From ba0736cb9dbe394052e0e818da1708dd11058612 Mon Sep 17 00:00:00 2001 From: theUniC Date: Tue, 14 Sep 2021 18:15:02 +0200 Subject: [PATCH] Added PHP-CS-Fixer as a phar --- .gitignore | 5 + .php-cs-fixer.cache | 1 - composer.json | 2 +- php-cs-fixer.phar | Bin 0 -> 2192654 bytes tools/php-cs-fixer/composer.json | 5 - tools/php-cs-fixer/composer.lock | 2105 --------- tools/php-cs-fixer/vendor/autoload.php | 7 - tools/php-cs-fixer/vendor/bin/php-cs-fixer | 1 - .../vendor/composer/ClassLoader.php | 479 -- .../vendor/composer/InstalledVersions.php | 565 --- tools/php-cs-fixer/vendor/composer/LICENSE | 21 - .../vendor/composer/autoload_classmap.php | 33 - .../vendor/composer/autoload_files.php | 19 - .../vendor/composer/autoload_namespaces.php | 9 - .../vendor/composer/autoload_psr4.php | 36 - .../vendor/composer/autoload_real.php | 75 - .../vendor/composer/autoload_static.php | 211 - .../vendor/composer/installed.json | 2179 --------- .../vendor/composer/installed.php | 306 -- .../vendor/composer/platform_check.php | 26 - .../vendor/composer/semver/CHANGELOG.md | 172 - .../vendor/composer/semver/LICENSE | 19 - .../vendor/composer/semver/README.md | 98 - .../vendor/composer/semver/composer.json | 59 - .../vendor/composer/semver/src/Comparator.php | 113 - .../composer/semver/src/CompilingMatcher.php | 71 - .../composer/semver/src/Constraint/Bound.php | 122 - .../semver/src/Constraint/Constraint.php | 435 -- .../src/Constraint/ConstraintInterface.php | 75 - .../src/Constraint/MatchAllConstraint.php | 85 - .../src/Constraint/MatchNoneConstraint.php | 83 - .../semver/src/Constraint/MultiConstraint.php | 325 -- .../vendor/composer/semver/src/Interval.php | 98 - .../vendor/composer/semver/src/Intervals.php | 478 -- .../vendor/composer/semver/src/Semver.php | 129 - .../composer/semver/src/VersionParser.php | 583 --- .../composer/xdebug-handler/CHANGELOG.md | 112 - .../vendor/composer/xdebug-handler/LICENSE | 21 - .../vendor/composer/xdebug-handler/README.md | 291 -- .../vendor/composer/xdebug-handler/UPGRADE.md | 30 - .../composer/xdebug-handler/composer.json | 42 - .../composer/xdebug-handler/src/PhpConfig.php | 84 - .../composer/xdebug-handler/src/Process.php | 114 - .../composer/xdebug-handler/src/Status.php | 169 - .../xdebug-handler/src/XdebugHandler.php | 649 --- .../vendor/doctrine/annotations/LICENSE | 19 - .../vendor/doctrine/annotations/README.md | 18 - .../vendor/doctrine/annotations/composer.json | 44 - .../annotations/docs/en/annotations.rst | 252 - .../doctrine/annotations/docs/en/custom.rst | 443 -- .../doctrine/annotations/docs/en/index.rst | 101 - .../doctrine/annotations/docs/en/sidebar.rst | 6 - .../Common/Annotations/Annotation.php | 59 - .../Annotations/Annotation/Attribute.php | 21 - .../Annotations/Annotation/Attributes.php | 15 - .../Common/Annotations/Annotation/Enum.php | 69 - .../Annotation/IgnoreAnnotation.php | 43 - .../Annotation/NamedArgumentConstructor.php | 13 - .../Annotations/Annotation/Required.php | 13 - .../Common/Annotations/Annotation/Target.php | 101 - .../Annotations/AnnotationException.php | 171 - .../Common/Annotations/AnnotationReader.php | 389 -- .../Common/Annotations/AnnotationRegistry.php | 190 - .../Common/Annotations/CachedReader.php | 268 -- .../Doctrine/Common/Annotations/DocLexer.php | 129 - .../Doctrine/Common/Annotations/DocParser.php | 1459 ------ .../Common/Annotations/FileCacheReader.php | 315 -- .../ImplicitlyIgnoredAnnotationNames.php | 177 - .../Common/Annotations/IndexedReader.php | 100 - .../NamedArgumentConstructorAnnotation.php | 14 - .../Doctrine/Common/Annotations/PhpParser.php | 92 - .../Common/Annotations/PsrCachedReader.php | 232 - .../Doctrine/Common/Annotations/Reader.php | 80 - .../Annotations/SimpleAnnotationReader.php | 114 - .../Common/Annotations/TokenParser.php | 208 - .../vendor/doctrine/lexer/LICENSE | 19 - .../vendor/doctrine/lexer/README.md | 9 - .../vendor/doctrine/lexer/composer.json | 41 - .../Doctrine/Common/Lexer/AbstractLexer.php | 328 -- .../friendsofphp/php-cs-fixer/CHANGELOG.md | 4033 ----------------- .../friendsofphp/php-cs-fixer/CONTRIBUTING.md | 104 - .../vendor/friendsofphp/php-cs-fixer/LICENSE | 19 - .../friendsofphp/php-cs-fixer/README.md | 75 - .../friendsofphp/php-cs-fixer/UPGRADE-v3.md | 166 - .../php-cs-fixer/ci-integration.sh | 8 - .../friendsofphp/php-cs-fixer/composer.json | 71 - .../vendor/friendsofphp/php-cs-fixer/logo.md | 3 - .../vendor/friendsofphp/php-cs-fixer/logo.png | Bin 18627 -> 0 bytes .../friendsofphp/php-cs-fixer/php-cs-fixer | 115 - .../src/AbstractDoctrineAnnotationFixer.php | 227 - .../php-cs-fixer/src/AbstractFixer.php | 203 - .../src/AbstractFopenFlagFixer.php | 124 - .../src/AbstractFunctionReferenceFixer.php | 65 - .../src/AbstractLinesBeforeNamespaceFixer.php | 111 - .../src/AbstractNoUselessElseFixer.php | 210 - .../AbstractPhpdocToTypeDeclarationFixer.php | 225 - .../src/AbstractPhpdocTypesFixer.php | 129 - .../php-cs-fixer/src/AbstractProxyFixer.php | 124 - .../php-cs-fixer/src/Cache/Cache.php | 138 - .../php-cs-fixer/src/Cache/CacheInterface.php | 35 - .../src/Cache/CacheManagerInterface.php | 27 - .../php-cs-fixer/src/Cache/Directory.php | 55 - .../src/Cache/DirectoryInterface.php | 23 - .../src/Cache/FileCacheManager.php | 141 - .../php-cs-fixer/src/Cache/FileHandler.php | 109 - .../src/Cache/FileHandlerInterface.php | 29 - .../src/Cache/NullCacheManager.php | 32 - .../php-cs-fixer/src/Cache/Signature.php | 106 - .../src/Cache/SignatureInterface.php | 38 - .../friendsofphp/php-cs-fixer/src/Config.php | 307 -- .../php-cs-fixer/src/ConfigInterface.php | 133 - .../InvalidConfigurationException.php | 37 - .../InvalidFixerConfigurationException.php | 48 - ...validForEnvFixerConfigurationException.php | 24 - .../RequiredFixerConfigurationException.php | 24 - .../php-cs-fixer/src/Console/Application.php | 143 - .../src/Console/Command/DescribeCommand.php | 433 -- .../Command/DescribeNameNotFoundException.php | 51 - .../Console/Command/DocumentationCommand.php | 126 - .../src/Console/Command/FixCommand.php | 372 -- .../FixCommandExitStatusCalculator.php | 51 - .../src/Console/Command/HelpCommand.php | 125 - .../src/Console/Command/ListFilesCommand.php | 101 - .../src/Console/Command/ListSetsCommand.php | 91 - .../src/Console/Command/SelfUpdateCommand.php | 189 - .../src/Console/ConfigurationResolver.php | 879 ---- .../src/Console/Output/ErrorOutput.php | 150 - .../src/Console/Output/NullOutput.php | 25 - .../src/Console/Output/ProcessOutput.php | 146 - .../Console/Output/ProcessOutputInterface.php | 23 - .../Report/FixReport/CheckstyleReporter.php | 71 - .../Report/FixReport/GitlabReporter.php | 60 - .../Console/Report/FixReport/JsonReporter.php | 73 - .../Report/FixReport/JunitReporter.php | 137 - .../Report/FixReport/ReportSummary.php | 103 - .../Report/FixReport/ReporterFactory.php | 92 - .../Report/FixReport/ReporterInterface.php | 30 - .../Console/Report/FixReport/TextReporter.php | 93 - .../Console/Report/FixReport/XmlReporter.php | 124 - .../Report/ListSetsReport/JsonReporter.php | 58 - .../Report/ListSetsReport/ReportSummary.php | 47 - .../Report/ListSetsReport/ReporterFactory.php | 92 - .../ListSetsReport/ReporterInterface.php | 30 - .../Report/ListSetsReport/TextReporter.php | 57 - .../src/Console/SelfUpdate/GithubClient.php | 54 - .../SelfUpdate/GithubClientInterface.php | 23 - .../Console/SelfUpdate/NewVersionChecker.php | 116 - .../SelfUpdate/NewVersionCheckerInterface.php | 37 - .../src/Console/WarningsDetector.php | 78 - .../src/Differ/DiffConsoleFormatter.php | 94 - .../src/Differ/DifferInterface.php | 26 - .../php-cs-fixer/src/Differ/FullDiffer.php | 50 - .../php-cs-fixer/src/Differ/NullDiffer.php | 29 - .../php-cs-fixer/src/Differ/UnifiedDiffer.php | 53 - .../php-cs-fixer/src/DocBlock/Annotation.php | 310 -- .../php-cs-fixer/src/DocBlock/DocBlock.php | 264 -- .../php-cs-fixer/src/DocBlock/Line.php | 132 - .../src/DocBlock/ShortDescription.php | 65 - .../php-cs-fixer/src/DocBlock/Tag.php | 109 - .../src/DocBlock/TagComparator.php | 59 - .../src/DocBlock/TypeExpression.php | 284 -- .../src/Doctrine/Annotation/Token.php | 87 - .../src/Doctrine/Annotation/Tokens.php | 342 -- .../Documentation/DocumentationGenerator.php | 488 -- .../php-cs-fixer/src/Error/Error.php | 99 - .../php-cs-fixer/src/Error/ErrorsManager.php | 79 - .../php-cs-fixer/src/FileReader.php | 73 - .../php-cs-fixer/src/FileRemoval.php | 98 - .../friendsofphp/php-cs-fixer/src/Finder.php | 35 - .../Fixer/AbstractIncrementOperatorFixer.php | 58 - .../src/Fixer/AbstractPhpUnitFixer.php | 58 - .../src/Fixer/Alias/ArrayPushFixer.php | 222 - .../Fixer/Alias/BacktickToShellExecFixer.php | 148 - .../src/Fixer/Alias/EregToPregFixer.php | 184 - .../src/Fixer/Alias/MbStrFunctionsFixer.php | 133 - .../src/Fixer/Alias/NoAliasFunctionsFixer.php | 338 -- .../NoAliasLanguageConstructCallFixer.php | 71 - .../src/Fixer/Alias/NoMixedEchoPrintFixer.php | 155 - .../Fixer/Alias/PowToExponentiationFixer.php | 233 - .../Fixer/Alias/RandomApiMigrationFixer.php | 178 - .../src/Fixer/Alias/SetTypeToCastFixer.php | 239 - .../Fixer/ArrayNotation/ArraySyntaxFixer.php | 154 - ...tilineWhitespaceAroundDoubleArrowFixer.php | 86 - .../NoTrailingCommaInSinglelineArrayFixer.php | 89 - .../NoWhitespaceBeforeCommaInArrayFixer.php | 152 - .../NormalizeIndexBraceFixer.php | 62 - .../ArrayNotation/TrimArraySpacesFixer.php | 104 - .../WhitespaceAfterCommaInArrayFixer.php | 103 - .../src/Fixer/Basic/BracesFixer.php | 1008 ---- .../src/Fixer/Basic/EncodingFixer.php | 95 - .../Basic/NonPrintableCharacterFixer.php | 187 - .../src/Fixer/Basic/PsrAutoloadingFixer.php | 285 -- .../src/Fixer/Casing/ConstantCaseFixer.php | 154 - .../Fixer/Casing/LowercaseKeywordsFixer.php | 78 - .../Casing/LowercaseStaticReferenceFixer.php | 108 - .../Fixer/Casing/MagicConstantCasingFixer.php | 101 - .../Fixer/Casing/MagicMethodCasingFixer.php | 205 - .../Casing/NativeFunctionCasingFixer.php | 120 - ...tiveFunctionTypeDeclarationCasingFixer.php | 183 - .../Fixer/CastNotation/CastSpacesFixer.php | 130 - .../Fixer/CastNotation/LowercaseCastFixer.php | 98 - .../ModernizeTypesCastingFixer.php | 162 - .../CastNotation/NoShortBoolCastFixer.php | 100 - .../Fixer/CastNotation/NoUnsetCastFixer.php | 100 - .../CastNotation/ShortScalarCastFixer.php | 89 - .../ClassAttributesSeparationFixer.php | 578 --- .../ClassNotation/ClassDefinitionFixer.php | 438 -- .../Fixer/ClassNotation/FinalClassFixer.php | 63 - .../ClassNotation/FinalInternalClassFixer.php | 221 - ...FinalPublicMethodForAbstractClassFixer.php | 167 - .../NoBlankLinesAfterClassOpeningFixer.php | 102 - .../NoNullPropertyInitializationFixer.php | 150 - .../ClassNotation/NoPhp4ConstructorFixer.php | 408 -- .../NoUnneededFinalMethodFixer.php | 170 - .../OrderedClassElementsFixer.php | 511 --- .../ClassNotation/OrderedInterfacesFixer.php | 235 - .../ClassNotation/OrderedTraitsFixer.php | 197 - .../ClassNotation/ProtectedToPrivateFixer.php | 133 - .../Fixer/ClassNotation/SelfAccessorFixer.php | 189 - .../ClassNotation/SelfStaticAccessorFixer.php | 204 - .../SingleClassElementPerStatementFixer.php | 233 - .../SingleTraitInsertPerStatementFixer.php | 119 - .../ClassNotation/VisibilityRequiredFixer.php | 195 - .../ClassUsage/DateTimeImmutableFixer.php | 161 - .../Fixer/Comment/CommentToPhpdocFixer.php | 239 - .../src/Fixer/Comment/HeaderCommentFixer.php | 459 -- .../MultilineCommentOpeningClosingFixer.php | 98 - .../src/Fixer/Comment/NoEmptyCommentFixer.php | 160 - .../NoTrailingWhitespaceInCommentFixer.php | 88 - .../Comment/SingleLineCommentStyleFixer.php | 186 - .../src/Fixer/ConfigurableFixerInterface.php | 48 - .../NativeConstantInvocationFixer.php | 302 -- .../Fixer/ControlStructure/ElseifFixer.php | 105 - .../ControlStructure/EmptyLoopBodyFixer.php | 140 - .../Fixer/ControlStructure/IncludeFixer.php | 153 - .../NoAlternativeSyntaxFixer.php | 234 - .../ControlStructure/NoBreakCommentFixer.php | 353 -- .../NoSuperfluousElseifFixer.php | 110 - .../NoTrailingCommaInListCallFixer.php | 77 - .../NoUnneededControlParenthesesFixer.php | 189 - .../NoUnneededCurlyBracesFixer.php | 172 - .../ControlStructure/NoUselessElseFixer.php | 132 - .../SimplifiedIfReturnFixer.php | 142 - .../SwitchCaseSemicolonToColonFixer.php | 129 - .../ControlStructure/SwitchCaseSpaceFixer.php | 95 - .../SwitchContinueToBreakFixer.php | 246 - .../TrailingCommaInMultilineFixer.php | 220 - .../Fixer/ControlStructure/YodaStyleFixer.php | 735 --- .../src/Fixer/DeprecatedFixerInterface.php | 28 - ...DoctrineAnnotationArrayAssignmentFixer.php | 108 - .../DoctrineAnnotationBracesFixer.php | 127 - .../DoctrineAnnotationIndentationFixer.php | 193 - .../DoctrineAnnotationSpacesFixer.php | 301 -- .../php-cs-fixer/src/Fixer/FixerInterface.php | 79 - .../CombineNestedDirnameFixer.php | 237 - .../FunctionNotation/FopenFlagOrderFixer.php | 129 - .../FunctionNotation/FopenFlagsFixer.php | 114 - .../FunctionDeclarationFixer.php | 235 - .../FunctionTypehintSpaceFixer.php | 86 - .../FunctionNotation/ImplodeCallFixer.php | 151 - .../LambdaNotUsedImportFixer.php | 349 -- .../MethodArgumentSpaceFixer.php | 481 -- .../NativeFunctionInvocationFixer.php | 418 -- .../NoSpacesAfterFunctionNameFixer.php | 187 - ...NoUnreachableDefaultArgumentValueFixer.php | 197 - .../NoUselessSprintfFixer.php | 121 - ...ypeDeclarationForDefaultNullValueFixer.php | 174 - .../PhpdocToParamTypeFixer.php | 205 - .../PhpdocToPropertyTypeFixer.php | 242 - .../PhpdocToReturnTypeFixer.php | 220 - .../RegularCallableCallFixer.php | 233 - .../ReturnTypeDeclarationFixer.php | 137 - .../FunctionNotation/SingleLineThrowFixer.php | 165 - .../FunctionNotation/StaticLambdaFixer.php | 179 - .../UseArrowFunctionsFixer.php | 208 - .../FunctionNotation/VoidReturnFixer.php | 259 -- .../Import/FullyQualifiedStrictTypesFixer.php | 206 - .../Import/GlobalNamespaceImportFixer.php | 745 --- .../src/Fixer/Import/GroupImportFixer.php | 282 -- .../Import/NoLeadingImportSlashFixer.php | 99 - .../src/Fixer/Import/NoUnusedImportsFixer.php | 286 -- .../src/Fixer/Import/OrderedImportsFixer.php | 536 --- .../Import/SingleImportPerStatementFixer.php | 240 - .../Import/SingleLineAfterImportsFixer.php | 161 - .../ClassKeywordRemoveFixer.php | 253 -- .../CombineConsecutiveIssetsFixer.php | 175 - .../CombineConsecutiveUnsetsFixer.php | 191 - .../DeclareEqualNormalizeFixer.php | 144 - .../DeclareParenthesesFixer.php | 56 - .../LanguageConstruct/DirConstantFixer.php | 134 - .../ErrorSuppressionFixer.php | 185 - .../ExplicitIndirectVariableFixer.php | 94 - .../FunctionToConstantFixer.php | 303 -- .../Fixer/LanguageConstruct/IsNullFixer.php | 176 - .../NoUnsetOnPropertyFixer.php | 224 - .../SingleSpaceAfterConstructFixer.php | 335 -- .../Fixer/ListNotation/ListSyntaxFixer.php | 150 - .../BlankLineAfterNamespaceFixer.php | 136 - .../NamespaceNotation/CleanNamespaceFixer.php | 107 - .../NoBlankLinesBeforeNamespaceFixer.php | 76 - .../NoLeadingNamespaceWhitespaceFixer.php | 104 - .../SingleBlankLineBeforeNamespaceFixer.php | 71 - .../Fixer/Naming/NoHomoglyphNamesFixer.php | 245 - .../Operator/BinaryOperatorSpacesFixer.php | 756 --- .../src/Fixer/Operator/ConcatSpaceFixer.php | 168 - .../Fixer/Operator/IncrementStyleFixer.php | 173 - .../Fixer/Operator/LogicalOperatorsFixer.php | 79 - .../src/Fixer/Operator/NewWithBracesFixer.php | 147 - .../Operator/NotOperatorWithSpaceFixer.php | 84 - .../NotOperatorWithSuccessorSpaceFixer.php | 82 - .../ObjectOperatorWithoutWhitespaceFixer.php | 71 - .../Fixer/Operator/OperatorLinebreakFixer.php | 321 -- .../Operator/StandardizeIncrementFixer.php | 130 - .../Operator/StandardizeNotEqualsFixer.php | 69 - .../Operator/TernaryOperatorSpacesFixer.php | 180 - .../Operator/TernaryToElvisOperatorFixer.php | 262 -- .../Operator/TernaryToNullCoalescingFixer.php | 212 - .../Operator/UnaryOperatorSpacesFixer.php | 81 - .../PhpTag/BlankLineAfterOpeningTagFixer.php | 101 - .../src/Fixer/PhpTag/EchoTagSyntaxFixer.php | 270 -- .../src/Fixer/PhpTag/FullOpeningTagFixer.php | 134 - .../PhpTag/LinebreakAfterOpeningTagFixer.php | 80 - .../src/Fixer/PhpTag/NoClosingTagFixer.php | 72 - .../Fixer/PhpUnit/PhpUnitConstructFixer.php | 206 - .../PhpUnit/PhpUnitDedicateAssertFixer.php | 407 -- ...PhpUnitDedicateAssertInternalTypeFixer.php | 202 - .../Fixer/PhpUnit/PhpUnitExpectationFixer.php | 289 -- .../PhpUnit/PhpUnitFqcnAnnotationFixer.php | 92 - .../PhpUnit/PhpUnitInternalClassFixer.php | 165 - .../PhpUnit/PhpUnitMethodCasingFixer.php | 213 - .../src/Fixer/PhpUnit/PhpUnitMockFixer.php | 142 - .../PhpUnitMockShortWillReturnFixer.php | 124 - .../Fixer/PhpUnit/PhpUnitNamespacedFixer.php | 229 - .../PhpUnitNoExpectationAnnotationFixer.php | 275 -- .../PhpUnitSetUpTearDownVisibilityFixer.php | 117 - .../Fixer/PhpUnit/PhpUnitSizeClassFixer.php | 197 - .../src/Fixer/PhpUnit/PhpUnitStrictFixer.php | 150 - .../Fixer/PhpUnit/PhpUnitTargetVersion.php | 58 - .../PhpUnit/PhpUnitTestAnnotationFixer.php | 416 -- .../PhpUnitTestCaseStaticMethodCallsFixer.php | 474 -- .../PhpUnitTestClassRequiresCoversFixer.php | 135 - .../Phpdoc/AlignMultilineCommentFixer.php | 179 - .../GeneralPhpdocAnnotationRemoveFixer.php | 134 - .../Phpdoc/GeneralPhpdocTagRenameFixer.php | 213 - .../Phpdoc/NoBlankLinesAfterPhpdocFixer.php | 115 - .../src/Fixer/Phpdoc/NoEmptyPhpdocFixer.php | 74 - .../Phpdoc/NoSuperfluousPhpdocTagsFixer.php | 486 -- .../PhpdocAddMissingParamAnnotationFixer.php | 276 -- .../src/Fixer/Phpdoc/PhpdocAlignFixer.php | 422 -- .../PhpdocAnnotationWithoutDotFixer.php | 138 - .../src/Fixer/Phpdoc/PhpdocIndentFixer.php | 142 - .../Phpdoc/PhpdocInlineTagNormalizerFixer.php | 124 - .../src/Fixer/Phpdoc/PhpdocLineSpanFixer.php | 148 - .../src/Fixer/Phpdoc/PhpdocNoAccessFixer.php | 73 - .../Fixer/Phpdoc/PhpdocNoAliasTagFixer.php | 136 - .../Fixer/Phpdoc/PhpdocNoEmptyReturnFixer.php | 126 - .../src/Fixer/Phpdoc/PhpdocNoPackageFixer.php | 73 - .../Phpdoc/PhpdocNoUselessInheritdocFixer.php | 164 - .../Fixer/Phpdoc/PhpdocOrderByValueFixer.php | 222 - .../src/Fixer/Phpdoc/PhpdocOrderFixer.php | 166 - .../Phpdoc/PhpdocReturnSelfReferenceFixer.php | 232 - .../src/Fixer/Phpdoc/PhpdocScalarFixer.php | 131 - .../Fixer/Phpdoc/PhpdocSeparationFixer.php | 173 - .../PhpdocSingleLineVarSpacingFixer.php | 100 - .../src/Fixer/Phpdoc/PhpdocSummaryFixer.php | 103 - .../src/Fixer/Phpdoc/PhpdocTagCasingFixer.php | 106 - .../src/Fixer/Phpdoc/PhpdocTagTypeFixer.php | 214 - .../src/Fixer/Phpdoc/PhpdocToCommentFixer.php | 162 - ...rimConsecutiveBlankLineSeparationFixer.php | 197 - .../src/Fixer/Phpdoc/PhpdocTrimFixer.php | 124 - .../src/Fixer/Phpdoc/PhpdocTypesFixer.php | 163 - .../Fixer/Phpdoc/PhpdocTypesOrderFixer.php | 222 - .../PhpdocVarAnnotationCorrectOrderFixer.php | 81 - .../Phpdoc/PhpdocVarWithoutNameFixer.php | 154 - .../ReturnNotation/NoUselessReturnFixer.php | 115 - .../ReturnNotation/ReturnAssignmentFixer.php | 355 -- .../SimplifiedNullReturnFixer.php | 161 - ...ltilineWhitespaceBeforeSemicolonsFixer.php | 295 -- .../Fixer/Semicolon/NoEmptyStatementFixer.php | 196 - ...glelineWhitespaceBeforeSemicolonsFixer.php | 78 - .../SemicolonAfterInstructionFixer.php | 76 - .../Semicolon/SpaceAfterSemicolonFixer.php | 149 - .../Fixer/Strict/DeclareStrictTypesFixer.php | 155 - .../Fixer/Strict/StrictComparisonFixer.php | 89 - .../src/Fixer/Strict/StrictParamFixer.php | 177 - .../EscapeImplicitBackslashesFixer.php | 171 - .../ExplicitStringVariableFixer.php | 173 - .../StringNotation/HeredocToNowdocFixer.php | 116 - .../StringNotation/NoBinaryStringFixer.php | 68 - .../NoTrailingWhitespaceInStringFixer.php | 112 - .../SimpleToComplexStringVariableFixer.php | 116 - .../Fixer/StringNotation/SingleQuoteFixer.php | 120 - .../StringNotation/StringLineEndingFixer.php | 88 - .../Whitespace/ArrayIndentationFixer.php | 276 -- .../BlankLineBeforeStatementFixer.php | 350 -- .../CompactNullableTypehintFixer.php | 82 - .../Whitespace/HeredocIndentationFixer.php | 195 - .../Fixer/Whitespace/IndentationTypeFixer.php | 153 - .../src/Fixer/Whitespace/LineEndingFixer.php | 105 - .../MethodChainingIndentationFixer.php | 197 - .../Whitespace/NoExtraBlankLinesFixer.php | 466 -- .../Whitespace/NoSpacesAroundOffsetFixer.php | 111 - .../NoSpacesInsideParenthesisFixer.php | 111 - .../Whitespace/NoTrailingWhitespaceFixer.php | 117 - .../NoWhitespaceInBlankLineFixer.php | 103 - .../Whitespace/SingleBlankLineAtEofFixer.php | 76 - .../src/Fixer/Whitespace/TypesSpacesFixer.php | 126 - .../Fixer/WhitespacesAwareFixerInterface.php | 25 - .../FixerConfiguration/AliasedFixerOption.php | 100 - .../AliasedFixerOptionBuilder.php | 91 - .../FixerConfiguration/AllowedValueSubset.php | 56 - .../DeprecatedFixerOption.php | 95 - .../DeprecatedFixerOptionInterface.php | 20 - .../FixerConfigurationResolver.php | 135 - .../FixerConfigurationResolverInterface.php | 30 - .../src/FixerConfiguration/FixerOption.php | 169 - .../FixerConfiguration/FixerOptionBuilder.php | 138 - .../FixerOptionInterface.php | 40 - .../InvalidOptionsForEnvException.php | 26 - .../src/FixerDefinition/CodeSample.php | 47 - .../FixerDefinition/CodeSampleInterface.php | 25 - .../FileSpecificCodeSample.php | 66 - .../FileSpecificCodeSampleInterface.php | 25 - .../src/FixerDefinition/FixerDefinition.php | 77 - .../FixerDefinitionInterface.php | 37 - .../VersionSpecificCodeSample.php | 64 - .../VersionSpecificCodeSampleInterface.php | 23 - .../FixerDefinition/VersionSpecification.php | 74 - .../VersionSpecificationInterface.php | 23 - .../php-cs-fixer/src/FixerFactory.php | 240 - .../src/FixerFileProcessedEvent.php | 55 - .../php-cs-fixer/src/FixerNameValidator.php | 32 - .../Indicator/PhpUnitTestCaseIndicator.php | 73 - .../php-cs-fixer/src/Linter/CachingLinter.php | 74 - .../php-cs-fixer/src/Linter/Linter.php | 66 - .../src/Linter/LinterInterface.php | 35 - .../src/Linter/LintingException.php | 22 - .../src/Linter/LintingResultInterface.php | 26 - .../php-cs-fixer/src/Linter/ProcessLinter.php | 167 - .../Linter/ProcessLinterProcessBuilder.php | 47 - .../src/Linter/ProcessLintingResult.php | 97 - .../src/Linter/TokenizerLinter.php | 77 - .../src/Linter/TokenizerLintingResult.php | 52 - .../src/Linter/UnavailableLinterException.php | 24 - .../php-cs-fixer/src/PharChecker.php | 41 - .../php-cs-fixer/src/PharCheckerInterface.php | 26 - .../friendsofphp/php-cs-fixer/src/Preg.php | 209 - .../php-cs-fixer/src/PregException.php | 26 - .../RuleSet/AbstractRuleSetDescription.php | 37 - .../php-cs-fixer/src/RuleSet/RuleSet.php | 151 - .../RuleSet/RuleSetDescriptionInterface.php | 36 - .../src/RuleSet/RuleSetInterface.php | 46 - .../php-cs-fixer/src/RuleSet/RuleSets.php | 69 - .../RuleSet/Sets/DoctrineAnnotationSet.php | 42 - .../src/RuleSet/Sets/PHP54MigrationSet.php | 35 - .../RuleSet/Sets/PHP56MigrationRiskySet.php | 35 - .../RuleSet/Sets/PHP70MigrationRiskySet.php | 44 - .../src/RuleSet/Sets/PHP70MigrationSet.php | 36 - .../RuleSet/Sets/PHP71MigrationRiskySet.php | 36 - .../src/RuleSet/Sets/PHP71MigrationSet.php | 37 - .../src/RuleSet/Sets/PHP73MigrationSet.php | 39 - .../RuleSet/Sets/PHP74MigrationRiskySet.php | 38 - .../src/RuleSet/Sets/PHP74MigrationSet.php | 37 - .../RuleSet/Sets/PHP80MigrationRiskySet.php | 43 - .../src/RuleSet/Sets/PHP80MigrationSet.php | 37 - .../Sets/PHPUnit30MigrationRiskySet.php | 38 - .../Sets/PHPUnit32MigrationRiskySet.php | 39 - .../Sets/PHPUnit35MigrationRiskySet.php | 39 - .../Sets/PHPUnit43MigrationRiskySet.php | 39 - .../Sets/PHPUnit48MigrationRiskySet.php | 39 - .../Sets/PHPUnit50MigrationRiskySet.php | 39 - .../Sets/PHPUnit52MigrationRiskySet.php | 39 - .../Sets/PHPUnit54MigrationRiskySet.php | 39 - .../Sets/PHPUnit55MigrationRiskySet.php | 39 - .../Sets/PHPUnit56MigrationRiskySet.php | 42 - .../Sets/PHPUnit57MigrationRiskySet.php | 39 - .../Sets/PHPUnit60MigrationRiskySet.php | 39 - .../Sets/PHPUnit75MigrationRiskySet.php | 39 - .../Sets/PHPUnit84MigrationRiskySet.php | 40 - .../src/RuleSet/Sets/PSR12RiskySet.php | 36 - .../src/RuleSet/Sets/PSR12Set.php | 66 - .../php-cs-fixer/src/RuleSet/Sets/PSR1Set.php | 36 - .../php-cs-fixer/src/RuleSet/Sets/PSR2Set.php | 64 - .../src/RuleSet/Sets/PhpCsFixerRiskySet.php | 60 - .../src/RuleSet/Sets/PhpCsFixerSet.php | 108 - .../src/RuleSet/Sets/SymfonyRiskySet.php | 79 - .../src/RuleSet/Sets/SymfonySet.php | 184 - .../src/Runner/FileCachingLintingIterator.php | 82 - .../src/Runner/FileFilterIterator.php | 112 - .../src/Runner/FileLintingIterator.php | 67 - .../php-cs-fixer/src/Runner/Runner.php | 319 -- .../php-cs-fixer/src/StdinFileInfo.php | 174 - .../src/Tokenizer/AbstractTransformer.php | 49 - .../Analyzer/Analysis/ArgumentAnalysis.php | 87 - .../Analyzer/Analysis/CaseAnalysis.php | 38 - .../Analyzer/Analysis/NamespaceAnalysis.php | 103 - .../Analysis/NamespaceUseAnalysis.php | 122 - .../Analysis/StartEndTokenAwareAnalysis.php | 28 - .../Analyzer/Analysis/SwitchAnalysis.php | 66 - .../Analyzer/Analysis/TypeAnalysis.php | 107 - .../Tokenizer/Analyzer/ArgumentsAnalyzer.php | 147 - .../Tokenizer/Analyzer/AttributeAnalyzer.php | 70 - .../src/Tokenizer/Analyzer/BlocksAnalyzer.php | 60 - .../src/Tokenizer/Analyzer/ClassyAnalyzer.php | 83 - .../Tokenizer/Analyzer/CommentsAnalyzer.php | 294 -- .../Tokenizer/Analyzer/FunctionsAnalyzer.php | 261 -- .../Tokenizer/Analyzer/GotoLabelAnalyzer.php | 40 - .../Analyzer/NamespaceUsesAnalyzer.php | 118 - .../Tokenizer/Analyzer/NamespacesAnalyzer.php | 88 - .../Tokenizer/Analyzer/ReferenceAnalyzer.php | 49 - .../src/Tokenizer/Analyzer/SwitchAnalyzer.php | 117 - .../Analyzer/WhitespacesAnalyzer.php | 52 - .../php-cs-fixer/src/Tokenizer/CT.php | 99 - .../php-cs-fixer/src/Tokenizer/CodeHasher.php | 36 - .../NamespacedStringTokenGenerator.php | 43 - .../Resolver/TypeShortNameResolver.php | 92 - .../php-cs-fixer/src/Tokenizer/Token.php | 494 -- .../php-cs-fixer/src/Tokenizer/Tokens.php | 1395 ------ .../src/Tokenizer/TokensAnalyzer.php | 760 ---- .../Transformer/ArrayTypehintTransformer.php | 63 - .../Transformer/AttributeTransformer.php | 79 - .../BraceClassInstantiationTransformer.php | 90 - .../Transformer/ClassConstantTransformer.php | 66 - .../ConstructorPromotionTransformer.php | 80 - .../Transformer/CurlyBraceTransformer.php | 263 -- .../Transformer/ImportTransformer.php | 69 - .../Transformer/NameQualifiedTransformer.php | 103 - .../Transformer/NamedArgumentTransformer.php | 87 - .../NamespaceOperatorTransformer.php | 62 - .../Transformer/NullableTypeTransformer.php | 85 - .../Transformer/ReturnRefTransformer.php | 64 - .../Transformer/SquareBraceTransformer.php | 183 - .../TypeAlternationTransformer.php | 119 - .../Transformer/TypeColonTransformer.php | 92 - .../Tokenizer/Transformer/UseTransformer.php | 108 - .../WhitespacyCommentTransformer.php | 73 - .../src/Tokenizer/TransformerInterface.php | 68 - .../src/Tokenizer/Transformers.php | 111 - .../php-cs-fixer/src/ToolInfo.php | 113 - .../php-cs-fixer/src/ToolInfoInterface.php | 33 - .../friendsofphp/php-cs-fixer/src/Utils.php | 168 - .../src/WhitespacesFixerConfig.php | 55 - .../php-cs-fixer/src/WordMatcher.php | 54 - .../vendor/php-cs-fixer/diff/LICENSE | 31 - .../vendor/php-cs-fixer/diff/README.md | 10 - .../vendor/php-cs-fixer/diff/composer.json | 38 - .../vendor/php-cs-fixer/diff/src/Chunk.php | 90 - .../vendor/php-cs-fixer/diff/src/Diff.php | 67 - .../vendor/php-cs-fixer/diff/src/Differ.php | 329 -- .../src/Exception/ConfigurationException.php | 40 - .../diff/src/Exception/Exception.php | 15 - .../Exception/InvalidArgumentException.php | 15 - .../vendor/php-cs-fixer/diff/src/Line.php | 44 - .../LongestCommonSubsequenceCalculator.php | 24 - ...ientLongestCommonSubsequenceCalculator.php | 81 - .../src/Output/AbstractChunkOutputBuilder.php | 56 - .../diff/src/Output/DiffOnlyOutputBuilder.php | 66 - .../src/Output/DiffOutputBuilderInterface.php | 20 - .../Output/StrictUnifiedDiffOutputBuilder.php | 315 -- .../src/Output/UnifiedDiffOutputBuilder.php | 259 -- .../vendor/php-cs-fixer/diff/src/Parser.php | 106 - ...ientLongestCommonSubsequenceCalculator.php | 66 - .../vendor/psr/cache/CHANGELOG.md | 16 - .../php-cs-fixer/vendor/psr/cache/LICENSE.txt | 19 - tools/php-cs-fixer/vendor/psr/cache/README.md | 12 - .../vendor/psr/cache/composer.json | 25 - .../vendor/psr/cache/src/CacheException.php | 10 - .../psr/cache/src/CacheItemInterface.php | 105 - .../psr/cache/src/CacheItemPoolInterface.php | 138 - .../cache/src/InvalidArgumentException.php | 13 - .../vendor/psr/container/.gitignore | 3 - .../php-cs-fixer/vendor/psr/container/LICENSE | 21 - .../vendor/psr/container/README.md | 13 - .../vendor/psr/container/composer.json | 22 - .../src/ContainerExceptionInterface.php | 10 - .../psr/container/src/ContainerInterface.php | 36 - .../src/NotFoundExceptionInterface.php | 10 - .../vendor/psr/event-dispatcher/.editorconfig | 15 - .../vendor/psr/event-dispatcher/.gitignore | 2 - .../vendor/psr/event-dispatcher/LICENSE | 21 - .../vendor/psr/event-dispatcher/README.md | 6 - .../vendor/psr/event-dispatcher/composer.json | 26 - .../src/EventDispatcherInterface.php | 21 - .../src/ListenerProviderInterface.php | 19 - .../src/StoppableEventInterface.php | 26 - tools/php-cs-fixer/vendor/psr/log/LICENSE | 19 - tools/php-cs-fixer/vendor/psr/log/README.md | 58 - .../php-cs-fixer/vendor/psr/log/composer.json | 26 - .../vendor/psr/log/src/AbstractLogger.php | 15 - .../psr/log/src/InvalidArgumentException.php | 7 - .../vendor/psr/log/src/LogLevel.php | 18 - .../psr/log/src/LoggerAwareInterface.php | 18 - .../vendor/psr/log/src/LoggerAwareTrait.php | 26 - .../vendor/psr/log/src/LoggerInterface.php | 125 - .../vendor/psr/log/src/LoggerTrait.php | 142 - .../vendor/psr/log/src/NullLogger.php | 30 - .../vendor/symfony/console/Application.php | 1239 ----- .../symfony/console/Attribute/AsCommand.php | 39 - .../vendor/symfony/console/CHANGELOG.md | 210 - .../console/CI/GithubActionReporter.php | 99 - .../vendor/symfony/console/Color.php | 180 - .../symfony/console/Command/Command.php | 704 --- .../symfony/console/Command/HelpCommand.php | 83 - .../symfony/console/Command/LazyCommand.php | 211 - .../symfony/console/Command/ListCommand.php | 77 - .../symfony/console/Command/LockableTrait.php | 69 - .../Command/SignalableCommandInterface.php | 30 - .../CommandLoader/CommandLoaderInterface.php | 42 - .../CommandLoader/ContainerCommandLoader.php | 63 - .../CommandLoader/FactoryCommandLoader.php | 62 - .../vendor/symfony/console/ConsoleEvents.php | 72 - .../vendor/symfony/console/Cursor.php | 168 - .../AddConsoleCommandPass.php | 148 - .../Descriptor/ApplicationDescription.php | 143 - .../symfony/console/Descriptor/Descriptor.php | 94 - .../Descriptor/DescriptorInterface.php | 24 - .../console/Descriptor/JsonDescriptor.php | 181 - .../console/Descriptor/MarkdownDescriptor.php | 206 - .../console/Descriptor/TextDescriptor.php | 341 -- .../console/Descriptor/XmlDescriptor.php | 247 - .../console/Event/ConsoleCommandEvent.php | 51 - .../console/Event/ConsoleErrorEvent.php | 58 - .../symfony/console/Event/ConsoleEvent.php | 67 - .../console/Event/ConsoleSignalEvent.php | 35 - .../console/Event/ConsoleTerminateEvent.php | 43 - .../console/EventListener/ErrorListener.php | 95 - .../Exception/CommandNotFoundException.php | 43 - .../console/Exception/ExceptionInterface.php | 21 - .../Exception/InvalidArgumentException.php | 19 - .../Exception/InvalidOptionException.php | 21 - .../console/Exception/LogicException.php | 19 - .../Exception/MissingInputException.php | 21 - .../Exception/NamespaceNotFoundException.php | 21 - .../console/Exception/RuntimeException.php | 19 - .../console/Formatter/NullOutputFormatter.php | 72 - .../Formatter/NullOutputFormatterStyle.php | 65 - .../console/Formatter/OutputFormatter.php | 283 -- .../Formatter/OutputFormatterInterface.php | 58 - .../Formatter/OutputFormatterStyle.php | 108 - .../OutputFormatterStyleInterface.php | 52 - .../Formatter/OutputFormatterStyleStack.php | 110 - .../WrappableOutputFormatterInterface.php | 25 - .../console/Helper/DebugFormatterHelper.php | 107 - .../console/Helper/DescriptorHelper.php | 87 - .../vendor/symfony/console/Helper/Dumper.php | 64 - .../console/Helper/FormatterHelper.php | 92 - .../vendor/symfony/console/Helper/Helper.php | 178 - .../console/Helper/HelperInterface.php | 39 - .../symfony/console/Helper/HelperSet.php | 99 - .../console/Helper/InputAwareHelper.php | 33 - .../symfony/console/Helper/ProcessHelper.php | 148 - .../symfony/console/Helper/ProgressBar.php | 619 --- .../console/Helper/ProgressIndicator.php | 254 -- .../symfony/console/Helper/QuestionHelper.php | 605 --- .../console/Helper/SymfonyQuestionHelper.php | 109 - .../vendor/symfony/console/Helper/Table.php | 865 ---- .../symfony/console/Helper/TableCell.php | 78 - .../symfony/console/Helper/TableCellStyle.php | 86 - .../symfony/console/Helper/TableRows.php | 32 - .../symfony/console/Helper/TableSeparator.php | 25 - .../symfony/console/Helper/TableStyle.php | 364 -- .../symfony/console/Input/ArgvInput.php | 371 -- .../symfony/console/Input/ArrayInput.php | 210 - .../vendor/symfony/console/Input/Input.php | 213 - .../symfony/console/Input/InputArgument.php | 129 - .../console/Input/InputAwareInterface.php | 26 - .../symfony/console/Input/InputDefinition.php | 424 -- .../symfony/console/Input/InputInterface.php | 151 - .../symfony/console/Input/InputOption.php | 233 - .../Input/StreamableInputInterface.php | 37 - .../symfony/console/Input/StringInput.php | 68 - .../vendor/symfony/console/LICENSE | 19 - .../symfony/console/Logger/ConsoleLogger.php | 126 - .../symfony/console/Output/BufferedOutput.php | 45 - .../symfony/console/Output/ConsoleOutput.php | 166 - .../console/Output/ConsoleOutputInterface.php | 32 - .../console/Output/ConsoleSectionOutput.php | 143 - .../symfony/console/Output/NullOutput.php | 128 - .../vendor/symfony/console/Output/Output.php | 174 - .../console/Output/OutputInterface.php | 110 - .../symfony/console/Output/StreamOutput.php | 115 - .../console/Output/TrimmedBufferOutput.php | 62 - .../console/Question/ChoiceQuestion.php | 183 - .../console/Question/ConfirmationQuestion.php | 57 - .../symfony/console/Question/Question.php | 302 -- .../vendor/symfony/console/README.md | 20 - .../console/Resources/bin/hiddeninput.exe | Bin 9216 -> 0 bytes .../console/SignalRegistry/SignalRegistry.php | 65 - .../console/SingleCommandApplication.php | 67 - .../symfony/console/Style/OutputStyle.php | 153 - .../symfony/console/Style/StyleInterface.php | 132 - .../symfony/console/Style/SymfonyStyle.php | 513 --- .../vendor/symfony/console/Terminal.php | 174 - .../console/Tester/ApplicationTester.php | 67 - .../symfony/console/Tester/CommandTester.php | 78 - .../symfony/console/Tester/TesterTrait.php | 186 - .../vendor/symfony/console/composer.json | 60 - .../symfony/deprecation-contracts/.gitignore | 3 - .../deprecation-contracts/CHANGELOG.md | 5 - .../symfony/deprecation-contracts/LICENSE | 19 - .../symfony/deprecation-contracts/README.md | 26 - .../deprecation-contracts/composer.json | 35 - .../deprecation-contracts/function.php | 27 - .../event-dispatcher-contracts/.gitignore | 3 - .../event-dispatcher-contracts/CHANGELOG.md | 5 - .../event-dispatcher-contracts/Event.php | 54 - .../EventDispatcherInterface.php | 31 - .../event-dispatcher-contracts/LICENSE | 19 - .../event-dispatcher-contracts/README.md | 9 - .../event-dispatcher-contracts/composer.json | 38 - .../Attribute/AsEventListener.php | 29 - .../symfony/event-dispatcher/CHANGELOG.md | 86 - .../Debug/TraceableEventDispatcher.php | 363 -- .../Debug/WrappedListener.php | 127 - .../AddEventAliasesPass.php | 46 - .../RegisterListenersPass.php | 230 - .../event-dispatcher/EventDispatcher.php | 280 -- .../EventDispatcherInterface.php | 70 - .../EventSubscriberInterface.php | 49 - .../symfony/event-dispatcher/GenericEvent.php | 179 - .../ImmutableEventDispatcher.php | 91 - .../vendor/symfony/event-dispatcher/LICENSE | 19 - .../LegacyEventDispatcherProxy.php | 31 - .../vendor/symfony/event-dispatcher/README.md | 15 - .../symfony/event-dispatcher/composer.json | 52 - .../vendor/symfony/filesystem/CHANGELOG.md | 76 - .../Exception/ExceptionInterface.php | 21 - .../Exception/FileNotFoundException.php | 34 - .../filesystem/Exception/IOException.php | 39 - .../Exception/IOExceptionInterface.php | 27 - .../Exception/InvalidArgumentException.php | 19 - .../vendor/symfony/filesystem/Filesystem.php | 758 ---- .../vendor/symfony/filesystem/LICENSE | 19 - .../vendor/symfony/filesystem/README.md | 13 - .../vendor/symfony/filesystem/composer.json | 30 - .../vendor/symfony/finder/CHANGELOG.md | 79 - .../symfony/finder/Comparator/Comparator.php | 91 - .../finder/Comparator/DateComparator.php | 51 - .../finder/Comparator/NumberComparator.php | 79 - .../Exception/AccessDeniedException.php | 19 - .../Exception/DirectoryNotFoundException.php | 19 - .../vendor/symfony/finder/Finder.php | 808 ---- .../vendor/symfony/finder/Gitignore.php | 83 - .../vendor/symfony/finder/Glob.php | 111 - .../finder/Iterator/CustomFilterIterator.php | 62 - .../Iterator/DateRangeFilterIterator.php | 59 - .../Iterator/DepthRangeFilterIterator.php | 46 - .../ExcludeDirectoryFilterIterator.php | 93 - .../Iterator/FileTypeFilterIterator.php | 54 - .../Iterator/FilecontentFilterIterator.php | 59 - .../Iterator/FilenameFilterIterator.php | 48 - .../symfony/finder/Iterator/LazyIterator.php | 32 - .../Iterator/MultiplePcreFilterIterator.php | 106 - .../finder/Iterator/PathFilterIterator.php | 57 - .../Iterator/RecursiveDirectoryIterator.php | 149 - .../Iterator/SizeRangeFilterIterator.php | 58 - .../finder/Iterator/SortableIterator.php | 101 - .../vendor/symfony/finder/LICENSE | 19 - .../vendor/symfony/finder/README.md | 14 - .../vendor/symfony/finder/SplFileInfo.php | 85 - .../vendor/symfony/finder/composer.json | 29 - .../symfony/options-resolver/CHANGELOG.md | 81 - .../Debug/OptionsResolverIntrospector.php | 120 - .../Exception/AccessException.php | 22 - .../Exception/ExceptionInterface.php | 21 - .../Exception/InvalidArgumentException.php | 21 - .../Exception/InvalidOptionsException.php | 23 - .../Exception/MissingOptionsException.php | 23 - .../Exception/NoConfigurationException.php | 26 - .../Exception/NoSuchOptionException.php | 26 - .../Exception/OptionDefinitionException.php | 21 - .../Exception/UndefinedOptionsException.php | 24 - .../vendor/symfony/options-resolver/LICENSE | 19 - .../options-resolver/OptionConfigurator.php | 139 - .../symfony/options-resolver/Options.php | 22 - .../options-resolver/OptionsResolver.php | 1347 ------ .../vendor/symfony/options-resolver/README.md | 15 - .../symfony/options-resolver/composer.json | 31 - .../vendor/symfony/polyfill-ctype/Ctype.php | 227 - .../vendor/symfony/polyfill-ctype/LICENSE | 19 - .../vendor/symfony/polyfill-ctype/README.md | 12 - .../symfony/polyfill-ctype/bootstrap.php | 50 - .../symfony/polyfill-ctype/bootstrap80.php | 46 - .../symfony/polyfill-ctype/composer.json | 38 - .../polyfill-intl-grapheme/Grapheme.php | 247 - .../symfony/polyfill-intl-grapheme/LICENSE | 19 - .../symfony/polyfill-intl-grapheme/README.md | 31 - .../polyfill-intl-grapheme/bootstrap.php | 58 - .../polyfill-intl-grapheme/bootstrap80.php | 50 - .../polyfill-intl-grapheme/composer.json | 38 - .../symfony/polyfill-intl-normalizer/LICENSE | 19 - .../polyfill-intl-normalizer/Normalizer.php | 310 -- .../polyfill-intl-normalizer/README.md | 14 - .../Resources/stubs/Normalizer.php | 17 - .../unidata/canonicalComposition.php | 945 ---- .../unidata/canonicalDecomposition.php | 2065 --------- .../Resources/unidata/combiningClass.php | 876 ---- .../unidata/compatibilityDecomposition.php | 3695 --------------- .../polyfill-intl-normalizer/bootstrap.php | 23 - .../polyfill-intl-normalizer/bootstrap80.php | 19 - .../polyfill-intl-normalizer/composer.json | 39 - .../vendor/symfony/polyfill-mbstring/LICENSE | 19 - .../symfony/polyfill-mbstring/Mbstring.php | 870 ---- .../symfony/polyfill-mbstring/README.md | 13 - .../Resources/unidata/lowerCase.php | 1397 ------ .../Resources/unidata/titleCaseRegexp.php | 5 - .../Resources/unidata/upperCase.php | 1489 ------ .../symfony/polyfill-mbstring/bootstrap.php | 147 - .../symfony/polyfill-mbstring/bootstrap80.php | 143 - .../symfony/polyfill-mbstring/composer.json | 38 - .../vendor/symfony/polyfill-php72/LICENSE | 19 - .../vendor/symfony/polyfill-php72/Php72.php | 217 - .../vendor/symfony/polyfill-php72/README.md | 28 - .../symfony/polyfill-php72/bootstrap.php | 57 - .../symfony/polyfill-php72/composer.json | 35 - .../vendor/symfony/polyfill-php73/LICENSE | 19 - .../vendor/symfony/polyfill-php73/Php73.php | 43 - .../vendor/symfony/polyfill-php73/README.md | 18 - .../Resources/stubs/JsonException.php | 14 - .../symfony/polyfill-php73/bootstrap.php | 31 - .../symfony/polyfill-php73/composer.json | 36 - .../vendor/symfony/polyfill-php80/LICENSE | 19 - .../vendor/symfony/polyfill-php80/Php80.php | 105 - .../vendor/symfony/polyfill-php80/README.md | 24 - .../Resources/stubs/Attribute.php | 22 - .../Resources/stubs/Stringable.php | 11 - .../Resources/stubs/UnhandledMatchError.php | 5 - .../Resources/stubs/ValueError.php | 5 - .../symfony/polyfill-php80/bootstrap.php | 42 - .../symfony/polyfill-php80/composer.json | 40 - .../vendor/symfony/polyfill-php81/LICENSE | 19 - .../vendor/symfony/polyfill-php81/Php81.php | 37 - .../vendor/symfony/polyfill-php81/README.md | 16 - .../Resources/stubs/ReturnTypeWillChange.php | 9 - .../symfony/polyfill-php81/bootstrap.php | 28 - .../symfony/polyfill-php81/composer.json | 36 - .../vendor/symfony/process/CHANGELOG.md | 116 - .../process/Exception/ExceptionInterface.php | 21 - .../Exception/InvalidArgumentException.php | 21 - .../process/Exception/LogicException.php | 21 - .../Exception/ProcessFailedException.php | 54 - .../Exception/ProcessSignaledException.php | 41 - .../Exception/ProcessTimedOutException.php | 69 - .../process/Exception/RuntimeException.php | 21 - .../symfony/process/ExecutableFinder.php | 86 - .../vendor/symfony/process/InputStream.php | 94 - .../vendor/symfony/process/LICENSE | 19 - .../symfony/process/PhpExecutableFinder.php | 99 - .../vendor/symfony/process/PhpProcess.php | 72 - .../symfony/process/Pipes/AbstractPipes.php | 178 - .../symfony/process/Pipes/PipesInterface.php | 61 - .../symfony/process/Pipes/UnixPipes.php | 166 - .../symfony/process/Pipes/WindowsPipes.php | 207 - .../vendor/symfony/process/Process.php | 1678 ------- .../vendor/symfony/process/ProcessUtils.php | 69 - .../vendor/symfony/process/README.md | 13 - .../vendor/symfony/process/composer.json | 29 - .../symfony/service-contracts/.gitignore | 3 - .../service-contracts/Attribute/Required.php | 25 - .../symfony/service-contracts/CHANGELOG.md | 5 - .../vendor/symfony/service-contracts/LICENSE | 19 - .../symfony/service-contracts/README.md | 9 - .../service-contracts/ResetInterface.php | 30 - .../service-contracts/ServiceLocatorTrait.php | 128 - .../ServiceProviderInterface.php | 36 - .../ServiceSubscriberInterface.php | 53 - .../ServiceSubscriberTrait.php | 66 - .../Test/ServiceLocatorTest.php | 92 - .../symfony/service-contracts/composer.json | 38 - .../vendor/symfony/stopwatch/CHANGELOG.md | 24 - .../vendor/symfony/stopwatch/LICENSE | 19 - .../vendor/symfony/stopwatch/README.md | 42 - .../vendor/symfony/stopwatch/Section.php | 185 - .../vendor/symfony/stopwatch/Stopwatch.php | 166 - .../symfony/stopwatch/StopwatchEvent.php | 258 -- .../symfony/stopwatch/StopwatchPeriod.php | 81 - .../vendor/symfony/stopwatch/composer.json | 29 - .../vendor/symfony/string/AbstractString.php | 727 --- .../symfony/string/AbstractUnicodeString.php | 580 --- .../vendor/symfony/string/ByteString.php | 506 --- .../vendor/symfony/string/CHANGELOG.md | 30 - .../vendor/symfony/string/CodePointString.php | 270 -- .../string/Exception/ExceptionInterface.php | 16 - .../Exception/InvalidArgumentException.php | 16 - .../string/Exception/RuntimeException.php | 16 - .../string/Inflector/EnglishInflector.php | 508 --- .../string/Inflector/FrenchInflector.php | 157 - .../string/Inflector/InflectorInterface.php | 33 - .../vendor/symfony/string/LICENSE | 19 - .../vendor/symfony/string/LazyString.php | 164 - .../vendor/symfony/string/README.md | 14 - .../Resources/data/wcswidth_table_wide.php | 1119 ----- .../Resources/data/wcswidth_table_zero.php | 1339 ------ .../symfony/string/Resources/functions.php | 38 - .../symfony/string/Slugger/AsciiSlugger.php | 183 - .../string/Slugger/SluggerInterface.php | 27 - .../vendor/symfony/string/UnicodeString.php | 377 -- .../vendor/symfony/string/composer.json | 40 - 898 files changed, 6 insertions(+), 137514 deletions(-) delete mode 100644 .php-cs-fixer.cache create mode 100644 php-cs-fixer.phar delete mode 100644 tools/php-cs-fixer/composer.json delete mode 100644 tools/php-cs-fixer/composer.lock delete mode 100644 tools/php-cs-fixer/vendor/autoload.php delete mode 120000 tools/php-cs-fixer/vendor/bin/php-cs-fixer delete mode 100644 tools/php-cs-fixer/vendor/composer/ClassLoader.php delete mode 100644 tools/php-cs-fixer/vendor/composer/InstalledVersions.php delete mode 100644 tools/php-cs-fixer/vendor/composer/LICENSE delete mode 100644 tools/php-cs-fixer/vendor/composer/autoload_classmap.php delete mode 100644 tools/php-cs-fixer/vendor/composer/autoload_files.php delete mode 100644 tools/php-cs-fixer/vendor/composer/autoload_namespaces.php delete mode 100644 tools/php-cs-fixer/vendor/composer/autoload_psr4.php delete mode 100644 tools/php-cs-fixer/vendor/composer/autoload_real.php delete mode 100644 tools/php-cs-fixer/vendor/composer/autoload_static.php delete mode 100644 tools/php-cs-fixer/vendor/composer/installed.json delete mode 100644 tools/php-cs-fixer/vendor/composer/installed.php delete mode 100644 tools/php-cs-fixer/vendor/composer/platform_check.php delete mode 100644 tools/php-cs-fixer/vendor/composer/semver/CHANGELOG.md delete mode 100644 tools/php-cs-fixer/vendor/composer/semver/LICENSE delete mode 100644 tools/php-cs-fixer/vendor/composer/semver/README.md delete mode 100644 tools/php-cs-fixer/vendor/composer/semver/composer.json delete mode 100644 tools/php-cs-fixer/vendor/composer/semver/src/Comparator.php delete mode 100644 tools/php-cs-fixer/vendor/composer/semver/src/CompilingMatcher.php delete mode 100644 tools/php-cs-fixer/vendor/composer/semver/src/Constraint/Bound.php delete mode 100644 tools/php-cs-fixer/vendor/composer/semver/src/Constraint/Constraint.php delete mode 100644 tools/php-cs-fixer/vendor/composer/semver/src/Constraint/ConstraintInterface.php delete mode 100644 tools/php-cs-fixer/vendor/composer/semver/src/Constraint/MatchAllConstraint.php delete mode 100644 tools/php-cs-fixer/vendor/composer/semver/src/Constraint/MatchNoneConstraint.php delete mode 100644 tools/php-cs-fixer/vendor/composer/semver/src/Constraint/MultiConstraint.php delete mode 100644 tools/php-cs-fixer/vendor/composer/semver/src/Interval.php delete mode 100644 tools/php-cs-fixer/vendor/composer/semver/src/Intervals.php delete mode 100644 tools/php-cs-fixer/vendor/composer/semver/src/Semver.php delete mode 100644 tools/php-cs-fixer/vendor/composer/semver/src/VersionParser.php delete mode 100644 tools/php-cs-fixer/vendor/composer/xdebug-handler/CHANGELOG.md delete mode 100644 tools/php-cs-fixer/vendor/composer/xdebug-handler/LICENSE delete mode 100644 tools/php-cs-fixer/vendor/composer/xdebug-handler/README.md delete mode 100644 tools/php-cs-fixer/vendor/composer/xdebug-handler/UPGRADE.md delete mode 100644 tools/php-cs-fixer/vendor/composer/xdebug-handler/composer.json delete mode 100644 tools/php-cs-fixer/vendor/composer/xdebug-handler/src/PhpConfig.php delete mode 100644 tools/php-cs-fixer/vendor/composer/xdebug-handler/src/Process.php delete mode 100644 tools/php-cs-fixer/vendor/composer/xdebug-handler/src/Status.php delete mode 100644 tools/php-cs-fixer/vendor/composer/xdebug-handler/src/XdebugHandler.php delete mode 100644 tools/php-cs-fixer/vendor/doctrine/annotations/LICENSE delete mode 100644 tools/php-cs-fixer/vendor/doctrine/annotations/README.md delete mode 100644 tools/php-cs-fixer/vendor/doctrine/annotations/composer.json delete mode 100644 tools/php-cs-fixer/vendor/doctrine/annotations/docs/en/annotations.rst delete mode 100644 tools/php-cs-fixer/vendor/doctrine/annotations/docs/en/custom.rst delete mode 100644 tools/php-cs-fixer/vendor/doctrine/annotations/docs/en/index.rst delete mode 100644 tools/php-cs-fixer/vendor/doctrine/annotations/docs/en/sidebar.rst delete mode 100644 tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation.php delete mode 100644 tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Attribute.php delete mode 100644 tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Attributes.php delete mode 100644 tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Enum.php delete mode 100644 tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php delete mode 100644 tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/NamedArgumentConstructor.php delete mode 100644 tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Required.php delete mode 100644 tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Target.php delete mode 100644 tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationException.php delete mode 100644 tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationReader.php delete mode 100644 tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationRegistry.php delete mode 100644 tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/CachedReader.php delete mode 100644 tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/DocLexer.php delete mode 100644 tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/DocParser.php delete mode 100644 tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/FileCacheReader.php delete mode 100644 tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/ImplicitlyIgnoredAnnotationNames.php delete mode 100644 tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/IndexedReader.php delete mode 100644 tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/NamedArgumentConstructorAnnotation.php delete mode 100644 tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/PhpParser.php delete mode 100644 tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/PsrCachedReader.php delete mode 100644 tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Reader.php delete mode 100644 tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/SimpleAnnotationReader.php delete mode 100644 tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/TokenParser.php delete mode 100644 tools/php-cs-fixer/vendor/doctrine/lexer/LICENSE delete mode 100644 tools/php-cs-fixer/vendor/doctrine/lexer/README.md delete mode 100644 tools/php-cs-fixer/vendor/doctrine/lexer/composer.json delete mode 100644 tools/php-cs-fixer/vendor/doctrine/lexer/lib/Doctrine/Common/Lexer/AbstractLexer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/CHANGELOG.md delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/CONTRIBUTING.md delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/LICENSE delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/README.md delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/UPGRADE-v3.md delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/ci-integration.sh delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/composer.json delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/logo.md delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/logo.png delete mode 100755 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/php-cs-fixer delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/AbstractDoctrineAnnotationFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/AbstractFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/AbstractFopenFlagFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/AbstractFunctionReferenceFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/AbstractLinesBeforeNamespaceFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/AbstractNoUselessElseFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/AbstractPhpdocToTypeDeclarationFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/AbstractPhpdocTypesFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/AbstractProxyFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Cache/Cache.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Cache/CacheInterface.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Cache/CacheManagerInterface.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Cache/Directory.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Cache/DirectoryInterface.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Cache/FileCacheManager.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Cache/FileHandler.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Cache/FileHandlerInterface.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Cache/NullCacheManager.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Cache/Signature.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Cache/SignatureInterface.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Config.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/ConfigInterface.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/ConfigurationException/InvalidConfigurationException.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/ConfigurationException/InvalidFixerConfigurationException.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/ConfigurationException/InvalidForEnvFixerConfigurationException.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/ConfigurationException/RequiredFixerConfigurationException.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Application.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Command/DescribeCommand.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Command/DescribeNameNotFoundException.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Command/DocumentationCommand.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Command/FixCommand.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Command/FixCommandExitStatusCalculator.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Command/HelpCommand.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Command/ListFilesCommand.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Command/ListSetsCommand.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Command/SelfUpdateCommand.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/ConfigurationResolver.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Output/ErrorOutput.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Output/NullOutput.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Output/ProcessOutput.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Output/ProcessOutputInterface.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/CheckstyleReporter.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/GitlabReporter.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/JsonReporter.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/JunitReporter.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/ReportSummary.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/ReporterFactory.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/ReporterInterface.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/TextReporter.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/XmlReporter.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/ListSetsReport/JsonReporter.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/ListSetsReport/ReportSummary.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/ListSetsReport/ReporterFactory.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/ListSetsReport/ReporterInterface.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/ListSetsReport/TextReporter.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/SelfUpdate/GithubClient.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/SelfUpdate/GithubClientInterface.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/SelfUpdate/NewVersionChecker.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/SelfUpdate/NewVersionCheckerInterface.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/WarningsDetector.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Differ/DiffConsoleFormatter.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Differ/DifferInterface.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Differ/FullDiffer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Differ/NullDiffer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Differ/UnifiedDiffer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/DocBlock/Annotation.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/DocBlock/DocBlock.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/DocBlock/Line.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/DocBlock/ShortDescription.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/DocBlock/Tag.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/DocBlock/TagComparator.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/DocBlock/TypeExpression.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Doctrine/Annotation/Token.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Doctrine/Annotation/Tokens.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Documentation/DocumentationGenerator.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Error/Error.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Error/ErrorsManager.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FileReader.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FileRemoval.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Finder.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/AbstractIncrementOperatorFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/AbstractPhpUnitFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/ArrayPushFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/BacktickToShellExecFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/EregToPregFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/MbStrFunctionsFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/NoAliasFunctionsFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/NoAliasLanguageConstructCallFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/NoMixedEchoPrintFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/PowToExponentiationFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/RandomApiMigrationFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/SetTypeToCastFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/ArraySyntaxFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/NoMultilineWhitespaceAroundDoubleArrowFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/NoTrailingCommaInSinglelineArrayFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/NoWhitespaceBeforeCommaInArrayFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/NormalizeIndexBraceFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/TrimArraySpacesFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/WhitespaceAfterCommaInArrayFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/BracesFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/EncodingFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/NonPrintableCharacterFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/PsrAutoloadingFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/ConstantCaseFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/LowercaseKeywordsFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/LowercaseStaticReferenceFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/MagicConstantCasingFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/MagicMethodCasingFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/NativeFunctionCasingFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/NativeFunctionTypeDeclarationCasingFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/CastNotation/CastSpacesFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/CastNotation/LowercaseCastFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/CastNotation/ModernizeTypesCastingFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/CastNotation/NoShortBoolCastFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/CastNotation/NoUnsetCastFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/CastNotation/ShortScalarCastFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/ClassAttributesSeparationFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/ClassDefinitionFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/FinalClassFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/FinalInternalClassFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/FinalPublicMethodForAbstractClassFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/NoBlankLinesAfterClassOpeningFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/NoNullPropertyInitializationFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/NoPhp4ConstructorFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/NoUnneededFinalMethodFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/OrderedClassElementsFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/OrderedInterfacesFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/OrderedTraitsFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/ProtectedToPrivateFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/SelfAccessorFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/SelfStaticAccessorFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/SingleClassElementPerStatementFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/SingleTraitInsertPerStatementFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/VisibilityRequiredFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassUsage/DateTimeImmutableFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/CommentToPhpdocFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/HeaderCommentFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/MultilineCommentOpeningClosingFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/NoEmptyCommentFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/NoTrailingWhitespaceInCommentFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/SingleLineCommentStyleFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ConfigurableFixerInterface.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ConstantNotation/NativeConstantInvocationFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/ElseifFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/EmptyLoopBodyFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/IncludeFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoAlternativeSyntaxFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoBreakCommentFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoSuperfluousElseifFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoTrailingCommaInListCallFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoUnneededControlParenthesesFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoUnneededCurlyBracesFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoUselessElseFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/SimplifiedIfReturnFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/SwitchCaseSemicolonToColonFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/SwitchCaseSpaceFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/SwitchContinueToBreakFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/TrailingCommaInMultilineFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/YodaStyleFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/DeprecatedFixerInterface.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationArrayAssignmentFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationBracesFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationIndentationFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationSpacesFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FixerInterface.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/CombineNestedDirnameFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/FopenFlagOrderFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/FopenFlagsFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/FunctionDeclarationFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/FunctionTypehintSpaceFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/ImplodeCallFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/LambdaNotUsedImportFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/MethodArgumentSpaceFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/NativeFunctionInvocationFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/NoSpacesAfterFunctionNameFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/NoUnreachableDefaultArgumentValueFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/NoUselessSprintfFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/NullableTypeDeclarationForDefaultNullValueFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/PhpdocToParamTypeFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/PhpdocToPropertyTypeFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/PhpdocToReturnTypeFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/RegularCallableCallFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/ReturnTypeDeclarationFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/SingleLineThrowFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/StaticLambdaFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/UseArrowFunctionsFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/VoidReturnFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/FullyQualifiedStrictTypesFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/GlobalNamespaceImportFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/GroupImportFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/NoLeadingImportSlashFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/NoUnusedImportsFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/OrderedImportsFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/SingleImportPerStatementFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/SingleLineAfterImportsFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/ClassKeywordRemoveFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/CombineConsecutiveIssetsFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/CombineConsecutiveUnsetsFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/DeclareEqualNormalizeFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/DeclareParenthesesFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/DirConstantFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/ErrorSuppressionFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/ExplicitIndirectVariableFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/FunctionToConstantFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/IsNullFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/NoUnsetOnPropertyFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/SingleSpaceAfterConstructFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ListNotation/ListSyntaxFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/NamespaceNotation/BlankLineAfterNamespaceFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/NamespaceNotation/CleanNamespaceFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/NamespaceNotation/NoBlankLinesBeforeNamespaceFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/NamespaceNotation/NoLeadingNamespaceWhitespaceFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/NamespaceNotation/SingleBlankLineBeforeNamespaceFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Naming/NoHomoglyphNamesFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/BinaryOperatorSpacesFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/ConcatSpaceFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/IncrementStyleFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/LogicalOperatorsFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/NewWithBracesFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/NotOperatorWithSpaceFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/NotOperatorWithSuccessorSpaceFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/ObjectOperatorWithoutWhitespaceFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/OperatorLinebreakFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/StandardizeIncrementFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/StandardizeNotEqualsFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/TernaryOperatorSpacesFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/TernaryToElvisOperatorFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/TernaryToNullCoalescingFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/UnaryOperatorSpacesFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/BlankLineAfterOpeningTagFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/EchoTagSyntaxFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/FullOpeningTagFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/LinebreakAfterOpeningTagFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/NoClosingTagFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitConstructFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitDedicateAssertFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitDedicateAssertInternalTypeFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitExpectationFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitFqcnAnnotationFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitInternalClassFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitMethodCasingFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitMockFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitMockShortWillReturnFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitNamespacedFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitNoExpectationAnnotationFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitSetUpTearDownVisibilityFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitSizeClassFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitStrictFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitTargetVersion.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitTestAnnotationFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitTestCaseStaticMethodCallsFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitTestClassRequiresCoversFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/AlignMultilineCommentFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/GeneralPhpdocAnnotationRemoveFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/GeneralPhpdocTagRenameFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/NoBlankLinesAfterPhpdocFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/NoEmptyPhpdocFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/NoSuperfluousPhpdocTagsFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocAddMissingParamAnnotationFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocAlignFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocAnnotationWithoutDotFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocIndentFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocInlineTagNormalizerFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocLineSpanFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoAccessFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoAliasTagFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoEmptyReturnFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoPackageFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoUselessInheritdocFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocOrderByValueFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocOrderFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocReturnSelfReferenceFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocScalarFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocSeparationFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocSingleLineVarSpacingFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocSummaryFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTagCasingFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTagTypeFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocToCommentFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTrimConsecutiveBlankLineSeparationFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTrimFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTypesFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTypesOrderFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocVarAnnotationCorrectOrderFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocVarWithoutNameFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ReturnNotation/NoUselessReturnFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ReturnNotation/ReturnAssignmentFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ReturnNotation/SimplifiedNullReturnFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Semicolon/MultilineWhitespaceBeforeSemicolonsFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Semicolon/NoEmptyStatementFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Semicolon/NoSinglelineWhitespaceBeforeSemicolonsFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Semicolon/SemicolonAfterInstructionFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Semicolon/SpaceAfterSemicolonFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Strict/DeclareStrictTypesFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Strict/StrictComparisonFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Strict/StrictParamFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/EscapeImplicitBackslashesFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/ExplicitStringVariableFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/HeredocToNowdocFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/NoBinaryStringFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/NoTrailingWhitespaceInStringFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/SimpleToComplexStringVariableFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/SingleQuoteFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/StringLineEndingFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/ArrayIndentationFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/BlankLineBeforeStatementFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/CompactNullableTypehintFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/HeredocIndentationFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/IndentationTypeFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/LineEndingFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/MethodChainingIndentationFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoExtraBlankLinesFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoSpacesAroundOffsetFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoSpacesInsideParenthesisFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoTrailingWhitespaceFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoWhitespaceInBlankLineFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/SingleBlankLineAtEofFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/TypesSpacesFixer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/WhitespacesAwareFixerInterface.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/AliasedFixerOption.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/AliasedFixerOptionBuilder.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/AllowedValueSubset.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/DeprecatedFixerOption.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/DeprecatedFixerOptionInterface.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerConfigurationResolver.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerConfigurationResolverInterface.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerOption.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerOptionBuilder.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerOptionInterface.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/InvalidOptionsForEnvException.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/CodeSample.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/CodeSampleInterface.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/FileSpecificCodeSample.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/FileSpecificCodeSampleInterface.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/FixerDefinition.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/FixerDefinitionInterface.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/VersionSpecificCodeSample.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/VersionSpecificCodeSampleInterface.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/VersionSpecification.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/VersionSpecificationInterface.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerFactory.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerFileProcessedEvent.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerNameValidator.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Indicator/PhpUnitTestCaseIndicator.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Linter/CachingLinter.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Linter/Linter.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Linter/LinterInterface.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Linter/LintingException.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Linter/LintingResultInterface.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Linter/ProcessLinter.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Linter/ProcessLinterProcessBuilder.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Linter/ProcessLintingResult.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Linter/TokenizerLinter.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Linter/TokenizerLintingResult.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Linter/UnavailableLinterException.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/PharChecker.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/PharCheckerInterface.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Preg.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/PregException.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/AbstractRuleSetDescription.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/RuleSet.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/RuleSetDescriptionInterface.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/RuleSetInterface.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/RuleSets.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/DoctrineAnnotationSet.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP54MigrationSet.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP56MigrationRiskySet.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP70MigrationRiskySet.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP70MigrationSet.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP71MigrationRiskySet.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP71MigrationSet.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP73MigrationSet.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP74MigrationRiskySet.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP74MigrationSet.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP80MigrationRiskySet.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP80MigrationSet.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit30MigrationRiskySet.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit32MigrationRiskySet.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit35MigrationRiskySet.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit43MigrationRiskySet.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit48MigrationRiskySet.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit50MigrationRiskySet.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit52MigrationRiskySet.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit54MigrationRiskySet.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit55MigrationRiskySet.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit56MigrationRiskySet.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit57MigrationRiskySet.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit60MigrationRiskySet.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit75MigrationRiskySet.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit84MigrationRiskySet.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PSR12RiskySet.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PSR12Set.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PSR1Set.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PSR2Set.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PhpCsFixerRiskySet.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PhpCsFixerSet.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/SymfonyRiskySet.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/SymfonySet.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Runner/FileCachingLintingIterator.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Runner/FileFilterIterator.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Runner/FileLintingIterator.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Runner/Runner.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/StdinFileInfo.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/AbstractTransformer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/ArgumentAnalysis.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/CaseAnalysis.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/NamespaceAnalysis.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/NamespaceUseAnalysis.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/StartEndTokenAwareAnalysis.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/SwitchAnalysis.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/TypeAnalysis.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/ArgumentsAnalyzer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/AttributeAnalyzer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/BlocksAnalyzer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/ClassyAnalyzer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/CommentsAnalyzer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/FunctionsAnalyzer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/GotoLabelAnalyzer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/NamespaceUsesAnalyzer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/NamespacesAnalyzer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/ReferenceAnalyzer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/SwitchAnalyzer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/WhitespacesAnalyzer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/CT.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/CodeHasher.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Generator/NamespacedStringTokenGenerator.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Resolver/TypeShortNameResolver.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Token.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Tokens.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/TokensAnalyzer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/ArrayTypehintTransformer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/AttributeTransformer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/BraceClassInstantiationTransformer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/ClassConstantTransformer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/ConstructorPromotionTransformer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/CurlyBraceTransformer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/ImportTransformer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/NameQualifiedTransformer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/NamedArgumentTransformer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/NamespaceOperatorTransformer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/NullableTypeTransformer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/ReturnRefTransformer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/SquareBraceTransformer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/TypeAlternationTransformer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/TypeColonTransformer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/UseTransformer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/WhitespacyCommentTransformer.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/TransformerInterface.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformers.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/ToolInfo.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/ToolInfoInterface.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Utils.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/WhitespacesFixerConfig.php delete mode 100644 tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/WordMatcher.php delete mode 100644 tools/php-cs-fixer/vendor/php-cs-fixer/diff/LICENSE delete mode 100644 tools/php-cs-fixer/vendor/php-cs-fixer/diff/README.md delete mode 100644 tools/php-cs-fixer/vendor/php-cs-fixer/diff/composer.json delete mode 100644 tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/Chunk.php delete mode 100644 tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/Diff.php delete mode 100644 tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/Differ.php delete mode 100644 tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/Exception/ConfigurationException.php delete mode 100644 tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/Exception/Exception.php delete mode 100644 tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/Exception/InvalidArgumentException.php delete mode 100644 tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/Line.php delete mode 100644 tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/LongestCommonSubsequenceCalculator.php delete mode 100644 tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php delete mode 100644 tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/Output/AbstractChunkOutputBuilder.php delete mode 100644 tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/Output/DiffOnlyOutputBuilder.php delete mode 100644 tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/Output/DiffOutputBuilderInterface.php delete mode 100644 tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/Output/StrictUnifiedDiffOutputBuilder.php delete mode 100644 tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/Output/UnifiedDiffOutputBuilder.php delete mode 100644 tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/Parser.php delete mode 100644 tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php delete mode 100644 tools/php-cs-fixer/vendor/psr/cache/CHANGELOG.md delete mode 100644 tools/php-cs-fixer/vendor/psr/cache/LICENSE.txt delete mode 100644 tools/php-cs-fixer/vendor/psr/cache/README.md delete mode 100644 tools/php-cs-fixer/vendor/psr/cache/composer.json delete mode 100644 tools/php-cs-fixer/vendor/psr/cache/src/CacheException.php delete mode 100644 tools/php-cs-fixer/vendor/psr/cache/src/CacheItemInterface.php delete mode 100644 tools/php-cs-fixer/vendor/psr/cache/src/CacheItemPoolInterface.php delete mode 100644 tools/php-cs-fixer/vendor/psr/cache/src/InvalidArgumentException.php delete mode 100644 tools/php-cs-fixer/vendor/psr/container/.gitignore delete mode 100644 tools/php-cs-fixer/vendor/psr/container/LICENSE delete mode 100644 tools/php-cs-fixer/vendor/psr/container/README.md delete mode 100644 tools/php-cs-fixer/vendor/psr/container/composer.json delete mode 100644 tools/php-cs-fixer/vendor/psr/container/src/ContainerExceptionInterface.php delete mode 100644 tools/php-cs-fixer/vendor/psr/container/src/ContainerInterface.php delete mode 100644 tools/php-cs-fixer/vendor/psr/container/src/NotFoundExceptionInterface.php delete mode 100644 tools/php-cs-fixer/vendor/psr/event-dispatcher/.editorconfig delete mode 100644 tools/php-cs-fixer/vendor/psr/event-dispatcher/.gitignore delete mode 100644 tools/php-cs-fixer/vendor/psr/event-dispatcher/LICENSE delete mode 100644 tools/php-cs-fixer/vendor/psr/event-dispatcher/README.md delete mode 100644 tools/php-cs-fixer/vendor/psr/event-dispatcher/composer.json delete mode 100644 tools/php-cs-fixer/vendor/psr/event-dispatcher/src/EventDispatcherInterface.php delete mode 100644 tools/php-cs-fixer/vendor/psr/event-dispatcher/src/ListenerProviderInterface.php delete mode 100644 tools/php-cs-fixer/vendor/psr/event-dispatcher/src/StoppableEventInterface.php delete mode 100644 tools/php-cs-fixer/vendor/psr/log/LICENSE delete mode 100644 tools/php-cs-fixer/vendor/psr/log/README.md delete mode 100644 tools/php-cs-fixer/vendor/psr/log/composer.json delete mode 100644 tools/php-cs-fixer/vendor/psr/log/src/AbstractLogger.php delete mode 100644 tools/php-cs-fixer/vendor/psr/log/src/InvalidArgumentException.php delete mode 100644 tools/php-cs-fixer/vendor/psr/log/src/LogLevel.php delete mode 100644 tools/php-cs-fixer/vendor/psr/log/src/LoggerAwareInterface.php delete mode 100644 tools/php-cs-fixer/vendor/psr/log/src/LoggerAwareTrait.php delete mode 100644 tools/php-cs-fixer/vendor/psr/log/src/LoggerInterface.php delete mode 100644 tools/php-cs-fixer/vendor/psr/log/src/LoggerTrait.php delete mode 100644 tools/php-cs-fixer/vendor/psr/log/src/NullLogger.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Application.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Attribute/AsCommand.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/CHANGELOG.md delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/CI/GithubActionReporter.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Color.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Command/Command.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Command/HelpCommand.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Command/LazyCommand.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Command/ListCommand.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Command/LockableTrait.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Command/SignalableCommandInterface.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/CommandLoader/CommandLoaderInterface.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/CommandLoader/ContainerCommandLoader.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/CommandLoader/FactoryCommandLoader.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/ConsoleEvents.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Cursor.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/DependencyInjection/AddConsoleCommandPass.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Descriptor/ApplicationDescription.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Descriptor/Descriptor.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Descriptor/DescriptorInterface.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Descriptor/JsonDescriptor.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Descriptor/MarkdownDescriptor.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Descriptor/TextDescriptor.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Descriptor/XmlDescriptor.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Event/ConsoleCommandEvent.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Event/ConsoleErrorEvent.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Event/ConsoleEvent.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Event/ConsoleSignalEvent.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Event/ConsoleTerminateEvent.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/EventListener/ErrorListener.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Exception/CommandNotFoundException.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Exception/ExceptionInterface.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Exception/InvalidArgumentException.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Exception/InvalidOptionException.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Exception/LogicException.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Exception/MissingInputException.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Exception/NamespaceNotFoundException.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Exception/RuntimeException.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Formatter/NullOutputFormatter.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Formatter/NullOutputFormatterStyle.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Formatter/OutputFormatter.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Formatter/OutputFormatterInterface.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Formatter/OutputFormatterStyle.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Formatter/OutputFormatterStyleInterface.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Formatter/OutputFormatterStyleStack.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Formatter/WrappableOutputFormatterInterface.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Helper/DebugFormatterHelper.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Helper/DescriptorHelper.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Helper/Dumper.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Helper/FormatterHelper.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Helper/Helper.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Helper/HelperInterface.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Helper/HelperSet.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Helper/InputAwareHelper.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Helper/ProcessHelper.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Helper/ProgressBar.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Helper/ProgressIndicator.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Helper/QuestionHelper.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Helper/SymfonyQuestionHelper.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Helper/Table.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Helper/TableCell.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Helper/TableCellStyle.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Helper/TableRows.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Helper/TableSeparator.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Helper/TableStyle.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Input/ArgvInput.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Input/ArrayInput.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Input/Input.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Input/InputArgument.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Input/InputAwareInterface.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Input/InputDefinition.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Input/InputInterface.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Input/InputOption.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Input/StreamableInputInterface.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Input/StringInput.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/LICENSE delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Logger/ConsoleLogger.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Output/BufferedOutput.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Output/ConsoleOutput.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Output/ConsoleOutputInterface.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Output/ConsoleSectionOutput.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Output/NullOutput.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Output/Output.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Output/OutputInterface.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Output/StreamOutput.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Output/TrimmedBufferOutput.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Question/ChoiceQuestion.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Question/ConfirmationQuestion.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Question/Question.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/README.md delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Resources/bin/hiddeninput.exe delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/SignalRegistry/SignalRegistry.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/SingleCommandApplication.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Style/OutputStyle.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Style/StyleInterface.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Style/SymfonyStyle.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Terminal.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Tester/ApplicationTester.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Tester/CommandTester.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/Tester/TesterTrait.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/console/composer.json delete mode 100644 tools/php-cs-fixer/vendor/symfony/deprecation-contracts/.gitignore delete mode 100644 tools/php-cs-fixer/vendor/symfony/deprecation-contracts/CHANGELOG.md delete mode 100644 tools/php-cs-fixer/vendor/symfony/deprecation-contracts/LICENSE delete mode 100644 tools/php-cs-fixer/vendor/symfony/deprecation-contracts/README.md delete mode 100644 tools/php-cs-fixer/vendor/symfony/deprecation-contracts/composer.json delete mode 100644 tools/php-cs-fixer/vendor/symfony/deprecation-contracts/function.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/event-dispatcher-contracts/.gitignore delete mode 100644 tools/php-cs-fixer/vendor/symfony/event-dispatcher-contracts/CHANGELOG.md delete mode 100644 tools/php-cs-fixer/vendor/symfony/event-dispatcher-contracts/Event.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/event-dispatcher-contracts/EventDispatcherInterface.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/event-dispatcher-contracts/LICENSE delete mode 100644 tools/php-cs-fixer/vendor/symfony/event-dispatcher-contracts/README.md delete mode 100644 tools/php-cs-fixer/vendor/symfony/event-dispatcher-contracts/composer.json delete mode 100644 tools/php-cs-fixer/vendor/symfony/event-dispatcher/Attribute/AsEventListener.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/event-dispatcher/CHANGELOG.md delete mode 100644 tools/php-cs-fixer/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/event-dispatcher/Debug/WrappedListener.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/event-dispatcher/DependencyInjection/AddEventAliasesPass.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/event-dispatcher/EventDispatcher.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/event-dispatcher/EventDispatcherInterface.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/event-dispatcher/EventSubscriberInterface.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/event-dispatcher/GenericEvent.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/event-dispatcher/ImmutableEventDispatcher.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/event-dispatcher/LICENSE delete mode 100644 tools/php-cs-fixer/vendor/symfony/event-dispatcher/LegacyEventDispatcherProxy.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/event-dispatcher/README.md delete mode 100644 tools/php-cs-fixer/vendor/symfony/event-dispatcher/composer.json delete mode 100644 tools/php-cs-fixer/vendor/symfony/filesystem/CHANGELOG.md delete mode 100644 tools/php-cs-fixer/vendor/symfony/filesystem/Exception/ExceptionInterface.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/filesystem/Exception/FileNotFoundException.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/filesystem/Exception/IOException.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/filesystem/Exception/IOExceptionInterface.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/filesystem/Exception/InvalidArgumentException.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/filesystem/Filesystem.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/filesystem/LICENSE delete mode 100644 tools/php-cs-fixer/vendor/symfony/filesystem/README.md delete mode 100644 tools/php-cs-fixer/vendor/symfony/filesystem/composer.json delete mode 100644 tools/php-cs-fixer/vendor/symfony/finder/CHANGELOG.md delete mode 100644 tools/php-cs-fixer/vendor/symfony/finder/Comparator/Comparator.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/finder/Comparator/DateComparator.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/finder/Comparator/NumberComparator.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/finder/Exception/AccessDeniedException.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/finder/Exception/DirectoryNotFoundException.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/finder/Finder.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/finder/Gitignore.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/finder/Glob.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/finder/Iterator/CustomFilterIterator.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/finder/Iterator/DateRangeFilterIterator.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/finder/Iterator/DepthRangeFilterIterator.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/finder/Iterator/FileTypeFilterIterator.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/finder/Iterator/FilecontentFilterIterator.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/finder/Iterator/FilenameFilterIterator.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/finder/Iterator/LazyIterator.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/finder/Iterator/MultiplePcreFilterIterator.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/finder/Iterator/PathFilterIterator.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/finder/Iterator/RecursiveDirectoryIterator.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/finder/Iterator/SizeRangeFilterIterator.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/finder/Iterator/SortableIterator.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/finder/LICENSE delete mode 100644 tools/php-cs-fixer/vendor/symfony/finder/README.md delete mode 100644 tools/php-cs-fixer/vendor/symfony/finder/SplFileInfo.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/finder/composer.json delete mode 100644 tools/php-cs-fixer/vendor/symfony/options-resolver/CHANGELOG.md delete mode 100644 tools/php-cs-fixer/vendor/symfony/options-resolver/Debug/OptionsResolverIntrospector.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/options-resolver/Exception/AccessException.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/options-resolver/Exception/ExceptionInterface.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/options-resolver/Exception/InvalidArgumentException.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/options-resolver/Exception/InvalidOptionsException.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/options-resolver/Exception/MissingOptionsException.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/options-resolver/Exception/NoConfigurationException.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/options-resolver/Exception/NoSuchOptionException.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/options-resolver/Exception/OptionDefinitionException.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/options-resolver/Exception/UndefinedOptionsException.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/options-resolver/LICENSE delete mode 100644 tools/php-cs-fixer/vendor/symfony/options-resolver/OptionConfigurator.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/options-resolver/Options.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/options-resolver/OptionsResolver.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/options-resolver/README.md delete mode 100644 tools/php-cs-fixer/vendor/symfony/options-resolver/composer.json delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-ctype/Ctype.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-ctype/LICENSE delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-ctype/README.md delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-ctype/bootstrap.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-ctype/bootstrap80.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-ctype/composer.json delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-intl-grapheme/Grapheme.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-intl-grapheme/LICENSE delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-intl-grapheme/README.md delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-intl-grapheme/bootstrap.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-intl-grapheme/bootstrap80.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-intl-grapheme/composer.json delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-intl-normalizer/LICENSE delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-intl-normalizer/Normalizer.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-intl-normalizer/README.md delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalComposition.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalDecomposition.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/combiningClass.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/compatibilityDecomposition.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-intl-normalizer/bootstrap.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-intl-normalizer/bootstrap80.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-intl-normalizer/composer.json delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-mbstring/LICENSE delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-mbstring/Mbstring.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-mbstring/README.md delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-mbstring/bootstrap.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-mbstring/bootstrap80.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-mbstring/composer.json delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-php72/LICENSE delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-php72/Php72.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-php72/README.md delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-php72/bootstrap.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-php72/composer.json delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-php73/LICENSE delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-php73/Php73.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-php73/README.md delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-php73/Resources/stubs/JsonException.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-php73/bootstrap.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-php73/composer.json delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-php80/LICENSE delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-php80/Php80.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-php80/README.md delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-php80/Resources/stubs/ValueError.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-php80/bootstrap.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-php80/composer.json delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-php81/LICENSE delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-php81/Php81.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-php81/README.md delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-php81/Resources/stubs/ReturnTypeWillChange.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-php81/bootstrap.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/polyfill-php81/composer.json delete mode 100644 tools/php-cs-fixer/vendor/symfony/process/CHANGELOG.md delete mode 100644 tools/php-cs-fixer/vendor/symfony/process/Exception/ExceptionInterface.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/process/Exception/InvalidArgumentException.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/process/Exception/LogicException.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/process/Exception/ProcessFailedException.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/process/Exception/ProcessSignaledException.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/process/Exception/ProcessTimedOutException.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/process/Exception/RuntimeException.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/process/ExecutableFinder.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/process/InputStream.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/process/LICENSE delete mode 100644 tools/php-cs-fixer/vendor/symfony/process/PhpExecutableFinder.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/process/PhpProcess.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/process/Pipes/AbstractPipes.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/process/Pipes/PipesInterface.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/process/Pipes/UnixPipes.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/process/Pipes/WindowsPipes.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/process/Process.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/process/ProcessUtils.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/process/README.md delete mode 100644 tools/php-cs-fixer/vendor/symfony/process/composer.json delete mode 100644 tools/php-cs-fixer/vendor/symfony/service-contracts/.gitignore delete mode 100644 tools/php-cs-fixer/vendor/symfony/service-contracts/Attribute/Required.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/service-contracts/CHANGELOG.md delete mode 100644 tools/php-cs-fixer/vendor/symfony/service-contracts/LICENSE delete mode 100644 tools/php-cs-fixer/vendor/symfony/service-contracts/README.md delete mode 100644 tools/php-cs-fixer/vendor/symfony/service-contracts/ResetInterface.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/service-contracts/ServiceLocatorTrait.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/service-contracts/ServiceProviderInterface.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/service-contracts/ServiceSubscriberInterface.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/service-contracts/ServiceSubscriberTrait.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/service-contracts/Test/ServiceLocatorTest.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/service-contracts/composer.json delete mode 100644 tools/php-cs-fixer/vendor/symfony/stopwatch/CHANGELOG.md delete mode 100644 tools/php-cs-fixer/vendor/symfony/stopwatch/LICENSE delete mode 100644 tools/php-cs-fixer/vendor/symfony/stopwatch/README.md delete mode 100644 tools/php-cs-fixer/vendor/symfony/stopwatch/Section.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/stopwatch/Stopwatch.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/stopwatch/StopwatchEvent.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/stopwatch/StopwatchPeriod.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/stopwatch/composer.json delete mode 100644 tools/php-cs-fixer/vendor/symfony/string/AbstractString.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/string/AbstractUnicodeString.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/string/ByteString.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/string/CHANGELOG.md delete mode 100644 tools/php-cs-fixer/vendor/symfony/string/CodePointString.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/string/Exception/ExceptionInterface.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/string/Exception/InvalidArgumentException.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/string/Exception/RuntimeException.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/string/Inflector/EnglishInflector.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/string/Inflector/FrenchInflector.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/string/Inflector/InflectorInterface.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/string/LICENSE delete mode 100644 tools/php-cs-fixer/vendor/symfony/string/LazyString.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/string/README.md delete mode 100644 tools/php-cs-fixer/vendor/symfony/string/Resources/data/wcswidth_table_wide.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/string/Resources/data/wcswidth_table_zero.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/string/Resources/functions.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/string/Slugger/AsciiSlugger.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/string/Slugger/SluggerInterface.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/string/UnicodeString.php delete mode 100644 tools/php-cs-fixer/vendor/symfony/string/composer.json diff --git a/.gitignore b/.gitignore index c1b7677..3294796 100644 --- a/.gitignore +++ b/.gitignore @@ -16,9 +16,14 @@ ###> application ### infection.log ###< application ### + ###> symfony/webpack-encore-bundle ### /node_modules/ /public/build/ npm-debug.log yarn-error.log ###< symfony/webpack-encore-bundle ### + +###> php-cs-fixer ### +.php-cs-fixer.cache +###< php-cs-fixer ### diff --git a/.php-cs-fixer.cache b/.php-cs-fixer.cache deleted file mode 100644 index f7c31f5..0000000 --- a/.php-cs-fixer.cache +++ /dev/null @@ -1 +0,0 @@ -{"php":"8.0.9","version":"3.1.0:v3.1.0#cf4cedb9e8991c2daa94a756176d81bf487e4c4b","indent":" ","lineEnding":"\n","rules":{"clean_namespace":true,"no_unset_cast":true,"normalize_index_brace":true,"short_scalar_cast":true,"heredoc_indentation":true,"method_argument_space":{"after_heredoc":true},"no_whitespace_before_comma_in_array":{"after_heredoc":true},"trailing_comma_in_multiline":{"after_heredoc":true},"list_syntax":true,"visibility_required":true,"ternary_to_null_coalescing":true,"array_syntax":true,"no_alias_functions":{"sets":["@all"]},"no_php4_constructor":true,"no_unneeded_final_method":true,"no_unreachable_default_argument_value":true,"implode_call":true,"use_arrow_functions":true,"void_return":true,"combine_nested_dirname":true,"declare_strict_types":true,"non_printable_character":true,"random_api_migration":{"replacements":{"mt_rand":"random_int","rand":"random_int"}},"pow_to_exponentiation":true},"hashes":{"src\/App\/ArgumentResolver\/UuidResolver.php":1342246167,"src\/App\/DataFixtures\/AuthorsFixtures.php":4122136180,"src\/App\/DataFixtures\/AppFixtures.php":3353037106,"src\/App\/Controller\/DefaultController.php":3851032710,"src\/App\/Controller\/Chapter5\/CheeperGetFollowersWithQueryBus\/GetFollowersCounterController.php":2618371605,"src\/App\/Messenger\/CommandBus.php":804514830,"src\/App\/API\/Resources\/Follower.php":2888602315,"src\/App\/API\/Resources\/FollowersCounter.php":3419286406,"src\/App\/API\/Resources\/Cheep.php":1108692607,"src\/App\/API\/Resources\/Author.php":3297757878,"src\/App\/API\/DataPersister\/AuthorDataPersister.php":695078172,"src\/App\/API\/DataPersister\/CheepDataPersister.php":3477304344,"src\/App\/API\/DataPersister\/FollowerDataPersister.php":908724909,"src\/App\/Command\/PostCheepCommand.php":619713068,"src\/App\/Command\/FollowCommand.php":3043511822,"src\/App\/Command\/SignUpCommand.php":3958972028,"src\/App\/Command\/ProjectCounterFollowersCommand.php":3532244023,"src\/App\/Helpers\/ServiceLocatorForTests.php":3003748730,"src\/App\/Kernel.php":1363986843,"src\/CheeperQueuedCommands\/QueuedCommand.php":3742753608,"src\/CheeperQueuedCommands\/PostCheep.php":61421958,"src\/CheeperQueuedCommands\/QueuedCommandHandler.php":1894751926,"src\/CheeperQueuedCommands\/DelayedPostCheepController.php":2389061404,"src\/CheeperCommands\/Instantiation\/PostCheepController.php":3179068133,"src\/CheeperCommands\/Validation\/PostCheepController.php":980810652,"src\/CheeperHexagonal\/PDOPostRepository.php":727746928,"src\/CheeperHexagonal\/PostService.php":1307159113,"src\/CheeperHexagonal\/AuthorService.php":321230982,"src\/CheeperHexagonal\/Post.php":2891606510,"src\/CheeperHexagonal\/PostId.php":2057813723,"src\/CheeperHexagonal\/Cheeps.php":3154724853,"src\/CheeperHexagonal\/PostRepository.php":3582765212,"src\/CheeperHexagonal\/CheepService.php":1317740714,"src\/CheeperCommandBus\/ComplexNoCommandBus\/PostCheepController.php":1858020217,"src\/CheeperCommandBus\/SymfonyMessenger\/DoctrineTransactionalMiddleware.php":4199882653,"src\/CheeperCommandBus\/SymfonyMessenger\/FromScratchWithCustomMiddleware.php":4168921258,"src\/CheeperCommandBus\/SymfonyMessenger\/LoggerMiddleware.php":454639916,"src\/CheeperCommandBus\/SymfonyMessenger\/PostCheepController.php":1910708639,"src\/CheeperCommandBus\/SymfonyMessenger\/FromScratch.php":2208391163,"src\/CheeperCommandBus\/SimplestNoCommandBus\/PostCheepController.php":3991079077,"src\/CheeperCommandBus\/FinalSymfonyMessenger\/PostCheepController.php":1639253186,"src\/CheeperLayered\/CheepController.php":1095309612,"src\/CheeperLayered\/Cheeps.php":2282261443,"src\/CheeperLayered\/Authors.php":2262038374,"src\/CheeperLayered\/Cheep.php":412096860,"src\/CheeperLayered\/CheepService.php":1834682099,"src\/CheeperLayered\/Author.php":999916527,"src\/Architecture\/CQRS\/App\/Entity\/Followers.php":1594569155,"src\/Architecture\/CQRS\/Example\/BloatedPostRepository.php":1969085410,"src\/Architecture\/CQRS\/Infrastructure\/Persistence\/Doctrine\/Types\/PostIdType.php":920006836,"src\/Architecture\/CQRS\/Infrastructure\/Persistence\/Doctrine\/DoctrineFollowersRepository.php":1283294151,"src\/Architecture\/CQRS\/Infrastructure\/Persistence\/Doctrine\/DoctrinePostRepository.php":1519910660,"src\/Architecture\/CQRS\/Infrastructure\/Projection\/Projector.php":3045582906,"src\/Architecture\/CQRS\/Infrastructure\/Projection\/AsyncProjector.php":3063869471,"src\/Architecture\/CQRS\/Infrastructure\/Projection\/Elasticsearch\/PostTitleWasChangedProjection.php":518418864,"src\/Architecture\/CQRS\/Infrastructure\/Projection\/Elasticsearch\/PostWasPublishedProjection.php":4256844289,"src\/Architecture\/CQRS\/Infrastructure\/Projection\/Elasticsearch\/PostWasCreatedProjection.php":1723815873,"src\/Architecture\/CQRS\/Infrastructure\/Projection\/Elasticsearch\/PostContentWasChangedProjection.php":2118218919,"src\/Architecture\/CQRS\/Infrastructure\/Projection\/Elasticsearch\/PostWasCategorizedProjection.php":3109005816,"src\/Architecture\/CQRS\/Domain\/PostContentWasChanged.php":2315273657,"src\/Architecture\/CQRS\/Domain\/PostWasCreated.php":1689195540,"src\/Architecture\/CQRS\/Domain\/Post.php":3768227047,"src\/Architecture\/CQRS\/Domain\/CategoryId.php":1751338795,"src\/Architecture\/CQRS\/Domain\/PostId.php":2578191229,"src\/Architecture\/CQRS\/Domain\/Projection.php":3903614281,"src\/Architecture\/CQRS\/Domain\/PostRepository.php":647329403,"src\/Architecture\/CQRS\/Domain\/DomainEvent.php":3682041835,"src\/Architecture\/CQRS\/Domain\/PostWasCategorized.php":895904608,"src\/Architecture\/CQRS\/Domain\/PostTitleWasChanged.php":1600594513,"src\/Architecture\/CQRS\/Domain\/Subscriber.php":3057183246,"src\/Architecture\/CQRS\/Domain\/PostWasPublished.php":1581569850,"src\/Architecture\/CQRS\/Domain\/DomainEventPublisher.php":2188579212,"src\/Architecture\/CQRS\/Domain\/AggregateRoot.php":1384618492,"src\/Architecture\/CQRS\/Presentation\/PostController.php":1644412124,"src\/Architecture\/ES\/Infrastructure\/V1\/EventStorePostRepository.php":1453819629,"src\/Architecture\/ES\/Infrastructure\/V0\/EventStorePostRepository.php":4232639783,"src\/Architecture\/ES\/Infrastructure\/Snapshot.php":2705813553,"src\/Architecture\/ES\/Infrastructure\/EventStore.php":1693929189,"src\/Architecture\/ES\/Infrastructure\/SnapshotRepository.php":3408102025,"src\/Architecture\/ES\/Domain\/Post.php":3766514669,"src\/Architecture\/ES\/Domain\/EventStream.php":3725296091,"src\/Architecture\/ES\/Domain\/PostRepository.php":1329126686,"src\/Architecture\/ES\/Domain\/EventSourcedAggregateRoot.php":2178832654,"src\/Cheeper\/Chapter6\/Application\/Projector\/Author\/CountFollowerProjector.php":3687633703,"src\/Cheeper\/Chapter6\/Application\/Projector\/Author\/CountFollowers.php":1946095127,"src\/Cheeper\/Chapter6\/Application\/Command\/EventBus.php":4075261466,"src\/Cheeper\/Chapter6\/Application\/Command\/Author\/Follow.php":1031951997,"src\/Cheeper\/Chapter6\/Application\/Command\/Author\/WithoutDomainEvents\/FollowHandler.php":1625345003,"src\/Cheeper\/Chapter6\/Application\/Command\/Author\/WithDomainEvents\/FollowHandler.php":3042413049,"src\/Cheeper\/Chapter6\/Application\/Query\/QueryBus.php":3832810179,"src\/Cheeper\/Chapter6\/Application\/Query\/Query.php":3566123011,"src\/Cheeper\/Chapter6\/Infrastructure\/Application\/Projector\/Author\/SymfonyAuthorFollowedHandler.php":608643464,"src\/Cheeper\/Chapter6\/Infrastructure\/Application\/Projector\/Author\/SymfonyCountFollowerProjector.php":665655126,"src\/Cheeper\/Chapter6\/Infrastructure\/Application\/Projector\/Author\/SymfonyAuthorUnfollowedHandler.php":2116338519,"src\/Cheeper\/Chapter6\/Infrastructure\/Application\/Command\/SymfonyEventBus.php":3365958695,"src\/Cheeper\/DomainModel\/TriggerEventsTrait.php":3747271375,"src\/Cheeper\/DomainModel\/Follow\/Follows.php":3558816239,"src\/Cheeper\/DomainModel\/Follow\/Follow.php":3891736,"src\/Cheeper\/DomainModel\/Follow\/AuthorUnfollowed.php":1285854866,"src\/Cheeper\/DomainModel\/Follow\/FollowId.php":2359216634,"src\/Cheeper\/DomainModel\/Follow\/AuthorFollowed.php":2391957201,"src\/Cheeper\/DomainModel\/Author\/Website.php":2616873983,"src\/Cheeper\/DomainModel\/Author\/UserName.php":1510036969,"src\/Cheeper\/DomainModel\/Author\/BirthDate.php":1164002209,"src\/Cheeper\/DomainModel\/Author\/AuthorAlreadyExists.php":3334256849,"src\/Cheeper\/DomainModel\/Author\/Authors.php":3339493708,"src\/Cheeper\/DomainModel\/Author\/AuthorId.php":56952427,"src\/Cheeper\/DomainModel\/Author\/AuthorDoesNotExist.php":4263460925,"src\/Cheeper\/DomainModel\/Author\/EmailAddress.php":915918031,"src\/Cheeper\/DomainModel\/Author\/Author.php":2569653275,"src\/Cheeper\/DomainModel\/Cheep\/CheepMessage.php":2806368279,"src\/Cheeper\/DomainModel\/Cheep\/CheepId.php":1974162116,"src\/Cheeper\/DomainModel\/Cheep\/Cheeps.php":2912491066,"src\/Cheeper\/DomainModel\/Cheep\/Cheep.php":931324688,"src\/Cheeper\/DomainModel\/Cheep\/CheepDate.php":1460744744,"src\/Cheeper\/DomainModel\/Cheep\/CheepDoesNotExist.php":416755022,"src\/Cheeper\/DomainModel\/Common\/UuidBasedIdentity.php":2299022487,"src\/Cheeper\/DomainModel\/Common\/ValueObject.php":365840580,"src\/Cheeper\/DomainModel\/DomainEvent.php":1910334595,"src\/Cheeper\/Application\/Command\/SyncCommand.php":999094957,"src\/Cheeper\/Application\/Command\/AsyncCommand.php":3163434327,"src\/Cheeper\/Application\/Command\/Author\/FollowHandler.php":2146053641,"src\/Cheeper\/Application\/Command\/Author\/SignUpHandler.php":983724314,"src\/Cheeper\/Application\/Command\/Author\/Follow.php":80132603,"src\/Cheeper\/Application\/Command\/Author\/SignUpBuilder.php":3218827277,"src\/Cheeper\/Application\/Command\/Author\/SignUp.php":1624508420,"src\/Cheeper\/Application\/Command\/Cheep\/UpdateCheepMessage.php":1009454053,"src\/Cheeper\/Application\/Command\/Cheep\/PostCheepHandler.php":2285454597,"src\/Cheeper\/Application\/Command\/Cheep\/PostCheep.php":569830921,"src\/Cheeper\/Application\/Command\/Cheep\/UpdateCheepMessageHandler.php":254999467,"src\/Cheeper\/Application\/Query\/Timeline.php":107463967,"src\/Cheeper\/Chapter5\/DomainModel\/Follow\/FollowersCounterResource.php":3805789752,"src\/Cheeper\/Chapter5\/Application\/Query\/CountFollowersHandlerWithDbAccess\/CountFollowersHandler.php":333285659,"src\/Cheeper\/Chapter5\/Application\/Query\/QueryBus.php":2350268353,"src\/Cheeper\/Chapter5\/Application\/Query\/CountFollowersHandlerWithRedisAccess\/CountFollowersHandler.php":426576587,"src\/Cheeper\/Chapter5\/Application\/Query\/CountFollowersResponse.php":2282427272,"src\/Cheeper\/Chapter5\/Application\/Query\/CountFollowersHandlerWithRepositoriesAccess\/CountFollowersHandler.php":3810504289,"src\/Cheeper\/Chapter5\/Application\/Query\/Query.php":4259465982,"src\/Cheeper\/Chapter5\/Application\/Query\/CountFollowers.php":2364676781,"src\/Cheeper\/Chapter5\/Infrastructure\/Application\/Query\/SymfonyQueryBus.php":3196053842,"src\/Cheeper\/Infrastructure\/Persistence\/DoctrineOrmCheeps.php":1172944227,"src\/Cheeper\/Infrastructure\/Persistence\/DoctrineOrmAuthors.php":3341232124,"src\/Cheeper\/Infrastructure\/Persistence\/InMemoryFollows.php":2218915437,"src\/Cheeper\/Infrastructure\/Persistence\/DoctrineOrmFollows.php":2235952710,"src\/Cheeper\/Infrastructure\/Persistence\/InMemoryCheeps.php":4001387645,"src\/Cheeper\/Infrastructure\/Persistence\/InMemoryAuthors.php":1820124494,"src\/CheeperCommandHandlers\/UpdateCheepMessageController.php":3545018596,"src\/CheeperSpaghetti\/init.php":1091620875,"src\/CheeperSpaghetti\/post.php":3655653367,"src\/CheeperSpaghetti\/timeline.php":1571776813}} \ No newline at end of file diff --git a/composer.json b/composer.json index 24a12a5..8e345e4 100644 --- a/composer.json +++ b/composer.json @@ -104,7 +104,7 @@ "post-update-cmd": [ "@auto-scripts" ], - "fix-cs": "php bin/php-cs-fixer --verbose --config=.php_cs.dist --using-cache=no --path-mode=intersection fix", + "fix-cs": "php php-cs-fixer.phar --verbose --config=.php_cs.dist --using-cache=no --path-mode=intersection fix", "unit-tests": "php vendor/bin/phpunit", "psalm": "php vendor/bin/psalm --config=psalm.xml --show-info=true --no-cache", "phpstan": "php vendor/bin/phpstan analyse", diff --git a/php-cs-fixer.phar b/php-cs-fixer.phar new file mode 100644 index 0000000000000000000000000000000000000000..da664146940c25f6f4cae8c156bddafe7c763f74 GIT binary patch literal 2192654 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 z zY4QN73UY6v15&P+8tl~9rwuuFWo#T+NVMZKvx19+Q{=9+euN7TiCG~AaKo}jbiL>6 zsEl3{R@C&RyxcyM07g~FdFc&vF|t^DurDyTXMG&J%;W+JdDYo9Sv$y(**c_9#tVk= z7)RG)N$MB~jiV!h1+qkej)7O0HQZmS%EfWBd;j(l`4e%(>rG-)6=56(M60msqlaHD z5J{)ox&dAvu3sX^>JZ0OmDx+EOO<^?w5auG5mi$TD$u2IO!)>s*x1u{b(- z%7$G^Wc*U)VXGyE=E{lTXq?+rB)5+%f?5raLvIPPCk1q}s3Nz@U-RBqQd0N&Q_6+= zqc!*>WOAigT1D!|&Qk?Asapi)k&(}S1dWf$S@ohj<`Qv@V8tJekXepBN3X=E;2!?X zac_(_YTBs0V7w|Hi^U!OHvWcDMhwJSVTKh4JTzYEPqR@e!b$xaift4M_|a384aM_6 zj!%JV>~AgHirXQ3ts`*oBV3J$9H6_eMg#3ysDww% zUxX%o7w^;DDvCTqqvzW%k!RsMljt$+O#{gsSk28SnYcz!T6{-%tlc;ooY_Vz99R>V z#9;H&m)e<BshmoP`=>R_>s=za8fk37k>&*--$ZJR!ue>>@rd(3jOU4HTvWT-Ty7Ub5HO{>s= zC-hP1B0wx^d!7KPNr$k5r7aWTD9fkACx9%v$uUU-XlNYe_zCLjaLo1Al)Wo2Q4z(E zSGE#>W6zcGqUt&_ytwB{O?z#Y&dbqkImz$UfD!eW)bkC`{bG9o6uP{6m@L(t;&{4D zFkPb6sZqA1n1BF_<;>c_FOzH&1}zl*nB?cyq~4~P4r)EJbwLP~hS?sf`t2&81yWcF ziMf?_1u--oU-y=}ZBm|H4a4r4p6#5fI4U9h<6-7PH7fHQW1lQJECmXY#W|Y_ z2gY+OU9X6Vn0m*uUb8wpvaj$gVZB8%F0+v7n6!ZolkibDf3+QAs*wRC zI(oK%BpyG}c~Ed>916xk1s|lb%t{E2ES|Qb7koIkv-q+OsV{BoqS_8@Wfk==J2?d^ zpErw0203tPXYdFXU!t7hP~EYhc9N78n#$GiI-y`}#pEFx`1z>?=Z3nyb&d&E+RY*IVY zssc(=FNs(HtwZlADvz$4!|glc2D`<)D>&w?l_+m;Nl#e3TYX-#$Xj(&BfFv_-W64_ z7~FqmQ8&Cz;sOEN>z7y4_e%AQ>#1#%jD;;Nx<{m4#vvc**WAGqwI0?8IxfTDOaorN zM_3sH5Qp$dCA|0M#TTfb2#i!xE2R`%~(JR^_+52FV)PZ3}vUd#_R0$Tvgqzc>W{({hL;31pOPG`itsmxvM2bmkjb z4)4t44e`t;x$cbK!pi;b3Y-9%ka&GR+_<<%{kA1k2%TP!hbGj73ce`6CYk+HF;`HZ z5yai#cA-0S{X+Vu>jnkMuSRdB#-11x@1w*xjt>;49!ZT(t!NXB(;Z*@yM^yiIUE;Q z;2IYM11-@<+hn9P_T@%vESGmP&+Z?!#_?TR0)s@D%Bmoy)YJs&z)qKi;$eMkrL6d5 z^%VK37y_&Y6Ek8^RZCUA$)+RQu_ps!fM^o}Eu!6+^@j|k<{cZ7>^MEjZj z1&n6#7noE0v&FkqEf6!BK7m?fMT) z8ehi6W5(N+M*BTpmX+~pkKzXsI-v~P9*TL)%?>FM_83+`c}SM5%tDMQgGqF1Y~h-T zeq6=SJ`R1t!eS47k80yGxy09+&)Y%mz}+=r9a-+3D>7~TG9EVij(HIHPH_b`B}X|K zh_MEzeiF?!GL8rJ1XJt-v{Gux5;qnmoNA8=pC&EVdN0^_TyjmF7=|*6*-S@8p& z%6ce4nq7^0bM}S6)jgR8F!cnD&UFKH!DBQ5KQ2MV(^hO9q_{!q*dg|BSmaBXnny~d z?wy2483imBc9dkRq^v7MOm$FiP{}J90jRDzLI$9%gr0M`L&L7D5Mf$purf|E6D7SQ zd#C7#CSPt-6KF`-Kz9L?6%P9Y3WxD}a6=s?wo`6FE+M@rM$UnNNRIJXwyk`Eo!e$E zT#GEJVn{D2H(1Wy_sZ@yZFuQm3GV%^moJ{JYlX7#r+E@txXjEKvm+v6|3A77o__wl z#(ti!%YR~q!^g1&D?}S?Z*Fh#?dHbTI{&-2{o(~G6H7naYyRhw(m`2IQnWr<=#>>< zWm|4Y*mf$UFp17R6Ayox0&CS+p&~9xYylyP>Nl1Ha4R#4tU@tSc^U$=Dgjt8j`ybH zZynmSCfdy+uw0a(oe*|tPF`4C4ZM@6 z)*o@zFv>l^&xr);`8`UjdVfi0=x~9~*lK=fthF+Cs#1`pK2MwBLK9@8`5^f+P33)8 z5&ET7LuUrmf_T?v4Shwc$jeygBTHJ%?`)w(Tx<=UKYc!E*02s8Zv9niosO=33AveT zU=3&Xhq6@j=~Wxm`w6r!txy$@6}{#VZQQiE+Xt-zA^m zy!dJ9O719ISxKJbJ2Ph(w}LRKCoPI4piW;0(UlixD=T3v@Sq1vjx!l!a>|(8YR;>j zC=+75_#V4HHqU>SoT(xFmwi2H3X5Q+#Rx$#ln9NzfhJxZHmPKUi(#a@;1 ziLQ^8?c;7kLJaG$#kx3y;|1IcWfuDFB53WbUdR>>1y4;P z#b##sreVjfMBLMUTlff3T$&6_x#6dEDZ#Erjb5gBD7aCHTT^SdgpY5r6nz z{KMeWc}V|9rv8RebXe0j{xL3Pr0Vr6+{tK0r1Z+l!fa?tQjH`kJeqnq70O>O|6`#m z&Vom+kk@m?B>R2S_HxQpZ$rxzgQDZ?eMNC_b%Zxv{^**W;B=KW_*#E~`^8*ot1_$g z1B+ap4v^rc3_j$dek4APavS?Xxhg>2O`b!ddSVzIp8}IBpkzLwH?XV#}mWT`vrcn{cZrVN=0(n!ohHye0NY&M&)(My# z?s;Xn8C8J5(K}0DeDOtleS5#Xq%^vWg0{%5`m%L|E8QPn^j;r94Ca-wKlH}Y(-tmu z9Y1L;|AhZM{kioMfBw<^_g|2x;{NuXtH3`GY=`eMS%FBvrRx;LJnM$jAFR1T^CqW@5VFq1&YA<6^e!>qV7YI_lya71``+bERO0osH+SgPSyax(vJwzwywpqo&;;Hzg7w!WZ zhZ-j)uLox}ko4`9)XhxigRLztccC}n)uQeTh*%K-fo?fNZ8E&_Kx^AMlh)P)M~6RqU$5vfAVQ+t2$(MBa1N1tD2I zW6j=eYOP$Ek(rT^agSr^Ai%7w(2e#jTiR%2Vb8~+*T3 z<%a@~{X_&;Zp(`ng#|fw73l0TL#lKuo zgsn8J+?!-_ej3VW3-RNS&xB2T=6`<=W)tNd_J%)?K!jc(`ON_ea?n|N+sW*V`oHX> z+1aG^_~}uHsh}-|KN!B(Ep(;{Dz$%P5AaW-x%xipjPaT>#Ic+96H;lbC0kT0|n z?K|j@sTbG}|4CmU_E~3(w|meVBd_7{onEhZhjd%Jozd}w-ao?!@}-5S^YhmI`z=Pq zlhvmj(Yl026?}JZ*!rXe%SrEYqTD|6SHR{3cBp?QLsAPS8VpkWSYmnS8*__`S*`|+ z8>}opcPW^H8in<67RB&o$G;;_zS9NX+;lbAKkt5qc%23>cSBn(u!S`EX+mly+n|`# zJ4FKV$pGTiU7wc&*}?udOh>JkP=32!P{C+)d4-sT=ZFNF4*HNYgCLb3fccf%E93`^ z%B|(wb87qw?Zc6&FY5XA1uS-wyFruX#W@`Prohd({(0Dw&xN@V3fo}JupYKq`V3^h zp7aP7!m(C|H3wNxBM}gSWZ|8O7BX@;7jP#)h5@|X2>&EEih8fHZN@M&8x|jnJ7MZv z)2=Aeq^-~?kqG1hsQZ1%Sh$)*5)@WF8p>K6}`oj4p6Bw~trEF+f@*$!Oc|!huFx zFB*T9BSErV07d@64#MP_tQfKl_&3b9nyq*qt^8~OayqZc{_gj?M;!+MSXfDSJbPsQ zrXeljTbB!+L@0YvNDcDz4^i-U69wOr-NF!(5iwFg^i1~Iix~+{+(^=c+FAuDvK5E@ z7rVcxoJURs|6J+~+#z@mCnSBF^KQ#XfzT$oG}X8v-WJDxG@=v;B2x%drDV1>L7B(t z<|bx{|8_v++obd+--xh*Y3Bqp5_?zH9LFom1ismco@P*J4gCf>GI_Vv-*~andgdg> z6E7*AI7#stf|h*!BHyqgQr1)WMGFmfKNFRrmke!MSbF%Z`&S7_zq@kB&H3j)3)3&s zFzhs7iSfS^2y`fFdq#VcpZsKl5w;t5ei&UNN%QpusyL8eZCyb^@9{p_~bx-)}L+sb>q{|MML4AeZKM8#zz}#8+T-$YrCQiz#>4wJOdE>Jc2_p z^4Z8IR7cPXQOqc|U)?@fQzsnwQZ{%OUkU z6$ZCmqMS_7fgqEX6!LuV0)Aqd!S#0+ImyS?d5&8WEdSj7$b=UWPfKb~5`6zZZKt~@ zul}@pe*h&vNG$2v31U-kGwA~SsXK_GeQ=FV4zGtm&y%D95X|-A>0MWq zcd#w1`ogt{&O>NH7KfT~HlEX2_ei+R$26Dpt)8Y0Uhg_-5844k%T6dIGIzLtn~a7w zSa+B84IgV6vM1xw&oC%kk<^(GL|s&Sm^b4m+lRXXLb?-vsiW0{ukVX%l$Jzl2{_40 zrPX=8@BVVymx2^FF<}?1;LFTuRX$vD=q;4y75Dy`<2)LnjCAjUjpxnfV3F;x{?K+_ zcl)D7aM$`{<9QwahbyYP$b{Lr+Mys()56Ki6Kzucn#cMG6+ipk9n@i;hsJRm|79I4 zYG70e)TJ)}RI-}jxZ=NBCAdNY!Z#=3n-l#eJXmHtg`jD5>f`A*ON@6ky?)+3ltd~E zjKtPBm`uCEKjYabHSIo>_<-&=V?<$eajsY)KJD1Zt~NZeCemIX?IFH^c~RzdzNh8q zXLW8(mg=0SF{@9CI?aGSoenO#I1*_Od`dn#wweN6sicl)=|1k7xZlu;y~VvXtB>!Y zqa3};t`!f6y`9kqh-Y8R<$7e7uV<2FnE_XD2Q`18q=AJ%^5CN+{eL`uRGE*pJ^7Ez zi==t6EcH&m?ab`;+v&}^?Z8Yn16aPE53NupkIW611E-ZXj3}L~W_{hTURWYJ0ZDF` zx6Y@1-u=rme44+|y;bqQ?4F3ELlq(_FLDW@(uC{g1PtW}EBv5e9(s2vyEu=*ECHX{ zJ2auHg($S3H;eBWT&f`F&Bo+z`!2u}^9eB$V0aOUF((uwY3>CPQ^<=U-_;?BVlR%p zwE*QHFa(h+>!eT^2h! z-KR&pN}m>=BQV2~5qJ_h7Y#ezIND!FTnh1hV|TC?81jwg_J^%T+}P9vRQMV|TR6`U zgPU(&6DTp}HMwFs3CnxC`sV1k^iF#~82P-9aQA_0lI{J119Q0U07Gk6J z)h!kr#f<1GZ2^lP^qFP1y(%3UKO+WwX`B0j2EX3KyI4Qw&B#k**)C)H0n;Rwf;~}( z?-cmDFPodxC<|Q91T8lc^EBfPTm;r*lzs4Xp}^rM&X4Er8lI4U^TEo9bS zUNSDD&brS1ExJm>B08K#`-#(E3dKWnPcVvq-VmN1et{24w5e- z0H2P3NIC~247@bM%A=c&^}5mPZQ2tl6cy&g)d?((L_?sAlaa)Ame1NWLvC)WF)4DF zbl=?jQhin1clhKE@+p)HN3?*C)D6GZWxr!pOz+&dABXJiPj1|WI|Z05^60?J?c+~x z4v)+W$liuC>YclHp5yLe~?ovE`mIQsRLdrY8HJRSU?uyHTny~S@a@b0)OWKUJMo{ zvBqqa&>E!R3h_Z=mp+^a-vqv5V8FUMO7f&FJoySt>@8lCOT_Ff++PI@^k+-ydiChe zXmG?1pj3K)n+hNjCdUMV({=5Mdmf5%VP&6AlyybyolCR>+LlI*!ymQUW2PiQ{UXiz zQ!*pv*v&qpu~o2tU{2HvFs0`BF!qYTJ`?6gxg9~=Sw}P(sM|hS7B<2e(Jcsd_PsByct9}{ku^w zF8a=+5qjZ0{?;8Ug}seUN0iy*VIiYv({1M}ivS3D(kv;-Yu}!UwKTdcc?4UBc-z*8 zOPbF3dU+rchu-?&L3(`81W!3}1}c1*5AHsa!WI^U-pFSdWRQEhre$Ey@*ZU2|_A zu*j>uOuut)qUx>wtA`h(p7}d<IIJ~Pqr=25yvCrRVkF5Xwu`~WV z*!S%r-Ye0IzucP~2=BqKA#WwU?oIpz#yDHo<5QEQUC%sm@)RGdVk_4ks)%K&+LE0SuPbh_?PbI^CJgc@NMZVD&@Pc-bt8X zHBPxPNz1*DQHP_^()>R?-Uhq=?yWDljDacDvgmfhisXhnICBrSu*VRlI3o@c?&Pm8 zrD73?iO8Dp+*gB!veS+`h-C{eMLLNQgyt=%NMw4iVfPJ{k{vV@U$+w2O+9l%IZ=2b z=ch2Bo`(?uzl!0+#SR8p3~S+Kjd{Y|_S3^hKXe})ZfzqcdnvPG=lwIX<$}!%Lr@HbMO!Vp3pjsV zzLc?G1GPyMAICbzri?i?H=DR40055kvR#gzdfL$9$r9KOn#79SBw3_$s(~VD(3V@+ z82a#~2h2za&N+))hX&D3->oS#!I5n_Mpkx3EKCc|EIkhemPEOPh{M;l zd?M|&JxN%1Aq;xv*k-C=CiT*00bofwVvLE;5zj@5`08ae<2^|EWo?x7E>(}2}zaiV6 zYAfJUg$Z22q&QIxuuyu^tz9uKz$KtiP`m;7IdojSy$XcO07x-nGJWmUV}64mTEzK> zI=IA{EE5{1OSqIFg)6f3Nht7;9538VUPD{gvi(F{s09z7_DI0fBtys(i%e2$8!KzA zo~6)p(XT`q;cH18l2k+`f&*6@)de5JFT7D(Ab#n$C88?#9+oZ6J(3`^TW76uYwE76 zs|!g=7KnxuS#i||VF*8*#Keo**Rsue0rA8ZEz(2t;=C`a6h%rf%iq7m;RD(suA8WY zzYAhwIj@RTCgOm?TqbZi#==PDqOenWViDJ>A$f@RM|13FOYo?Zko+5KI!rz$)97~E z$;PdUTK_UOp&#%*^J-(;KKr zK1Ns_uErlrl^ZuDv_otcs=H+?Y{TM6=%Ch7}bMc%Q~^lD$dS1qC&~eS*eOlcZBoI;>vca)|;buCLBu_;N!u zeu}APAEL5nzOK>&%c_flKhoi&J`i9a&c|y^Yb&2clFM=WU9ploQK>)sS{Bg}wGh@W zE_w^hO)bzf&Zps;aDgcM;wFfTCMB}+z#YGkjqL_!Q*!}3R9@nACTkv~=SA=+jJ5zG zC7Q1sIhMz&Dn|I@l}u_;gh=U4I9K!ZRquvUmD;sNGGs@sO7L!x203;oD~X=qUiAcs zW+9~P$WgbvRH!->YGnS$QT@{3ndM38B6<)70gDme2I0dRflifbDJh+G#c<;cZVP>a z&Lu(6#ZH|p0)}0Ih{ITLTqbrC&pCZ7P~yspiGCNlDk&tUG%2T@=_J7ni5RuEz9QVM zbC7q7hD5BkS&QtmolYlFW7b|NRI{JBMe~PR_6#?Dnq~dr)BWwv-od`R%H_1WG1&M~ z@ACOs&sjt2^GNp(OGL>q!Hs~fwwE6X-|be@tq742t2PC{VI@6^HEUus7Fxoa;|)1fATx;nR?Y-QjgH|!uG_e2+Dny<~xvp(&x+9u)xm8y9C^ZsZUG)V{@i#b!e<>PGc4e5e{VKPl} z!nLhIi2@}EIX_HjcS`vJ1PcvK91eMcntYUz0B(-w z;L*@4nkM4^ZwPHykV5!~l0sX*l8JH3N*+W5Ph|PUPqRWT;%>xi$GCOGpUZk@jC2A% z&|W?v4H@?PXSh+E<_{aT7W9Bd74+_`>q|gD-elbZ_x=$r%_!CG3Y?ha(n8SsfYeAi zp8{T1Ue#qpf@Hby=$Ou=c+dypW$_MY0-8VeXeMQ049=iQbej%s;S_Y05||vrs%$4! zte;-FZx-0fa7W9C@dhr02Q8311v%TZI?p2Or)vWFgmaQq0=NWJLjyj=^E#yc?sjhe zPOdTL&A;KNXQN;6rS4_e7GNAt91lbrFa+D6foZo^16U-CSQjboqI}zeb2;n7=lX0? zGm-kCgnC7rwWHsJ(-L8x!r_j(bRm#Y`Hz3aZJ*=Mo19^eW*Zzp#-<;EGrQQgg?r))&h99AlU+p{Yq;v{Dzx?SSKge@?u*?u>|n8f zGnO~rN|4&XuW{MAL9+ZPCjc&W z!x4ISuJtC&IrWDKgm0h?3UvB;!Vc3@T_{mbRrJdO?-m=oHgmV~8HyD6#dHe-k?fm@!Hr1&^Q)Pk!GT9BD zzuJqitI5JOZ|OVO(;9VJ;M_zv1}GI2-Q>)r;-AR&8TIz$+gij#9Hf^yq6GQq8-{vx z{V@r%Ct~O$@c%**o(hK&$?BE2#svqyMK;Y{C>OZY;2Bd>hBU2}V+BitbI}~LrL|-S@(;tzAkw45Ik%g$L3Qw;Sr%*m|WZY}4=Q(-Jd%uhm7~K($ zUSFOgL;;bPNGvym{ClDio2b*E0i(?Bsu`J?6SsFUII{-+IVdOo#bH_In?m&fW3Rya zAnC5E_8GUv(o&$>@H?e^*>VLYmUk?}9e{u4R&*+9cDA=3J?eITc(U8=e7ko9lDbB^ z$ZX@yEsu5|J!DIUanEVl+3M_VOIuAOjD8*exr&*MUiHt^X#;JJS2Qj>2kA@6S$DU1 zt6(&~wV~a6dV~9+;c4SnSi(yn??XxT8goYp9Of;htq7rlaz%aHoBX5yI(aPq&Rfj3 zHS;AriD$k)LUKVX5a$Neo~IDSo+EK0WlSiJG^OqACI=|UU4b$5go}H|`(369oAv(x zT=yk$$U&w zx|mX?p-lE2-v>gT8xEpi1aem&VFgd&BTzXLO-Q59QD0>=WVM9BKl6J?$CcB)_hJZ{ zWcY%tLb>zW6Lso4{flX@Z150dyz(9LyF;ft3#Ztk3I6bI-W)>9+4GQgMDEJ=^W7Z0 z^-Y>LU7Iu`kG`M%J#n;wdXZJ}jpr{6o6cApyqXw*0pyla>Y-+(cwUjuR~U5=3YY%N7d{bloM zwDTTi4oU7Qd2LBR>Rp2>SBa{8*?bc4I?98RjoCbxSreIsTFp~vhQAqj)-Ea$i%&@d zlybRW&F!$`i!@aLZ_=`9Y6MN+Ed@f-xT$Z)?3dGaZyITs6_i?lQP{7^LIBTkf#u-Q z%chGZYEtJhr9qW@#G3}*g>M=zGXHAcCFUE>zQBC58B7Y=H1H{SGwY_1*R$jnHkiRN z%IoF>h1U`qT#y*N06y&gqRD>~GJ#ih3CLcsm_QW~I?zE>Ubu8k$skIJnzm5i&X$g} z4PctxtZA0@De`H3etIt5L1;RqwN|sSOTU1MozjuGmK1vxn#_DJ$ANUR+ym>ux0rV_ z^7e~N!Klnbsd?7~Legj!tXPc2*1Bl82(0)>QEv_iq0wS1mh`(IAjy(6ts6Q{+RcI+ zx&q|j#}~7(MH|&yK6-ABZkye{yB5{o>JcHll-JBV~?5-mo;cQO7@y)Txbu@k@7#D=Q+`|5JJTb>9rqFNR%n%9gvS*&4V680U((eXObX^_Fe%s!JSrsA0a8(wax0%s zDhlesBGT20h{7%If3k7lynBgsFx zTX3@ayoo*lna--%H}1ncvz=>VCn8C@>olH_z9I9G-vs)mdP|t?Defn`FQ$+By-dri zj}BlQNxyqMN*kic!09wK3=R9pBN=}+%6b_MF}F$o^m;n@xlb)aqJmRL0atqQ?dV*-N<8B&WLafoALDOK_4F8nj}1aH$}?lozbh|);Y+97!H!R zFUO---U1uFNz8&E(O4SR-F3-bn=F#77kBXB-*&h0pC`MATb+YLcopCKk~!+}>btGO zy{!k2kYR02e9hK={IS`7$-Z_DLVY)Uw7F>=xiDn4wN`uacFx)T&=8BBL9bZQl|6Cl z!N_}VzIQFqn$YPD3-^ZV(4a+tpWqMS0<-s%U zYjd-n@D;vUZZpgkIn*UW`9c4ZDL}xpTy#069EBQ|r|Ccr2a}(W#^Ysw=*r9Z8I?&z zha*h!l$Blw$ftXkpx-RdsP|Qfk@LxT0P_b*T6w=V+og~KB+J{2tCisM1Ll?mrr8&y zL(XHZlG^f?Qe((wstbpCzE&^`6gT9-alRz&7g75izl#UrAN;tKH1RTnyp8~ixd z?IX~O9xCCs9lQnhhoXCdvsYJz(8s$j3@Gj_pg$132YfCa#YS4o2;j2|Qhf z({omZLjE{S#MruHD|@Gf-2<(0&*AsN<-PO2CP=yb0%wg$~PT>L6sin&WSENo=ad{c>4M6?OR z9gA@F?MGWjN9xrt4FHf)F>ozsVB8PR_u*$JKD!PsMv++TWST&Bl|+a{GxP!uGLZ53 znkBPEjQ7!>b@+TZJxPPjsAo~XWi-9`vA_8|bR2d3(=Z!1F&UueR56l=CO`vZQu^dY zCtL|`r8rlOo)hQs& zgt}r!P118G(w%brHysZT{Bhupq-*cCFc~pTd1K?^yC7U5kiuxkkBHg>gdP{t!I$gl zV9$C0vS%vye0n_V!BW#WksA{umcH+4~xs7dBMCKf=KdaQXtX=gNy8%S$!3CsVl_O_`0whlU9;0y!ge9G$)tRmJ zkW8QyxB9K0Jy=ec0d)nyZlj(oQ-VHoN;y7opdd}GuTd-76VH7@-2o}}vIottbnoO< zr%b7)hh3ro%nYrQWzJcB*@rNzTBKYPWit~Elj^FdYcfhB-+}Dikw5Ne51_+rl6Mpq zWp-cW|6NDFt*o*54YYQAiok>pqBP3AQRA?j6j_$s}mE+8>_n39DyiEM}$Z{KQyk4VWb7@Ej_EpT20VgtQx~Kp9MM z*sre+koi(|*veKr7|5B3$dYg#h<>-YOUx)bh!kk#Zg*3Wpt}mAzJ9zGK3jA0NvHb+ znrO!CFy=EfNO@6r|A4BH|B|)ycN_GJ&}eHnaa~3ylf?_(X3N8a4ixFTJHS0p3#8IX z%4?B{BlcH8a}W(eh9AJ;h0R&x+zm1*o5dN4)>?qWF;z9Ts%h(FMe@{>!d?X>WVTQ7 zvUr}z;Q;Y))unqQChC0Ml9F}$2F9AlG zF|>*DyuOx!J$lbLPIqqKQVj&!0ArJ#g_Y84PsFhK9A{ipGvu4ARnxfJ@_SR%X?@Fl z>lQ8!$54`KfxTn`tAUkReA)ZC-+K1-GyG8COpZ1q^x@Eon7r9m|C8LNU(S-fhW5e{A6v{u#_6`Mg(1{*TG3 zN6k6@CX=YP78?Ghy`N}Yx&V8~W-w~@f1%?*|14n&Oa1aK+17GV#iJK#?jmM1T`t<1 zkTD*)eR?ffqH~yg^T=zyLmTA&s@cq-^CV(X*0(*u zU$WNT;)LPNUM4LIbJ;so)(e)_F8G4ggC-Z%ZpjcU&nMb-VfjqgEt$?x8PBRd2t9Eu z4fSfQ^e*2Ef2*6R%m%VWgv1%b@JL@2W8*jV&P>f|ve{yZ)|C~vyiaZj7z6re{j+G4 z1THWnd2NO)VW{zGm}~K2HN{50R&_oy<{@EzXxgii8H+e5&q30(Bt3xJO1a3b2hf>s zZFe}$5Ipa=tyVVGDyZqKH(NiC24^7jH%o((aYyb3q5&=ES<44#1oSq@VB;Ij9VPkHzljtv7c<$In!;Cq~L70N1yUGP0BcJc3ahqtjJk-S4=sy6!e6`@oS9b`eMs)cG z-zX^)JS5Vy9}{a?wmKP}jhV@gEx1|k8%L-Gaj~}PR`F12e)2e(*hEs~E_T-PQ;{by z)%UYbg;NJm&*PwOS5AoDV8$#G^<*h2`QTqct#UYIqwTOQxP{n1Q#9&dc!xc}JPDVxW60Jij z;WVQv@Jl{LE0{@96PEo%5Bcf;xE!k49qZ1g%M#~~h@DEMruq&19(hP*Bf=f&)5WPU z1*vvcBNeaaG%{(70MXkFgI^xQ6TSDMuaV1OmU-uAW=bdB^_^?4dmxj5ylsN( z6_j4X>E@<;4Ifwcr?wPc+(e9YVB8HZ&mYx^)9*CWWOMWU`T}I{!uwMv9UiYi$AZ?3 z2dRJl-R|KL3h;D4>wc=-XJ0!9S|3*PVXPvZv>rb_>QEzS z6=cp@&tJEmiATBONB=DT(p<-?`qNvn@yCT=3(#8+N5EQ3+^9h$C}~nOOE9T*|9mvs z_;6KA$+84W(VhVqt&czX)OysGUV%bg>Q=AUUeEjhdVH2y{>kA+;T-SHip-zkgXhnS z89wJTH$$2ITi>0^+Haqp7Lc9tnS%^o7trRr6G*@P*+=lx?k7K{ZW@)i8Buytw+{8W z)qF>|s+BbTJ>q7f+PN83{G9`5j58EhLS{hSj#Y4rDEEzYLfPICBHA(s%*gAdF(5=` z1FxTl`6vXrw2$ZF!2;BJUX%UZ?{|+nxg-DVk@cIxde9hb1Dl1$B6M-A(*do`Q2mcGWBbaW^!Naz`C|>E;k(2sgm>BM^D#JK z-!c>4JM;r`ZaHqPr7;bKk?W~?f9Ti8QJ<;fY2o}VH9tzwA}DAvnyEsd0mZ6?G^jAs zrS*D6FQmK?-%!3tqx=(s`tJziNW7!BN0b~G41e|pt6|8d-M1*$KAwLe?PmWhHB=y;@$K>_B zFSQH@hlHt0w%39j;y%hH0`1Dt+Hj-J!^53wp?(uau`r__$`CY@xB7!tfJw zVGXMm)RH^_4YV|!F|!WD=Ah6U?`rD;%bcqPp#e@+o|8 zqwfVg69~qtV|QK4tHK5l=0Az4pV@Mvx7ZD*idGuqF5}g{QwWIP3ZTBwfuoO)YgY>B z)yWC#5A*1TAV}=FlzvXTMdJ^(WMDbo1myvy<97B!s=mzZj4P6T1n3p`bab9uLTN+` zOBy>lH5=$RlN}HP5qx8WcH1Xw#TRRAt8grH(b%JER~)oljAekZ%gh2Kqj@e3itFj7013BO!l7a0%Pnw2 zS96wBzmk!hrB&C1kKUbSWyeIN!am?$oX`eXynX9772Gl5Y|W_bQ-^HPuYGo&g}eFJ zbB*RrQ%q0TKQI*I6Zvc2`(^9?K<%=vb$CvmP6rqGoc}6*)5=OCH$VJhZ_DHX3pM_k z%>pzUT>kdfCudPyl8v0zx9t@-*z&DD^sPdQxGhb04i6} zMOKEDwcR1a*;8hw0d%c4LeOOFb@ig9+9h$wHVXhEb4OIR(XTkUk7k+%R9}_3R-c@h zw(R8OA;hEp_oMMoCnwI~8mn3l&znrUm#?7^gA9QSkF-mI?();V3EmH@Fv~_ib=tIRLhenD; za5|?M#ZtSl_;S?&+hw?NhX(QNNJh8087-!L=#-fG7r&!I(-f2vcnIk}4?>jZNGTM& zvA<}s5-*>VVIxZeWu?foh_J_MDUEW9Dsb7_mW^@ZqRbKwk$glJh>aHvVN_fyQToK*YLjK3it>rLnV&Qb>Qj78E&wBi zDura*U}F^HmbhdsuTNi%#%D0PS2_a4=~8~Hy~9MXNWl@Ti|Ma%2`c?GcX4rgJ{V6R zrPRL)l2he9AP^P=f)+1Uup0f&=qXP7cyfxYW9fO|Yy|~GZkwtMRvQ(YW|z6wyXn@t zy{chQLQaJ5niKP?sfGeInn8&Snh<~rWm$}7UdN%jBTzVZnTMxhvd& zzcg#4)5^F8qK`SjXBYh;4>Y@hzDq)r^;dl@)1Zj@iYA){NL>63p4)Qn7_oQse{L{@ zdR60V;-s7!%ERJ)AMA{bdzw7GIz!S#w6rtm_z({L(HG7e(0T5xmJC%PZ*5pe|-uL z9=HJl63rA(l-y)<@)Pc-C0MVO#N1C6~@5`{%+un zN1%C&`vdF7sB=)MwLw01Ubk;YJ0vxF5t?;!)W3x1ht%wa84Nkdu*CAOBEPGrh&ks$ zL`ILEdg?f&3qA@kw)w&$Y$pO)cQj#}=P$eA?XNuiE0TO)WlG zNI!3e^z*Jj`gt>?pLajwD4%b9);x;L<@1fkxqROJv-a`l=05(SE&kHf;?FvlKR3_i zFI|D-FU@fLRp;{8=DDZ~4MD+i;#~-2Del3p`pdA+BV5RS74}-4r*LN^xnjL{r@L29 zkr`<~!Wym`^-~HLP2h?h!a1Or?!sDwE`?06Cy$uF-`YM)hXC?xiA8wyngyxZ%V%`HTKCk10HBSz?++81&GcF&bVQ5-8ymXw?khdo!~px z9>?BjT0^?fcM3$fD*n(p(`nP`Ze>-1l2X<1;dit4T!b4@FFSVjt<<9DtyH;`u#X@g zAU3zCQFb)V2-d1*!bjQ!8AFVqsDJJg=)(iy%huZY;Fm3V^kg&{usj5Ph_q2ubYoVt zeOD?f>u|sS0)#W}5G|Ptvbh}{rtmNK3OvQ9JM z=LA_oenO&=dtZiyZIcJ13^^JhOP=K;0cC!LB=^vVwO*kn0P>ihq0SI#FNpce(OK3{ z2VFq!XAd*AFLbz-Q%zpfH{uI z0R%FA?T+b>nd`ffD&(lUK;#FaK%{~MIGYhT3nWf4*LPZZ4Dn9Z;BYK7z-ja295UrO z$B}I`ZrqEU+Dr4st-2elN-K$YK8>$kw`!m(6LVQmc1D;Y$kbLRpsMhUcHl?#!xZX^ zzEpE2!kKTROAh&2Y#TX6KMoJ{V{%xo`b1Piw;^?+!cth&Q_yKRo)A69UgSRm@A9^`KL8|0L0T+mp>p2ol`BFCB54%TuE8@DGp-W5T_)k^G z`9V1;1~|+}d+s{0?wJ{45ipKFp#{_Mwb?e3_b%?7t74n-ngiLp(AjZ5V+_TUqh{vH zr<~xv-0LF7^yvQ_O`+0VbzzS`z0r)IaRqSR?j(3oPT|uZp^^rkfPMfORKx5@LB2+x zVzy9cc&%st{-Yn8jmJ0)s3sIrpH`O(R23_ww(#{hgYLaAPcM+#^sqO40d_wh_Y?Rs z<{O>`-{hZs3R@~t8FPhZ&-Pzmfs$m;e1+i4hYTrf7Wm~gw&4%`$=lMOY>i)BUm_a9 zllMZ0RZ+Tp9}+k@Ma+!Pq=R|yn|=8-bOof#lp-iBbVMHnHxPt!dcCvrs#ac#H-fEDM|8-yo$>%i1r01v z*~vqVe4EX2Mlk+%lUXakIm%%dR zyEVO8lv!e4j)pbo@+K(X=R{Q{8Z z9Kr!I+dKBXTwOBn|1yiaR0awV6;Z=cOse=Q|FIjtT)i2pFSQ%EpZ?``<6n#NEV&*3 zis@P2*RsYYFp5IvUn)Bb9A4(7Ucteg*94SyUXxo);9_3p4^Y^j2+OSi`w#T%Y91WOXC1kJ*ppCe;-)jZ7$7u zO&c&zYWl_svNC}OR{E+xl!4>P;Ul_-3ktZTIMN}L;k03Nf#7s{F`D#?FTpjktXGzui6BJL*0_!hCFG071GPU0(KzZUGRyRLi=j0SJ7{b@uZ=_5GCEO23Jk38gdc zp;!4%J^<#?noSKMuD{N zaNs-{1~!obGBc;_o7ASY<%F%h0m#tN+B(84xG2dP_cLW)6f_=80*0vF#P67#T%l)M zLtHKJ(mc8zqx_HHXY^IH-{=$5^$B9kps-XQ+yRF(3q#Pb>`-0$XhTw*rgPEo0?F0f z5yOHT`WI`)aF~#+t*P0a*2(k^JymUT2k;mlqwLXEI8~bDTox-Y6lmmw-u>hNe4FxW z&s!Wk_%{?k>>fPXJ>2RX90IBCeTmB`>&F`{0lxAa<@riK!j*Ju)5t4Kq$x_616>Yf|%az2NSqa+paPo3+?#XH~r5TkR{RRp8 z7e`KDE-)vW-@Px*VX1G{H-|@{?a`n0#o(B&{sj^%{_3_P&a1T0_c$Hec?}ZXQ3b{S zUBIGmbOF+$@i|S05_txxH@&gNX_`fKP~pvF{Zt3b*j%}7#IGW#rfpK8kY&Q#MWo8L zKqm=W`I8aGQDKRKf=1}Cob?f;kH|>+mYhzztavo}yI4KNpd$Y>1b|W)q%e26Bm%hq zkPs(+?P9M^+#iLh$-TIxoFjp#*Q)Ckql;ZCxV63)bq#MRc?b6_)@C|86BOW*t?3Xl z)?nNR?*=-qi8~gy-pyWRX#Vjp*SrI5!$QA_|M1osd~thl_?3Eas6==wGk|jwy=>zQ z+jJ&#-o{k?Yq@54piE!(rY)&xh)Q*?gCsfk!cM}sVi2K^FkOwC%o6IpCC<7?e0{ft z+|VFWv~TbXYvJpV<>GBCK%%O2752D8a_7XyAZ6$E?^drM*@1&p(cBU4CKg*#h)8S9 z+k90#Ve~!8^%Ph6b?HqbZyJ%j<*pN*fDR0X)50ItD7P8)#!AGX`;8RYK<-LhKN8j&`hlU3H9vVzsybEo z4-M>^+wsx8;iG^fADGuM-l;V13zWKADe#k2`a#b}{mYy{g-V8}MqlU%mlr|{tP95R z3nQ!SxyzWHajkGBQf4?>Xn6fWhc}#_BP9334;f6$)RkVKe-*qu8ia2&B?J(CQ??h< zS-`+(6phz)3WH_)Cr2UZ6yyju%Xx=Dcpymss+zroo6SKZpL3Ft5r5V>9S#T}0qlIn=pF|LIG11H` zXC#hYr3I_ZW)1JIICYbJCw^~tS3ZJTRgm-%!=@chuB;IsTj|xS@!pDbKGu8w4z8?I zj1s3(PtyIo?38zSsZgX$PDmxz+HtmTnXeVTaf#aEf%Ewvz+yi9Kc~YjPiWQk3n(u! zR5ib_x6Cg(4lqhe8U>N{S`Ytydw+rm-P4QfGX~rATH_Hyf4#UPtRN+-+jbY2UD0E2 z_;c@KaJFUY46oExXBU6=z(9;>d^(~0c*MGmCqCjVYZ~8c{xf^%n?it__?P5KC7YkU z))FB(XHV9;%E20QDrXz?NdDy?3&%G=MLv`sMJ$7cGMMG`-v29f4Bx$VmX=)14!M_0 zYSaB4?kK$Rr9y_9c-x3Hg$mDN0g}WNl@a9T3oJ4zb)}Wka@FIX4}LK@PPh}N+rwQS zy1@^Z08Q_K!WNkKBGX#f=ogZ#%(AZu_tR`zOE^zyTky%zdg^tpo6)4^h?>LfJZ1uD zmz#NI?f?E~+oeway8YFr+Bl-}O8=#tpZzC3DF4L+v3~Lrc~HLk0G~2~=)bVoNMW$P zxryW`uQonhU;V$AWE59FKEc1$Pw=)P!a6y?%cj1~_SD*Oy z^aB1PZRna_VWd(_K0d^aKVHPz6Lg-~lO+WdQaF@J8{?v4QIu|Xg=D$cneHE)PR zT51$$NaJX?#^c^=2wvazCjaQaX5gS|LgcwUgsp!~q&x{(bFrlOXqV-z!#Dbqtx-#^ zUmNWqp7T3}!w<&C_KaT-CS8G9hGVFlK9f2>^!N^s7|-6rA<9~w4aNzmJJ78(jxr+lwW(X1hx*7*aL+Ze>ERA8x|#N0^cCzdzl+iE zMb>cG8|vIdruQT4GvYU?jUY5gI{=>9Y$)SrfY_5;QmoIq6@fWLn0i;YxSZ?M=PoSq!%1V}C3CG;8# zb2C%{^d#JFSB%!^Pk+$eWK`J6MVwW zef*^J0}G0(va|OPsmfG3Lexg1 zll)`I1Yo|AyHr*l^w6y}Iw&XWyTWoQ(P`8Dkc1_l;P$O~*b^i_Fo|4B^|gDJJ($gO<^w3pK;WeF|&l&Zf% zOK7zHB53IbH-)gU$7`ZUUTe;rvPkDtJKGdB2*M=_%D50NT{DH@GC6Fwzdf4S?|=sw z5jS6gNsb8NycCl4KO@T#7WIuM%M+nj@nkhXl#o!fO)xwqc`V68BY1z2IS1 z&(v47&aGiV;_g79(+7*JQu+lE+lTlwYVzsrrooEx^^iS z9anBhH zBllw+o}0u{`hL@C0uL+}Y}>8FjDee&Ki_%wZE+YSpsQ&lzc6$7L1n-y+=*iiU|VlS zX}t8{%0Z7Gq>B^3$!3=NqRr<-P#N8VELQYJiA%J^pC<|#FvQSufG_?ty^D=Kk>yL- z6@BDX%jI=}edAT1sg&{y0~U$YNkkraM-h15AY_o%D%fkw6pT19WQQEP=%YC$ZaZ@W zaeYet8~S(8sJth>kC7v`aO#|mfbTqQg!NSia+4{^XYo8zov2DBX%mqE(YK%ii>kn8 z6D9c;2wI~>x_wG+9Lt(^D%FkDv_M{VFuX?XTqQrFrKyfiBfsX-e*97LGGsEY(kaJH z_^sjvJtK>z4$K8iI(t3nBRe%rW%3@{HEgE*2_vzu+_0OQ4;~$C|D)Ua;mK~dDY88Dr!jg#|CVKAtx%f$=%8lC#l`;7 z9)lGu;{l(PInbkJ!}+q?_@kaR-8~%Y)}94e&sAUFdvv zxmLxHXnhpdBi_pO6QQ}~8}%UGnh4^1TzpTwdIqy5R{i&K-`Zkf;r`ioy^CwaN!KK7~8ckwl5UMF%mx zbeY57yNQW*dTWZ2pI=YS@*-D-F;4y!g=U)RwGaOodLK2{R6oMo^t-Zc`o7v-=%v9& z2Mk6)kvEBfbUy7G(wkcH320m^p^EDYPez2B9& zpDfsOV~1h{U$J}uw;dR8b58)j5)01Hw{M(ivDgdt+}NS49Nh=}Ay0iiwSOqOxw^q) z;83cgyn2axKfU2=;_>ul-`Au>KrnK(SONkBy|qvSUD{GP$e<4OuWI#au|=psTsI|O z?Zw=5-g1&Lrc78ob=L9%+fpS}l*(9g1V{*$8exkGT&U;Cim8BTA6pashSV?<5<|Fx z7ZYcs;gY0a!cJ$*Wn;doCzECE<$UWJJG;Cysf`J#6h%PNawA~UI+*i-NQS}UII0hR#R9o^yU^yHvA#* zY3`F;V9S3OBAAFjft%0Ui;?*p;h4pT71{0k5Y6vM_l(b^gL&_pYc@FZw?q&wC&a~Y zmK8$oB0{zaf8TP9FR-|t=_U9qU-rg7!D|^+e4+X7k0I1nbG+OUea;D@fkAs)nWu6G z+~jtTS*m_xRtn7q7IXiLe;td}4=G}^Z=ZlC8L0OhmbBifrLSqZ5bEX+?ud6Tb2y2x zdyI%D4B%MmkSL~_q^Hqq_RoKn>-4Q&nBqtwl~rLI8D9cuTzd*V{%{K+`6$)At7eIt zWmlF3Lbu;D8<3>DqF5mt&m2Lc7EvZf7&vUHS71yuC+*`lZ6onB)ttevf(wfl4 z9$#rR4g3*OPs8J4=8c8q>RVCE^jj~h7MO5TYdh0Tq_mdhsIlIKl_u`(7%bWLqphQ( z5D5+AvSc!BDhJ}PN0LM)8k=Mriuc3@j{W~-*68UpGh{2uCA6Q#F7?eVd zsN*#`6wC=Ku606F796vZ&Z!j*>&XM1&;%{!k6Z%p>CVD^6uXsec6EfBnz?xH_59>l zu<9x+gqtlKWgbcPA8_!p_md}nl9!pufc88UL|Yy?SzG*(fJTJj?nFtQdS_>QHf~50 z)8=Oj^-{_D1H$e}Rx)~_CrGkHC}5^0kjpeP4%Z>wv84|)g}1v*J}iRJ;RF=WWO3Rf zQT7YsTBO;TGAzbEEOVS)pF;KB@-IzNGwU%g>b%ptnw!vGMo5 z&ffO^U?72 z%F2iLSA^72AaBVqLV@^GB~zS!5`ZkGelXeYAy+tgzl?)64hsXxzw$$|SJ1>qM$9!U z1~?!5(mpx5x?r3w(lCse8{?v%BQkpVc{DiFUh<(9wkdib3MkM8T~i4yBu%JqUDL`~ zPtu^urk0cItEl$q?7lR3EtA)ojgLN-s|3rKE?y; zU7y0;B&P~a-ythh-=RNp7Uhd3ixu`Y*G|@#vAKPO+8NCjf-9aV@>kJu_TJQzN&2B3 zO+GFrfPK;Wpg);_KOG4UESz@;C&%#<;=}j6cluNPL@acea8sa41LUjC&Cni>Z;^D% z+tbO7y^9MD2<{CUouLbUt_r3S!if-VxB;tcTj2M$q+ErpqPPV^8o3@vHBsXCa#?fI z*)_KC6@eM%YPEn92<4V7YE1?&hESp+12+^kFuOCYlN6zeGDHAK0UR3F=dY2<78mV= zM)@H!E1r+&WQJ>|m8{)Nb*xKJkF;w)QIuenj;adQX<(BNn93fl;X=HoOHEHyL=p^N zAd8X+i8ob>&Zs>%hjj>RZK8`f=u(Ve{ji5{*oVVwcV`!Bw8LHCRimv^^nExkm8-Ua zk-*UYJOm++9-(?dQd>P4ela6UQxl-&0ldG>8<>gyw9UQNpVJ~*>W(~>?_BP_T$$u% zS(wYA{J7{xk;6!iEAn^b8~S(1uHn@E>L>P_(_#U9`9{{TaTVW}D160FXr+&EW_U)R zhn5|N^hlf#x0gQMSmYdTH0h)rcB3buKDnA%pEiZ8N0ig+AZJjXj5#)KvaY&UZ6!)R zdDj@_$EFC?(+Hphb?g&Rv~3^HOOKSY5wJCh;EeS}5(X%uOidTDVUou?0z$aHlIGWu8-eeJepGfj#j#hK}EXNeYC9(V3C1Ut`%-~fqGWv%#s{4C`Vg?{uAcNt}}0vm^d;Zs+oFyR*58#+}aL-h-!| zUD!Dfj&{*X{08l_2Zy^`|G=|TI1AXL?Ja4AZ99GGA9c3BWh?p`xM#GQ$}^Q2zCPl?1GXk2`z& zPdV1v$e!&S;8*|jrTe|R{jEGf7AR}6`$%TS@?8T2=7P0Gngl%Cd&n;}@wHc#A%~rjUVlD zgE(8wF7Fm>Z-4vI(;cp|J@1Z&mS?onwU^z4eUwRM3*au^GUQoSc25#fZ0{a$bae)E)b z>24nY7tsOR2T=-nd(iCYiFOXQ%Z5Z=B($ZcX?NOt(S3#b#@z^&Ts4mF_j{dhyM|a- zFR!{#G+Pg`y=G;N@7SBYbl+nP$oc+YJUQHxV_~wtHOABLwmO`=&%x#29CT1&aCe9A zM09p9o<4ZAw~eP`Fx<$}YmX0i|NZISA$zjt@%GtEw|y#3`wu%$54n0uj_fJ&igaX@ z>C5rRtz75Z!vn4z9DfGxXm<{`_IPNgV|PS4hddr2+1AxlIf(e(z35#&KkLb3-ABCY zKH7TxU}sCe=!Tv{12@9Ymf*J2MR`WF7ctDn03VG)%qwdW8EVgd*xP-?)stu4^YQ31 ze$jn+c<@*Zu~cPxjm-Jr7r8c!95;l_I2A#^Z7DC@1G)Z8Grpi^Mswz!oH2?E-WzM3 z?&B>`V2DrL=MFwP`D5Y%lb4IkkEc%SPt#vE(DIq9t#6wtrrJH$O{26S?8@O;Y0(-5_qb> zQtetxvM;nQOrK8GnxR`&ueP#gajQafS|Td9PQ0yzas5(Ojv{p68KDBS&q&2vtvlcL zq00N<4jQveP{1p5JT%5Z;&>#UhuvjtY^`^VI&YDXv|7)5{}gc4|0DZas6hKKAK@Q- zJ*pr?L@5ArY zG{qr`f_>tZhbYwjkre7y(b?;BFi@&d;T=KJXCi;9M%1PPp%8SOfRKz~6<64_k}6SU zduo-eYd>J^1Fv?}Bqn$1o%#j;hw1H(m3(d;9&Y{6J^J^jP}^#;dzBF230bH&ITuqY zq;p|H5po4mF}teZs3uF&^%LDs$i)O-DaYhOAIuwlZ|lLMT_^;r@aO{M;5b%G=0LC) zTc@-NG?Lo^bITMdf?8?%ji~OQjbwSZwou%-wl#|I$({!=^Vx`NssQ7sAuzzvi?(pc zEQM#7Us}<qDl{F8_qRU{3d5p#tU#l=m)3F&!Z;s{}ElxcA-{6Hj2xcy+j-zVH;0 z%Y)OGt;=f!ggi%#vzSZOkec#*h4H5zSrBV(5qCfyEPiCc3VNkO@|d`crgDO+v3|4K z)?@X&*yp*BlGb$Ow74rjGa{KkyE6cOVb|tEXG>Ok)yOfd*d>~^&o72>2G^O4yy2=U zI;jv7xm?YdF5L)2whBjB@M7Cc#|BtoJ&yS#b<%YHhDyM+3}?&FJ2JS+5yCg6y)`5X z%Bi6qyY$>dCuiW220>h3KoO;^2 z-A?nS)d@EuwWHH+LtL7q#-Vgy(+po>quhG7*KB8t^^&#?y?f5CxP%wQw#p8@Uv6f> z7v{aF;wotO?vnuRP45Aq|DKbUsk$0W*A$hj5q7&J1hpZ7BikGzXn5R-XRNsplw zG!TdVs|#@_dWIC-RA0AOp|4zj24JpGvx_FO7B$VSXMCxI1P$t$Zk)T&$!ZVB%yoFO z`rNq}RWp#psYhB4jA!^fNiY$9;^C*e$ za)8U<3Zlg=*sB})Avwd`1T?GGH48G^BK|OD7H_Lg---s zT){FIM@>x#yq(~Vw#UF7G{dE9q*m}linIFnLUqMDVi7Cm76Og&*^$B6UQMB;f0XMV zf9t&sag~>R+wN~6@&rY7&;c`TERO51DrT+?FhtCjd#W8VZ~Q)%MJ5&lLAKg8#gL@h zACxO5ypPzr9@?U9!vic5C=G<;k1CoAT-?8qgYmO%lAHa?0OoMjK$>C)UY~+oxylm6 z^4E$~!xi*(dlwH^O)MC}>=)ZUI?lSw)FhSK6MnSje1o7knyXYG#2o!Ml2MS_ilWI) z=2dh;3ISel0;hI_;-Sb75MldeU;IstqezxJ?I2qC4|L%hx-yOdLpij*-L=qZjQi&( zRD|R2!jz&@w`}%LhXEfmt_!o;h8nPktbM~5JJ5~y;Y7zrrW*$a+hVD@68^ot%M{~6 zf6!Ov?;$_0#=r|Jo;Bjp=2nDA)qs%caD`gpcGVvqeaSL7P_q zWnFYy`E2KXBveRfz``^vS(J=w@)%1;(Ft~JzdNA|=Q8!3;iLd9^q!c5QN+4}8dQAd zvPpQX@?juHuTNjDpui7dR?^CP^z#c!M}ha8|((T&r} zLKAVsa+SV*MTylA+9NDJ22TPb@ut0v-yla;)^VbD^aDFfNe%V6h00W14<|1N=eVP+ zQaYy{>ky?zQFNyT=h%4n@|qiRmkUPuUAN49{X>#qL?tGCOZqDU1)EH?@GJzWRMeP5 z+*&l^Z8=%)^l_@-zgc*u1Y2rLS4xIqhO5asWgQy%it9Mh`?8CjtY= zfq&viX8CEi=}7mF{_9tx@!4Vj5?CjzTo+U0FrubiGf~#nVODoKxs-Uo@b9gK+JHwP zV>f9%L$nd6^{fTmEGH(ZX&(Oj_PzycPG%eUxttG2qmu`{G5-HQ0k-B>;l|=X;gJns z7XQdHUYXp{^(hQblhJr0h(S4CNJ)?qS)ZD;l>aInG)ld1H*%dV zFiTs(jfB}%?-l2<6f4X-qC7<^m+}T?;RgTy=oJ2K;DQ~qfK>^8MP>J*TGRMB<(HiJ zwk|G48U&@DQXu+fXfz5NAC}1xd<4L6xzBNrfZG(dr5QXlhz1Z)j!;BWOAaFFfES0D z6&D(?=<6XaS*}YPC3}mP@j$iL@iHnXbCR+5N zWPTS28w)TCe=V(8GNf;ZfM29q0R;w-udR7ij`g>ILPEjta47sCFimyokx4-*$2W%u zPoJ2Nuz7XRB?3lY%5l#;d*LB2M`Oc-VC z)fW(auOh!q2&4BJ>;n#MwNwds)!D5BFu7_45DN--Ujca0Zo1s1?4a3F7u zBw3EPBX@9&i%H_&TAzlKLP*`6np_69RzRzGxIjXM=|crqu#pD0UtcY;6THQ0jM9vL z{n^r!4|WDYO6IHG6=#Cg(|BNDG0&ZFw1OLQ>>AkwcM|~u&-~!;=yTn@h4!wvGaW_p zT|a?XJMcArxLgXOk73o3Yh<)ZTb6)&!_VD#pcAH~akrNA?p_!7jv0C~1WIm`yo2ca ziw!XJM5p3Wo=La@!sms+`=c^04^sZ`Fg={IISM-$;AM{@gLT%*)2!Ewh zaVgkA&MgoGVKJ~#Wo^@}XQQgYdy@TRYlQj4)f%Z^)J0R1M|5Lnof97R7tQHN@3-h= z)h;Y&AVB$F;#XLR46+ok^_8z2sge0tm8n^W>nodfQo#gy)_ZlGiTlwUKcXHG}kS9=_&Pa0YVrQck(g$o~b|%$h1r+7<@~WMGit7Qj zl&0|3)EOa@+6jJM^dWHhh0;-wh;Ok8@lJNmL&Qb_Eo>2;tLfgS&xMSspAdWJYKC($ zknIevoABiLz!6^XrSkTB?>-G~zS-4-EHK)~JgoCBl36)c&Z}UVaa3mF8HAu?%w`lT zCXZ2a(TVXzN#+$T$t=7L)1hq>;~)O}ezex0A42GDbp*{a1YkL5#0yZ2Rdq(e9wdEZ zJB7RT+gTsNHH#3*XWfDhg&QLVDRoJMMQ%K{#xYUwUI;~9!(FlzvtWBNgT0BtIrVE|b%&C?f; zub)P176T$1YHNw}sC>ClfF9{W_p(2Rl6vJte@!k1r;s!9iD)9k=&3;q_N`nagcraV z5Wf)kR}{JaaB>1GV6mz*l*>+KapKFFxF<6{5_Wgq`$}N?{^%)k+)fXMPsUKlji;|? zD3VP{oH^@&21ag6IONhpc;u%XRHt=+Cxc)Bn`Ovm57?L)MqHfWcm#Vk(pE5i`89*W zTF+qF=}*<=iM>WaR?g!|TC`8>{_Uy1Q`OsP+`o9uPT^POBjH5}4d-OFy`81Qwjiay zgm>5!u?qBHPJrE5+kgxAHeP`Re9?ku)_`SarNhc}I1j1dblLC09L$nA%s4fGXBSrE zRqOgn3q4(oMpptP1Q4?Z_^xF{Byt3_=4a4?%9q>9Ma2~0AJDoUJ|ENVK;dJ!1uF`) z{<85IGF9U)X^pSpo_R?#H!BE?M`zc_C20`jf8p*Ql_@m^p^1Uz@mfn!sB4cA|qgJm4! zRA4GlpoM;ggG>h;A zzA2#(gOV4BegX#byAjor8jEuEOS&jJl9Ph6=m3EqgtRPyg^@@Ai#tQ@F9PimwdS%H z=5~aEDPYNnc@1j%A96DCCB&%syLqbATCw5)fiBU*!5Cp5wngC3v`u!^BDNMJY zWxgRYMeK-!TD34iS;W*5L0trtjTA}o3~gnK=(wmSs$H=@{b0lLgacoLD=r0h-^d9{ed|t-U8t|4MG9kJkz6le+0cz_h<0E< zB$WZM*=?1_WXGV}rWv`)l!}9iAHNx;OI@MGzla<>6+8_lgH-?O0z6fYq?@Hke~WCR zBR3o+xTuCM5E2u_M*p~=eAz`1ser<%7yr+N0rO)KJ@{jPnQ6se`>BcFZ`u_@OwuP& zO~Oc+C^lTy%6F)W-dw4v^RZ*^DH?3$E@az1V-V4e+NWmI}iLi+4bAf@}A$TtP-*4@7;N+^#iB1eRLAfhXr~E#QJ4C+Rb*1nmjS5 ze-Lw{!qqalTCcVai!bV3T~wVZ6#Tx&G|m|*BjVlvV8(XyP?ey%r3|Xl>OMF7Wx6$p zKFjb-2TtDGIad+DcELknj4BBTax8l{6d>D5=0q!}4~8P?JM(3wzbUvYmy8)(z5r45 zr?3u8zwRY_FUVnT!{C6)sJE9KK2v#}eD`)USjwi|o+B!EBK9ubg%8KzbU=0*$>2_> z-4?$d^GxECH#H7_8j@-U?|f^ zczf^5RXpPJf9B6!7VV3C#ID^i;@V)Iv}_P(VHHlr#p(&xwrcZ)Boe8o?401XZ+1ypn5IH;rkb4?|cw^!JNzJbpu;yGy#joV1zLA4{2KucOP%k%@}5DF&z1>%BrGumt4_r|+2yjZ9n0`6)d9iHRK^p>uT82 zw8dYFkp{AZ@;))swcKcy*mj}e?k>_e;LMk(r=v5ZoF}m62IS|6g<}K~b`OhsUp5GT zw4Qza%xtOp{*?A$Y$W#g6n@>X8o%sOGcjh-An*szl3jWh+{znsZj?sUn-t`!SvuFg z25vY>FIY3n0dJN^<2^}JmSAa}rs2l_{$*cH{isp{VT9W%m7zdqwLpP8qK&!As3Qg2 zkQPA~-_Jagn3P!;!hLYXV5JAwgA0f-mac3jf~SxwnQ*{*A_^x464B)#70qi=M&}Jc zb;k=JyVP)+k>2CHoDw6;nj<$pR#3O;T3U{`dQLbH?cVjpw0(S&;_}#o<#NZm>%!mm zxNk^93od|G*;Sj`nSYDcYM^Fd2_)8fT!|YbQj|l%;!_g(*HFBYxfLTe?whDId4lqF z!t8d3$KH8glHmr3UJtdH3qiANCi2it0aQJ_vF=U>`*lqR%iJVRMoV23R338+<~L0Q z#aRhsv^TCl@A1LVlF0egGhTF*hS=$#DCGLNr(QIS7q!WDtYey3Cewxws_&t&x5ZX1 z)k~)^_%BUv^&o54A`LyMNxPvNU-z80%JfzqW%tU%%XAO#*0<1a20OYY>{kW2UO(B zd|D!lKT1ACJZeL_)hPTho{Kr zVVh3H`~cCX)a>g0422F|gx!eduI-4dXD{H1@C(uvgRtbHShsuXQhv49F$zhC_is|J zZ?znTq`vVbXbF7NKxn(PSfF;2c>Rl?SfX;JoR|g7XNPa9l>X5r%CT>(52zCG6io}WxDdC zttWdn0enZNRq#;rKC&F=?z_RP_K&-60LDuLp{(w6f=KcvXzmZ5j&F8@^^Fj3I=uAW``n z(VkdF8mJZejVXJJTLkbt`6FlVuOa!av*v&tHEMI_D@i^JaTY}xpi?OJ2WQCnA*{Pd zfY=2i5J8{o1t`x8IMAFS)Z_(!>7z`z^<1hel$f3met8(>#SLtZtJpI^M4t*bFd@6% z5D9*{XdcG*;)iZu@wpNzEA@??{d5NO?#AaNGH7RKK9Da z3d0ujKrAkj6CEu&88{O(iKq~N4e;4)Eo$aJ+>BYx`T)}nJf}wkJRdZ7Li}(WmiWF1 z^LKTdnV8n+vYfyf`RCE#47@Lx2F5+{KuK@mLkSs&zl%Qiqo_*>k4YkNYg~9p9FqCQ zF+N-C)525|Rq?Fll6LBYg?%~)a(on?c$PSQsW%IN^1QF(#1(?&bPsaQF{pecyCeju z&|{faf=UEwl|qv`)iz=HXz{#X)Vs2vyKN=?6aZ$TnTST z(e4IXLgAiwh$|?i6#-vmwWy{moVy*CD>QD6(|#gVEu3|uW%P5&$;u)lr(J;si;+UCIUN zYsOSYH$Y93kyzms(lb+MW5G!XBLS9`Zl<8tz`>f<%TZy|jU6Wg{wVS5a)xE|v?mEI zmOpJ@gyFDD<9H=s9eWUtmE>|END>PCzInO^E!=x%ypWrBhMhv*SCX+HHPv%eWWza} z^iQu@<#=y`v>@E@->C-GQ_Zqs^c0CkcE;yS3ll+TV%XKRwAMeC zH@)lKS^@ps%`K~wxob7SQX8X?Ol*bFWih-Win0uD{-HT074CINYeOb9aLX;c@yy-R zmKc_+BOhnd+@eb^`$Ti?ZtH5(ZUXr`KlZj@U}99c7teHt<<7ZNF1%;=Mw+MQU)#> z%gahM+){-LheS@XdjG}e8E|OlHnrjP<@5gd;9TdmCttyi66gEls`;*!6#t3aQT-Ai z2>N5OC;f=l%>E)JIkVc{I@K{}F5Z^8?ks33%S`;L{!-+`^2CbQeh+n>&Fd2U0aHLI z9j092_9yfW@;NJ+fPTsw9a=*9SHKC{=7~y?{y3=ZVqSaXw9DbVHw(WGgotH!H!`YN zu3q8}fDCYct!#pvN#)}u5>0-SWJEgYFg&HnG-atL|COAizTUj0AY~b=OR9Tn@qu-? zECD*;DTGMp5ozis#8`R}M&_#uE2~RAalSgjnNssPfl^~x70+bD2`{- znlCJc02F6V#5uxH?x_Hb2oru2XN?XLJt8e4Yt=KIA+tSRNp;>H3QizB+A~Xb@C^EU z*l~FxTk1_CP&W%gmM#$$u_d>D$ddruDV!qKoeY%E>}HaT9EmudduJDhqr+X?Zgl^- zC7C4^Ndmn5@28t6ftv=)7N%0$umX(W z$sdX!xCb=*;|g+!L#q6BD~h0};17RKMG#Ge)N)$FUFOL3N}vJA-A$E1k{w6XKVKkG z2j+;sttPo6e8%!+XwE$QA#z*$^}J@kfcIV zZ_3n4^#-$J36gQA6UmX9p5$#1{fw(uuJ8oa%fV`EA?V}-(@Hp6S_}uun~-dc((zr~ zZ9!y9J`$;FcX%cxaFREK9^Fx56)KF(F^*9;8J5)&ZD+ZQi7<6H`UdxJSVEj_3S@5>R%2{M^LB4 z8w{GXU#f#ps~|%zbcf!!N8+dF6KV zW06TEA9^5S%r9r@`d@mI?!#z~sn1NhJFa=t6bt(AId6GmI;PFd2agW6|IzLI@MIS` z;15xr{oCCm6uN$JxV638bZcP+Qec)|Oo3jnf|)q8^eWC^8LFrv%V%$nvsqOyDFM3r z21GG`?s3M<&y9yQy3?yibi&)*$WI^Ru&@EC5{M4|;?dQtE99zTC7pa1yL;ec@%(^( z_7g5HPo3Q_P<6}d#aAkwFZ^rx0YlYSv|%@S8z4jy*A(ly^R}t$#)f}QXh6igQ-@e4 zLq$ZBQT;V6x9eSG&7IBG&SDZKhE6b#3Cb?`x%g*TuarNZMH~&3SLYjBtp{s=< zR`fy`lczyN^xwpjU}r#IcA#%#v|@F2a1!t@7n*=YVS(O6hh}cLsP&D!L3EC9ce@Yw zkc_*#{){!sEN7L*IYCzpfAS0J(Vlg?J9~%S?lT|w)T~ZB8LD4FF@h@7YH>6SpmEMM z9yH{4nKXpV6Ve+&q7i0Tarark#2LmXA&EF zH^X$`SN(gTU(cxnMVe4CdYGWa8?(J;`vCi=5f%L5zx5B1S~}`d|yh0}U?vJ{aea6>{7P+1!NU zKB+NyIRu#F>eN(`G~o1HPwHNr+$#;kg1$R@ipu~{?Xd}LK+w?hBK%0hr;5Opjzgc= zwE8;2LZ)17`99b7%2^>YBzl9i<467T>i$$kv~0h*JqZ--tZ@o{q~I1%e7x8U=pexu zCYlyJra9D@i)4<7`NP0zl>No?DBsFxwiT6+^LdnsW*lSCtp08oRL+F)B_d0bt7vWu zdxa+xB0`tgPYh9%QlO6GB_tl~kA@MyRymRD!mlMJR^LbS1S^nKm?mLW=h(iRdUBb~ z7n@f>edf-pVht!dx#5&5{rF_{i%lm#tT&lW-bXr_=B+Ki^Z2l^+NJCxC@eGT7)T3F zZ6XtZBZAY5aYk@`;e`?(o<*>$MljSH^0VJEJxICmP^9&5I5t|RsVEwJ~$07vvrsQ zPo8I}UABGmtia2>D0(}Zo(+bCl&+S=Tfw{KtY1+++pk|B)9LW1m9Kjj)0MC5Ic}d! z##`6Sch>_PFJ$3wAsb6+UkVHSCPI%y+JP??*8#W#{dJg@*v6 z_y=Q+80O`V>NH3u`v0@{uG>vzS(@m7J;e?}*^L zmJG^}C8s0@IDs1HoEJIcyho35#^_h+2k2Mm@0)Yo_u7(eOh9JhtP1SC_qxqB*SycU zW(5N75OF}A+%ZA~4D?S}305=znaC$EZ5X!nDDNnQ$SYqaB9CCrT0;-KA0#-gk2n5( zeWzp2vKCs{7(q1~^tK?Y6mQ?xkQq$c)Y&~5TD0j05WYdSe> zB;^z&=jTY`>yL3&ww7lt&RCFDS4xO1qu#;*5pAz|8>hrLDd<_iRW=c&dSM}fzBrN> z<6+N$y}DFC1Xr!t&@^#$_JQ1+>8;@>rXq`d%`19Cx(2$Ria`=k8-1iu&`WhpBxl%% zc?}MOxThg;6GpA-UdSpn5--(JFQ*A-YR?K0SzV?5iufJe!ig|9VbvKs#igzfou^jc zyyNxiggi`9VtYK9O*8dDv3HDfg)K$2I5~tcv%wZ~*hjgJh7Pk!1G15y|e4{j=BONe>sY2f>f}>Phz{8KqjfGy<|_O6PchzDFtw zh-}g9zyvVuYX$ClpGzx$>>qs|!8=e4l;`O$P4An>?@=8g0OStN z(KgRffURZA%oUZtFh(F!;Ib5A<(_#}EJz|DOKu$Ty5Qdis6WoDfcpiW;{u8?cKfwN zzwsHq;H?y}#DVz1L?)#ddX?2JXwG2Ynj{A?HLicm*QKJuSD!>=E8aj^EZwa^+HdFLAV0U3w)t*Apme*iC%G;w#Zf`gQF#KQZu3C;%Hp%5)UeAt_R z>L$gTU&(~TnG%Cgxs?(k{|3Rqe&GDounGeqcfQmJ>S(P0EE@oB9;f~iB?M7n+a!Y| zQl#4vqeeJ|`P<-o1l&wBUV*}K1ko@}a%PQ`K@~5R2ON@!&DM94P78*95RiUv%}rc} z(L>oC9-a=dG5)2VK^!`_+4w!^-N-+|BZW(O7)~U+9G*T9PeH9F(n@R%zIwS2L!08Y zR+9sAEZHi7iCaMe6845t2K%75a|N%YnG*#2y+_a;&MmzOQPUP349Qt#2^}_;GwXmB z!VTl)P8n{AH%7TvB$Mb-a8=onp?>|>#7wbgVuI6CYW`rM6I|&boCCrN*+Zve*(ZBJ zVp7GJ>S3(I3-WR>>JBq~hiG!sb%X77-}3A#Dhk=Te6x@isc zVgFds8y%xgqE%rkcV))GsOE$9Ft)>xT>t;PL?~FAAhmGFNlleZz(p(XE7F zr}ZRwT_$LRhodNJ%B~bqJPm+?V6=m1@cTu4zT{{%_IbX-@0M2ZY^hi+8jU60Vsm2c zD##jrEj9SGP<^!D1VtQD!Z#;2>XFOvl83_@?T9&G(IcV8eB%5ZL~pA&{9(HPhbiYA zwK0EVAc8A8bYVwJR)n+1*3g}Bi=#smHP-SME|tmce>7JCmJz(=3wcnDmk|P-4>Lm~ zbl4$$q?+FdP$y#~sDL;xpzX$`TbIv?b-n=~X-HwIFL@=$(8ZFNZ_aHy2q;?X5XDbv z#cPirgM|bs*CMZBhaIEnz~H^U)_%J4r~Tb^#9FoRtK}SKfBgb7VtdF{bbWY2G>%SR z6`u|ev0~22@u~Pq4#SQfCI$y<)@#M-a=2g7897;eK&BV&TDW1=sdc^a^rD=iXb)~y zT#E>u#7E6(jS)g(QvUIHa?^QTX$>X?kQC{k2zJIvM*DfyD=Uh%9HXPtT4I#zW9qQC~0z`(|p&_^YN5(!N)- znj|k9#ht9{%XqS}wYjmizW-zU$tM4F*O20OTSyeYu5Yciws+Sbv7}5`RU|+Ymi~syBt{Q6Dj{wjSb@ zxc2l?$HC~g!E^vzMs6I^O<-{~JK`OB{!m&co)%lb1`~c}t5zC6_J_l9<|X!LrSbE4 zGVH}K6@)9-zUo|K2&MJrRnmsvXBz5oOeP^zttr=7BSi{#Hsb2g{`9bW(%+vVRIU#P z3{%whRkzbyAf)(Q;uH*Otea06cslFCbqm@8Pan#I_^pA@Q0WYA)T{RQUCKFiW&SjC zy@%2!NR0;fKVO%`qOAk1u~#yB_*)M+T<6BT)HAWff&_&_0y^Q%&Q^LZ=))`dE9`xZ zNHg0SPmbXO|0^$MOt0!Q9E)M3tR#-o6Lt8@ajTZGxu=(}e;3@n?mnEonv7qIVREiG z(rm1!tD7)(8r2GLg$QrBzkxM|lB&)HPksl_OH`nl3TLtaL`#Kjs2gu z8Y@o2c?X883XYW6Pxo^Pj70p(X5D2EhD(1E5fS_E%<|#~VHzv(M2{#h_FR)|bEz+Z?FosMS`ac(P!Qg@8|j$tCD(RbSWKd$erLsn7~#|gA=rZ~!6*8EmQ&$C-5 z!&+ODxC^5;rY~9`k`muT%TG{@lgE z;c^<+qznEx=)(SrwWkyQrPFAxTwm%mB<7-Vt$rtI3!WSw15&C0Hv-zRfnW&14LDQm zkeEk8R|O&B2zdduAYptkV);Op9ii%lrxFm@smw#eN`EJ##`a|V=1kPSypDU}=+e$6 zyf&w}HF=G(CX>^{S*M~hQN@5h%6!^-4W&yacX3MwhWE_DD#ZCAqfb9!NUK*+^7HiC z*6$p~D)e5=6ZRg0PPj{OFP=fTD^1!rTWimGDW5HRk7`#*XteKLeskARJ^$V9CHI0K$Q5eWe(nxt6>S(K z10BUR^5X~1U!C2@h<3pD?zjGM+IN5CTK?FL8@i9VI0Qe4K&dPDQ{XsW%q9dVV;{sH z#G|>n)(`wV`B3LdJ_I#g?FX6tsY8w%u=F-y?XVN2EK%bKJ7QxCh#8~) zOBf$28o8Bn7W}b(Lv~txXZj%0G*G=}{Cb~7w}<_G6kO`#y3O$v$SWbt+#WGiP%6mG z-QyOHD+j8?EqUwV_65JBUg?$L7q?RJXgu2Q9>E5^Z*d8TKI-j{$0z=(Ry9Pa2qr|8 z^ioYy-k#(MtL=$26UOd*M({WP?2J4~0k>;ALCUCCizMW%+3E#w67}?DK#N z{k8FV6x`JWfX|+wm@du(Sl4Va9x9#Ae#p=?sQTG=rZxW=j84T)IH#vwW?;0WuA^|_ zY?qJ5;Fv>1^2{W}5_5LebO#uT8G&H#KKbnJZe;@09l;xO4E(k+8U8)S zG{(q>VUiM?86aB9HHCpF+2fyR9>pdHRFI-2l-&OCXm!<-MS~j98oIcIq8YsA_vc51 z1hQBt$qQWrQ0~BR8GLk=@YMck5i$LL3=oiUTp9#!Z$r*>r9f~aM0gcErDzO;9?|A^ zL76PPOo(rW;c32xSFI4q=r8XvLY)f!6~+NrZEEUyv|eL-BzQ$=h9RmF=opBrv2Hku zRa_yfIzy3D83WEFHX@+6>5leR;ld`0+r5#}W?#lZy{CFvX_puR|lfV`BBubRtNTphuUPWj96zjq^0&)Sdq-P)LU#3ml!toci7enUyiM`qJj0W z%mn#Zx{TA~u+9^rF}CJ}EG%v|SX|po#&Becc^28SW@+8BprV->BSZx8dFU!kpm|)1 zEHtV|kdg&UL+lOlxnh4(#}8Fy4L1dwJY~7tLpU{9sJ*y{ydWGgS9^9(@kw?yF`&n5 zcj3um(>J(pdJT-{F4QPy8X~x?l{FjLby!OjI^b01Vq_evQWNuShB1U4>sJ{j(J`Pf zLlL_!&m&9~GNEY$n|nswm-U5s;Lf2x`0hJ@?%!w5y@5JD z8qs{?jjJuKNrc+NGBiQ8T*Ln*f~4}?b7{rT&4~`HtG)gVNm>LVQCwl@_-qYX1BHoo!2!$3GFCelkYACp;3z5|paOHWWvWA1F1 z1hFJPBCIIii>o|Jkw@Vf)g4`XwzK&sS8+6%4!IiDyl4(GrpI$ZiOfW!8D%??+4zq1 zzO3?4{`8clB0a=MU1%dp;gOaSxxKhz;aYX3s#eM~#{UD-Vj1}iBFNv0?de5FA>ova zMco3dT7Ic0Qb3L(U$;iR$EMbzYpAgkdSe#YpcP3Gm}na5mjt;v-LB~z!CeT7x%Sy7 z?jREa`h2q%j#)J|j<3AIOaNpl4Q)br4a9A=hTA%y2&?#cqrLW{CSLL-q0H&eM7}t$ znqmbV9tpq~*<|(M;CLX(EHQ_n@FQR0l0*3BTE-``WkE#Avxs>OT6(SB>ZLDl~bK7Y;%>tLA-^owY#h1 zi`qflbcS+Rn5SS;YD6W(m$9NN5 z;+f$SLK(9?tf@f*m26zlW?UO$3!++yl9jsBy(y7ecd=-BPW4EZ^N>hRx8Nw!!Go&y zi=<1{V;~fKA4QOu=$QqIgz#gx!ZgpN&U^?Bd@dgdjL!vaw>rabJkR zkbjlvhx^2e*V3(gW)B-GYr$`}gxT(`wO3bhQ#J1;P~MMBB*`P%Xwe+1x6+!smV@~P z2hj0>T{3Y9DQ;GFI9%(9l$`snsz887rOOeJd7iC%i7pc1~`e@?}oDk1Jv*< zy`88uEwg3>i-atzS@TznmAI1YUX05roasnOG71ccb>SJFoOT#(Kn=c`n&2K+keu5l zh_mw8>@3aVN{3^aWc|6PmaUzg7OD;W+cVtk;z%bh?-N0zR0W za0Zl1eEpo<54~gDrkzGBsTv}_ZGIgYsWyK?#F%*?j++Joipw&oHA|+?>Ix`}o%X5} zop(wlYsy++Mi(rBi&vB=kM{~C5uzz9L?@@>Fa`3OJ5DumE#_&0j9e{oicj(rLhTaP zj_iggSO5qi@LrAs&x55dREOAHfI@bt8$fztPXe#iF~r{+v)K!SjUCHzQ1#zvp*GnB z{}2r)S}o2EE4xkHFwRG-WJu?>3J<^by*Q@jAE9IAF*b{(=E~jN`omO9ajGW#dZE=G zfdohdQZ2`i08fHO4ASl8J0aBK*}(mh~=XQ!*PqX_9qrVVVBq6+nu_0x+m zIfm4=F*Py|q@Rbw@!_uqn3x%u{cLa;#M+95k(?92Rum~1ByS}p*kc(82JXt8_2)8d zAwr5fYMhFR&TtWpaa%k+Qo^#r?U;l3Y{~EfmF{?m^y>=E6t;bB z;Vgp|=L}$A7mTPB{`My>lp*D_{2{`vTkJ!08i0bR=sY5Zww2DGF|pjdS=kh8Q=lTc z7MJe2jZ8#u$klg|85mkCa$oopVNlZ{eFfy2snSaUUP{@`-5-kfumP*z(hw$sQIsy= zD3+UH6y+H^b`cRWfxkboQPEBwh3Mnb3YI8U8y|tH1kv|qa|3}|LyO#uQ-PU4SH&a_ zHwYSp0NN zUb1hbl}S*q?3Q9qJh#O2nU}H8J#yffa}m_IdH_fIT#(72b{R0aRan1XK(RyU=FbNu za4UtUXULJm6k35RJme3HM+23_VMdbG=p|gDV7C$pp*%a5mUw=IY+CnGa(WmTxgFLyI^MMu2ENq12bmdncd{z%01+(*PNKSa3moskb=B{(L6MRxlvP_a=LruM4# zmdNPe61fi~FAIqaGZKqlkew={J*s1Nve{v6F{N6~D-7UKhG5=1?r)CS?-vGdkT<2N z;p{R#yo`fZ$nyo9!W14`Oz;UvF9hlw^`*pH(p5840NYnil=kab2guyKalPD}@5d__ zP;1E8E=_uJ@_-7<#`a!`yqR@7jYSbSW+Liz^1^Hi8@r~!GxL_l=T)$?5=UZZ^STO+ ztPCe(U0nHRy|wluf7R$L{)UL_P25Y4GK7zHpghRML<79=TbMYCF(W-hk*~PqXj)U&1oR>!s)pxHlG9LK#90?EpJ)IkjdpFvq<%A*##FLLLG2U$*A^pOs1tZho zC5l6KX&Er+DG7R@X~I&B=^SaKvM)phT9$zg%f%j-(svELH@Ntj@q_Se#|!~6%j*c! z+et!UarUrqe=6cei5}yxOo~6#aDZpK>-(FnCl4RB)Ktd97+Ec<7(?`t&2BPh)#GEn zJBO4_kUJgM5{WAMYlG!^QfjxaI#@oE=oZcy4!hqmyk3)d1c5y<4(o?Gpr2T6i5u;$ z2O4YimBe^TH+*f)ltvAYnugcUJl$U3+HbdhINvUbLGF!YG{n)?RT0;v@cQ_mN^UX3 zV@%4dycLYZ5r&sQE@uG7Rv~GL*W`LKexnkEi3ifL7f;lxXMkv30QBE_>v(RmLNAR; z+p$9zOanfX3+gYkQgz|z@}b*UH<{u|oOEnAyr2gC3F0^v@}xhjT!M%upu3r1UXw84wdU z9#al%@BE4XJbG%xL0(M^%Zxzzj{}te1F&P=tUU*!13w1J5;y5k6KTTD-;*g9Xj(dm zc6pQpT<>UToDr@s29ud16MDiBJ4S1di9z=rfROv{Vt!ZJw>9;nND!8ulgH!9(_r;Y z6mN}Tp%;VXguTylkNuJ#^R6T=7#i-S*KH}7-8&vj=XeQXydaz8KD8_yN_XavWDrV@ zvPY&p_`!gW{WqQ-D`r?#s);0NJ%sX^Z<(kry4jK55>o?dP86rQ7`xhJPJTd2!vXP; zhMroPk3;H_#tmCQ$)}Kp^JXMFA+ph&$Xg~xzA6E=4S3hhAp%fXmEMSztUv$gDgR6V zto;{s0Z$%pY_&Ew|0KUcpX8ILJEBkGSN%kFN&HC~f`8UpNCDz6M%`qk1EZpJdVNr2 zPMcHxdYY|&l}yjbhG0$(pi zk**G2CKMq6(Ye;@&cnIZSE0pJM+>wgd!-S3<h^l*8cXdJ@yFv@prS;l94mXkS+jrZIYYu65Hb+PR4dW+Y_}0_jfRC3TBy+fga! z8f!W4EHy5ahaQiLa#GFCtLvTJ8z``hu)Yh6Qt7BuXjj&WnaV)(awn{FFGm zvr<$fPGsRERLQTN6ZhsQd0F<18gAvM#8&aivdC_Gh?nb1(U_iGkRi(dO*GdCfRXb- zDkYtKTT-Bq`(UF{(EToMeF5D!LJg|#?cy(7kjD%b6OnIl5GY(4W?4PX5MsF&?-?I( zH=V3rD>sz+=>fM%OCNXY=_srr2aR&k#M5Se-du2QU5xcfTM-)Ro&^V{1Xdce?SV=A zicd>`bb@eYdz?e5#R%z-jl-DnIMKsrbyI4Zesm#hl`* z0!zxoL_fl%2T8_EN_j;aCDdFloLLRRsM3ze3?;)UM8uG;g{rLua!rC!wNp|FkD1Zt z>Z?zEePK{o-q%Vl68WfN;S+|Q2S)?8yuNM{o&Im!0WUQ^aZbhLnlCPy-sXxZ4FY>?Kk}+{`cTO{(FSu z3S7WXIubC-1NTF&Q{!DmSiGs?&V+#R2-Vr2wIAR7SGnYAd^#&Q(dI-iUc>K@3v-p& zjr@%dR`j~-T1{)CyMpRcARHB#=d5bGRC&2(>w4e04cd_h2ZS0Fw;c4aH^%C3O*39- zNjVasdR4`j552Nv&i(C#8XCImsOaeM_$0hzMB{$}yXE2=ArYjRUI%lf%yb}rWO_uJ zj9#wmJ|`7-g7o3A-<_a#+ie2fMw(gTcstQ6{By5XQ2nzLQ7K*RWmiLncKgS;fNwY+ zVKvE>4K3bjkBcVdP?nCpJiYLJBLJw6N1k(eM}D~Twyq{tGV4q?da>EV)4{Npxf(-S z`Q!dsT!c!#SAx>zXmLo1HO7F#lEVyHeV!E_0RTS&@GlR591KJzfrCs>;8> zuP<=?+-8*uY+s^|yfOD&B@0Hl)u7jZJoX`&{pm9}npi$Wg zjm;iWnG$w&7wza~8U`>z(GN@iN`NB>7L-e(FezgRP&F}PNo9b_y^-93(o~rXVS{x* z7bPIh&g!m;q?J8tw128P$7-{^$?_7TwZ39j_D?fdpV;pHT%Ms zfJh4}3sl*t1d$SoX*zp;fFzZq`XdWtlmH5sZe!I5As!xZ3z5FE)8*cOK2p19il2of zn+UBJzB?`yU$@5Vyurmqi_MW;KeAN1quM%jsv(3d)Yi7*=#o?h(2MJ`qN$2?MW@~c zUfubYmy<&#BZ8G=KfU|x&bN2xek2CO=FxZz?;C_dN}2Y6qJNbVQ>ia!@Te5~{^=_0 z0**IcRP1xN5_NV@hK~`wwE>Bk&VykeAz+aU8pa4yES&O{ab^L^tjH>bSn<1?hgN2V z24H9#BoTR(lSSqT6JQDt5n=L2hNI!);`YYYvvm`cro=87a*=RhB%fq7L!mIx=GL<( z57&_<(YRw0F8pd}hY)DMU;m^(dD-7Royb*Cu)76pSr@Bfw#5>axr1B{BrM3>FCaHv zM&g;tLd6s^N9Gb!b&ly=Ol)zt1bESILwI1kKVX{GwPQ_KkmF2{*~Rytbm=&^rpZW# z42!X02W@0B3mBEmNEg|@m~=GgbRGSod;BS9C0@Il?SCj!(WT-U&yv`Aj+=R5+{qU7$(^dsf#C@ z^1iewk>G)eS8Q(>9EV+duD^<%lo`{Hnx5s&2S~HBJsmq3ULvPxHu`OSf3CF zagxw79{!ZvcMB0m7LY~-7#xDD4kVYDCP=2+>L|F4d^?bP_5>kKm@5qi^mG}mlUN{9 zwwP%vK9|E*@eW;K4<#NA`(b0k@aq3z|GV>6Z9WjKUf|8R8 zggK#`DG;D$mgia;rRu~;Z{gJJS#fl$qVt5@XXYTFS6yUgxKwptp@tWpxeq3NYQf2I zt?J2yC)OT6CBa(nz6}H5xglIJ4B;%om@E3kM0wl|cIJ9_q^OBPLNOrAUxsrAhI*Q@ zwY$H&j#P_QTXQCHgB;4+?GjBlo@{TfKUv>u?;0>C-G*pdi9qq3g&tTsYxCB5{;W>q zipJa2LW^*=Q4S2@;)0_V-dqJvmdsu-bWNsb6ND5G?X(yhmsX2N`aog44`aR1^Gg`$ zWswTp2sR#?CMOW|VMF$XzyC}mK#GWXIikO>~aI{fr zpbE$aohL8_@3NP~eGr06qUINK#+AlH#6}DaibH@>aKX|;k#n3FKK*p24V~RhPA_!4 zDVidpLu$x)|676Z&H|qPSAzpM>GT%)yfp)!GtCL3siF{@#-&|Rf0HJOepl}6R)Qc` z!Vgphy=Tl4Jhy>GzGMORY(^Vq3iqf{lpRItJ$rRD+BQyX%xt8ZWPTiLD#dj~0fDiW zQqCom3aTxo5+)HW)0!I=Q~*kB(HIXT@{8g1iX*o|O691L7zH*)nurXK@~0zC!6c@| z@hQCa2mJ!!42X0@a8ge~s){r^AWx1YcnF8JXp}v?C1J!*yhMz|dUPI5L;-oD9xOLae(D`~0B-(*Nu#~XjAt=Hhya&}!nL@CBdUay62_b+i= z69qxwSQ9AuzpKFsiT_ICxNcp)UVHHJxH}luYS(YoLMrX5`1+l`fG~N!7_a5%mYgyg zMcy_XG|*+3D_ZUKAO5tz^>qKqv(5I#{^rKkI!=9KG~Pevon-qIFU_&;H@7E_&XY24{Yh)Eky4hB8&AFQHE zP)32sjIa#9)baQ?uq?cFKEq-*mIvfhB6ib#WfoM(g0h~(nh67T>w^!lfMl(aW+u+* z4oKQv7kWlgCQ-r(OSD~8g{T?H{kT7SHSXPMF1ZeK4Q}4k@9v)SyC#Eea~<8khkDz! zy#@nSXZ@FF633=x)I4@oq6k=e66Fgs%a87$I1Kb?DBQ|eDxp@!Oyj#QJ_;tVcQ+IgUpEmc>eGaJz@{9Y!qt(^(V1el!#JY>) z3P*k1Fzl9}0wpwB7`L_Cv`NyZD-yaW$)r=L#9$5c$wtDtBOxJg=6H%2xTb_~jdT!f z%4&T$Vxh?~H;)h$ml}F&EWBtFgg72qyh$bRkxVyf(-yaa_0oHXK5A@^ObvAr9L10T zW4j3puDS*Siv}(IAiX;;y)xx{!}^b{K8^5Lks|rhi?`k%D-BFext6x#muWsXL%lR@ zl^!i@G|EGJKd4|RJd z>@-)KwUaolM4}5zn*v`r+iTLl^}LUQlIbe8J(lcS9A7&(SURvJYBl09=GpZgPwg@{ zn6?O@sIx~8W+qxwL5>noV@s0=H;C0P5j+?cjr?|9@DQRcBn~!5L&_eqC#i`j=zqn4 zN-`?Z+OEZ`YqA*VdA8#)Qj?M7Hkn4GOOsa?GX7|};)^yt%G8|C+KC0hF4DbZ^>qEa2hBkNoc-p6#| z6QPD#Lc-}oq8?9TC#uJzc&JBDpFP~f^_x#OpKe`vz%cCIM^9(FfwxzD3-m6U z9flAdoF2cwC3<|$4NgWN%;)2V*;T+W*Hkyl5T`u&;OVp>KJ?G;thb--Z1FeUK#g-( zHk=NTB5t&i6>w$T``r2XNS1I9i~tGxu^}9aJXc9B$cUU5&vXqL(eN93vEVHypA?^OQX7{=p zL*p}Q!;@rF&pXVD{m_k)uOsyK&U;gU28LDJ2ER#ue}5Vwl6khryNUpq1XiYWz5 z+ZwaR-z77Xz3KHc%W+t1mn`Z+0xw)aA++#%%+lywy#-vLD4Xr}ILhgcY_g%`>w)L8 zCjFxj?d{=(ye{MTubQ>S#z@hk==Bj{1#tpBP3fY>urzW?Syj*KwwS6P!bXi#DveALHV(&4r(`EGhFv;X{;C5jh|S*s87JdZ~uYORg+$6Ihk+o`Q@sH2BBi z2q1z?NDzFmmpI9cpl;&kV{Z7RW|oW7^D__$%Wg8K;}&mrwm_JO|J+}nE~(*0f}8$2 zI6;+rp$+RpO+$h-1PCZjVUSo<4)h>Kq{i8Lm5H6EH;bVVedSZkx>C89#6I#6F$QuH zd(R8KGg%PX_9b$XP8R1<4#4hk0FGoOQum>DCTy%Mgk}LTS4YK5kjxl5#K!SJzu=H;F50l+~JHa9Bg`srHe<+;hP=1qEnzgT$bfD43BpPgFG$quResJSmT86 z&1|oIArseUS0X_DV@n|yO2ZWAGm3Bz`;+Nm_oP29`JlJP?FoF-F!8X=Uw32VLmWS` zn8E@~Q_O4FS4XXg6Rsq~Xgn)kb?J{a(?{y$LeYeYn<|www73VfqT(M%EU~fnA+gV< z00fpBd@D(qA^plFU{)qy+CfEBqxxV}d=(z7G5w7on`IPWdY0N5u2V8q91Tnp;q}hw zo7gE#QmLW$b}9?kAJBH&#!cTj%EEOhsUwXu*Vt|(@=(m3JgH0wuaR4Gf|X^gIT6SA z_tE7XCxAH_CrHC|jBP!C$;debJOEJRmC=O*VzBlskF#?Dhx4rkF+AGt`8U!p<#O3) zH=H!^k-HG8B8f&Tz*uVOHM?fgF(+Xs>>^*?ATqW{5X9^+{O|~=s&f?YkD`@tjVH(5 zAryPr3`vRkblSKOJ_N8(f117;pALIPclf${Hl-T=8UZfw1{Vis#VL7VG5yOaqxKJ& z;X9qDhf9pCRmR_MIXJ!=RH!pm~uc1tiK@SBhAL1)WC8f@)sXQ;%-BllON}~*4k3W_=SLcFae>n5I^8u zuIy=hGB}oVDOLAAVMdQk!pXcK2tah$=@~CS9Q=wuPe+F|-`&!>Q=0jT#zEsBL7=`$0ok7Nm?B-s zrl)afP9!$sM_Gy%imQcsAu{rw9*aPQYb?Zkkv#1MP6}AUTdX*xqK~;GTo~-7Wn5o5 zLMDYu*R;||pA@pJ)aPZq#WyeI3@cHu-okj9?$0OS@-hio1!wL@ry&l@;#*m-Usre+ znfW5R5Yu(0z;}gNqK{JWah&Lb?4Z#Xx}8?O6_*Cht_x1Oz!?dAEhOfzOdtq1`%u-&v2j__&R5-hnEL9o7fu` zB!|BIommsB2Z!ezk1q(?UdB5ogslLV( zynA+hG#;G+TE{2j5v0G40k^G*YyU0_x?5vUtu%(!Sb;_Gl%?lg)aOe+`qYl>t*2#Y zwpwC}#G74F#;;SSQ&Yv>JH>L*xpud6O%29c`LA+go3-!0`>wIuVpW%hvGXufMmpTX zyY;7!;4&Q7_^(Z&q5RyPG~{pEr?h!3JCq<^^IvX%bNe>(9rhaHq~E6#zc)T~b)(Z% zn!i7ndn}53%Nq()<5shC_|{F6D-gqtCl{hL^+qUN#zY+YaE(1%B=PYK5uH%woDlw* zBo8IH1gx}Wv6=k#+U0J*LN$Bchk43iT>?Tdf z%aP*JG{lZ!#-zniee2*kdP^|Hjt(42`#-Jk>~1{W+TVDD!qswU=rH#m&R$K%uf+vE zmt!>>*P?TFto?N-L9p8XsCzK98SV69{maTXH?Veb4_K$DOc77!W-h6!=FlTR zthxShV$aeZg~(bF~5e~QI;r4gHIt@2U{NT?hf(oOv- zxdOigjI8hH>>2}_`~kes#DGJbV9$Ib3u%boRevrMo6d!-Rh9($-ZVJGh8$aa(iaWR zC{ZGZM|zc&>|M-fNslPE(NYM?E&rA-)RC10N?{^$e@X?c1a%?aK4O@zg>ndvtp<^n zgAko-_iQxlzL7Owf#zjzWrKL4mw?Fx>8ev*(9%*A<$lAw;{)XHm^Y`mhcU1ZBWzSI zi0U^*8?wRiM$b1f@(j3_J7ZT@{r5~e@OMj*F&Ta`=}*VQ-}>%?GB-Ee?vs22c-ZOj zrLuxlmw|c8qsfN^NK^xRQ*=nI!8^vhfF1~Y8@Zv1R z(7{~2PW3CxeBQb_zORmi`n)wqJqL6II+byZ6QgBQUJxB$&=dIrkq(pD3q57-@Kn^3 zP%K85(g;D^T6F?vUFt%Z$5o1yC2qx5?dz6;WhNBJiyo^B3cOFW++@%YH ziRrN=DCNS|1PDRInqS~W;F}YD-4p`A>`C6POe}`q-dsHxc(W-3iz`Ks!YrquEijAxGg4(_n{ja!(KC9_k9M&m8bd zyqUw)(@B+u63k5x`@AA1%HE#iBImjLhD)AJG^J`6Um|4|M9K(fKDR`x70n)WhqFvb zxx~n_W`x({TXLnzqcOzFKJab)8u;4BReEpWPQ;}Ezi0lN&7m(|e1GqSwNf&k9Jafu zxqAh29%AmYWy0o$-Rb2(LR*`6kPSD&{f#Q%UA|D|$CbcPkz1<-z(Du(XXOTY8RN3G zD$gC6XABK=4*Sr&WPTKvpiuY}Hc#O^vZd0KwTR^^SRfD~TNB4hh;w>HyoSI_Y*Qt= z4B{HJmD9B-tVTGD=Y3Wv0CV@Y+{ASrCVnNad_m#F#eoqbk-%4XSS}_g_i=3C7gsF8 z<<{U}ZoyYVPqDJZa~ctX^H8I%xeeLeSZ>>IjNnXRD4ad*^XZL7|7F5aDc$V`$zj%h zmWYU&g4P?eRDg&zeisFbw9}R>ZSo-is@vmR1p8h;7>*Brh%Bp~J5B|CMZ>Rl@D*%RbGvr}m{>fxmh*j;n( z?XH`n6Ra3An4HF-ufa5}&O*RiJ7;y5Zmn{vGTnw`aJ$ud()!cJll`srKR$c(w9Vf& zTA1Bze`v^4q$+y3)M|_ zxwwgPT0oif7M1d>aHevnknW?(Q;2=FJ0@+fQfypfVb$&ke#{Rjo$!woMdS^6pG6Rm z;HKDhZ9Z5>ewhxY9jUd!AZq($4%c$6T_cx&ccE6#rv39YlxffDSl(YGp_I&eak!BS z@JhnJ+;fm){3y?rOMZ$inDJo>Hpc`$__0P-&EeV?3PEy)a5DmKFkhF9SddF8(I6tP z`rBcJqnT%la)^U)R@pX*nf%IZ(5)Uq{7vZoi_Qz^CJ1yvU1BqTBn(*)72_k;zwJ*X zf5E;-VdCjYpXTZlgkR9m4r023iXBRbiV-Tr6jJi17)%kqFzw%T3tom=#t=QJ$n=5& z#f#~C-2zkfnP&~E!F z{|aNNf?jM@W6n|%6tEbaush(YjFpn)rl4n%YX52Q4Ts=MEk=9@vyj@w-N!w(j^_>Q z#f4S@+k34s7#$8zdpZjK43~;IJeRV@Rd)PK3Z7AFZJL zHTP0~GR~jvNtFxZ<5q;W72(|M(zy+$vTnMh4#wjlykthu;4!jGN*m#%U!BA4bTs(O zDaosL*#jl!eu4OjsbXK>SD5_l=2G`#IY&!_LVBp(NKg~YeTWckS0El*C>`c#NH>%^ zx%xSVz6iHfQ?b;w-@{T2%6wno>3**dZo(q+_PO+q37>+FBOE=`a<2hyHW7`Mq*ZVD z$$Tf*{kVQbV{(55Ttp#o%nN**We_bJK>yl51AJV2wY~$V{i9Nsy}{8@vlj1@>%e{u z=U}~JlX+^eZ2%YJ<|>&R8DWFRl+GI=Bm9MX)L;P8d3mA-WoeEPAdRkq!Z`Ljfh-G& zBZ76!vMDK}JR8en4>zoc2-F#j_607@deRQ+TGfP6=?ZI7#i{BW3suy)fxj>5+u@X* zxH|{9_0Y^)R%dM`=K`MYZ+5R2NF&&KgL~bRa&)AYZ^fOQPPxF%^kPPM7_%qlwoBo5vhy&O?h0?vZ>tIlA$ugBk0 zPW^yMUkZG+_FA&#-sT>QO)>uRZLKP98Ulvq_%yAvvDR28i|uP^Gj{`6w-}8_H~YsY zvojva!SOM47M=BS@e)p%Yk!ztgMKreK^daP!Bvf=7IM0(`$dPMfGCvdyH$Bd>t*r= zmsptXj%6}XAM=0*L)1_poj;a48oV@V?$zYz$QMy?ow!%MbPi@3ghb#3J6&#S2(tQ| zUS!3Y7b^vHe%vi%DlXHT&-|h9FQ;$Pcb;?V00FTO<2wj1kmc48wJxBI48y&JI z4**l$8{Q34IbSR22J`js#v}(XN1$~dX`WTGS1GQga{9_AF!`sW;Ta+7umu}#tp$Mg zt1i$3iq>%#8o=uTa0c3#SG%Znu`#$(X{kS%D_(?UVI)UKp+~1-Ipk^=m^{w@;fx}u zJtd*_1DIoXB3KJZ$E-N+!>&pcl4@XsnRV!1Hti&f;ws9OV=n+FPz4cOLPo51wZv6~ zuT1i~@g3P@XCFLShei@|+7e#|4VcTCA5X@|I=FEPO+nq*tDR-iyRA-Yw4ZeNE*zG4 zW;qIfr;pKgrYyRu`#t>}M^D0t$Xl9A6sQSdLvz);Vy&Wh=lqg>nZ^S{X#=b;xc9@Q zq4?sdVLE+$k3hAbD!$ktbv_5x`hkI77NG!R{MB~)A!s}{gk{2_9&|>4rM>QD#`q!; zNX$ctgLUo?K*xYWzS)MLRq4wR`Rc2|RCHe_R0^I3+KLQl#?o^3Ns|TA@Ls4vgq`6E z4~sK^k(KW~^OTFhc-%#(ji3_16<0O5#V4+)*awu66xomvGHT{x$hnb-XPktAwa&qH zRhmZ?ez>iY5@2#BTch3+ng@1Gj0p^~L4bf?D`!xGiP_7Fqr4X(lS04LMYJN-P*ZFV zJ!=`L${zFDBPs66H2(o}Ou`FXO76Kvr-N zQOV|@=#YasKOXr!!6r$)6FH|mgf=9@5d(RXkTo3QZQLBAp8oBfr|tE%_WC2D)%MQD zPq-YEzdqjBYHjkD)@mtuRVS8WPPixu^dK$QX(-Q5eHMaa{z+*3y-bmbC=Hz;d{qL&kGWiTYp_g4zcSp>>ySPqsr+)-%`{+=wmdfrhJh^k!~F^7<@=RR~uCeX!@Z6;>81{N_1pHeH7o+ zlrOY`p0&k5HiJ$)vGAdOIhe7`ni^G->@TsS(EpqIk1<_ChkgoNTT9TH#lD=R}L z+^idj3lhLAtOcd@4s7lMAmQ;)JUF7d9Kk>*h&CHr91Gnvd@Xu+T|bO{w0tRIv=~W@ zMZnBsPgeTpNHpj(dHS*jX;F!4RzOM0FxtV8a0&Kp^n{ z&&Kvb3izB?Q zJxy(U*Oz?R@*?!pBc8e@WFy9wNJ6sA-AXTEKLR~7#iCX~TrCX~eh#w@oES>wv9;kV znT67J&;_-6+YzNfW+;F_T9l}?jzFIWe-pwkp+ERAGIaALCS?23AR+QsB=m+Z;zUq< zzNe8y$XvazL&*LRN_KG!0kPdC+n6jHhJ9HC3$5yMI3<;Lg8ei*E~k`YUSJb}SPMr%&DU*MX;et4|79Z zkyhlzOFj11G|qb%p~=WYD`Qq>)_M~uKaE^QjI5aNnhZY>@&`3&S8^q7TM}hZc>5>F zkuligO9Wg=EDpyAiI+$ZNri@#a+#4WsZ!-CQ!P;@qtQfe5^%Tc6Ca1oqrJLn^a|XN z`k!hdp%KOWG=I6(x!$?HWdG*BUz3xXN_kLDUJgd(X7^W1&)BrH(|L8hd4CmszPi42 zA6+q9UX_^f>5LUqj!uX6*k!wD-v3H^>0G}hv-(=1A&zj@8$xI$d%YXZ4@bGw&C-q1 zqh>O*&h8Q>r$?MqRB|w9djI)`hQ0co`d$2M_uU8X=dz@U2v@R4rMa(Mzt8D=x+KJG z&g{82*p?Dl^!ayRB}kw!hwJ#T-^;*U2x+#jWTx!?f+$eAcff~wHJYYq@Skr^EBEV) zoVAy9msFIJt){}!E)fv&9@V5P|{d8xewfSEDe*3m~ z0BHYOyw|@U3`VHeJfOpw?{A@O+`QUyAJ8pr<(#+J4)+>%T4n1vZKGviR$7>SI@cA6 zQbx%nJJQ*A_2u!Lah1N>aW4I9=yHr?(Gc-6c3gt zUHoCXG`-*4`{n)f>q~h1{>IYR1JHVBW_#ysY{y6(@loe>EZHlc1-RSG{lA=|Ryowv z?n~HXZ%HX@=#N>Q*8mK5s^yyRRE&8=T@p@BAc2jHtN&dQ&kZ8>+@5^Nm( zpb{KT^$h2dUQK5lJfFoJoJNZ7?KS#u#GT2A-9b3{^%w0fuUtmGR0gJ%K1=zw zPmW&rY0~tf-&czSqTXJCv17L{t412Y9H#$~O&)#^r-&%G%oY_Uc>yP4$6ume*$HI& z*%)jc$XravFljJy-fg~w4baSiyQEEkfuyety0bn5@I@8Vi$=!m0xk{MQS+|#}xIhNYMD`HXBe}!?`R0GFJYW7uGB_vprMEMm$5ew3t1NRmsyDo zjAwN+rxVnk4En$hqKWUxv?pnDcabEG4ex?5Jg2cly4yeqhbIn;904;`X`Gl` zo?^76%Y}zMC^+rz@uO)Uf@#m6llsY+ZdUzNz(iXc&$rsw@k*P>J2l-BeSt4wx+RmMb?zVR}*< zQrAp3oGh|(anVVQ6~ikA+^03d+5Px1kyoU=FQ&XtX39$xf=+TdfyBTr)Dn_LbM%n~ zmO~rH=L@HS$+~pE(mcG)2RkWgOAL+@B2ec zkymCP-02^qEYcLQ%p%jXIG2ebHs!e5WI7#tf#M@oxj<{4%i1I6(#@ z(0bTYpo?XdiYS0tJg(x;5FLYF3#V5=Ul0*r-5u`nF-(~~zWA$ok&kTdjnQ}0_94o` zUqO7yIU2AdA;tlf%X)o{pl*H!lVa6+Bsh;>@5>6s!b#cYxtVR{X}S8zJBS-4?BQi# zy$XfzuLj_n&X=q}Pz2Xa;%DhnJL0X*m&ODFUBwENJ97pmO8Oz_KPIABO<5)DcSyu~ zCt`m6FQ;!VyetIh1Jlux8XKyfKykJ>@6qdYgp=CamxHc`bi3BetI+?|380D5{ck{n z_N80EH7qM30K@V%Awv;mst)~OGGhw5gdIk~xvqvm(4k1PVXpk+a$>#cnx)352r5#e zA27<2&V8@Kx1AtVAO=4$ZFU7{<|;H*whRj9$i8}IPfXn?su$_R@{m(BP7h5wPb;pU zGcH7ubGk#L*-+Jx?qx-Rx+9T~r_7h=_e|)$kApOphEWf~X8er}P{b(_ot~-*XDx?C zluRfdaTDp5tAirsll660ZhA;8&o^W|sTcvWo{ci;(V9#gisn16UKXPt2BO7=^SFf( zFVKo~u-q0rezvvN#*L+_!Ip+N8oYUIDtZBI_PRzJZvlYm-do7wUyqPf$wa-a9^Dq@ zt{#1Rf~rcB+1aH=*M*xBM0V10Z2UrTEB$rI7q`^EBU806r4mt$deT_ed?^o()lffM zA5JK2z++;Iq=?D*g~%W;BsPc9Lp^W$WpP(&3Ms7lf~@1k5(~Tllv9X;D7A+xFPsRB zPqfM_ZWJ;x;z%=RJdp;Q?loxPb?Fn<86<7aU+SfNjJDRE)cv`UrT#YT!9$rYc5EdAD`}))-vZ3Pj$pv)-cr7t)`9EuH<; zMKA-dyW(rnLMX&|*)?p~GaxmDC#GO2{N z=lnoIqeZ^;>)e5g$#-CKUnql=@MA~vjqIyHW2nFYqTBg5 zUkO2W_f>el06erWJJX9nzz`%y4g|l}tXEQK6kHfNGG&iIl!37wk)}%q1Emd6XMnu%cLd(7k@JZltG3w1+&%P^LWij>iaRmx;&lxs3vZCUx`Oz08npZU2tMq8@Pml>4Eq*TOpWHej! zDKwGRdFfop3^>uWPt5!g!g+w1ZXW2+`>jn|6kg$bF;J8DAUQ)A!*rj2IlHwKVKD}Y zudqEwV`JYo->Id8&h;F;vQn;YpjK+Pe0xv)^U?)m%Kl%VLrt5F?@=d|;Sn>lzxr=A zEZsDgd?!K(b~d(t!2Za}5JTu-n5+dLr6x?Wi6zH)YAWf)1Xjwx6DUGyEisPpTi%oi zFwW3U%%HM|sEStwhv^VC@GEcCEn!<#hq@aM(7w||!dI<<`T|O5Z5k_-UAG#!DzQ;E zv3m3Tm?o9qbbCQW&9OT`yF|dV@K)6H(A85IQJ1;&Le*fnFtan)P|60WC(Jw zVU{lE(7j3wZ#hXiR7spDM>^*In4TRUjEB3{`7j0lHbwS$CK{^zXuy^qP7b#T+XBE; zzY$`KTmfN+ja%xP?o4km%W?NzXUcrV`qI*k8=YyV-r2=JH#)mw-F3F;1_h=|4Tgr& z-;E~!VfRb-`7071zUo}R(YdvRM2LE4`uxU{ACj^~Fk#&`?MD6^n4UHNLh=rp+J*{_ zgLBL+LX(6!ZNg^U=j7oMm!*_+Hil$QNE=-d)h?5+rGZ>rP}(meLzt^uz^E9!pJPt7W{Fy$B> z7i3HyR^@mnDc)Zf^*f+^ddFVif?y1d`t=#?f}dve7oU8ssoykhv5es17&lnJrVbxV z*Jc%@ok&L&S;m@YUK(Xy6Ta*0WSj8SUeTF7*JN}3b?JWg+okLI=kKy#Kj>_gv&WYZ zMw$G4UC7-Y4layzo|e9<%DJvsR%uE1GizEx)rjCHncLTTqu}&Bo36vfYx}yGizdj% z^Ny_P{db+W(cc}EV2Wl31iTA*^av?b^E-}Oae2QFfb;OpOeREn9s;QI!LcYcsM`1} zdU3gVY^>^rEh=z`uS$57Sth?rP>GNDqs^IcUs~5v^u+)5p99oKC`^5X(5pt>9sm0* z^4qMJp%hM;29o+vtA(E?O)vWW29pbqP;|4@P*k8RNJ@J;fjeAgnNLE`=c9ehh^Ztv z3zD|a^Z$@?xGg6ON7dv8? zVc!sPj}Jh1$-Q57M=w!6Qoa`DCrOyI0f6OHxmz{dPb&AjiU6asVVa^Q7K(~nN^jn^ z4Pow`X$eLr=3VM?Iq&CCHTPpig2@Q69t7#m72Sd0X}nYnUEXFYVt|H`J2TFF4_fJt zRW?g>d5lPpsgQ?q=`&h{A*RjEMa$0A%9^HwP|&1z#*AtyXt=Pt;FIWm_)tI;nf*rHpRVYHjdVX&X%=iig7 zyE(~9)-|uFCYfy9Y`a8F3Bvaj_G`RR+T1l{X3XG3`IS1QXnFFNbZQckm~+Gq@Bt>E zsdA`)XYDlRNocuQ(Jo_j#02bPRVG|+k^;le+4d|vnFqO~jSw};==cG+p;K6}fnjmQ z2s=#c%6&U0dI*wHJTZ8}(-EWLV*C(?4iUi23B?=3y~G}H1Irj9?GhYOwbxxJX$BW6 zR)sQxhXu-?X@6BH<8jRG^-2bhE{QUqR*Xv|t-qPtiJ97nTjO!@u?BOin^c5&A67 zeT|u64_+R32g6#8g&^d{BfShlkMY)cyLM>QokZq*c8OyhbBy!t?` z0z4gZ?&@l!dCXBX^g;r^3n;4K{iMi>#`S7o-ju9==#To7?ofBtOR^fsEt^XLOPl!0 z$bA;!_X?;4And`{9X@)l#qROt?Iwh6Z-fuA<^;UF>ZC?rQ-bp)nMeRHX2f2@Y5GX6Lylx1c_!SRuHf1#nQZ4%c&OY zGAAFN@;Pe>8kLr$hQ8blOrNJ^73MP|W?5;&1bimC3k0k{nhMP-ULv!p4E~9TgRFG% zGpL&|CS)B$)S~_ED|>%N(61PlB7Mu-@q*99GUNYNy^3s)^YYJS31(C=Fh%eD%@!IR zL$uM4HIhIkYV3gFdezXFjAAT^ltW8)Lsb_|(RWuL7Y(If%V5Q5~ipsjQdNg^KWfQQ7_8FP-T!0+E`~O`juJ$^N~lYeQCyL7e0K z_c2UqCN(oCin`=0q~4{t47Jx*Ox60TwkP`(byVv*Z=6Zy+oFYnD>SN_aLo&u*{v1W zS=mB^d&aKnH`{<##E(D&@pvb1QjZ3Z&10Pn6rZyhzaT8^JM6`Ga3EtpUU%L-zj6QF zclTGW-&<-fcc#~u5J!fMzgIu+?gTJxe23bz9*MKNg$?n$^$qr6!T0}!?;H2b9uWjU zZ43>OcrZE=xcJ7mdDuxRtJ4!?Y08Q_ z_t|~@7D_bhB82AF`OsxyViW~&?GzWVGX;SAW6@kzVsOFIaA__*anOj7&cT!HLe&_5 zayorw#$7H}R#tR^9NHGl)9*0BSA!!v#pF}b;O)lhA_R*|ZkCkDg=oW2Rs9=g672-= z(b10vLs(oaqD)VQgBhTVv;OY8x1Hv5#-#3j_xAb9^}T!VpTFxgS8jAzB71cOVWapT z&${-wT->~~Tx{>G|FFNiy}5yFNY*zup6su+w%gBk){A%HtF5Q|>rb}Ze**GVqQBfK zM|?LVxbd!`2q!NLKH8U2rS5<*w7KhM6O<_bUe?FFJ>>6LyQlN7Y{EohXUmze*2WXu z|1n#n*#k*4!2sSS@*x2oFSOnls|zCv1K1J8S?HZgue!gP8pZr<#EeyxJ*L=xs0%=_ z7Q#M6(@&IWuc#Ls2(=NRE;EJ#n!Wt~eQ_6Qw+LVOkh_>v2TWn~u@u0+l@JS(ZHd_y za!q;%Ei0=Efd6rKkZ_2w?ejMwx}d~H>Q6zQ)@viQfvU#Lv_=^jUZn^jK6Z883`ID z1ftnU=?Q1PMuT>=DZ#UYmH3V7LubLzx&YN;gIPp`EoP9E%$kQuDgQ$x=Lus3rh}xNnb<{m26F|Z354?fzGqL>r%^QJ;58tD@1Snie z4YX`KDl$Wvm+%;4=%JLa!Y3Mw4wjG1;ak{GX#Qbh!}rBR?`+9f2&@Uo2&-V;Dq9TC zU?v1g!ZP9`;@pro?}gD^W}KA<{%86@cAzC(;7QPEWi6X9eqcS&BgJ@iHFgR57Wq?B zMY3zL`iPk`G?E~BPI)lZNyoO$cVN{n9RL=R_sV~bN?;L+H zzPkTE|G)qF|Nrm*@qhpC|MCCI)jU|kr;H<4ZlgPODp_sk;WX}h?^KK)S;KjW=1b?% zr|Oc79@*9l*j?1-i)XXgJv%-ckIvw*JwAb_XEf`mqjzfI*>U%PbT&p(!ry%0p6h-s z?#Q$Q2?-UhD98X7>zzJT7uoW~eB13NELt%Neq^4lv-CbxSlY8L)Y8>$LC%og-GGByxI45dYP!u z%Fk$edgC zBd*q0M_E;KV-(Q3-zzya)mT?iIFp-Ka#e~DC*&#$s?kXq#0(}B+z)A$1B9x5^vOiz z2h(Xm*Epf)7s;-2v7Gs!5+Gu!MFK)i#J?@dheJlz1UC^HmVg8SxyA~K({*P+t^0)G zpSnX{D&y)4nFIs*R2)PSucvonQ|P2c;j7MIy079J?x#XLpO`=-?p@3T70j&J01u+y z-K@^tSKc+YXe?JwQfZ9Y_?#p7I~|juFsdx%+8?IZGULL8!q+w9rsD+eh=Ns4Mq;WlE@3}Wc=u8hmf0Q3DPfqjfs@=vJx~FG7*g;vvP7A)SbyxqS$XdhU-eFR84J;NZzUL&E5>Y8EYTJah^X252g`ffTFWH71k2}bSJqxR@hu5hx5 z+7q-(KQiv4G4X6MHpP3LfbP&Z@8C_w>O)w{E!NXMLMu>$Hn={HC+{`$?Ffy+@`=Ih zjMZt!M@J6eDXim_3IeC+3*nalq7*`!X&EH%icJ7lb>^zTJR4WR7H=*K&^1LtP3SWy zcc+e%16V2o-o;-i#h|e({t;nS4SKY`_J?oK(!o-Y7yn6sz&cXk$U+UEQd*aL@)baB z2%wG0*%OKgRb7c6Op~=rhL9kAz!b2YFmTzO!tn?f6M{6rYIIhJO90n+9?tXzLv#ma zx{_dDp!Bnewh=x0YEl`6o*Hw2-5oJ;@kWS15SD|lz;<*v-zJ}(XYgl)JuLCiXewYbbFmm{#U9jdY77_# z5mxh5gMS(mLRW!f`_}G%k^2s`TkB>A6aqg2Ji<@iT?z0MV|J^nW;HIR$dnnHcOSCW zZAsP(c_#vlkzLXa6|nfYlZ4Uv7b=-pN)-0I=K_T8JeP=}3U|!!?HLIor$r#n+kQUq zX0eu5xEFT5dwKv{WPTWDP55GS z8*)uZ1~2%V4)C=Mh@%2a%9LbDwQ2mNdI{WP#8_ZCbH6E2lWfClq8`)4GCNlNnH)5;xu ziS7-np_6%P$JOYbCQeMjS-XF8uUaiJTZ`Q!k=2{j#UykzcvGoe$i$pEDCEi0 z<{sw~K2kOY~nI2k7iTZ&AW zmSGdgLfb@^O;vfK;3B6pOsXf8n9zbo#RG)0*w*4Vc@EXGatSkco z!1E&^?I~antwHZ9q@z%MGZL9M$YsOVW#P|7JI1d@m-gB{3|8HjYTxSu`xpjMe;KBD zw`1?CGX{WtnUVxkuyt**fAZ=C+qRD`_mO`Nmo4oAwb|qhqS(A{qeOAYwq;kLI=tjf z;H5K9L#W6mM+!6qTuM}l2hI5&v1nlH?C@35H0J+^C^>qGYD8}i`{I%y6ia5_GU;gRo7WYM%@fJm^d^*~QGxk7m0kNvbSl{_k}B($ud^RzDQ-=Mf8{46gkcnj`7K#3xe0=mOlg#fUDd(lR- zJoA^QA325=*-ctj(Xw&PU}PZ_Os_7{8(WXox7y$$5-<57>5g~5WWH2abM&{w3B#5< znnd@Vd(oUJRV#Tda%GLXCoZ~Q+CBA`$2Cj}1~%E3l*CPu{oi;Bf9EV+>x zGr5~w*wx;5ol37^r+U*~YjlR{d*9Nmu+0Cw<$rkTuiTUuFP`g_Y#(0FrExLlsw@XT zLPO>dOju$DG<2^LThV?9Te_2?|4kMfw&>W=uvak~QPr)!oM2%xyqu&7~k2 z`RHiy#`mO`XIrun!4&GhX)CFox;FGJ>xw(4MMoY-Thf|Lx@WMs(0XOVLHGe@|At00 z5*a~>recEpE-35MOM@k-eAXYry|=i>WcdOUS8l;f#}qDYq2hv@mjRxgFISz;H3?tw zV6}v?BGuUJFgz}5=%92UKc&1WY?15BYE8s6AeS!#Vm2gjy&2hTC{dsQoR6xJav85! z(e)VUYbLVND6aD_)3bNeVp6#&RbtJ>r>5*MA6Z<{wK*E(vf{lg#Ir50>*3})8U8N5Mf8po%M2B^@OQB>MGsV)gSw`4k?%~6eyh{rU!&1!^)h@y zK_s3D$KU^Xqy6LlR_n=n^-Siqe6rsD@#&-eT|lWNMQ~(2(Vzj*)yPi+z=??^k`PXF zQ`;u8c$3#Kt$;;^wJ z8&izvpvmfo4FqGR*^_IJwL@1Ytch5KXdDF||V8t}Qshnm-H<&JO zTD745<{s-AqQ=(JI}6aM#r}J&vn2%v3CTLDg0jeEgQ%e$@X5W-PuJxm>nas$!S8PU zf{Fl&PAiR0(Yf9!P=@BevvOAnC5Sad0<>VK_O7YxHs z=67R>q4~I27Wc|_Cil^=?^cKx`pT0Hc}rKganyc55FupU9<$!Q`|i8O`qRe^lky*z zQ!ds=FF|0P$bxC%;tFVD(7_})Pxz2^XVA_;j|WRN1aGC*6J=|Rr$60M@ngHa4Fl&C zY2nN@f+gmZc{9C!*szd#2&NIb?)48&!*L4^lx0!DF!TQ)|AI!3pUne{=1@!OQ4 zj|XQM&wL|hnHrW2Hj$cfy(onm(-0jC7($Pk|0LC}ULtXJRA_jD<|-beqO{!Tp|w=V z@o&mLVN66@HZg9mf7Cr4&X(w7dWn*og=O}`v#eK1U{wy7l*b4{VU**`k(gnXf2ho1 zrHM?E_JWp_R@f?vVoAeKq5zduZmLQ@T?vR#k?y^tdL}-XlHsP5wUO5k*wjuekv@~ zOfNE0kX$ZO`u&hro&VTjB*L-{kVKk~G^A!jq$}8_7z@qcadNvzQgf-+<`{y$8&OM> zh>e~|K98VL6UlFbLPI68I;1o>k4|DQ#g#&Sck*stl3y&QV_KkHxal2~U=AddQUDY! z`Ow@hJe7sZyX?x~_E94p19R7kr9IVJ6DhOI26k~O6C7dYv4cdK&4EXIu# zJa(ClC<@J0MGqAPo!;Uk|M0-rbLG#6Pc4wb#ab4K2S|nY*9!{>VJ{e3->eVN>NbSl zA^x>hRHIW!g$0+QEPV^x6K|#)ep}qQQ6I>uQ%=!14ftA?^m(P;|9%`ku?v zku`Co0|Y$$%Hob73bwmTugQeMtL4=XA1q9U)4_7f5E-1P^rTC(Je(+X3i$pnNbl|s zZmB5-pgY6M2KgJ;MH1>~z^Aw$vHKE-rUYI$+;R5}R45sIx#-}O4f`W(T+o&T$xleW zH-DBI@Hs|f3pZ(LpnsLV$7B7R8^IlKBaa@825Cpw-tcNgzt}%Bzv6sLCOjGsAe6Aa zqArP&bK^N~@FPfaC~NWVMp6GWus1B@r9G&$-gr*?Y(eQ=K&Acag?oBb0fYpl`)_8G z?uK>4+s#Qn|wbHJU8>l3gu<*04&;x z9vr08+(9PI?O^5lf_#<8{FS-WR2!MoLqz7S(;9`-0Jz*;RD!)6I5be<}i+HWvGWiKgQ5nSyXL@P96xDsrA{g(Xwis%BYNq z@hOWQe6NL0ASm1y3mn2t$>fM;%r}s z^H;`6!MgB=IhEmZ z#1o??VquE16dpE%CMJ$XyL7uK!aPNE_Fdegq*&a%sej5zC0D@L!cts~=s+%&5d)^h zMou>6+Qkwa3y_&v=_CVIvkOUqRxaJ=Sa>XMEd0<>@_Cse8ROemLxoe%%C9o3@T%R@IC`^`%1i?2mfWqICcqKs_LNs@B2Oiuf_@fQiWw zEZ%R!2d31Q?r%OIGz#+gsf*Wzj3Ob2h}T8UE!dv$z(y4Ihf-=YYwop41TKUSgorMy!rXZjkf)c9%--5Ye>^o7y2pSlVbQ8*@BKBmZ>c~ z+8U31AOVQBa4h8(hQ;9i3ngsQLv#g$=}cqWlAt|$TT(ciFf-wHFnfgq>$D6Tej|E< z63hy295)v#0TYPrCE~uOGzUBlv60&`$J7R`91xMVlo1Zcrz7~vP2=U_8m~Gp?m=Dw zmjGOK$f_Dj!A>)D7aay&;jf9*C5$_Fv1gx_TRbwh`|9v2A*P=qY)S@R%UNSf{GtxvoHPMB3*RJbz!z4od*dI>%ac3ha802ZSxSgsH@ZPa8uhKFJx++1$E zKx8hXcX}(u&*RCjQ>mJx0so*O8rZ*Fm{geoIwrqYj}H9Auoh&wysb3Q8EIE2EbtbU z1@Hr(yWWh%vQAQ{fKQF&)SKEGV;ykoGavdHP=^S?MD4TiFnuobwN6zJR(_qtIyD0RD5DuUs*^Xb{T>Lc((Mv}2>C9WS_<+M~Bvf%S%2jD3(3OH22cP4e2t3lqpq*K1=4uaMx9ku=06gkRv;znGu~! ze9Fc5*c$1a{2z6d=t9w&6dt9yQ>F-K)112iwJ7$+KzpO6#i|{Q$G=smcJEP1TO8(Y z>H}hUGUYvJtJ}{WZf>kmZ{6N`+FoC4uRqd1HhyZgMUj2HvDMn-v(`ft-D|BGmDy>} zKecxFcDLO^G`aq^v$6F9f7{yK-(BBs?X=oY@y%L$brrqr?6m$QajQRWQ2o}YThBH( zHDm<=tq299W7&aU=KjUBhWk=VLNy%-rH6u57q++MWN?4Pf9g&kj3462i?)?dYxu~L zw9ZBZWn2{s!SsbKm|iG5}O8047a3%$)g`vN9!DG2aBYJ>vBwhLMtsE9b&ffrEMB%q}DzWVF_zqe1#%ACx5$ z+Gx1BbXaClVdEgsuteh1DZ%~&EcCg3fdkAaC+Y(<)fU#eT2B|jzhD1y3o+W)JFf&w zaWiQXmtQR5Pjgx6eg2AY_0jX|OaF(xckgTK%F=}Y=Tj(ds(=JLu~XeO<0N)4mJ_-# z&@50>2{&U!pxqie-&fAX z$6>N_de0>9m6khw&tnkb_m1<28T|~G3G2htgZ(n8E}sC`8Uo#}tOx^UM!s%>R;oh7 zWfHS~y@u0saa?ylGvjC!fO>`{PKj`25D@@}vVDmV!Z}9h34%Z*4+Qlt2>yU0(}VC^pWR0= z3ZL%}5Ko3smxmfSA~oeh)1~m&PvNg0@tvkJJYvGc+J2Mwll%W!x?P(8n4vEG-!G}K zDRe_OrT~00ynqeLSrx!Y(g~v^j@7>f3y1UqsDm4-vO|w|0fz$G_iB}SLGK0v4rSVh ztslSap7%qAy}E4IuBr1czKo^$*aOp(Qv1f)iRLY2A%x7MsyNG6`L=nrA}e%5>`1B- z0P;t2YpaplNbg#eQVrfQRvc%T`+9~{L?=Qf7eFEdBib|sl-txWpsYpAHy580zo=`Qu&kfZOe1F;rF-&I<()}T3@4ab$#vW z{_4sWLvMWn=C&?ehqy&M-yvhujqz^aJi4#t&yT)n-3!_votkhL=H?%W9~c?w1eQBQ zyE+F_RSwm$G0~lxdjt^p=jL(+rWDT^wOPIs5+|-@L1$9-kPt*sLDlt?w23`Z$r45d zZ#f=HmUqD;&IM>B=fT|BCg6~SH1HF3{sW#xWtqUk&U>?#N{Pkuq$4ub0pI`&aTpd^Z@r8c20B_S@RK^`odkf8M)w=N73WHH=0; z83uwUrHO&{PtN;#TgA(i=?1!&2xPygdviEEe*<;u$++(2Q4gdVNtJs?b#GC8ERn^J=AmvCCGP3w_MjB(7$_D z`@)j+)xFaVsC&Z%d^Hn*S?I9#g=K)K`D8pi8rF3M)?Im%0;Kd6tm%eER74xpymGwR z@M?(HDBB6@#yT>!$A#Ag%oaprk+?&xj-%azWG`vTax^4@J9;P8`0%)5F$-3m!l}HT zikb$%Xldp&V;XYZ)4B8>1sC*>pZ2z?ZP@+CmwThy`v-cqqESv~r7Uu5~KJnXM&JonAD*%Z`?@o1* z2B2yIlX|VeYRZBCuJE`}5G1-3*`oM6QQeROsk*^*r0`X}hM?T}nUw_`Dwx*XX_E9x z-6W-Y7%O}UStXg^C5nk?tuJ}XUtT=SDu2oIw8)qg0h6boJM2QLf#uC`a&;Iz!e~Wr zNlx!w$>R!9t373wgYN08?i>2jwwSC4x@d^s;sGn^Izi>n?z9fDh=bN(IF`S-wu9x? z0ik10`6r;prve3g%taqiqCZeL9n{M7me~{Xd6I(yBXS(r(36KY4Dxp;4><_P51zHSRw*Hs>3do@g(K!GcX% zvYaS7u5F&opysh`=h6I(64U!{w^%t5n&B zl?1mo(aIgX%x5syh~xf-J0w_0!4mO~#Fx@$B|hFf-odqp4kU=?Fu&H4&*5WBR#{>> zEnPtJwyNfiP)M2yDB^EXSj3;VA6y6lqN64h6rvc$fnt^opE%AweK)fF(w5L!DB#NA z=qYR7x_%e#5Yb;TMk7TBL*1gLXq&8Jd36$rZ^k?2)a+1Qp9_mH&Ps|Uj~N=E&|hx# z?!1HmvU^J@)2-)_A+AoY*hLzOt^lIg_ubz7Tzv6 z6#7aKmHYRBvRfgnLuk;XV;!*!uI2Ytio&|YeeA*r^mImx#7;lS3Od#?6|xn$nn{R_ zB<$*^&|m1LwXT5pSTFX#!!n7P}fbt=|y8>FL=?%gE^6C`+llEYwSp7D;dj6p)eSQ6{sRMKouk zZF*TVGNc0PyeYX^@Xv*3gE6q+-Hdk?rdN0B8k}oB!d2W6n%P%StDv6`7Oxz7PPv5> zUv5RXW)QvK^3ZtEci|39;4Q!kR?s6#9U79w?Y}E*evr9D$=5<^fW-x7Q!yB-677@c ztWmVUk&5T)xe<3bmnYtv3({d(xgLetdrPn1s?M~27$9SGUi)1$_ZFHt+G{H?-l32m z)p66_TLAl2Tzo~lcRGY+3}v7PKQxr4+q^&>l}B$xt6ncl=+l`>gw!)8H^wcU3#V1!Fi;Hk~x6ugXJf_JFA zeo*E~OW3ff!v;?`ny1AEv_5>*yCBL5djR3#XsZh)_60LuC;q};{$aE?y7Q6z=VRz{ z;Gv1T(*7e(u3Z0IQ39_B#mqvs#C=9HjipXBkSoI!z&0tr;%c&j@2RPY2YsEy!Pe_3 z8xrM^7fcui*H}tNGGt^sMnP?f<>R~LGnAIasPvZ-#n0j_~!*>FMezBE_!pADiPaXKIj)>23 zTcpx#ruFkgkjCC3X9=L&Fg0_lokW7i1*EFrz%T(2;cV1HYcPb>rW zi^L1+ZD4t4;P?@*HWUqkr6fM!AljO-0EayU129Tu1R%#ovTL0&ytirbFJB<>FAR0J z(_YgLG+DBaaXvh+U%o^?0Kp0(2wb2-UM{*y2xsQ|Et3wu-{|Qb`gFii3OC7-x=~kRJ{PE1^oK84M2i86`@O>zNLKKjFR=kW!O7G z&R+XHs@8L~VTZ(rIwbq4K=$g=^>mBd&d`RH9e&IB*hHZ=kFqVOt#P!&P)y@X`MS`# zzeDwY&1jjS%hO4tT{!9YqW@tr(Hj%@p$4-Ib>hinNUMP|SRv;*eBqemiA;fd>1 zYX?$XT1W{c+tjt6jzC&1MRGn2koX8j26gj5G^L1iqkkcIQFw70Gw1auauwlHWvJQs zMCj@y)xvLYH9TXjFBwo%g`Ij~k-uZ6Uj&a3=Gfy~b~+f%J-VeXqBjU%dS|60KwF^uFMdYE#&dEb! z10^+6@!WoJ1x&8M~ZvXH7J^b%Bv?O~k{#ydXYQn%n=(J2bD&;&Q%-!b# zRr%?#j5?z9fN2vdzvO%+hcz&E~Q!-?b*dxM)5l^>6W z2&-b)kj4HYn<_XRK9GE62XM3U2_FbSt!1f_1RhBD5kL7^l6R;VS4Tp7_6Er8Tc5Dk zJE=4$O9Wm)GxMtJm(R(c{)r6*Rs5JW&MW;xiufX z1FoD_Z6oibybama+*E?Bh3)Mp$p1evl;v7Cla#?rtR2jWA%+gzP{9yS0z0At?N6aX z3<^0)Gfm7zTZoga3UrP>K=76_wPSi z-(3BRB%<73eYU;+H%Fc_ z)gL&J)xD!(+JKEEY6x6*K#4VQh}qn8pqJw;w?1gv0q&3M!lVqPv#&GjM^2ZR3yS0m1TiOCpVC+6RIb!1JK}OEmRbT# ztnuaj`)09Pg`)Ze0*{yuk_iWpj_S)FKm6%O$qLEr43Q7Ok0qpo{2AFG7t!ozB!$G2 zf9pd#UJ+qMyp3FW6lSwTjrZunOj*_tGA;tp1W8`?zz@yyq*qWdcr3R`X@sdevmuj zmc_O4YWSrBU!L4xHqoq#%PT}kNat6#Q{d!APeZrgRaE-YdDirIW64dp6;3jINWDx+ z^-l}6X@6uR-p2f~+=>x*b=7f97}lsBqn+X?M&7q7x8br9^r_dv#=HCq>Q}iUWJuf$ zd3^xfLZmvSgi>GM!_UVNM(SX8?wu@s(b@`AmTd6_a zLT}8l((WFfXx{SSu@+Og&HZJtsO|AcwF06M=nkL{gQHo0^j&LrtFwLk-=QF5kss;} zV2zO?qOhX8>Z4vImG^2p88&4LwP*^H@k8cT{{B$y0?_<-TVRP?2RbKRcXi6tRDcOO zrXfbh^w~koV6yay{+K#yU4QT^0-%1L;NJG78V=X>wndEY{h5ebho;w4iPWe$DhI`c$s5$Y6A}=jGSPW@ z0g^P)njGV+M{rlyM$!P<5raeK<3vD(q;PV^{8Jj~3vbArr0Sfdv)RqX7GaGd$+ghv ztoOiGXCoAh^=EUa`kOT%3S|6P_O`;3ZEm$U_K^-%MY(JOTdACZTxffpkN~Y|O)1a6 zbSHt9ASS1ES2FEu*P^Ru$J>-#kkgswfj9;HF#W$wF58H>!ios2RXdj`#V+K>OOyQ1 za3%0t4Q{DS^x^%z?Vlt`9aH{3r@y0Jhq=U4ow6XtK;!y}C$_fTySToBBc6_@S#$}Q zk1w10$Hg1%Bs?>U@ce7z^6Uld;`CDHPhv6Q<&}v;iz<4vIp${e4f#05;z_Vx{J=8G z@~hoXaIG@n=R>=P{b6NDPOSWrjb!FLV;|lBEkx(dg^_H?uKDXqhhPgu zUH#h%$|iNI2$4I~$6P7uiX2WgQhO!%B!3I8cX)|HT3YD4UM?yn8uRoD?yW5kb|v~q zB3%3dHLqsh#otNlU;JWL#VLP2IQK_|E_PzyL-cYt6&sGMJ;@k zN6yII00g=zUy*nT>-BNd?jMW*wyVewy{Xs>h67wgbRBl5erXd=MvUFP${&2Jf3xBQ|%lj<( zrlMPGCM?#Ekgrp|7%YdY#tDaFM^;@O5Bel~R>zF*-ueIj&;NZ6etceePj(N6$s*3E zM9q0(ZNK>N1AelUeUmWoHG9_^9C3eU+b`_ZynS%{0sPl}DLNOkg+P=*shJOSMoVEK zi+f*x1mS|5^unIxU=BTH@(RY7n-?}^rg?QVe1$Xfcq~R@ZTDWb#VVBoe{^|%j+h>a z)LLAcdl;ev7o?7egmvBDo8Nn-;buz@G1qfkmR1AAdCi5NC=H|?V*%DFjtq;0EY00l zxzzRz;LTu^*o#o~2ZD?Sb?M09hAT?}leM^a{^R=P&nR{B1^+tz`6vA6@1viWmJm}W zV%sbRBx2m2-yZwD*YFb@q0s4z{ph}h>4TqlTWu7O?qsbNgXnbcIfP7a_9=}~(bDUW z?>@g12blCJ>{wy*^P{^wcb7)1^mT%Qe&Eo8$8VAlk=;btNvgIoJDCd(?>lqpH_;wX zN`<2nZS<8xHhwotN=g-!vi=ob0!c*Xxx){b`-L}C29MNp7Xcacl{00~5~%mXAof(Q(WS$>Xc zUHx2p?KzZ`Zx<&NFyzRcAlVd*kcz8&o(c7ThxEzFvIIhekL2GUl$W0&dBP2kNbNYK z?fuIEMJTPNLf;_Cl28aO?|AjKa}gW0Oy(`*oZoVO)%k9D@WEPeV=4r}z2Xx$#ZQ1; zr+sAjCAX(HWJu7EI!;KN++RYQ$L~Cyf$^}{@u=4>jfD(7=Qpu+FWWA9W6Hqi!;#5e z_Az*_=wGAU3y*VuAk~LJ)x^n8J7IDQbW+pDEfx&_Y|4zK`DtK@eoG;6^<%mELcm;+g`AcpGYJ+N{N$>tc#bZL z=V*1V)7(W-(Ht&2U$;AJo!~SYMi)6FoF?q0q`ioGgz(DmT-oGs%zU44q(YbY+cuWL z_^N89`X7Q0_d1;2wZZXFkVhOlAz^@w_q=Dmya3ybxVU5t=?wj|t9a(*d!TD{5-I4n z=KC^X*H^?5H0{2b-Teh}i};_~W&kY!l4f$Q=?kK(aQ)OOFhQCo(a`U|k9X8s%O-?T!ymL`$GDn8+loDzy8L`RAzCOo0!{ zL*|(jrXttb6h#+e!i;Z#+NRPWxXYIatAc}WfX8kSjqZv!6s41Lv1i@auwbMRs7|C! zg$ahf3gAy67i2mp0#~$8Y9d)h9Y00+ML`V2f99Yj9-^i(s23P=@2V4NmF@OlTVxYe;Y|t3UN}7)homvmEZz+CJ z^VYg=n;CX-dF~TTz*nXzWBfV__h4a?E2Qb5BnhbUTd~7sj4xP<#17Xzf>VzQK~X@6 z3ZRh)3&u06z|ey>RBd(9JO+7DvOSQYra23AVny>?>;M^91(J@OY6ru8xG9DNW@fPf zmWoH|gquSy(lV06E)fw>c#$NDm-~7pArXZi0CC^}$}R|EhF`>6oFCLn#5?GEppWUk zqP7@k(mY5@?_3!+@|U=udRxzWT!@B4;IQ(d)PqTqBS#@8bO1o(SiOH;!W(#T;forU zROVy@3Zc=l9Qe;$cbdkF;Q|YPboxfyT|O`N*}U%d`uf@yxFT6Mo4Gz*XCZs69(m~l zfWQ*DfC7e+xmgR$dSUlDeFY}8sD~q23fyh3c4W8G&D^gUyBRcW{zpZP;x8uX;BfBy z$dL$!4%#?(eXDd-sFc)&H-386_SaT13FWAaCQqYzcuI|&Eiv?e)4eboFzLetb&(l? z-<6{0;7gc=J%u)LJI|dBPfu|>e*;}VSow=_A3T$3g=oFy`KD%w4xFR~6AZYiIh@Hf zwO*U3hv?x5h5$1`cqyWkL_s7EKNg=$i@D@;&=mEDg#JicATtDJ&2N5aNx?dMUVixl z56s(`fPYENND|*f!d~O$C^#pT1y;ekjNZs^@jZ4%7^3}e#(+G4dZ0<{omFiR`l#G- zs^U<}3NbD;tauu#8bB|+&?;PR6Eqp2vC1GGxHz_;qwu;I5kBIsn?U-~sGHyq)lJ|p z+{4OmXLsopZ0;-rfwVLd-sd8PG1B0qp5*T&pE*{MnD8$u(upLNLdbplZmJFfseFL_rPN}BsCWgIM5s&=Mp%PY&IyP?QQX2(1{-oW z>#BW$)VI;klo&281yTfQk?>K4?ZTObE0U$zL>s|P+)F@CA78UH|EylVVWr>};lZqP zBmyb#XmduoUJhr94UQg?&?+sc8)xsw>JT4&lnjyZdeY@@pV@N+*z2H%J#za6XRr!4 zRq}f816x>dc$GO9?`Prw=_Ip?{9e7oOQsomblM$!M=bA9<0&f6Uym!)f{i1(C0=w} zFE};#lcg(DYjk;b*1dQm0X`#Ey1F&pk5=Cdi?=M|cv+Wd2F#upFDJ zS>Rp^Y$`a=Gt^2#IyTPsgV@IOOf-(rV-VKFg0a6|7);>){$Fz^G(?2j4}^Y^n#Pj8C_@7;Kio=aCYC?ay5lpU`xe1GFgAv?2S{) zi}(VZ_F9n@5wVihgiLct!#W6LNL>1?2VSDS;K9*G(yDgJzF@8U*Cq`K-Hsmh#;I>kDJj3u6a zf^A%fG8t){VCV#WCrjpwEe7WH2UOH@l<{6<=Ww%30Ho=%^YMwXsulVSS$Lf{DaMfx z-HZXSrwo-8AE@*a*2KEKlQ%G*4>qwFym{}E!;o!V!ZR0r&AwBj(C2L$Kbc{JCc-G) zED6-7%|M1=pnf^itVKdsW;qi@Ux29(CBVckSB}EOZZqgwq6F43wm-+i2yr_0B!w!Z z(lM+dQ9(^bZ=s$hhe|M~m=%rtB5pUlHW%j!*ru^dBn@CiuC)3^*_!#o%L~?ETowzI zbrT3458nsggo+jrXSpM&e@R{#1A-hC>7ibllUAHr^;><~@S)&?&8#dYRoz=!@-v!S zx1Yj=VILoYxAH4PIS5TF{wB|<{%Z?9XQV=J{c&=xKrxQa+4?zU8vBuh405f^$P zRQZbnR7r~nBP z%QYvKWre_O*4-D`I+7EcZE)BzY?vHW2K0Jx?*j_cEy%6tKgpz4cShrG7MnI@eZD_8 zA?vae2^_uZ~0n+FN-6?!9}cu~HS`OWH(Zzsk_7nO2ox5QE#S1qK(S+31wk(S#DRYN6DYB`VCBD{xwUp>%V`dXeN0>TEnjT94akju={alaW}YLbbgAt2Jb4fmGA z@95-qNk3f<@iBUp)CeqTalt5tLnQPb9QInTprZuMz=Z*WRQL1_5^3M8pjM;FhZ1;w z^Q*PhmG%9VjmNBGjYpULQ)Gg!|08Z7 zeM!POLe3i7K9DT=BtY5>z@FFWnA#~#s0YO2Aus6uq4jhViH*qd!Reh&Eug{1r~3ew zs)(K?Agnk*;1{h)GD)!h3;Zb%=?&zgonZ%Goc07jbchHJ6Ru?lYpnl#V;DYd(4*bh z?Uzm5P2UJw=CWb4Krwk#{Ncrtfu;W1^UTG2R3vg`xZ@UDcUqs~|Ksl;7Va$k>+e4e#q7N&*h|S$$u-t~fC5&cmldLxT?UH* zLvaK1Jo6MGv4`vmRQd3~MKy+$ZUlxi`VB&f6zh_~OOP0e?iAh4kq~PW-$H%bkSs$% zRai2sgv%&TeTGy8eo!w+)+0#n(E(4`e!&}Ke;hmHh*a{zYJZkH?t_NzsC$Thd*miJ zo;`ik23r%7!&Qo-QXFR$03qw6ONv)0A5$i#mD%QY>g5*VWbUQ>mFq9o!Tw_d<62Fh zu-v-U+8f`}W61j?Mn@!z-+&S&gOn?fsvZ+FEKg5~fY_(U)X^uJq|`<_^&H)M=DnPwGr&Q~JjWE}AN0czg_> z0g!Sp%dQXBJa9$YLb*4u&rNe0H$G`D`~a;d8bE1-f@>72U08`n7+8uyPuH z6o$b6Z@*sKX?M0H4?5B(!PNm1P+BD*ArfXmQ!(BNw)=c;IG5NV(cxp55Cv8AmfLXR z!r|0*PZk(FbE8T{rV>6(M+JSDydI_Q?}3mKFOA56o3rr2&GUDK31n>7h$K3P z{(Lh3rUyE`;e~K97Jy{O6&KFYVfqAnel0qwW86@GbOqXoN*j|2N8Kf?qiK}V?4!*z zk}6Z)3w6qSOQ~+Gnovf@dap>n9zkc``xO<(;LSxb+=Xg&)Ka0tlJ62vQPc1hWap3( z_;{$iJPRtmkg3;sldHH2-$-V#VK;xJxSW!xQvAFjmzs_Cw}GXqk*TgFOCtJb+&@&a zWFT$yw^iFp;T=GmVr(T$ZvF@#B1j3DdFB>A<3G#%XOaIb@t9!XKvex4P>pcg_QTvUD(%2?X0aZmb~bxxt({YsfeatcArLzVrfvE za@RGaJ>W4S>O!!OmSr*Tuetc(S1uSS%7udRMcli5kemg0WQC)U-oAV&{qhF3IDpVF zmz>kmH2H;G%%>8N5C&PojqO+aVy3K7K}HF(cvdCCUi@5Sf($ToXVJ+`dJ5@uILVXaLf@sHH;}X+25P^Gj0uElVMKn%|1{LD^gRkdYIWhk|($2kB`+_T-OI zf3!!BYX33IhhGiH!}acq-l=yr%SYS2;~u=d4t1m-YV3_QQ|!PM;P7OIVdUEh(~$Qy zo*Ygi*5Ntz0-E>lCTJ99HVHZ*z-@tg8i9Y=YHzRXY;JeR34&eo=Pqw-W?ds1>XxzKY#^PDs_}V2j+mF*Ttrc*Dl@JalJ4rl?V7P)>Wcy5_x$m#iBp{e;)c zNF~j2$rHd$UAqccA)&G4?e>u0ZvUJ1c88qv+T#|y<^KE${wFe3(WT@tq3E-@vfl2X zVk-EFh9;5c=QjWB?R;;9`KVjBH&{@nyyk>lL57{;0QA1t{v@MF*lU>Va9$C^b3qHB z=3xt)%13N2o=!jw{OFCqUQbCA0uzN>{zTnhG5j^!CBuH?(>gzeJ|)q_qAW6I3|eBO zubG0BlMPh>!nZV9%Bd}EmWFCRqskf*53#D9_gXrMc~nWtZ&Bba$yMccWh~A7%krYO z)|CrfB5&q2QZp}3cKU0 z>0P7gNm>Ol4eod~Bt)^LBBY7}x3b*Z55S}h2QNoE!>@)r%Cq>)Aq&ZPRe@LfssNfY zPk{1loh13nWhe|;fVifpyvRG@W?l|focZ&n>RJ-VkW$xDyC13De`mk*?b^=j*9tm7#7c`0q8M5d>73 zZ*&i`>37c;tNFWAkpf=AiGabQ>vK(?n=b`L^;4E4l>;J0vW7>`5tUGyaa zBB9S_0V7WZby|6_B|l%|APA>nA3+-<_A@nxITP3)g<6pbg!@DYnW7(cbS2nr#`hTS zmIxoIpJKQ(fek!A6UVDv#iWt#2w_*BB1Ud!h|r-&&IlySC;hrpMly-~Uf{7ptW~+u@@ZKCTcJIrT~~;J-}zk$U3A4}sOmdCwaX;{z+k ziJ>jhs2W6!U8)@TlqD!(8sT8vL3}_CA;d!!>~`cQf<=>&uJRb)tR6C3;@z2VHGHx+5f|hOBSn6ZPmmViw3 zA1R6on}3To{}ys?;vX3PTXYp@(Y}ueD7EiH59}6ss)tuMH&$1Ijb3V6uYHp?$PM6Z z0Ji`$^4qUQUx37_Z%q?_faFQFUDfY^&7ZDqJPU)fqswwR~S*3+p)rv-kzwX*Vb zg7hkvVzd}}@SDlOf@4^w~IAAJV+zLSkY4+41_TqO7l+I0VP4#xc` z3dhS0xQolQ0RqNCU=4faKL1e-BtQOKIBS6x zR*gYh?=o7*=`#29ru?{!!*GNFSb`B9$veBJZ(xgb-aFv|OV!zIKBmbv?tPOZ6Ex^t z9)i&r4KExyJ&wY8$EXP%N3ot$)*GTegeAy*d?rmB6F5Q; zcGJWI1E+&F#&Qs}sr!tI6z|$o;R*8UUxXY5YXewVD0KM_$m@#PSe_=9`e+NB+O+ue zs_mPN`jP&<6R%XTYlEXMf+c_G1t7^e>z(U;naY_`sYUw@hvm?4uLGv|&PDQgZm!{@O-}|kP zzJS7y6uDxMPFvlMt*#vjaKj1j>hmZ>R*eyFDL<(6=msf%Aze5zt)<|lG9MNi$e-9E zXbn_7s-NfPmk;u0ZhoQ3N^RV==r5|Ilm z@)QOF%U{8x>U<%?T_nk?Ei>`pNTgH0^mBz9EFGX4rl=KpdAmD!*~4Y}J)&|^wReEJ zqpm??)sy_Hu56hvM3yH`m#kD0H;Xbs>?J7VtX!ykr3653fT+330h7XI2}M%?sI`q% z$c`UUAwnE2c|qU?o7ODj*ZM9BG);lhCn~F~ZvlvQ8oA~2 zQd(2amuyzvUS<5q#iSV0CmoM0N`>#qa5Qh1MCc$uaPOk7P@3;xRE}Uvei`=Ux12o5 z`P*OEk1#R&O?Dy_e628G@-!1Pc?eSZai@3jK1q-`F3y>0UW<{3-y=m7CmOhoi4i$S zpqB;DCKUDJGh!x%)CK)Gv0h= zy{Fp%*nrYyrl`iJ#HGmWCl5*Ma$=QU(y7Nlbr4fZsheH#8rNC$AfWRA?hsD-$s`wo z{GR8uOc+gBn`BceS1muezQ2pYL9XZEv9oe2plAN=&Ko3|hSf%aDJB8jGF5g;y15}Q zpoWbX3!7eKf|$77dfmg5)}n3+m^Nk(#8h)CVtbIJcx<@pczu@FoyR)3^9^lvnMwe? zSNweF4v;l+Z9{gKTFH&9q4Wmrf)DF1Meap|H-pjTMK9j1E6QWVOaO>>MJ|d32>|x| zLCDXmcv*hkW-WJmhL;;m%bR&fDG|7O4~U&z*79Ctvl=E2$I26=v&Iu zC@KrT-K^oUt!mCL;`27lxCV$b04dXx*gyhPIN?;v(rWp_Xzxh~N+`ilL9mJ?hSsuC z55+aXbD#9!S4i9*BNe~AH zlU5XByHrF`;KEmXeRK6M`#XQzYQq{*Ee=~d9T6IMB(Cs%mzZlxejiMJhRc)G9 z8ItoSkd~nk3vzvs$hGZEP7Uwg!Y8`OYw5Lr56t`30`uggiR?LDhmTmb*)5h8_GB0^T}1e?#0o)c-h+3s9zd)LBiN z&CZTA8ji+!t3bCv9-?CYZFKeE6K*pI1p4>!?Y$UfDuD<{1 zBel)mzKzyw%UH1yw@CuURFQ1J1fU?Tqj0Tx>p z$hdSEKf*lUmoO)VHRP0}VlodMaP|tQ(wOfs+dwio*#quq5l@u8-){dB@kDybx+*Wd zKd)^Y|0L>l^Cb6*J{Th~jLJL&DMu!g>$MA{;+6j6>scf|rAt6U0}4NC8F6Sx3GtI;l#!n6>>Usq0YG@}(m2Ld=H*ha=k zp`FaLR%nXD_+(>0HFN!u6aE?hV2_w8MU%e7H3VuA_3C6QAvlCLk++ItFQcd}eI&IJ zT0ZQPMA-k(OU>*ZSHo`3vd;+)at4`>WHBre?$}i%5R**sG6rHK!m0pTVQJdLJCSglriL4tM@|MUwJ5|&Tijan589EhmR?}&!fU5I$O_fO@hDh<= zjvuxDGcR7J;j_j8>b({^`#uy`h}{1F(7dJY1^63DV9L9=CUI$?$5fmEur(up{M+u1J~v&{faBLf%q0@fZoR3DSI1sUA}skLGrVckK=OTXwgQ zn`)|32+Ronmnwi@M{xfEWKeGZ>#}?LEBeD*WL67h8d?XRKRD1@PX`}-p~a}Ey^Y?s zi>@i5;{x3mUbH@cV9x7VR?%No6(SoG(;iEdO$e6Jo0hto8_EC@?9F!8uI^cYAfPzC z8I1nOhaX~R5)4da3+|Fi@dQ9P-yMpe0UB|kfd*sUV_;2dQG;% z)=Oue&{UQPsf&16x}_fX?L&c1lc4WKFM`^oPBetxr`feyt(zjq^+#X#Ujil3-ii>e zAPVNN59IhB^^)8r%=IstF-N8+qpBdSQkDpl^P=UFM6-3%+HiTa$fvst)dBVCRFBku z9GnKCB4nz|Krt8e551fcjsLnt5p)o=r`?P1nkHJ&a%Pi5Z-iqK(A3Z~Y`V_3nh%S? zOEZYTp+&I6_MBQ9*%?@c;siSAp>Q8676&A&o1S%c(jBdyz{eZpaTP8Sa5gdY)ln1K z+v>&A%|_QF$$6SUB%k|UHh~uEQ)K*>?X@OSJXdgQaCFsmH;+=CF?U>$J%KQ_VFTub zgsb~e4>=P>m(w`0vN^elZ2x@JbWKg*iW@4c4lZ;RY~;kT1&8L054t0+nD!g|?ggz) zU#Q!cr*=9W4$s5LebIQJba#08dDzm*RK+trwB!<%M3{R*c$2#)2xH|_RHwmlZyU9op8@U2i#H$Y@rGu3Gh(UX4DRk zjE*=$36|i8ew18!qJ;;>umhk&)Jy6PPgg1Hv6F6)-IDz$!iQRi{@jF1kpf=L?HKtlX}%UUkwtc8!}F-TOdprBnhO#WbJn7Gj!s z1b63ln1COd^;cJD>VF`a7nbqVlaC^)LEYoc?eb}*2gkLvA!1yzpIQQ-92=1_X{)sj zL=6_x^Gpd@yUu=@FQIrHvLO`DgS=Jqyy=@Vk3#zC=A-{?uU03Gqz7rM&U*HXMYmY< zAbXgBxwAuqKm``hHo)^0Pigh2+jYA@W$RG@2xgC1t3v8m#Bvr=$wG=?@zXukDpQdI6O|WN@noa-P3O(o z@o?}4C~%TUlTGYJ(kOy)OrK zJxPoGPBFeT-=8*%>bH#0UPB3?Fl5%pKJu{j&$_3ahd3X~V#N6{a|P6Xx7Km>e7(8; zxQ*)ug&JSqYsrfh)aUubQETt@r?+&+oGnq%be?T(ZEo+hAJe@grp}*Zj-*O8q*ySC z*^;y_QoL)VR?;8kI~1(PdlZ%DO(Rb}mVduM(j{~)e?QPC`U472y!c#RLmZMH@-Ou2 z{4u=XzpwQ_x8=@`Z@xSPHSEtUS2SK!e9Gmes@C;A4~LNb9U#{#YXmLIsK7g zR`VOj8*h=~qd#+;M_e=XfnixbH{;mdH7iFA1Q`JTUG-vjb5gy)OR%vWV($#E;1vTr)Yg4jFIxvG}oFOZtsGATd z8WRFgj-slyUboss>WLPNe9)u*1OFU}vH*V|4f_S+Oi@Uk>eaep>1HRM@1hHFwtw-( zJ#6#*AvO#B;D0zy{LefxMa>`cFXXvkOB@2!k#;dd{A71Q56IIRWrXO-v&bjJuIJ)5 zTiBJ{P%UO9Sd~8d0tu1kFfxU)9)2BjHZS?}1qb&ACuxJ)sof%n_y#CR$1Px^;3Aev-3AJfHNY?H+eRqPsV(9rL@K^OzxI! zhy8;s22w2R%NO1FzY8?u%e#1qvtK(CP*(v}b~RpoIvD2ez2+(0{dD>a^hW>nhQ1P- zQln7p$W4JDn@54K*Yp`Tw;A{=hh6twc&TxWoxqPuS3{gXdMRULyNEUk(<(nD= zU>y?Gr#Mw<^>)8-YdTbiVws&N;V`o>P1W(o7T4;Z`xMJu0R6axJxxGlK&atk3Om^f zIUVMkNmihK%74Psj8eht-{bwy<-p5gg3My_audD22UshwntF zv6uIKm;AqySmU^L@IvIqz(5`F&NxWte9(dj3WFK4 zH=^duQU4ePT3S@TO8psIaLo#B0rapP!Tn#ZI%v$Zx;b8o#<=z1^Q_4Rm?vCP6$6o@ zB1xZ#TZpfVbDo!3^27)YNK!R;s}P@36}yr$CF7He;VYq04YD_iL4c7TjE|8Y?HL?j z;UPhD%q<^gbc@A>m*In8Z@L4dFgb4B`orkfatp~DYuVPkDcbF`0 zC)}or4C=N3tlaN06@|M$SeGFS=YI^oPCq?*ci?-hmeS(=B6qD5ZQtz5ZOK@iiuelq`Ge9 z|FndyGCiq-DjA>BY8tn5l42}|9yQHeH#g;wX7`Crx76?-Qw{YRWal+ON?;gkL*B1` z>T+b8?42%EiTjC+ zBYo4$rU*L(mJ{jb~iWNT5Z?Si^(Di%>CF(jDs?gOhK$4C0Q2RtgzftJY zwW=1n7=1c)ImMfS?u=;~ss_Lbw-J0PjrhF>XW|#e|C$;TED0k1A@3MJuf5Xi;bLW_ z#9UpesS!%g#L4391YDuh$$93BxaQ)hl2Rd9Tt>w=$}fH%V7ndE{V=wazQidhb>LJR zze<|d9J}T-BPCO2qGtJEo4)SauRVUA1{WrJ<{nCzIW1CHKrn25X*gF=yU08=N!cHB z3kBAmRiVT>!F?2-TpjL&-^6W~2Ctha2^le!_Zo$wOac@}B;iv0Pf}asKAT3fLmmZ8 zWmb#k-XSUjX9HJ7&qDIx%uqN8zS$8dyWvlf8Ny8(21y!l0V11Z#OQ-PKno?kj}{l; zxnjkEwW^2uMO20q3!8~3w$ou2uwd)auXjt1dYbaAtNt3NLYlyJ#NCq>hNp)gb z-;2a(r!Nu#-+B`;3z@L{TtF@SHZpvPI)$*EgCni~pB>LtiLd`63$bPdfiMH277vO& z>sru9=iDFs69Ro$@)pbPo(xZq5D)QWc(DSL(kmxOGL9qy44N-t!=z+o*wm@rPVJ5Y z8awvM>TU_YpU4cE{Za*p3|RCZYHIFA&6>{$n#q8BTYYUHszUQC1U;?tLt2L2u9GLV zR@|mp&I*`%YAZFa2K3P*6|*noN?!-JQX^bLGCv_G#%;%h>r+(HdB-80S1t<}M=zvt z@|9~43mRk%ueh?(`(1$XErHd@-2*MEoPDYZIaHx*$wcSmyj%}DH;-ndv9@!!AK*d| z4|Lmu3$2%!QkxQmv%?&!;#Rax6X;ic3JK_5FUBk5=rhc}0a@r{3c3@>dvW5ehhUXa z&*7DEUe-*P9*>VJtw5M7yI!~1aL0^#ujbumZao94@|f;s(QE+XCt~ms-o&~lxrBUu zjnfE4EKWf|)v)d;Q@a8=CC7;mQBcUG_vg|bhZ1?6f1Rr+SN^xI#Sj`yH`LAc-ezkr|pp=uAn}Tk2=l*^7>`pt9 zL_jKBTzOjRC!Y4!G%b-juX3^jXHqg~F(x2C;gMCl>9ZUKwj3Fetp#~cJ>jXPK$SeF zWdc;o&r*Re=s$H^QGAibx)m3^W#x-^gP$p$7>+n!B4#m49L69_o$@8j&Zm(k7CB>d zH>XCraa5eBxPIxCbT#8W>Df@r*ZNHZbd&{1R_b}3nkoloqc<}g8V8VU6{dXU_17Mv z_XPmR45$GanC0fTjue6n#!OgWH1NYh;TXzrNMl8*9Ol{InO`MiQ77>)m;j4}hBR>o3o9t8|z?PS&Tk;?!tBRYLq5aj{O|C{o-NmbVv zCKbu6e8oMk&{;Vn%dLsW(TJ=F@Ni8@iwFtr;*_eLJGq;CI0KF2_e*p42@?D@htnQX zU;$t|GE7a%EeA<4HE#F3JZq(<9 zaZdC(%@O0Xa~|-xdV({J2nStIs{T*3`2;fUKPBC3jpRhq{!dw`OiY!8_-OhC|4*kr zRnw2n4@V~HR1PcU(*EF*HO#@;kvLJg4mTU|AwuylcoF&XNGo5$`TgAW@A_-atS?l= z>g(O)1ux&CxQ~tkr+Mcs;b+BXT(w~IcjQXkf3jJdG_#w8qkb&(U?W_V9CDN|=2H&EjxsQh*$X@QHY)rh~~?LOo=OMlH97 zqdvXXhzWMf3m9GBQ9uYwe9_}7*j~W7sGA$xqteWL(YYf~6G@q%$i0g_*~83Edjq(> z%g|aW(VP%`68dVnb^ER}vNq4aASNtg(>wxcld$g!ND2760&Wnrm-p|Vb;pM%iwhtB zWAEgnc@~cM2?D@W$OTAUKtFXBrhi8n)_5=+c7UmUbH|re?nM=_f>-kw$c!>RLoRiM z>%Bmc2r*w2*j6Aw^^-Febt)dq{Y2*Pa(w*1_K}}gVi2-vAw6t<{N>C~9-JL;xmia* zE?Zw%h2dmn@N!Iidel1|GcQ^91-ws+Re+r5T{}kFSAOnoTBH)D<6KOaCcxmEUUy7K z4J=$ng}{^0KRjhWq-xpne7(+VrR2SN#08Avu9rqOrB~Iddi=1HQtkWq#C>J_t}tLR z2zG`bSq-GDui}s=o&B~yJ{ew)qn!GLRjz-PtX?~kvCFF358%AZz%s_V;t!$Ph~w%W zBgscg9aDoN^{91l8|nWLLy6R1_)CJ#$o!D~=tyyUOaF&JGL$X6jc^`G*R_;{g1kjU zN8lFw2(x%2yOoq5l;8L7gW1a=FHMm1R|pQ+u$zhnN$*Z&V)uCUcvdvCvhWOW&PoZSzxKaf+xdFG zz54YgGL&m7b*USVstI!oOsc+sas+cMN8stzRTDZXJ33O&s7uK6WiU?|dUbPSbp@5k zU>RBWXOGvu$seSZ%k8_Tn?*-YpRMN~ZEokkV-af~2f17FCY_>-PSM3*vpyRloI$`M zcD+sY9A>qeYm`^S{i*$p5n9Rzs+;rhv6}k^{DT zvD-z$7x@^WsrrLGwEnHNck7}*`tHr%t=34ckYzkUWBeWtPT#Zu4g@$ON(ccdLlm5} ztLeD^8rEE!0Pu@0N!Ip3x{d+LGBTzT5M?>kVP;=p;bIrJ= zBg`(-Sa^V}wcN?jd;zN_8s1Vx>Tc{J8OtiHhOt17WZz9Vb9yU-ip3p6J`(=QUnMpw zfdxgw8julUTy}KAQ#Q@J$wdD!3t`~ANj8ZUvUdKaoC61QEwaq|0!bEoZOK5r%|DY5 z@@Zi9*_g(1NGHN@L?h=DXno7h@^76jkaJY}?p6V*Nawq23T1<-sJ0s*d%yKiUQ>(a z=$N7iRg!VqGD>2bHEtOirUe*BBr;ulAz^=Y(m(Ar<0|u9se+;Qb`{`p(`_~`{F8l* z&Jei%n5+uLHQ^VVW-gU13POjX-5@!em69NODtwR{gbQ^=;6W0*++FC8#L%Mtt%mt5 z*#xr#oJxZU=^D_@wOMgYc3O8zc4HH_kYF3=4hkPbsOs?@DD&LWkbW#z-s_wk$mhae zUuiFD_tQvMI(q}3-~d#IVF{RipfV&v z&GrM!3#TV1Ad0Ni?kZ9_!CZIf)wc4eVsru}$f;Q~A;6_L@u*L{4Xn^8Pr7c7$ajhc z)6e=MlEo@D6vUlYpJ&2h6k|&0L^QM&RGw}&luxk5*c4ru(yyuKbs~t+neUj8a_OF2 zP)WTj7fQKjMzEzF(ut-&??u*T{I7UDySppAWZc<}ieR@L;SoP)SsfwYF6lG`1r z_|(VJ#A@ponyn>ritD%U;Dju?eacdJl-}fKK7NY ztz5l#m^AU_$L|U1WF58G5?d1h-fi(^Ed;!+g22dD0{qW0xYDFXSlk) z*=awYb&6N$P#sB)Qi!Qg=}>@XfeW=*6dDI43WwoJ2$;~U&?PKMO?ZSijz;y@Q6rnX zBb)5UBd2K~X%=A;(!>O!<;Rx(CcL19%*B(=$N8bFJvx28d>k|~OPSHi;OJ@Z;$^R6 zS;ZhNNBuMyT{&ws9o>wnV3leq)U&a|8>RMrhLodG)O;`Mi~-un^2Pj@TPNqMTA^o8 zAS+rs_tM_m=$`dN!9Maw6TbRolXp_UN|lD4-s$nm;b9Lo6E3Ez3QG+K*s-`nZ=<W=8zt z_uJYz4;r*iNV-v{&AMdHv)0iYEU14d`mj;!wEta?`mudgk6Ff$C8qK_MKBp`^^)Qn z>2QwlajMcPr+S67TH%hbHNsFMyS~!thy(P-PJ8NM8)!lO#mdLk!D}aC({zOQ@QsAsH=+Er{4B2cN7uOlxVtRd^?TbPgeW$t|`< z0}j+=?wU6um3HCQpEAO^8)d>5-0$Dc>pF3+^T0wV_S8jGEaaF zG~7H?2L(`3M<*!9*oEMN^zZ~?F54o>j=sWw;vDe9mn72>pm9F_l>7((kN>MmSQ>a$ zPDNo5nGkprkfg+kMK43n)wF2oq$Kjfrx5uTqX>>R)6Nx;mDK%d4+in04$`G{$Cnqq zXBIV}^1mMzt~t(tXTn^OWxF*Pi^wRd5HLdwf^F{J1m>xuQ!pNrWlK?@FXo!WLYf~d zqkAb+?*OSiN6M3x{9E<7Bv_s`z8ZRym1|NSmFvg?tSTI4{S2+xQ8VZxB&`o0&2#6gZ80AEs5Wr@7vgqp{XOVfH)(RQ@x`Ns%AMJFR{ zeGn^fD%Yq`9%d6hFZV4i9Ie<@GXW)5Bw=L6WpW9P!Y)K|0F>deie`tRyYdpa-onaG zams$y+p#H(2qe5QQ8(63z%w{voj&uh`^>6(ShJ{KLjBX;PPu5(HyxnM( z>nums@)naj$(V}DjfOkwAsW!U6RuyZcyYmUQ^kkKrMI_-)PwQK{no+)@)6=`$_k1$ z63%@nX)x+7Zi$EI==`(~Prr{B_wc_Zaq$e@(ARXig&fRZp=7}N8jxypzx{M;=Wj^B zoIHKpUSE5PaxGgs&m_AE-ILGzs9)Q#b@!JyYeGW;iWds2pSg3{s|^+DWmgi`j+s5VxZi59a(MOE?AI=h626`e3o zy5GYE#onC>b39U4OQVPfEq@xmf#arqF;Tf8o!WR$hC|bD=+janhilJW)DZmfXVF?% zn`#|oIPp|l6?v6jbbrt`;HP!5P>1A$m&PG1vt z+X6B63%e<$3TibrhcK-kxem(;>0w7(2gQEA1HH`Yshpm~IX2bHJXza-ubf=a?}b9f z?em2rkXM0p;g^9+`ZrV}%2>#kc}k91?l{qZG%@U(@E9oW+N#V$9Ze#c1@-lHHV@!^XMN;kf^Ll~g2Q;iWIG0jzx5uWYv~42EM(@Epk7 z`;u$CJZ9hzx9m7O@q@D-bW*pSQpy_P!gUm7-JO%aCU726W5KPgHB2`Y!dRU+cw?OZ!ITKZ-< z@=WKW&bK@oKH-cj=R%n@@?ubJ^GHQbp5rGU{AjKXeoC$3^sEoL{!Kn7W@nQ7EQeXo zL@A7l2>C&F0%&d}`)lcM46mNbO}h#I&x;)t6ozIGQpDxqczEG!#zB(V`GE>Bmk=}W z5c5tG|CNZW{x{j;0;EK!T44cW!j?dAjV}JI1%4IJP_!q? zWrR|}&7O9-vL;h&H9$4Gb3wGos%m#n&riB9dZ_jbFM8DLsPXkTk9|3) zErJSXTKvz-XRV*%Yu{v?JVLOe*cj<-KO}72ryfCxn8fJjd0g4O=ohbv zL7sJ>=GtCaV<{`+bqdh`qCWC5x>YY7V9?RC5zTyBHfQve#IyTFqc%f;8`eW;tn?f1 zVfKx;1__m>sxT2Wt1>6`;|c82>bQNF*SjxHdsLLMQxI;CnomrYq}rh8HOxuEn4>|? zkSlq_M@A>z%Q(B+$mk}nCs}n|*rwAcw(Jf~7=)ZxF7bg7Wn*Wn6v`IS`=;N6q$VrJ ztWpR7iL&v60WPkm!Ja{yPYJ{jro)n+5^5yuHD~^|B=pF~tj%JCjRaDOr zHTX@*<^{$%o-#fcyE{kEkC0@)IX~?w#a7K#&Y?${^K{=;PF zk>(dyhV6!eXY+Ui_EtPn9joY|twF)`GiySA0%h{E9X~YnJ0H zkivS3Mj}BfU6E`-@*8V1oFfKg=PL4Jx$`4!8}SI~o(ceMB{~p|3pF@MCA=UZ|1f~o zLL9THPGAvyr?S?v1Wq0hyslg$NS}~&K|6B6vKqxdatd{4qLLEET%yevY80^xJ%Gvz zjvGpmD}cXH5cES|ij`(D0ok{|kSHy)cL?dAHDXMAxKmO6m2XubbZiu|M`eIb8FJuR zYOtie&HO<^%*EEeUr-Y7v0W<=eb4p~LQ|cX)Q5wUE7Eq2ovLnLK2P=kcdp*zoc=`pBPf4-Nnp?Pu_RZ=i@XyU{s59dF14wfvWm7=MyoEOeY7)N zle|%S90eM;9}G>yxh+9rM);Tg0zko8i}LfiIw@kjA1Z$8CWo#y_>z14z6dYBTY}yf zOVBkeMJBEVW78y&ZFVb>iFLThV8YqlVp-k&$7|bdEwBqpdepywo)vkMNK#!2%$jd* zYkhSTB!|#cZ5F!QU+JtO^d1Ckp*uPRGc~F0<929_@aFo~GV=b)`qtMg(kW%cYM)1WPZ+C(-l@1*D#mu$b?0N<5(e=zU0c@;k0I6@wYU`1Kp{!qa;ZmMkr9)KbE`? zlHdX7Eh0M;7g6{+hj9oI!QsU+5+5CQao}28UvIUJhP}~X0a=ldh3`8mv<|fWa!V|_ z2dx*Es2Ph!@=l&DTbBoSa88<4Ppg(}x9QPu;E1!pNpC|ejnV3)*PWG-i z__=5m`>O1Bl={*g*5j5g$l}`VkqCI9SHVo8h5nJL`$D5QX?Mpa$_$1VXGoO!15EO& zV3_Y7j!{j1&2igNFwRZ~35Zi3L1gem#~ub8hWD?A$H%Bf)3(aMb%UvvVNCQEO!1j$ z54*J!^m7-rUHUy;gykAjIWB z#G#hgLOVy~=_-M^5*U7FNc} zmrdP6c(0=u4UpaQY121aL{K(6jviam>37quFfw@3!q6<*i{4S` zX7x??^b#>}+F#TTs3>kyd*OU#W6OaT%D5_RLVS%-sznS=5k zp0t84=B8E=hCux!s(!$ZO9?c0Bh&fBR;ul&EJs=K_ean98+Ou|Q8AdsyKlK`^Ul!R zp?*DYj@97+N_5Dl@DMiIaM1d`d(o$9UVXvc2@)~x(Tx~_FH)@|{r0GjhV@D#3v*BP zG+D5F7!g_AKvX51-6s+6?Qw53&f?jrq1Tx8DEHP#l_E#=!8eTGFf9NmGdvCK_WFO-x$^{X;A)&rYDe?9)9Otc zyza=~`qhPd!aCp{_^v0H+x&F8&zQ7G!v9yM+cT^W)3%4-nupZ%Z(uXpf@;<@JpKozomozI~ zb>r0Jbrk_@CgkBEW+!54#X#-5e6_ujZn;kxCpHV}g)>wYIEzVR4;acJu%%YYyen}% z+eU;CK;?~!P?Cr>&ATJeOLrzX>ZT8~?J})fbhwX4WxD^q?3)bgvAG|_j!IQb^inpm z7yL-;a7B7e-MMr0n*l{~5|Qe@it)+ULh~sj#?=S8TfpsZxpBqN)mV6GaJiE_4o=i# zm&|b$`bXeKiS2S4|A!cPp@1E}>KzH&+dou47XYM9rsO!Ia&)7o&XELX65S9yjYe%dA@OP#0b?QQjk0zvkm(wt#%W!4b__5Nk zsSP}T1SqrqFXi68>4V!tJ-6|jZG_#z(2O9+#)1;5Q7~W{ct!an;K@67R*o}nJ$=^M zVbzHcr~@kte3M(?LXoC^+|Rk)&sqm4*8)$e!?6{g5I`JMyRnSCG`k|@y}<{ckHn*= z<^xGpDH369KaqhJ@@2W7059^%;LwF>=HEIH*I^M>^LV?Dn96&`R0kE+s!Togp`^sebo4#nc1Ke_wKCvX@-ia9eztCD{~I$C(HHn+&t zR}Dqiv1TD{fgpbpnJB*{U-&B7!sPwrnjP;;$XWm&c$pm_9uO7bLzfo_iX4S{N+z6z0Q={+-A+~pppkM!z6DoQ&}Z>U37 z$&r8A1}~LyZ`0aCy#eV#?+BzVntKOw(^yzSSeKv++?J4wHw@=Xl5h!f;p0YE zR<9$PrN;1wnzWOdG`?Qj*zu>5Sz~1#rqqoUYI|r32%1M#E(TA!d=&yUMeVkoG$wr_ z|ECWBeYH9wyQJX@MLFTV_xgi<={vaiK_!W`E+C%TIzifO{qxoaZA!b>7lmD2*&0a#_VA zM#1`{Accx1VM6AMc@z(n*wzFIRvy8#bY&HLiF)0PeOB>b!n-m}fc$v&Xnjp`sv{N5 zj{fz{%C?(+;+bj$QDq8>9%sz7iH%I>hi#mM!>V?6BbTDpuE-by7f6CBo1b?r5*ar; z2x0-A#dkO+6$qKLckTYh2|$#V5{EMlL;qd^RK@um39i}YWZ)59=Tp3@j=~mIJk8oc zJPLpVa!*CX&{#K*pb>MS*h<1|WNv*u_~_G-Uz8S&(6sa_v{Y1%Vm?j+UAEL7E$;O% zy*IC*ua}ymM_WQcPv1C}03nla@k{2YTNb99v~Ua%P|E;kFpkKTj^wiK!3de%I><72 z+Uu~u*pne8q%>ST=_`z88k(>q$?8^YlWwkD7dQoF8C$s$Wfr1qup_;oJPfYU)bIoJ zuas<+tIex-X8Tc0qc}=C`ydqxEkCX02kE6&KRGV{N;_5z5#X33S<&jPcdqC!j9R;U zRYFpW!67(%8j@D~3*%Qhwob2zm=i{@6;?Ee{Zak21ra@j0%mZizgzS0+~+YALhkyh z;Tb*6^jXy>Ed2sH#Cv)HAs`@rBsVzx1?0py1{UA3Bs6Z()iji%stuh9TD1#fMecM} zV?+xaA*?+pM*|6s$JW|Fs}ydl&WJcfndvF04W@or$g}TGDI@q;nT|Zo5=n`tXI;i_ zMQE2l$l@m+)*bkwbVQLbdxC5W=Q4y!I)*~0l&Eni<3`><_H1MtGChf^3t)EYdNyB6 zOEfu)wyRAhDnv2}i3_@^MVvh94d0q)m;tmBYFaG3POByzCS(;rcF|xc&vgBCS7<;s#R{PL-t1#U@4{hKzPSpl+r^g9i2eU@Wr960RSqzs!>Pwg_*t-^4H(nFpbaV zCabPKf$BSWgECl+RtsF^<4y3L$TQ7!oRln)PL%&y+wdHtQGrrR z47M&BEatcG!c(`=iRgM3Yjvm_m-?52aHY&^okqq}Sp~ty7<8QP(&~&*X667FyS$o? zOwNtclHipx4<^L;HScVKa57ua6O`_uYG%@JD?GZ|;v}(azF^(UJmGmV3CWw9^bBYi zZwckzYGKn(zLU)=ziWm}(z1lnbu8C?Co`Wg1NjDndwz9U49%&Ys*Qx) z^%BKP%c(Feg^>%hX2VAFydMkz-B$F{&saE_ANJKdv8+`nZ+4ANQXL8uM9(%Peov%0 z&wVA5Z53D6yJs(sx}LX*1aQuM;d4zviTt_?34o!;%wXGGrmndw)X~*kN!hWQ5pH1u zK-Q{Gr-XOhw90qX1W5CVr$bsOAMGXRV)Z$c;Q2(}&42;v=3(76G?v?v%qYkD3f=ID zHi$+Q(Ddg8BJFYHnnxjvmKg*6rskkzQ+6Jyek2 zl(ASN@tG<2bMPFn+5awIHJa~n;k}$7<=jXCAsU=h4p)_UlH@>x|F?P<9SB1b$10Ly zh#*}tTdh3Bl~c0BHzwz_yYTCUS-3y86j+i2l4j-M0A->_sP0V7qwu&g&zS`oi;6W# zhTT8;gV73@L03NM(*uX^>-{kxt_D*4#`=J4lJ`C3FiR|Lz(XLT0COzs8n@s zME=RUtj?haxP{AD{v!RYy@XO?T25Su_MwMMO5P6TP=P$b?wsn8btu*J_|)R}OLC>~ zBG6vIuL&wYLk@SNSgt?Bf0OSBK>a@+2p4ICG@14zTTyEHfI4<&KnFvhOEN&viUnh0 zGQ4EpfP(L=yCzJW-ee>35oSPrq8BRw2u=V)Q`4O`s?l_7D7+LnSd&z3IMmIBcq-Rr zGC448*)|VQGojKYa(&cl-1wyivyr&nzkk*pAD$qk{@%8v)A!qTLZ3toS82+%q*k}f zK?olaxFLx5l++>IQ`rtN7l}$`_CCp{*)+CtDxtp!k^I_279+F_-A3JKUB7~iGGFD9 zhcYOF_Wf* z!L+o7xz4RO(%?s#!&^@nLbDB1nCzu{!< zfjspo6DCiPlyuNzP8h!* zt)FLGTj;9&c;9;bYIA#S=j*2(5+6$#5xVib5OMIBq{WozDp9Dl{OdjvR$d&Qypg_m z*X;`5lkUZ560c)TBY zue$bOHpM5Rxvu>{->|v6jigibXZs2%>%pJGX()b{uOc+bSK*HTDJM2A`y> z@W=W=brm+9`ic8fPR<;@eERv4d?x+@cRo6``O~Z$|D*tpPTs$mrJuMabF@p)PM_?% zMcMYn+HnciAltU;>kRSib-rQN51^zBe?F2f+} z0$hLMbBoOty!Ji-De1&N$@l5bUWUk2i&^BHD%{mv)Myk@g~oY`hKTL-l>s6%gq zSrtGL3+Mxf|2dV{rf?Xdvwin;2Tn}FR~q@F7i>zMkcmt@W7B76-Ix8t^uhVb`Q@OW zepd`CzEWGmQC~g#Wj?ZnF-Q^ATX>hAXBqGZVt9^z2%6OgX2sBc-v88=Sgy&7bkOoa zopnaMCH{mZCQ5E~SqUt&+jEiS*pG;|W^PHkg-HXyC^O8X=Z`)T(LHpn!Nk%eUVW05 z6Cd#a&Fg9;b2Npi{s_@0kZo0ST^*;Yx#L#|V3O2GX#(nW?QxR4Q2`$SEUM_kY`qs* zv-apxz=U~eL-RaroHzkg_tL&j=G21Ey%qDpTwA0+b|8`Ig&~AzxP3WqS^uuto`p}Up92j+`MOn9ylZ`OEm5kmQt^R24uFBz39*0N5O@$tqN5@%Tj ztY6XEW^x5KF|@Yw6IS+!7$>VE=SUHj@JL=^2u2_&HO=@y`+x$2bB?k{7MRrFlQYYt z9>+-)xTkZHBVN2o7E-)fowg2}HP*p=Nc-K>mrR3jawc4lUh7fjErYJeZ50E8>TWeT zhWy9B%iSS7n&U!%_}l3GNe-zPM@~V>_ck^ws^)Z-TJ_ZY%g;QWTA~^h#joftkOYD^ zV#YkoSZLY{z9$L2_1*R)(9k5ouNT}MXe)Unyf z2QNv;GC5~ysTw{vm#CpK9gvcM?2(gdkiS$}q*??#11)DD>>F2fWRKF1V?(`7LWd%L z;WMY{e4*kN`!X?$&!qlYGLAn;M+wh-f)YE3BNw9qo6<6sWDk4JR8nWCwAV)( zdQjb-WS;!EfX#>oaZ_*&rewR7J<3l$3{h$o`yE{4kW)%x)(}&&wgOi|dJnpL5@`v1 zrs6;(NRcQ?sTXt5(n!M}!+Q{m-MIz%QZAvS6W~J(>yVeO)x?{in&Cw)x#jRs7bQ*Y z5oZRW$Ww48GmJNbn!$v~%1r{l8IkjoQiB!eE;HPORmxQtEsl9CTnuRw67L`F#zj!l zCS($UaY~Pg`%Uc6)_>LB;1d*br%2SH7MnBS*EVuD-3*QZ1xj8RE|28kU6hk zorA~cA91keCX`bc?!luTnaj4K*bWY8am#Y7z5dAKRrzrNdOp%@k^F1-6YRLp16dbw z?vs~y@lyTJX!8#6$h!#p704y<@C#mrI?FU}H9kv53b>cU(TCP0HHYBtrUc(2XU!I% z1XH+IQE`Fli6E&|8I=KC8J5QBPMV`^B2o{6^lZSeUNOY?m%v`(<*M7j1vs%s;XmZS ziAD&Q?2+wd8)>4=EKRdBktoScYM?YLto_2q#beD*1Hg3{Ndzpa7vVxw3Jr{C6_W%F zOVoP@LA^2I3;ce&; zxqm&owoelJr^Vg5bf!>MK0ANZqbg1011kE{_eaCdlosP&_u}#J)nMfqx}t_YcBZzG zc{B`OKK2pI=SM>yhi?Mh#dq9Y93uafk@N&o=}BgGDd_*W`z*iuu5%TEcX zID1Jvr6;mjVNZgCy7O-Cyh}QeL&&<3I@tz0it6EEVzH9=L8T?7f3JT9fB5dgrG|abXvw`d22_LH|N*qV|J}PDEvU z3UE?=0Cgd*0jwzycGn`dcy;mHd`xkaEWBGOR+|mfRJKL#av5q()R^Gf0p+;VymtZm z`;(^n%H{a>;*~yHc?B!CILR7tt@95<7XOW4rX4lB(zYv`ge#fIyRWj+zWN%S^hW(r z4nqLanU2~6+Gx48ps<=_{R{i}xYZ|mC0xsHTxPj91*51aJ8+PPhr#XEpF)Of1pIzB zOTd^=TC*OTefHQw@82ZE&qkvy(9u>{Jt1PXF+2qlD|EH$*y;i5Zcs2 zCY|tfH`+^?^c-rJyjqFs^2!vS%|<U0GW`dR?KFcP$*he%e+5}Tb=E@_m+5b4~FBL zSXRtsQc+daolujK!a)V;x76@&L>NirDxt(U+){WWNc2>YG7Kg;_H2+?GUPk!4MOr< zOI4_X=<0fr_Po0g?@b&I3Rlgqqa0kbHpD!-Oz+`-C~uy3#;gfc4;PQqDcDUy{X*lE z?Xs(#Z+JIxvTeOC7voHIFfpU$b518mb!GlmS47Qa{yhCE2)31lhspZ=iOniHvH=1D z)Ifd{P-U7)5R(!Q41cIC5sgjrBxUQtzY%QBt-?}pwZwE8dHb-a<}O2%N`FK^n}uqQ zY znssOzo4v;I0reN50QHDzsuA{qmHhQ>8LHa5~W?U;Ap} zEVB{lUY58!=#5!B6+kt~OOvOZ@%=Pu(XYEOl5UVsE9OWE4JPD*j(wB!t8^_@_i7EJ zO`@dWLg|&JSfC^`x>>}HnhB>=DvgLVZ$}3o8;h4z5KbQEG$p-%u#mjtN!%Ybu*<)VU1d;7`CYFn2aX>7Vr<*L_ML+NRIW2ZBD;aP9K z_W1DX%TK;dAg~rMh6D(j|f>E;H+V1$X{`_TIIUd3VH1LfRvN+8_Y%$Hy>XJ> z{2p?5RHKpXEIR>kEA%B`tm+BWJ-DP~WYb^h2^DhWD9Id`d0mZI0%DNCi;3q%pZgPo zrw+^Yh5LcWVfXb-_>Gq-$hATGOgyAYjvuvWuSnp+M#3jb!Ymn`eA*wzGI^L94>9)3 zSV{>+kGs%s`54XxksR$~2;iVliDQTYtL!eoA}aTDJPz+<5LBdB_J@}@^gkACeq=jasV;crAHcD~_7&%f=$P5% zR%5k++`OVRfefI)>MBbO?3r!5Edd98&Jx92UNi5lQ7}w#O%cd?a=<80DxFdQ=rX&P zew*%GO0u|;c&Unb)idSi7?^xHIdd3%$TIM>Es;GZ00QQTQ)2Cgr{Kl{;#8zoQ2lpV zNd!8XRzgGO;#3LHbxZKQvVmR+BsICPI`2xbd->+u=Z=1~QcqEX=MnT186ugK>*p@S zt}u-yFo<_miBk$!QY5CN%HLbRmddx1aHE6q)pW~}pKKWu0PRg3pDmL!?ZtrdB{Oy| zVu~c%YkgMgv>0keMtT0!cu0{6Ki3Tg4~@wB6fBRc@kC%E9MBjj8TF@oqrG<{YOiq9 zm=LIZ)?X#GBwpjhVVI$>VweC#`6R?o_z5n zM2LQrELB>kckfDa`I>rmu{QAGTpb!wgNzJB4Bl>)%P$atcrkMh;@r_jG?9t;zxHS+iN%;aBlAP+fq!alIQ(Jnu|2|z`bdEPhTn@3NZ;~vlhLdE^J_` z3La{6*%Z;au{+*>bNR&vb1yMKc07?qdJoX`ETKHU{%Fpxn8Z&=ywE^}+%FzXXV=J3 zfNR(0g(Owu#z_=dc~bOeb*_`TIQ1$mWtG93*6L|@vL-%`zsUa*A)7pCaQoCWrU!%R z+iUfe8Y2lpWll(oKq~?KA^N?>0RFj{|76g^iKTmwx%*EW>Jrp|C+ch4l5tdfDXisSTzA3_3T{i4BGqCvbWr5K-fnTo@gJHmr^5 zY*E1`yDb?IeTbP?{6F|Q*DY```moj)OA*zX670cYSBGy$`)B^_U1t zqj7|>X;=`Y2g!pc6>+U^x#a8z@AO$vz7)9-YfBJmnV!H=+Pg?JaY@GOS5wh0Stn$p zzGMWPrXEV=R%;ZE&#kaT zB1{P{RK*w1^Qg9xsPb0?PsM#v>%^&pgCYI%QoCNVf}OkA))HD2cT15A*zP|Kdwdig zN`D!%r`NW;P&*>~Hzf zesIUIE@hC>2V@K~SPto}RpAqXzmRRAbXjJFY&LQ@BLkMHb3Kr(?kvfV8%(rn1}xCo zpT>h8=q$rdzYySyYK6G_0%`gf<&n>N!J@<_lhgOGL$El3r2*@`wTjFw$eq`UibvO`4|A*D+4VJvCm?QthDEcPeh^ zPtack=oJ*)okDvg>6f^`?o?CIdaKm+FYfQnB+nDz| zPVo+LkMv)~JQ1jJPDTTXbfh3W*aThoG*ht5A-SPT&IUT`)SBQvh-&|5v7kwFo&%Rj zS%^mA?yHzZr3+py%I$BEvWM>gIJsz~yUI07LZk0-#==L+yZU1nWp2?dEpa_KePX06 zo&?@BTL=*&Q3^My{Q%r>S0l%+ODraIDy0E_W{$G@-1m61RHYr}%zHnxr-Qa2vZopGg!Ba`% zym$In1n=*GZg(L}OO81xRGBV(TzOLfr<+x2<1Moh*kQSp0HqapHC1}Odx%f~HIN|P zBxuhZ79d5U;0iIeyiZRGAIC=l`2O^1{pUB`=7o%3l`{~0h}b_NQ$mYFR)avTZUK#W zl>?wcA>I#B5_SSOL?btpmr%mADB=r6JnIgJI4BsXjHjFh=!#n?E%S3oi&|K^V~&U}3MqLM%>XE`a}Ft{Vsk%sNf^@5+ZuWczrIX<{fb}FHfsqs%tJcSGm=UU zN1ung+YP0BRrucurY1sU9d?q(tHVuWK!KXyc--_+y>;|K$dgZ_nk1T&bZQ=PjEHQh zTFd+R*yRrpr5kQT2SOr+rwsD;8iyt(DE62X1zQVu;pyOX*xxaUmuC#wLQzY8YeQ3o z?j3G!psZGuHsLQ|1uZ@3;vm16~)l1NJX2n7#3Mf4Bq!c(qy`cL!r+9V@%K)oZPh#)juuns2krLVRN(r?P`C zy;m4LfY3Ata&U#+#~55Th9yYAxMqV^R8k&tpV1)=szf2=W<$e{lO|Z#@jfi-$!WI2 zG{Sa-F6n*mG^spq%PSmx7xZt_6@!4-*)-EbqjBCxDf6@}&fMsrh#Pt}= z^dFLB=}cVUbKNrguOdGD~ppkYM89$&pnZV2o$sUGa zSAD%`f?iw>NqTL(*xTzMB$z5w{+X0HQtJZ88Jyvo>Q2~DSeMq5`=8za9AO%K%5RS3 zfpC64ds1*>X#I|}0fX1H+8J?G_2z$nAW;aWtATO9k+3#nH?R=Nl= zZ@CG(^gQljKSci0X$#d0CX?~VAFjM%-6U`_g%(y%VmcG~K2qqK1}{2{LGTJXUcv96=w0m%n4x(*0!QZ}QdGPX zNbA~Q74|0FdY{y4NB(40KF2<|@mg3bhaw04^yx)+cJ>CrF0JFy-;O88qqRTK(4O^- zC(^Dz)$^3S=6<{PP)|HW(Aq_-+QmI~e@_4{nlN0Pd7u!NDh5jU4~G?mSRq|rKriQF z6#y5K)~{(?iu$7(!ua#rCUjly;ipfZZSQUTd*|@S{moA4#7apHf8A1z7Y`WgRkZ9y z^+NAoDGgji zl|eO_;MrDB5+M}SAvwN4N7Zyu``IgUHg0UtbEF4H_G{e9i$YU!Y;z9D)aOBKD!Ot3 zyKq-H3OlCUYnvuLVwdzdM+it3%6V{Lbv4ub46SS|kK|?hKw!W5u7&V#Mpf8$@f?M{0Wr)B+c4{sFlcVBLAucJ-IAOcHcn4i8dR0V z%j6o@uvQ_V{?ZKVs81hmT0f6p)M(!wgJm1}X1`w7+ErG<4R7-#b84k_{v*9&z-ME=T1MvC}H`8+r=VGDqTG@1m|M2bLb1TPaqW z!P_{h7RyJbpa@q#p9&q5(OueK5Kq}&86UTyo11eYmZvljp`bS3i4w#FzOuw6jVNn5 z|LzLa)zY!isEPU`<;SApKqjU*&vO!e1!FQ*OtUgz1p?O9ugX+Pbs>RC-W4wiH{H@; zoVcrbQhfa-3m3)E1+SURP95!^Xu_jn7qMo@KoebCeoI4`_xoUYWe0L~0qUj8NfOxy z=unFa6+@?>0~n}?$&NNP=C;k`sxrxkkLVct`Opep5&1n{hwL|8q2bzJOn|95LpSU; z1zgO%Dfn(Y`$Pq8~|i zER}?4YKFEzI!{u6)kRaUq=C*#@GNzNl#TNoe~@$>hYuhKT>+UBFN2Ipbf?X>w5l*s zf1=;iatb!%=WF3|$|lO+o14p-wHIXEgxHo@v#=h>KfH7^_5spfSki}BjG)@p3KL+^ zF0N2D8_bz-mG_MSvl?17AWf0;yVrO=K4S_WaB)!9&%oL(!FcUluU}rGI)!prwC3-Q z-3YAd!EQ%m+N6Rd8K#TAlmNjfV}R>n;~8or^!nBD<#Qw?$K4MjN5jupE}cH=ZE1#c zgfU_a&C!dfjqVf!lOIL&rL%!Gx)C@83=bR4m50r(^Tze~s_~BIGPFjb6zLk=sQmYS zgV}Kt3uuU~S^okSE zY*fomL3Wc?YV2AAqN@}^gYB|A!yHG+0Q7$3EU=lq>&A6|)*uareubF?8hd;D_ZzRr zDpkmd6YFwv@}SU^WfG!9<7N~XYun5~SmZE!;P=vPTO9FP;EENx;UvSr7I{0u9O4am zHFKj*b5+_Q6O20Zijx>GbJ z1iQnIEI{m*w7jV|vdQB|I;7|$?v6PAd-%TyY2JuQk{RyGmrT-hjvtI*ArITq-RxbG z1U|b0&FD|cUxn-7PUtHHcF~-&qDO+f3m1}o6iok>FYlD&3~5*U`r>>%y2f6BevNPt zk97~HhC;`iqTj%_9&e36Vh26fz(0qy;QoO)c{R@luZ;B>F5uHEB;#%OapMRy1>(3; zCD&zRJS-tH!(p(bc#pDw=TR<6;4HrqdTwqA60HV@a? z<9IZ@?hMX5aK7#qdVaaTzjpwi)sCA<8{Ztc@{rNotPHEo7c;3o3Il`k6b4iUUZ`Y0F3()c-@y&G~iA3VQss#}v9X2`}dppdx3V2b1Iqvm&$@f}KSkVs; z54N7YJls@q6b2Qw(H1)t6?XKE>ZxU~vMsnZu3Qee6~ZIu==n4A`Uu?mR4IUIPs!ea z2jW?5oDRFAw~e7=ZI0?nzQyE4^TR;skkleoRUfpRtu(VpO+&bFWer!Lxmm1VwF&sc z(*3gW=n;5FaPQrB{pt9kFLQ%)A{aejE`fvBs9rQ_z(rA~;||&>_ljX3wa!|^$CP4# zI=q@!x=whfhD}q(!z@4!NwJ_Hj*t8Fx zB4_k1v=YRmbQ0}N*q@%Kb1%2t+1kaCLCb%pdY0?dWqh~y^1!bodj5Rp}VySg=hIBNH2FE3xoJnbFu#I{YA?tCB&o%EQmo@p!lsONxS zza;@Bkc}Qw*-VA7w*KWY{=tLeX4rUl0Us{R_XSBU2>v7-EwlGf(b`-$`WELbU(7zz$ZcOJK+n)GpU{Zfi)DJ+HYx3Iz3U) zb;}>((SbwlSQrrBBz2zh1ewdJ7>T``s+dc3osP2zj;C3?dSBhj$tH*j(nZubZ_=DM z@f?FWo@$g0NL1ocY6TUrhNU~gLFWX5%c;O(i;7Ux2bYXP@b16nvR22#|l4ds+F+1M2{?=XHEb}j-8~# z2QvjtjT27@hr<5vNaBwm#lRPaz!cU~XM@Ncd`sjG+(Vmfk z+~70loB$1nqSn>=DH5+qSMKQKeF;{f2e}Yo0YCa!GP9tb^SvK?JpQa~dJLSLXNDj@T z$mmGW*lPX_KODc8%AJ5JQ=r#2GAVcs{}NwrkueuJdP6--KL!iAYnT{07Tps`TM+v6 znUHIeiCm}?Y8^!cuuaXHBH#bno5}c{WVfhMh_qG=qASgpBe;<0eds8b=)q~VaF4qq zf%d(Bn%<)pc-G)wRPlNk;`zOLSg#!8xO3(>WcXirm;9lL#G&|e#XM{Cb-IIFU8?QO zEv(k=FDkm@mCN#$S-ug4#elF`gJnG)Ogm};Kx!pNo>0tyAW~&=^!TZBl9X_Do9;KP zy#j+N!af6BttSPo{W9>v4CziIuL1Bu7NLN1EkO;?go^-DmXH|TDc4NxYfuq{Jk73a z8zf4cqNGUGd0yT)xXMK89Dl5gmRBk6p+wZ$9pyZ&?TXmq{pg;#Z3jtqPt9f9An3y; zh$O959F^JbcqT^Wh%vG6C2Or%q~nIhb=ehjlysBYlauuEaVHgHw)iG#Qe>h>Zq3fV z1$Kd8)192LNxqI1Hr=NV3~7;5*NUvC)TAzaTHGSADV`DA9giX_e6o0Dog`A5YI)g& ztOwakz+8g^rftOD<3`W6LQ;w$L=IjBmEd~1b1in!3eov-aRhjTspgBF#ELNTSHj5Z zJq}Bc%eE&=sPJ``&Om)B9Jf54Oh9&-P5BvAfNy;=Qr!3zyiA~WzwsHzcVQUx;z78^ zf3u?v_@rqLM$skq`mj=6;Q0Yu3w|_1cS5P!7`F%Ne6##@SnE@Rc5(<4}@g~SP@Fmd%=Wq85)U^1O;s`%}tG*9OoCdqH~qnC_iJxty}3}MQAIhp~$ zQQS*DzL(BG_hHb>Yf?*m2+0@csZw{^LvVY=WfiY2qioT3DQTO(+@ve8A?E4tz1=~| z)P>P4VE*WyI?LEx4+5ZBl4s5=9)RG*3*rUljTZALTk;j?Wc?WTCCDWv&$=c!LEx4~ z#!}E|qrce#T`*1Iw#NQH`6zSEuabH2FNT^?ud&S1v_MFCX^(YjA7>-79S`K0stXs; z5d~Q})Z@*VAPT5_^1yv5-GyA(h0~UN#f#h2WpnP)0HN7jqqsq)vQ56vu|rphr!lK2=3r$T}iMOyZ*r@83+#>CXrw}M7O#IJTck)Jt!%@o_B92^Hu~d@x=>|N|8PGdiRatc-nXTFm1?{ZHjyw z{YQcA3-ILq<D*lN%0q=!tBU)AYfA0&C#MsmFu5m~jv694-Dv9L~z0d{#5e z-fpnA>wMjCWEUguK7vrT!;T&o9f^cHa0}HLB&)9MT$QmeZWx5niKaR+{h(J2%0Z2B z1Q`BVa0Oe1QmT*rq=Pd+t5@nf9}$nZVS12>N{l)fZAq`>N^xD*)!sW7ym50xe|esc#%m0>{#(dK}A!Yw4$YD$7D^y=;Nzc+KM(S(?o$} za^2xo#7@K$@+&211oKmv6A20G&{05nkBM0eR!)g~iQp3F(cqOE!6U2GwiH0PJ=yGF z=Mdo_8A&boULPwdtYa|hp?AXUynRi2ojZTc=7B98f||FQkC<%ZZ^xrY^tQzRFEPt} zX2$2FP?*-c)X+Z*NXw+A95|oT2oqvsBS6{bTS45<+-Pwre~f1tQk@mfQ`o z_*N)m^^=io#78gz%V99^M}f#Bk>Rtp@6k3nyt6K& zeI5EO{UgjCMV(3&oMQ11oOBmOn3_DTz@@AkD8lAUg8}814@(!+119aFhYMPOLfnGzwLf%k>9;A)(xWuw0h#gqRX&YDAm|z&gpU z!hF}FfjXtJLJ`V%4V{Jnvcxaf@u@{Bzu9qUC{rG^X^6t9>dwGXKmIC5V*WV#j?FB==wk*=F62l^|gU`yH2;&iC57}WW zbI#ru(~>-+7dnsXbp0Hby$w1&p^C@|T&FB~am>nmK$at9f7?v31&`9OlivF%Jn~pj za5)OC;MS}eU8nGFN4O}0G7-S4aiY9X;1N%Vx@c24GZ3bz5C~>zZb&Xjn~x{*j_m5D zyNt)b1@XRby-)FX2g!x3dOJR?;JqvwMSUpJT%|&L?P7Abi=;&&Cb|S53FT6P_>6Ge zA_b1AB3KU^R|WAassA+DM|z3LT@dwEDyh!Nr87`j4Cds3`_cVY=o92Oc*j*M_(k2w z)T4xd!Yb)a;~hsB66DhOxvQ&O00J~$ME#VbaUVOE4ZDJcuLghT(<%V0k?4}tn8t-E zm;5___ty!d4|Qk>V&aTNEulFQvS~1loBHMuP`_z<0-vv}60D(n5N>aS&}X{G5o^@^H(3?TO*i-Ds%f-%~s+Wva^ZvfFdfdshs5acHTF zB*o$6znI#;AmtZ$y|7^=;0B)J)j)Z~$S-V*)MLY|9=zXq!-+U!C3O6_qRXpztj;;Jpx!37u$Czu z+RU4^x$dXgIFl*!rbiU9gtncIkrR!n5L~Fgq(^WwL~P#_6p!Amy(?x^L-O|NQ}c8U z-onn)RbltGe+{p#XeAnCLNA75XiUV9K*EtFhDTe*&MsnPq@ia!z`6vU=0q^GT=e{& z&}pcAKK=A~)IbcI%p3ji*Q4W+=#yPE-tp*{%$!q_g1T z%qU=MrS<|Xg$@9SWIs0$-8(>dH@(b-clA<#g(vj<6L?q4A?vcy5eE}iN(wYVNh+Aa zc#QOQtTb;nk=p^!S7&bi@^sP9s#m*Ivx)J>%i&j8wo*> zKRtg>S9P^axg_fV<3Pcy+Riw3G#bLfdkh-@1w88LMQm2mFbT zjqk-T_1(hO`Oc33f!UbldnPTmm-1F_VdjPaTc?`}){n(Hh!Bse_n5`X%qv+CfaTND z00jlj8$(I#7+QdkbzkFum`=#@PQhOTmmH$kk>rFF4D?nmJ|TS%8!gt6Mgyd^nIi4f zPkm;?zHyvOyrm8ST_?EIG_0WMFBzN+9UyEzOK22uq7nsATi79d-mzQYMo=1G43G#( z5<4XTLhQ#+ePnVvmn2q*Ga}C*@{@20E`1kLY6)Wj3He>0>6(5ssID}>RceG=?b}Uw z@FVbof9@UZ9A`gwP#qk1Ui`T52(r%A1tdQ0<@pYUAA9f-_6@A%vWbg$U;z($!KKqu!FXh;Ay_8LugVzkBf$<;1-iwP$65a3K4Y4U&7sn_R@4cP#RZhIS>!K zAT({Nn(SQJgGb*UxBuAs<}b(7zpbv(RvMA4bP9MCmq5U3eP9iz##<)bBksacA!7Pw za1QS}`NCIN>Ea7f+Pm@)oW8prMw zdW{S2@ERmoQSGt&n&xqT?JYk$%c|yQSDDx+7L4vks-KR-Fq_An&^^fwAH=x-CB}vq zRB!ByxT3+F>4_R%P8u5OIhFWo z%MWnkh34gS4OUNX#X4|?6~myNF0yux`al#Wi^)ws02HdPxZFt8FiWl@%Ke*w%jB%z zSl{15%G9&&<@9POG6lI^Nxq4)eFJ3YM4RpeV=&Rj)uf-Ky0qM*$N(^zFbitet@%C~ zI$`z>VHrZlDEcRHuRdcY8Kfw!rR#x8h2_8(D-rTlzn?AuTPL@Bnv&kSSb@L@LL7O76B;uVzdNc->yicF5v*M_Lgw{eH{o9JGte@g)oy)C*WqqD!z@GJ`pcP=yVX z9;D|r971J>d`CGyWWbjDE9L;)3TdhhgA4yqF@S{u^K2#J!W(~1xQML+PBNuhMH?>< z;Dc#(#iV1-fPizF6Y$I%1W}|h@y);<$lo$7zA3v8`5w}}jYFR}OVUs~mGRTv8@;vkCYi0EN(fz)}RI zM3bOOOpKhLgtqxqj5d8BWc;v8P0UTpI8jk6#%xQX1Y*|$>r?`uH!Osp1Qn$8d1*K2 z$b0~#r!X-f`7qf{-zo=Tyqkg{?8blY`u_;C!uG1Sdd&gP3S4+(O~nPwQE*K1Ez3 zwTWV6n)HXP<^&^?l$*U4KGF}>&@3@{k5rRTMQRcretgoyC>=E;e0t*Z48ey9I!VWq z_WGmSXEufE#fB#ht{3j0B%lnYzaQJ*XWfjTnFL^q>VZw^AQQYD%HYw=H7#oA2fbBiQZk`*O=X?t%s$PoURE;Ay}rF32z)%R2xIXae}H2Bubj_W^gV+YBNv*KIdBBD4gO?a+q z5fzWAFCR=_!rN$FYQu!vhG&J(e}M678%zam`e)sIoKH59|D-?pz8lcd_ z7+KYYw4_^RGthfy&SV)s6Mu?fp}j~ha>l4d+=uwABrS9TD%lv{fSo5NDTklsB`tx` zv2li;iALoCYHz5;lN%-J+A#zk8KrKo{TAOk`U8+LmN1``SWT0JdwzJquoAL_Y?1 zJ2@%KtkciR_Sx_y=_xxDSTEMcWh(x}_F<>Y^Nid;sCpgV#am@g-?!uP-4^4?u5%0e z-ykXP-;QrGWhwFSaAuR;@gXXdAx`CW2tL>vDfmQTa1%-TJ?#v|(zjA?dwut?v$?ym zzTam37?cCi3gG_H`tI{i>?X%F*V|jWo1O0tceX#&1o5%d1cxvr!TjUu_#sw^8BDnY z>IkGVCJRys4%gJ}Q_Vo*c(see)oe82^NN2gZ+tvzQbE8P$w5cpJygBFkqo1SFLWH| zsoFh1rw_Lyridd&DVhO_@IeKDY~OH?xxAWTP9d!57UP2=so7BwFDX+;PeHni8XnGD z02iRh&R??tmP>^?Hs<-7;%DAxaW*01?tP9PB_y~2A5ye%S9$*5SA$d&(^jypcQ0 zHQ{L<>4>pl} zxt>)30^N>rKyQ8L;{xAgI+k`Drvj?R`4E15r+w&(`g5=Sa1l4iJF=|f%=dN)X$^y*u1 z?Pj}HxpVB8M;B{McHQ03JXPug((3*19U&3|8;DU^a@KW3)TKhT;~>`Cvi#|R`rjne z1Y)ysSTR?Im-5%5_l2wmZ5EN}AC5P`#18vEEBw9(JNrAE3CAP2hs~yttQZXl!w^co z$()28?~NgN^dJ296~gX&Mh%4drrZFp1+Qb9 z=kvYo?e&As-u~upCvpdB>x4g!pk+a`Gtu8MjP7%9m6WVkOc+EaoU~R6pC_)K3v+a} zC`eH|R*))VI+mMA1ZE|-XW%#>U_VBOzJyo2qk?VjHE;f1j62UIP46zU7HPe7VgJ~ew#RLk14KKs# zMihETg*Uf==Bm5zB&8Lqz{I^tj!lX{(8i)23#Hk0mbd#%1t6UJFq4|LuzDkP=R@fe z^PjWeM0~2%?7#+NgF0qS`-He)&b9{#!bOCpavQ2H(7*rK_zWJ8^^?frE_LsC2q7Rc zSxELCShckds}$a@qS#Q1hcUO2eW_@oy$hD0gI}e46H4w7r*It9fq%DoktowIVjC8{ zcWgzfG}Uvv4J8izV{tC$C`#qx>eCi6ZOjL$3vIZSo25{{asgvqd+`1)RH}?JxVRe5 z1`nue@=TNHSmAL6-bf1KNR?%H_jAw698n@SH7~B2%ThW%7M&e`Dp7>og}>)%S!E_V zmP9<1<|nxUem9LPGon)MOeLf!;odDwL1yIa;I1! z&OwKx36jF^$_22Xz0ajm`S2F6o7h6v#t|L%|AXS-lJ^XlGh~Fmns_nS&$)cZ+(gF( z1xv55>F7W=RDgV80whu~;NiV#my#$1#nsdBQ{}SeR92(X?X;=Fjyc4QWv zvp3zz6x_AO6lz|W_Z2Wdws=`*&+_u{ElQXlrUk6Gy@>?E%?Pp_f2n1wM5lp;Fw~qQ zO9d1g&}qn(w2T7Ke`PvFs0Ptl7|kRf_r&M-;GMV9yr&|Uwa3RRkg;0y0a9yCG5C5p zbbCeDl3@73M-qAMCvvZO4@oyx#9c`*H#2OtzWM5tWBgldee;z6{pGV?*FNPRt#3X# zy0^-|UTHMC>kL&?DfiD?wH0ZI+GvV*$p?M}5s(F3MH1wHnn<98bV~AURbS{c8wBX6 z8|l>x*t$eYtV3j&d34txcQzrKxf#i?AY;|&yKgCXPEN=+j2P4IvP^=OUP$K^Q{RWTmdN5C{EtKm&&j>$Z{P~oAh%tDB-+jY+3blto-zNk zIYlrw!h2Nz>wR1M)4R_N>2VX*jR7Lfw&>lI6FR;pI{lsNV^C;ZPjH3APV3=1Th6lgE#f5C8RF|8>Q+L=T&L z3mGuogP?>zH4kIN7zIzI*hnGlS)aL}=y7xf$q>aVnMMurCej{3(u7i}(0SuYmtg3G1SX)pbZcY59 zT*1QgE%?+~ZaQkYkx|39%s#L+lC_p;I32HC4iItH%?Yh7|V5X zb<%j#{V4$TqTeOU3b>v(0M)a8PvHu~v+ZD`x$>~t;t@(0{a6aRNSkMCc7k>PwQdh5O~902EZX^&?MR* zKNEf>qc;Xqta&1-wkA-tU7TWmTn?^9WMBZJczz85VQ}_#c>NR|pgB$(+Vq94Oaml< z%b3DFxiNcVIc1VA0_(C7{oFM(1QSLHesgs$%{Nwi@sOIKhs`ZyN}D#U$`B`nk&*ao zI!-QPZ{%ZT0-d2GQ6t;{t|?~XC*Z&cpS+pb|0o@*JSEHa5EOV0W-QT!ET-@>1Uz-+ zVl%vk9&C#I6?hJ7A=02EfZ#?cfO-!b&zRiQiCToLVriv4`VcH3L6AdcHcW1;<7)g& zF0aV55*yr#$;AIG0J{J(0Pz4W!R0Qf$ACsnAmF=hcuqh!-XSFin19Wt1{qOSNpf%s z(vx^8enh?M9A#AG9ZuF8X>jz7C*Wrj}4}d8JwZ^lWdt@JO|F*u=&W# z3nC*pp@Dy|eF_oclOy~E#$JVnFITLu_!3*bum1UHGW%)u9{YRz;LorA_Vdx>2miYM z;6?Yr`K!NO{UUyhHiV;xZ83%4c#OG2B$qJLKmhS9kfyBtR5MfJ;9{}|zAQ_nloIWY z`X)kY-*R%%sYpl9?lC%o;#UMvKcP>mPifa?zePJN3;^$is0(CGY`=ypQONK@d7LIA zHI~-SLfkMZw~2V{gzE`7rVDc>a?Ut(1y@S9i)~NiDx7!wKjD2-N1OEmkW>CiB!e zJde0Ro5PAnn;T7{s*lh)*z+o=phCbbYeuU@k-T^bb*U{)79j?RcE(cZ;o&oD`=BT zK%+{Ry6J|sG#;UXhm<@NV3~}xFsuB)CLGg7N--3 zS?WnSl3ATV+@)k@f?ZK3;hZ7OG=}W1pp8(_+@qu8y_FZ^ad3HjA-3eZYBfq+u0gTy zn8P@o{nmpgzvPkE8(lovEGcc(fRDmQG?UaZ&zw%i=o$mphQULE5_Uak85XNB*>#KpFgtln;BAZvQ_Iv~XEZCHZj zfG^V8CR-sY44?r~kP1mJN>j zDDeuLE*?N7z3=Z%phDI8o?2WKIkW%Uno^L8%*Qd(T+hPMT;K z1GVpmP>mvP2~p1A#Sw>v1j5iCQ&l{#?nSs z-bR$~Y^rWhVpp6-LHRe-Dt~OxBXgO*b@p-9K-Okr?@Un}r4y(|xkyQDaag@UluKX^ zeL#8hMAe^#nS7EzD=~d}8*1f>`rAW>vq<1Um1&hAcV#CkjGIP~aOUV%+CY`Q9(F&Z)P!GbpEiy=H|f-?D@EFLC4{qHLfZI*p~%OrzH$%sn>XF<)G z^WddRh*J;?-~xU?cwmYznRtZ<4-qCRJNTA??H1mQ$-!j(R>Rgega_48C7wib2}BCL z>Lhbv!ebOwq*|n;02EOI)@&&2Q@LeUFyW|-1?1>+EbyHK_wfXR3(>-NumClpcEAk< z7S)U?4%f~6$Z+>nyuD%9;-^c4MDAI|)V7akGGryX)RN&qzqrJ-0)Mw2j1^fiw*c&1_BzLi6SZ_lp4wZLGs_ti@Q|PicO8=^ux|JK7F=%fK7?p z%J3Wx^MjftEjnVFkaUyhDcQ;8VG3muQw`B^5AQv!08>1;lDU)3oL}DFpoK_l$558Y1I`B;pjZ z<^fgYhhjfRy!g=3u9%gmv9b7lFUH0h0KcfuOu_Lp^G7Cjl~*G6qEAqJQ4cjYT@R3D zALHby3-Yc_A}eFsezV10ueQ#ngN=SpLS_%#RWkT) zE+t}zmK^0h?RuX@C7-bNBGO&GuH?7ku&^hB;vz{Npb8 zmC7`-O$bP%jGdl%`m|Lh2C!CE<_ETwaFyf>uuAR9Uc?);Xo<>YST(C`O6c08MC^zg z<%1>+M?9A=c>UmD?+48QSeU)&YB+bORww=G6s}EJoxv9zZegaj1@bL)ocm*Zhk$|u zNB#SU<3qfw@5Fa&fJ~86_^yCFo~5iSaju9B=1nga>{OOaBhKC$7df}W3J?C$z^O-C ze~w(p51m6tD0VTiJ#s>{09$sHEPm`|o=~GpBOLZ~6Y01pw zB~K;KWSDgLo;RKUb<`x^3<854!iZsQF^H0L6n{IzsI;$!&vLS$UObv(7vQ0M;YXOxJ(OcX~gi)1>Afeh=4j+|O+Wvz-rM?8J|Sqh%k3(6h>yLb*gpH5UC?{+JG?$Lo$k zvoN1@EipB7F+TUW_N$tu8Y8u)+7;;niKpdErhrHB;HX z!&7j*2XP333u4cZhzyqZZ%!JWK`hM*^K1dvz+u{U?oM3#(DJ}ml# z{sUKtU9yCYwOGuSQdX5MJ2lQ5FQ;}6hOc1zj(SNJR_`<3-6vupkNG2%qw zdR}Z2kh6Z+Z$4yPMp#0T(BWi>8683oRl7a(#QZ1JRkLis&~xCtGgumU0QH3iEFv0A zf+_#}@W~$$Ksd)ifAzedh?FWDKde z%Byx?)JV4!2e@iP#NP>|93**;xcKKNTL{*EMvvOEGKdUc9p)0%qi=7h0E(P8lA;fx z*T6zr>SiYb6@4nAnN;Q6pf_Qs74QgSZosiiIF_tMPElAnQQj9bg5Ad50g)u`l^Y^F zfjh;&g2Y?uB$sTYP&s_gO?MRPAmIj5*M{NXfE)W?*Q?cmTPu5r`aJi*$_g#T& zO8n}<*ATaey~cdBn05xn521pZOVoK_r=Nj_q@M{icL5Y8>u>(8>G~-QXXipRcTHXw z)jE=u!Td+1&?;-q8A(xjY_~n*Z<$*JE(p)P$R}sYV+w3 zE;$~Rp9aw1pgPR#I>u}{e9%w}DK4lUZT7YzX({sk7WID!m^7VjGyw0YP?+*)#o77x zb|DJA+&J7j=_AY?vLeEC6gU-F2J@EF9R)<^`PakT612KSlT|_R6l={&@YE$EPp=_AcI$ z#PX@2-+hU^$t-_(_~Sma&3=QsL1}{-=|!}zP9~mvG9P79s}-NZ`LCTH26hs+E6^b{ zXMNP$=}%tw+iui*`(gAi#6&cwfc{FW`WaY8p@OeYvS&oD8_3L<-b2B&RjUeQbx zkk`g%VsD{1L1*0{h(#ih30|&q7(Xuu$gVQQAw@k{h*{Mk;5F-0wznQWkWg2d;4whwPB(M6Smo6F!j zrLQxWnb+EkTED-vYSnZKB;aozU7<@S>Qc!RS(Cf-Ju~m zk6Xk`D(}h3B;EOI2sOxhD3?G(u5${;W~{rj;NDfbb4*X_$L9}_`$}$VO=uAHC-LXv zxmRf)-7Dd`6bGT?dss%K;Dq2Ap;(u6fi6;Xe~JxF&HK&dH$E>Jp2(~x@Z$aYS>m=> znLc5BR9G*pA=5rO>m{q8y<0hN00Y88r8~?Z&Yb}hKot}fJ$D@_DqNFxZAyuw;tW$Z zupZ9U&S4%+CTk`{B3ZuBqcSppErosPT|0rCY`ORx;I%uK=(F5|+GQxP4UlonfNxU? zR+_qDL?S(tBFm27p%o@V(omgDc(K40&BxxX%Mxx7{Z<-u*-e&@gVq1JG=W01m`e-u zDKr#gT@lW*Dl%mJSCKypWWsHagO;_C!?; zh^rYvVulLuO&=O>qLUI=6&lT;YEJT%p(9ra?83BP(^q2N)I~jg`fPh|=9zh(zr$1Fbwjt>*Dkx-TN`uFpvxz|`fP~Jp)ZB@b3W9OM z<1e8C5-zDBaNArI=Oj}lkJ-EsS}i~D{393qAB2t13wA4@Kgk{8{#bU^Gj zU;%kE7Tu~HSA@ZV{dED5J1^UZjorONMjJBy9@c_CXYcwNZCUz!gw<){Kg3${0C6A~ zTa0W7BTp(*;NvGSNyAUF(Q2v%<>BRIS_C zkbjuqvyhP%#;Bw&IdQ&5S4wd zy07~iC_@a5&l%6G8zAOix9gg@m7%9o#CnO*F&&s8V0}3&-@8~g|4Br@XSyatj*_P3 zr7jZQ%Cr0M!7DOK^tP8J$mN(_X(X__<58?hkpX$VfXM=>jjpgt2k&!_S@+_cV?zrG z$);AkI0_TOR7Gb@nKrmfB|TF|>RBv0aU^fSJPUVDDe zMyVX?s-&Zb>3rbT@VYqKyVZcxFwnk>I63%TuKx%( zsOOvi8Q0kpK~MeK5KIPRK=Ty?H3}U(&z+%`|5Qh9|Hn)C)v6=a^50fC(9)+j-5pWB zlEmX*h278bT47`cj9m$Pv&jcA%XKSETUPT3cIW_xVlJTat}W(Pq7 z3@xG=Y_`B5gq^Ozu>#?da5t#)YZLcNsN-CN8e~x~O&4P9JVYEdv)jA?&$>%@?wk)h zGKc%{$H(98_NKJi-fGK#_Ybyq3sYCQm9_#_z(1!Gw|deMORx6{P(`0zvBy&QN87XDJC*!plNh$wQy3z|Zy zqc)Za@(?KN;md>F$Z@A4>n&rexh-#>?vn9erf+q25U+SUW3~)f#^1vb5_=g05Zycw z3+^bW?c_aa+H~Y!Mp`jhM+6ivfMgwI+^_Nqx`o)u7s|V2-z+nD_KEN~@hUcvoGH?8 zzK<+d9m1_t#Qwo_hlMg(oidIk%07a|F+9PXWW9-LM4(TpEuJpeo1%c2_5~`jibHA} zMiCLBIiBd^^>?~E9H_V@FWZ})?e(2!&)0QJqJBk|#aQAbF%vfPD2xll%{q*2Led#3 zUt4#=(n*KQESIw-Eev^N+~{r@CfKg2ZXlUp*5v=wCM%MUiZO@{RTkZJE>PzO2s_BU zM<255qD0w)hAqHC6Q2N}wzOZGYmIL-?x*q8IPkK*o-3w`-o^1bx{E^)#*uVA=|*a^ zMOz4CiZ+xDB%p)bThoIc@&dvmsYw4~z@%Z(!plq2u60rH3HTC@I}Q=U@V>JMYF`$W zMc6t4#RiQRgt`Be%Jv+?L(?UI6B-u)6kbMC{IxX2B?ydxBuu^tVpS_3^V(<%!--G* z4|*hI8~?QbtGY!RUCIN!V8x~z30W;&P{V@FF?aVQxSCfM698CTiG$@gvXlT&|68CcFC)mx zZ-cJ<@ObEe5)dX*`05G|$6Jzq1n4W7A7xr(k>XHT9F@O(jk5yDETW12h*fM(I+-=q zg80d(0z@dTjVeZ6>i+$(74tuCpme6yZ+u7?Zzws^q^kOrQ(zou4SGM99QDf0J&-lm zibG+N4BvZJ4XCgxLZPwi4AW~EZDpRh%a`rW9K6WiaQnX z7Np`_>a7Tne}7W4nazI_f4+_J1yXeMcVPqT_nr?Xw6h7weiz5S1I_KM)!tEM7zoLE ziSbbKt)3v^38#oCtZNMjg2XJZRen}q2;>qO!u1`|R-QF|*f;?50xRHDqKB9feCUJxMC0N6CEta)-aAQk+l?or%U`*cgma>+8COx#I2#X|g~6lW;DgyuKY1W$O9o zmzzkuj~ics50h*3%Le2Gl__yqBeR^KpT!Y)TkG@iJaY8V?>ui9eN0lF2wY3&9f>+Y zSU&~#{5uI?2s|kAO8gY@b|qWo(!;VZxw3M{D{`#Kocg0)lgiilDfDir?FQx` ze#k~nhKe7v!v%2VWNWs$k`|AjBClt-Ur$tyTj6BI#5@Z zR|jdZDdeZji8Y$CtbeWXHLNW}UWMwJQvBzNv2jRKTFx#q@_EpjAMFNyKNCQ zBfgQ#`Q27}291Dw1Tfs6NxEtsy^@o#EVjw|>>NANRFhL^x7}%P!eY3N$Q{LdP9Ti_ zO3~i7jDBl{*D@f^11!*#)3Xz?i$@i%+~!#BkiDQk!kJsBz5&He7K~hW&~gvJMGKW# zdior(0%1N3Xayr;ESUv4Y`(%L%Ji}Zo>|uCGq3=%dMVGbaLX+G-2A6SKqZ>P+GH*0 zj55r!P(j3YnYZN=Bj`=uA;qca$7BgqR5bB3`I&4omJ?<@U*Mwv-LNuO7+? zx1txM_ib2(DXKq-ZZJT;OV*`xIlg3CVbA>OhrlmIH||jWEfPOd1_3Gp;ewlR-igbr z?0c5O<9hugx{cZ|?lGeO(ytP0x%(ZXqcMWpsBn-4^Le_iN`@PR0os>JH+1R(dO#&n zDEREXE`cMUeVOzt7F;Qxw^qZRzPG|2e8pv2t!Ir z*m-od_#^t~CYqO^c*)c?H}G07Dw?p6MT#bKtWf^7F!7~SO}71P(@>gOpw9|oBN4?k~ie|5RP-fDD8z`h|-hyz*SB_PgpQjhGv9$`a^zswV0JmStNc-I-tCK3h>|`*O zWf`v5SPu^CIqA3)fAxyglka_o&3L;L=~jR}O=9)Zl)lOQoB(7K3a}_H2wMOiPPW-`l=9&X zArdrV6_LbmegqR;kV$^ARxD`hgS=pSG;()t=qOg*>81+LuU8iLml$-^diup`AXRYl0SiUuks#z+qx@^nM?6g_4Ws_E&fytd2jt%j_PJ>IL`^L97_D zK|l5(5R~Z$wMLL7C2+{N>XHZC3rAKO-XTIf5=sIYpxG4l)}?YE=6^}K8+S!L6N zrj$1~oWbBhp~vcJ!cUk^~s}`GkezDab>d^#XfV(GO(ry-SPU0r;F0#+z?S;3-`*bHO9}F~Fxc zrkZI`;Ft&<3;vT>Un{;qC5#yW6+-5UlAc_~gseZqV%9e#pykEZu7<@RKtwZ$9WrN` zB_G3&m(RAhHW)DDGSoB07!E{+Rh(;uNIc)$07=~0L0N?Oa%8YSb?HbTgw3bc#`F&n zeQ+JdI$RFx5R>1^)f;Zg>E1anmR3`nAShW-`EF=qM7j?g;hhMh2QIy?C~yQnLyX9x z_l2xhZKw!_{cSkH9KKgZG~X{e33U$ zU-+A<;0ts39g2HI#55m9IK4WjmVY)Pd|N7t)T!k$#2WEuiLWW=;6esUXf%o&$Rp*T z_{cVzUncmuRsqvOCi6<#a@ER6o&8V0uYao3_BPocje~vV&nhPJ@_T1JVX&1hCtPjIt>!T|6T(2f^l#1ubxoARNDCLxCVa zdgRRIVf5ysPn!>|AgFtMzwz1H!)D{tM@=7F^Y}yrbwmDP$q}F2c*NlU z&TIPV(~Iux>`klr==k6fE+1R9p3<;hZ97rVPv08Vf}&59_tJ&iwqT=z@eItc19|vL ztco1R7x!9*{|h{IRelLOxp0BWxZ*igB#9{cM5{y_Rh)2NI>z{Z;{n6tg$_9-;$X`2 zH9*9u9F4>A#<1U=1lIEsZ)E`Icv8j@cA8Gi>jwhbt3!Ux#QeOBKn$i{gsn`<>QbQTdZzv1`O~NKnMl+Ju4@%Djj}9b%ycvpn??JrK$1vIdpnr!o&FVx ze-K}QA{OHbeNG_dRETq7mwy+a#LKORO2Pr(8dUCzkzCmAe^mTgss>Lcns@=GA|hrD zkF!wvvMa)ZkAgH)8BPw*lG)(qd@S7*#MuL{vW~0o)C;wYu^&p7fhqE*xit2u(jp7= zK!eoxfkNXd%Mm~tObRKvd%Og36s=**1c>SaaTB#~8`C%At6`5R0k}a!qW||d{KFE6 z8a~~%r{D_Nv-toNf%HCgd+1$oqd{PPZVFU7r+q?9YVtIZs)DJKobEB(rhwyx!a=t* z0Y5$r)QgG&)s_S*YCHCw(?=!jq|&0xzis)!2=NpQW;_vY#IBQMM=#q$*x4rj95En za#5qJjF#?1#3km_b3{^R#kkrMOY42%ZBkx9v_%Pk1fL*-dqHuvZWcdur|`2v_+7NE z$d3*uqX3k3wN-k_1-JkfnuzC!WGWUUnozh)3!%nHhv8Y$i8n<~sR|NNh0Xq-y3Y^~x8z#adKE6#m&Ynjcwnz&%RiUYZG!_{x< zTI=&gdurquoeGtrW~!QE-?jEh_KnI(>{QC6dU!a-^nG%hsSk>npTL88?}`*5;YS;C zY~$8V-zsW0UnK>n6P>Iwn0BZGT-XkwzIKN;jf<8vTw z={YSq=?gcG7^D;a3Eh4~% zaSPSlcXIYpfXndWaE^1WBet(jA{udewK7{%>k1G@1|VdfP3SmiBGsMU zvo}nHYgdgp)7!7MrXT$}&}(!_oDwZZb(p_ISD9<+Z)Ive9B)DlNQUtBt?Vg2PJNsm zAEW-w&MDTTgMcKy*~Hlb<4G2PhyvX*>LKzP285r{tIL+)7U(d~D8F682|`+y*`zJ< zGd-5nJMmKw@8o-ixy#CAl+2$qQs0E**d9%X# z6jUj=714FvIn^ihrY19ejeil#GTY1|$E3OS2onD!A&@a7i6Y68A{r^j0mU2`tQ+?d z?i$$)t~v!|KooV;4n9$OlH7aS>71H>)liEN4xYQ%d6@EPda{+ja2ISs%$T9zhLjH> z*uO39D_G%4B)jk`JPiZK32XyFa9y;d1A-}VE4Y*q!~@@9_8k}#q6zZv z!m5r-!{9k!;eaqx$dl<{WMR-=VxReybRbCQ4Do4mmA8NE(1`svmk8T99P^gTohd4s zaSI8Vm%k!68)UyLeP-|Te5c+!W8sG-ed|p>3cBygmx8C_(jtE?dS9>_7^wG|^q=r9 z+YGE(X-6v289Q6MTRSgzI{V-4cfQ{|Xm9Q90_B8>0AAytxw?T(K`_VWe{O8Qe7-3X zW@mSOXHx<=vZ#DP*is<9Dv&LXzS4R7-?#SnHxc52s7vj)c>$lCo@k264nfxq>12F0 zIaAjQ_iQSThH)zi=VE?2Z9z>9N6S1FKv06o>_fsiHve;f^I(e+QR~~FFWtAuIdSr> zq*hHbV=(muY>W?NRgD>Ta4Oz5-QHiXrZfC)UNpmN$ys4KP6UIv@_*nY zEcwUHC-DNt1+g&15Rm2Lf5312T7no}B@hFo#8@Hi=Yxwg6+a@}voIwI5(w&wU?^@x z!LoA*Ox@Jf@EyW$lGuP)Rsg^So5D$* zh*GWB)xXGku-3d5>0sJ^JGi{;_ek?y@-T1=_z~Q(9nYW{#B>P>!9{^&v=8yGg<;;S z&gNl zj2IJy>B9RSmT-DfNE$o)3f)B!PJ#3Gf}${Drj!;?Gr2%Z0w7kc+E!u9HpY_)G|=C> zV!6?Nffbpk!xyIIrx=!B-O6N`$~sq1uMhg?VG5}?T}5_FJ5$4u7dJvz9-UiFS74{Q z+R$2vjtYXZyU2F2Z@|ye^`zrhR^yJd^fH*j`)bf@Uyo+ppIcL~nWNdcnU_2(a^CtU zU>+kce)R#304p6R%9X z7LuT1wLK$kGOi*BM;>1*XQQ~W(r>t#Z>FEokFh0gmf?Q%DinXdH4s?ry-L-Hk-xQu zK%~@)xSNaZK~`AUH2d_X?dvrHvRNXco1e^YK&6RxuEpx%KbL{f8A5s)t0Z{j; z*1ZiE2uBHX@COgFOK@PjCDuROC>m7C;+9(5(tMkQ%9m6NOF4-ZH4?SV{})>Mjv_-< z0C+FX+&h;Uwu43D#r7iifc;?KGP7&Wgnu!Ercg4t9;qQy=^Ci-GEBd7(5o;3{1zcP z!b~(Jr5ltSGsHE$>qo)BG8Bj;*y0WEl2YvJlM0O9$IVRa1es&kmX`zqPv;|rYk1OB z9k0Oj%xr}jEDgAZRi~)xNe>Y5yM^T4%}LC>V+j548?dOD_CHrD0htc%O#%eK?PtU+?Q-FB}kjB z;2C({@1+s^bsr3IH(pm=-%8;;C0rU#rF}tPH}6Q!Dnao<0QS8Q&6WXZdPr``zE#>h z0WjIJ-<~m>XDFyJRZti_TaOr_5S?dut}{KHJ|{P99dghW)pY{TpOGoxDt ztOrd~kER%6u;!-kQef)C@3PC_e5!7Nb%U9tDi=z2OX5uKE5;I! zkAZjeuk-hEAs8ld15|E+0?*B47Y!E2sz2Cp;T+3i>UUQS7oN=!<|AXg;ZP*mcIjA& zyq#NzmY2xc1%7r}c9oH%{*m&6XBNC!-V4Cz1NVtsM!vRX?EV6clX;^_Z%b>$U1@Tm zI_66jf4oQzh&{u@N>rzqAStGGRs)$b9FUvv4KM zHD*bm0Rg?7ohf445;H(Ehxf&Fnvu-`*!p^YR&)#UR3j)P(FZbiw@d z1*4pCz_K#Cog>46guCGSE7?S4>mp5pOC!#KE5tArj+1e1*D(_AW#?6FeaHGXIX?12 z%qg|>x*q1<0uqhsO*0i7DUui$VwmBzvlJroBosBGfz6P_#uGu#0Lt6UB4om68YAO> zlNS1~&6pKNDHy2S-Um`;bLH3UjvJ(UGdnWYVoS+*{G0NDA7ynsfG% z>z3}oDu%I_QcOsd%*+1Q`2_?pWbOc;WD_7o1#(q~_m4^~9NtGUbbfwP`NO&^eM>mI z1Lf_1iv|;K8s2gqkoo?|NNb|<%wNS@R~eY|#%cr`JJUCV^N2EQpI=7En5;|CF@9ng zl&nUzupFkaaBwVcMzTV#?zh)mi9)2JhRL-;LC#;;H2d_X?dvsFa_juYCdI|o@1UVV zs73?orj4mA{W#21?@2QWf&SnhE?94y)RG;$;~7kpy{(JO@kA59&oxh)>ZGFD*Zz%K zSFA1BYrRm?xqURRUR|i#KIyH99DrCW6MzVhI;EFmZ`_}bj+@MpqG{T}*&st;uix%6 z;IEb2I!#=I=K(hW#qH>1>r&gT!EeN0U?p$m{kn8)pWA0SFmB-J82G;Fx{Cm(!E>q> zPspq0y?DQ&DaT&6H#^(wJI|i4JEuVqmR!DnKf9!I`4wCN(Ia@h8OZQJ%#%)%ai&Xq znA7_{EI#0(s+hy5YZCn z7&!fB0+7i2&cE28X{_AgB9Xh~)#Uq4=Lv}TIO9k#uArcBXdVGe08abG{`nEJl@OU$ zm8L`^o)3n|w^_1w4!wU`Hu+X+1g-ycjp;O2yJ%u_BVG~9BA`cGV~x@3n_zXA+O-)F9cz_&HCY3$>SG%l{W8%eBAt!ic0z#@A=RBNeeI)FF}55mq+o<>2uv z1+_ymC)c{uj4)~SMN(P%3SP_*?5Z!_$BU>x)V@l*RYIFPcSRWz0EYC*cGzUFg63-T zq3vL-!MO{o5G%>GB#Z^R;aG!`N}3Iw@KoSV)tyk%f?E|dvPxG{1d(ncZCK0U-r4PP zBQnef^B&R*?&xfCWd=h$skRg~$QGL zz@ta@1M_ngb*+TjFqWO6H6q*$l3+XEm+3qb8I>C7h_Fj%*miaWD&{y25-oPBx1|Ke z{63d^3H-P;DgqOz#&)7gDHmPV>lN}3*~t(mW0!kOE`oYX>i?jzFv7xuMt;bHsg7%= zzaXqyVlN<3xE!`>xRE+G6@q5qe8H#s(;yvX%&JnjgU!R22fL8NUSt$*>9Ny6fEM$Y z@IkklOlpmSeYUpv-gI|D1xS^NX8W4HFG4HmECpH)-&{_%==`T$2}mkPn5$}P&b~jN zFd@qEXONzwFIY8=v5~pPxBlp7-$tq&e%T|*Y?7h~jZ}j|4qJl%R=6t+kr<%OdBaab?g~varN>QF!%pe4 zv;%+K0d5M$2e25(LH`1ARwdd}M2fVRl(-eTj8Ml?iW%B1J@G=fq-mj=hxVxHtgToPCA%o3LCt(O69mp+EJ0ae5wqHvl z*g&qxJ7)I&KU(iDm|80q?aZYA@q$t0L}n&_n9HvbF?USg7^zVs%sHM^rdjy9Vy#@} zBR`VoR_A;rgD!gS=Gwl#I3JI$fnZP?jc~sl?@7gSTm|B^IXU))$B(y0KQXC;Yv7;b zgz_IaNAE?j3xmW@eOoEM8=r}&Wpekowo#ydZ~t&>XY2oMK9>)vN*@eS{A7&PUtqg?uAfQ=Te~Q4zq_vEA%3Jk z!LqHfIYOB2=Y`n&Fr(aZj|oW;y?)EdjP^jl6j%Y|Il!JgeQK{^bh1CSCHgkQu+!@6 zn8J0LJFRVmz9RDn(ujZgtZ=E_PRcaY&1xVqdymDMPL5A3@WH@>2nfRnRur6G_7OF4 zb;;z^a1_QzA-E@y03Xd0QkkK;NDCzuB%>5^nMu?RFQHEas2zB|b^1RKkbA9l4>`S1 zVa7M+-NvXN{+qp-jNggxfnoT%V^ckf6J%@(u<<{R_515|JnHmEXUv@MdnRmsO`5;Y z*(3C4rP=@aYR?0x4G3r~ux) z^`hQ|EZ%O9p771>cD37h_!lN3WD$vemwD&!H@*M}R?k46Ky5nW8Qxl@x~c${Zwq8u z2MkH{4rugt1&v163^tTZ6_(^cg0ITCBgzDDzs?H_)fCHA^ZmTA7mppuSEQtN0}XyQgx|o&v8zeyzoqxk{RZkPn1{zq1Ru#A5jhAep%uWd z`lClDmlj>cc8$z7C#H17^rtp#^@apd^vn)YoeU-!+ppC!=zF5UgWg>!J)h-yKAipM79yG;dn6Z zXx3Du`*Z|E8=$&?+Xy68y(qjbJr>9Fw4YyA0<%%WP5WeNE6q)od05w&SGgETC-fz5yBkR3?n%)D0HJyR~A|J(7jitO80X-Um z_^eq6hY7)z^TE##8^We?;e5#W+LLeXN;&}sFaxQGAOX#AmQHvPy4SBoH5k2?oU12= z8wVd4Xk2AHjt8Fg3^BZj`SlV*HBqB$TU(p5YlPHKVeht}#6N#b*m!}lXm!r3%@w*XE zgB<_+4gXtD2WbLmK_ek+P$a^OUCMqzG`h#voC1*Idum-z^e+38ytRR?Q!(? zMmSA4-TqLz9AvXME{6W1+v`j8J_=TX4BEv>;=s>v8Y?FcStzgitO1OdSYXqC1pYm* z1k5ItLcp~&izFAmcj)tnH+`_2lSJT+E;w0*Bt*XGcR|Q;-Mv9N3C0(M5}T?v2EEQ| z7~2haIvzvn$!078rnnOmBI~{NHJydw7$Nk+-D%342?H8MlCv^|WVrB1Vr&{HD^P=M zi_<-W$lY&nN>Ef!t`Em*HV9e^--Bn&aKOm1*$n)1iY}(4JsfXIZciRY93`i|HXEyq z@15^86=mY~sdspF=o@%9g2SB+Msl5DR@5}tsi`a0%K_)f#RwDFR(BZ#V{A<40_HclzmIfZ{RR~?xE`#%Ah-w?|hZ zb_m?-1yrN|)3@(P@j0Am;IjQQW|%V-bO~2NAgR!3f*u#YH*P5oF(=eblyd#AG4~#M zTSvw#e6li)>7C#Lmu!X6=N6~wdOyO~KJ(sr%q+_Wh{#qqaMY{2TckOhR75A@&c7_l zN8AU<_}lmf;EB3+FvT9Pvl^7@Z*AMAyS9-%Ql?;5ENxNs*1O4$)lG?tcxs}_B8wur zJU2ZhLA05VDI)W9dp+cx8ADxd5>FG1ibyHp71$KMwb>=x99pf>9Pajx(&ufXpTh*e z(<8ITWAm$4WJxBN;i2$buK6vX?Y#5iCLCe*^3w#K3I0>c=L(V z5wsyHSx1U;$cygTloV5bPEqd^jLu4vH$FsY{z+ybREw`Zab>>P@(uEJ;6GIR@{e90 zh9a0(_~#fUTl%iY^WnHVv%f)4I#@b-c|B!IZfs|Cb>ScICFjuZsS1&eBDM z#&p0ZOILOtoE5~)#TY&ObeCm4=FKILH$*t@kK6r@&1~9QJHiGzD_WRN;V9JHv9gKj zB{q$Gu>ys(A?0cof+#$j_|wGig#5)1rgLbFCxb4aBmE9k6kMTOl^x2Y2@n3A3b4Pi zr@?V>@tCfoE{&G061+J_oM^=i{er0xH=OxXY?x}hPac`^`NO`x`6Lp()G~voO1u~2 z$>!*%&7aTuVv{U)AgU|5hyiO0C12Q7z!pBeY5N7B2pu11*%W1m7LJyEG-qA=lm6>U zcf!t#kHzBT26H}EiB=md_G{3+h8u+bi`^G?AkdF{W(96v0*?j$AL6-izcK%yK&~Je z{#ZrKwnhyt;{NjmtQm+iyG?%p8_ICa&6YX*Etfdix5MOW0N zQG2vy{X_AFX-JLCMri!dNA)*`G{-k~)_-L0QzQgKdc?EI7+LWzpfw&Ks{)#gScB@F zOh!6Ek;W;UPN@dxOO~=CWyQ78!>DH{dIcTK2G1WW~$E)4HJb8Q{=^*~{ z8UJ(km(MAg{dzod4W8U@G(MB$`1e=HLX?cZx6=7h^KHL>*)dpmWWT@(u{dc*HWsSO zuhrYVXoCJNXF&nuy(TfDlg2z~A4>~^_)!yFlYoTSB>-rGm%5tt!KXmQAHBQTblg02 z^OH%rA4G)XQGyCOwI}!86!Dfd6X*j`JIN`~e%SBG_=BBgOLxZ#Vazd)Fy!y#L#t-lZiQwX%tdhlu!*g;Fk}#{mFrFC}M0@=_cyP#8=H$Vsr%-d%>P9`z)q7;xRn z7VOmG8x8v@YIl-5qxmX}>c%=u_EDp5)P?0nQ%&-4Y;^7gW$vWbUFKb+ZK(B2xLD$# z{!erz*}ov0QXy?MR7N`$8PwV<^SQDb2VfQ`rwL9-DsJV=o&{FWq22*-yaMQ!)`_GXb;*p#c<&U^!umcC)?0Xn<-%ho3sTvY|;V-#EsY84JHw_{hwZ z>%Pw0&AsquN;;$CpgSb;!JcZQ0>rM%%N{%e75brJor6TCg=safCVO*LJa$GySoDTk z+62(Q8MvzKkk zk`Z}|P+oOpT6nVMVb2kcHaX3@l~rG0%)EPySe*uGiq{nH6xWRJ3bXnmD3VFp2)iMf zFZKr6YT!F~g<7xW<&)m&!NXSb#_rY)$UzxPAZ{EhKs-=uz^$`FC)u^b5;2akbgm`N zFQsn6=%k0N7QBoe1L>_1>8Vr4Vc2&?a9t5L*&;evSt&M=lf1&L;c*YO0}I{D*sJ`w zkaF>D@AZK!3DvVpYf8`Hxb$^kxRxyQj~l?tRn zqm2C_a%<)I6fsGElxbG9Uc0vTIrzYZ+m}8Mc!`=<@L=(n2N@NoLl)!FrEz6VL~|yU z`4DMonaq~_&rL!2FbzK%!NDl$H69J%qvIYwEOT4 z(x>K38m0Iij`4DyWST*{!oeZKiEIL;X^@15tS7Ii?Pek@ltl5<`{dLK*$5&Wx0xtU zb~EP2ly+e)m76(L{*p;VUXQRnmxxO6WkfEM2_|vyP(aw`&dW0wEHY308vp17XXsT9f)F z4+Z5m1{`xw5SvHFjU0(P4BQ^QK7|o%J@~5d5?dcOEbVsTBRVTVhD;X)RT`~Vr>IX` zcxy~$m>X!-(t?1wfPC1Q($~n_C-Qgmh==##Ujm2|*4XFHwSc(whW; zQ8iU3F!zWFW~&=91r^82-g zo4(*sdH;AQm_ClPwRF9-{T}2O&$V!ZKQhhc6O}{%;h5otM$DBuM(hV+htr{dVu&N@ zz?}maVsT#d@b7LbFfS7-*0`TX32xj;Du#dpB4du7NMQdpL<3|YT(BXQ;%8L}EbSwN zZ>m-kEL4?7M?DKR$SLxG^!}Q~wW;)CQ*?m`7SqdGDP#o#!47ck7!Z*F5=M%5P?;jR zcEwNLsV0|^%);5;JDTDV>eM5`RA6;BIk{GDp;JO}7;=eb5i$;`4t3T}RibXE5{?w{ z@g!pCi1)2_kQlj7-4ELf59f6&uR?Zoe17X|H$%XQVDQqbuK{KiSnEMKfM<;TJb?0C zb804R5_zZ+gl*#YJXI2}4Cx~FR1G8{C!+5r+Q$lxi5o>C61hZ()FlN|qE~HxA*wEa zlxcUtB!tBC>$mql>1=gS>JVymS*OEqlBUTs{I(iJNdyhQ75+fM-SCC%e1N(*2RL?v zxub30edFSGLrgKomVHHSV~*Fhx2TMh5{bpVDk$TU(Qu+r5yo&Ql69SiBMSok0NM@RLz#mWCMRpnNdnd_@Hoy+u zbOMyA#*`9;+LrfX-IRBFlXYBRO-ue|*$vTvO`~9hrBXRI)x&Ar^plme$^CQ~K*2 zoKCC$UU6!b&Lgkf?D@RyUmN#dIo-?i^yTS5fc1ID+#YZBPtV3f2G7dIRs42cJGO{& zg-By_#C55>EO3bDtdRo@6^DjKt13WEwg^T8DM!p!7kXH zBaX{jAr)8W*PETK)w`Yb?e^MoW4reyOzijnNI$s`gEC6vs8R=!(8JO2Em?!qM_0e& z-r=8|(ca!WIDm5rZAz$~4omfsxlJ@Cu&noRig51Tf>;D~^h6A^^xL_9Gx*a7>8zGI@$+JB;vcbXSE2Qq4>Zf)SernD)_nZSWDdz=8 zef#30Y7o)|$9?DGp9N7a9Jb@5fY%`OI5W?IJ3^P(3H;W3V@28m z{6Yr25A5tCijfEBtXaq~Np))sa096qE)4eT4f$`yQ4m31r?6Tv3Dbylgq*FpySkKd zyiD3v+|DJJn+|@z1oSERh3r?`;AtA;Gw6Hq-}p|7PY1HB@ps%sq+NSVuS#`r*zX;D ziBO$G{Ce^T>)MC+)#<~O9C5N0^_ zJK!7^g1{{;gxihbIU%R$BbpGw zz1+@VNy_@G4ycev&};|J!;cE4C;U9Q11uMf4Q7hGVlZ|>p3TS8`J{EYOG8$@c6^;^ zITG0e5lCvvWTX5X^S!nfi@jTNAk#mD?cuFrC6LO#>_q)gOrNZSNu;BjdW+j<=r8jM zaFCCw5_W`XuTV})4J-IgIb%zJM$?{RfzX6JP8Jv@$*MF^+xAEfm zxi(b34SOkSwbDrx(Uh6Vq&@J06G}Y73Th*g*??@-w<>J7P{bcz=)VJ|V|eGd_dq15 zveiC;3KVZpZjk za`jMzK-LK)n;f1VKMPWMB!;_iI|RXk2+D9Mj1GYiIBxvpRAL3M8YVpNXT&P|dnX8^ zkEB1vnk0`l0K;7L@a)nX43qhrH&2UhYpOKN&@Fffrq$4mW!N-wVb1p$xhEh6vSB z5S}yWg7NNTvs|mtGhGZD??QO$MG9WxFVg6ern!s1i9m}S3t?|w^c*c@H@Q!EkAaqHq z{S@|O{Z!Wz`G%>yV~p%w=J^n1S4+C8Y_OY}W=dC2Ovx=t)|M|ZJ%v!=u`%_)0C)^2 ziM!Y;OamG=@#$k1Ko|Sw?JmP1Gdq6Z0f&W`=CMycKbi+v$;i~kWANK`JvqqhGV}B| zlU-ap^&Ev#Y^C5lS_Lr-Mg^K;6ut>$nUpIU8)4aij2>KYVsErr210>c6ab^G?W{F0QD#70vhlNz}prijozO% zK#QO}YAneY6$87-KEa+IoIId;8lew#F-8yQ$Q6uJ`CA>xC=E?3-nMuI0QBn=PX#Mn z1$Q1x7^c=O$*cx`QS?$Nbn<4L!$m>I95yf-ynR&NG2KfAoEdarJI#yCDdHBxjrA)Q zd&yt~JN+~A)8Nd5pU}IZKvuO7(ZzT*CGJkLz}9=|&tp2rp@5D%9gsIUnvo~5-~OI3 zYq$dA(@I>f=On#ZSI~aNG}ofY{vQ5^GBRVy_qN*~e?dXmSS(ZG6i4x<-xgD1RXHwL zWTs7wCf-|g=>WeqZ`gcs9+<6~C2zrd6824cx6jys!qliC=1w$euEciS-ne&bt+R(1 z`HjzHN6a}~-NQq`nM^5+>^Ft>@SU2@#8cjJ_3-V_`Y6V%EkN7l#e+FMFhlwjawaxE zs><~COks@+!(C&Dgky^r7RAAT+GztJ&}^55A{5Snrl5!_ezA{VpRJ0Y_r)@AmK+cIsRFLJBu zW=mAbJu#1rr^&d({K**T13PTFI=qE4(Br5T0YI0?^5FfHW}A zGCVTn&06nd|B!YmTd$)v1S@?PdCIsTk}KiEpa8M!o{wI<^wgUK7as?lLR>3hJ;gP# z*Co;CCz%X9ocl1E`maT^PjZkfrpl>I$(~lrUx+5!?Uqd{&c?yr4Q#k(VW`esG!DFj z0H{bw&3=93THx{@OT?GQXvu;_HSq`vjBx%!Sm_dyh2I4zkRJ5NGz7h3R)I}rdlivQ zz`^s)Ri;qZNr>1~Wv5;jOJpqsfQV3NpnESILxDoz$q8K=l0?JW+<1h5iy_RhFdTy| zA2+NU05S-=O= zx0@>HD5e_ZAMZ-He+~*Rfa%bJzsuI2+=hHCnG^4dKx1^bEL`-ZXoj*>%?52T4>u1m<{9`B8xAa-2*y#;BJmv#Hua5>KO7Y!H!osPlKx zkp#6i;g!II>hL4+jtNY|AqoMCapAaH(>z4>$8Va4NN{?;m`_K+f^hVct3ptvldy?% z!B4IV&OH4$)Kx+3@@xI!gVTrLe0Jd^fPzEjnP7efbOf*#?;~RYSee94g|HI542;Ii z>+GOaAINfx1TqKX3eb{Oj$`+UngsxU_8F+d>*WNS?tPfUI7fzk)A^%JF0xNc=)` zlk;MM;3Vvy{q{q8FOU%oL4uxf37hBYAaN(blE@>dz!_V>S(zSU6BMw`RI5IcgYU7o z7Lp~+<=ADt@=^r>{u#joOrGEjWLLa1kF*XTgQ$sOleiaVrgPn#n(NP$ZsI0|ZcL*q zi+G#y8Zv1FioeAycrp}#!n+dlElew~nF%nmbp=vc;Vm-Gh#H|!Sw4B zlxU{y0{6;H6oDVQJ31U34G9U?R*bjVEbl10Mk>Sia&^dm;M?PX>w$ zki44!p5s`{VKxzUjK#au5jN6c=dQ5lcTZuGn~IKv;g5v?HW51KQuPla^(j~AH9{BB zl!jqR7mP2VaNtem=v7L#MS9Wj5jJ;#4@p3ZnXU@m)GHQb^+CHJk3q#CIR_oK3>zhk z6z&ppnm`wyVO42YH*;tebPQu|u2hEzv|Olk0IO`A@;(X|Dj8Gvfd z`0T9XSpzPkugcB|-rcU38 z8@zOmj|Y#Stc*8TX5ctYfT3)!J*$zvgbfB0-&b*K9~ z`*zmWRyVt=UF=M0l4Zau&NoJaxJ41bd97#!3Zb=+$Z*i{Uce9tm=~R=4A>qX-eo*x z7m=~3xN``8CDv{d@7i^cZ^FBYCLooKOwJ7-BJ#WCf&C{U61x)?e}MRTBBcOZ~b6u z<_ob%YT{nMr~9?XZLGP*(=LP^l_3&iH}pLH#SIG%aH)1aj3<@QrJ%oh6}BmDh5jQ%tF{T{BQo zJR1^&%L+C|LI-RzppjNIB(7S~NYh=HS4_m^nTmlRbIxp<=@ib}{?%JYM7QwZq&GM& zC>K5%os5u7>d`~V)-_X?pkitCzs@!YT16*BMAnOs;|T>|;-ZD-hWPX~Z$h4LzIgtx zL{F>w_uKmBUrnC=HGO(V-~H?Q^sYYr8~XHfefl@`=^xgoe@mbK5q@y`F|QcegDn>pij5?*^B4@S@iU+t+^vT#t$!^|L59HUj6mIuMc;$ zi~k~e`b(SP$9(k<{&}Q=R;`x6SJss=ctMZL) znLK>=Pe*UQ|K{&RPcNST*U{5=|ExazEuHy)6Fq(V@9D#@`0Bg(;aAa%7tjCO=;^Qi zBYjxoH{XBr-$hR^p2tt$+H&to=kde$-~5mImArcK+)hrO{_=m-SL^)hTiX|Tc=6m$ zQD50KHl+9eP(PA~7tgJCdHU9XWK-JNF3H1-=YLnfvZwz^pZ=H)|LPyphb=z5c>X^} zPv3o`4_$rrzeG>p8enb9SOyjH@Zz~G%bxz8eszxxe`l{g<-_;iSReBA;`#rk4ejZF z*Qd|e@>>I~U&~+ys`BvtH+KB;^y2ydp-Z~qB>B~O2CdwsxH zzq60z;rnlXtL^0J#c%(~=;IyL!Msz_Mg)}w4q_sKhX~V zd3|M1|AIb!$#>s>^IV^fwdLQAp1%LaPU1x0{fqj}p8h3$8uHz@)^Nm!?`*H+;l*za zJml$jb_pJ7hla}S$xixD^_^jC6j{cy4T(` zK3!&}6NdB;O^DOdL1C70F`g?44(s$n$XY=kzoqn^i75w%Ao|ERcQ)xgfalT?YDgMy z0bThJWte)CgTa6q@0i~eQE*EPgcu?Lmn!>ca{%68&i}ZJgGCykuIb9%yJ(X%NKaU(V6&l%SVo|8=$H)u)k!p%a#7R|_HS^>* zi2}+ol`O8e8Rz|8=^Y<4IV0*Y?fhnES>S8=i!W~AZd%$%Z_;UK{3Q(ItSZ^U2~ z1w*+(gmc|-&EV4TMdKqBO0m!I%z85re&qy2zFSd~cWX)Q?J$9#p{|q3!}jF$xzN^( zj*d|8v)gxdny!U7jg~1gq~BE(5yn8qQ6KsQ*_S6Pt@LQn`kNpt$rYG0F0dk@g^%U0 zLV*3<-h%;h^huQMsqWfLQ7Oj>mxgj>GLlFLF~5+q;v%%bTTELjPNXNFHLJLBhE*vj;g*q&sU^(dhD5Piobn)z^* zqr;T&ZuP9mXE2dsP)Tc@l<0Sy4XHS3T&eS5M~6(}jBM#NbzoKFp9=1GdF(M6o~AS? zp^s$#P|L~J9=}LTkE&lN)H`WDHaI5>#GV9a87K3nLvTWxWQd4AD4Eh$qQ6dm!iPHx zED+8}*bkX0oPX|-NrxGAb(g|N3`Kf4s7_HJdZ-R=69`lS8e z?QDOtaofMLM}4;*K3Q+y)jD(1p(+=xQ_Bt{0}JmV^WNTS!|}>ZN1xa$6t_?!y9<(T zM1c6gVd-JK_p2OX2qu z5u>Zmu54^@n=TNsb!g}w_nme9$EIR#9&`snnE7F2|CuDL57Z3F%2{Jvoo>jp&ris} z@~(B(kv9(v{ZdZJd}Mu$l}LNJcdX zy3kY*LE(4cl5qP|xRN1AIf35HmT9r5^r{iwSiZI$i9Bnh8Qc%$C-txqqaAo>4HXII zAThmUb|ok12$4+X2O9h0L4il77zy*RUw)0ToHgB|d@V8>8^QM=`00=iwzwUTS&lRV zn}Y*P06)$dHC62@TRG$?i_^7ax$yMue0B|@pCf%l68{AD@y^^qNbBzjKjRTd)>}vd#k;@u_XtE;51r-vePMUPPKbL zSuz3kRNWhA)s(}?ci#QFB$>C}Q^GR2A1~Dv z`6YOXpK=i87S~K!_i?LrVTN6_QjNz=(*xnm+M~=A49UoV<)R zs>#({1Z}uu_YGtO|8mU%Fs}5~cRDQh18Dnb7`z=dPIP(My@pSo`%_z@dm^o-U??cp znM+ie_@o_DpyY0^r@VMUj)xFyr+x(lqi)xO4ARW%Ng^(G?eh)ur zsvIdbA{(;246=|4N@9ycfjpIh^{nL{B$`{J#`@aHmmy(N^J`FG?xHCXg6paM;QjU! zwQ+t7q_97!+H&4hPA+K6F2ohCQDh`y{#E~(#GKusBCeWgz#{RSZrxogs}FVPZxzJ& zPugp^3mbPgq2k_xL{;JjFO3Ny0|G^^Ox^Psu*eJb5Q-zVqMV^{=?IyD@Xp3or@itC zve`D;-NxcAf-8ULzwNEhqbL4?8`)S~LE~$U)o!=5-NFaBB7Eikef9}f&fl|7`F?eM zW$oVW4ubqpCG`5EhmWqN-+t|T`ns{w-o~_cJ5P!A!6d`eKJT*g>(%WRljXRv^?MgC zc-gE90hl3!eI=@6(d>%UMP|;vw6G9Tjkb5aL-fI$>#T1GKU!9M(#bW;{@nbDz z`w5F(4i<|g+q<-d-USCbI$RO+@cD3<*sYvW8NR+K?hDnAx^3Ct@MF@y6z|3Fy5cho zV;EaVeP6TM>4W}GPEU#jyLbKvd4Jg7KYK7hH8{J`>V+OMxDY@hpQ`5L&?eaAoL zx54l+z|j3{Px=P_M83V0ZPYI&sKki^Y=7oI3O~qq(O3M_{kF#)iM~0tAN2ikzyHWh zVj>Un`{_s}YxnAO)D@p4?Ukh)v$@1SNe@!q(S5ED^7|8%BR%s&+S99dAQK3*dZ%g& zlE_i#w{?7s8mcU_1o?NWC8&-})g;Yz>O;6Ybh*3W)<_4Ge34_Cp4WCXdh5eIFrS}p z{Hh~FM4Ct0U~?VL#hkl@LKLh;#L9+diIoeqCFZliSOh~rYAZlEQJ_LaCiWFLU<`&U z^vwfD4C9(EV}(9b_+eM=LAEv!=gfvAA(75dB;-QBe5>(JYB8ct>85J9+;CyfoVJ~N zCsRRsUa|+!qPv+P?M2Y3%Runl0*;_$Cp+eXqC{w-!s9CmQccZ3It$4VWLwM8H^ycUZNj zn(kGqpi!P;$^s;f!liAZ*x8(9=V{7dQaxiitr;4Z+7QB`Jyc;ufihfZ+CW!{Au~g0 zpaF7*iBdtYUh1qccSvnOU9gM`U={WwI*=b{BU0L?=>7-Zg9>Q=I6D!W<72mh9|bIe z_#p^fd0V~mK@n-^q=nK=?hKO0jv$EGy}ib3t{%N-!|G#*e5f0;4D5B7x&E|69)26f%h!f#C2uG492*%D(QMPp%V_fs zz0~*$><|A_=;oc);?r0#WHU!5pT)S2&faZp_7I$etRHoKYE~-_A`+-o`OSbb zGR!(v>^V25^%2j8(?EW|ZfEUIB>F}xG=qbmj@pH@*@$C7>lZiQMiG?-mJ&9-X}*~k zlYa|>EreM;LrAV^Xwzj`FVCYf^)?vw4ixK+%y0`uonVROMl+E}H0!2b2>+|K)SJ=# z0*z(kQ!$1tdYYCKM9RBMofh<_Cae@*sjvdtv0~mDRe9y&jHoA4b$lpxLh6w6_+s{h z&#{)md)o6wV#LGq=GN+`?d=X9VU8-!0g{cL2a?Hk0`udzf`q9`8SEu6#EK_>{=4KtlBm^ih)!gk+d~Y7}M8v+@ zpH38AWP&7%iSWNUdEHmX0!y3IEm$U;!2vAAR}0R^F8LkbnMOf|!Bv4RL^QCXXD3;Q zik+qrX3C3y6Z$~Ygtno{mzTO&LG~s{EHFSeQmp7r-Z6b@Q!3Pl{+ma~qn?^DY*N^k zWIk$42wymQUOOui{`1ai0Ds_oCs-6Bn#s&@-MVWk6{vH&BA_(-JZ3u zd;lZtZu2-m+yr0|A6EQ|(>sBmK-dABoi(aJs$pZNX7Uhhffuim;n!O#wVE3W?qHa_ zFQ^Ykb-shv8HI1% z9Y!UgGuAa`q}?RkMzhLd3+dLRIP`Mk)@XE$^3vL=2>`;ZYyVR@W5N+RV+!l%o`GEy zo5rUbtGE3$Bv`lkNgqytOnH2K$V3QSZE>iaPrt})ly#E1_*vLyG#?JG%r!o*Z7e4g zAoYTx!tt>P)oC7tnB97Xc@UU4SgcZXb`&QsBxR&Y3l0>P$5UQci(V7`c)n3Nt<=vV zu#Cc@)u5|iWa#QB_>^z;PtV3fQd2jOw=;+W%b}R?h0DLnZ;~XQTmz6Ag;U5Qj*j{} z6AhYnAqP{Z`?hL8k<=vy4%e$kZNh9igy;INPEY(udsdMg? zzf^6XGnN|d?>y@a+g&pqHLgrwel(^5k3Um6pW@jh#7~4P^1OM}&fF$gN zcy2b~{wf9#P$D6SZvtA#rgm8cPy`~-Co^(2-sfF$EjpG~neWB)Nk~KI$@OqI%gnGf zvRK9L5ett6F-P3pz+EDxF;t#dbVaiEGLS6Bq-FsQwMVLAI;Q6qn&o?~MxB8(5IiwW zyh_J4IV+v+Wy@OJ0@3=ekEqcb4KJkS-3^&5C+#PwUM7N%kASI&2J$*m!v@McvuXC} zdE3{|2`0D8s!f#!6Wu!Q4Zmb%?KaDI`VE(bc;#l2tuihyK7D5)pcDuy?n~HQW(&wR z&2K_5d5}HGS|QmJ!d6h)!G)us%0XkFi)kROX}=-$DJ6a(m=0!@wsve+_@XQI9Cmm0 zzu;)(|1I|L*HvSp0(AJulquh-=tK){RYl&zUTxNeg1`07s}2VDN-xFY zoZn@IWH7P1pkQFQB9D^0+DHa@`NE^@D*K{6g)SXBGdb3)M`IUtsPkMFjRHEJ^iKu{ zh`=3ICOg&pCN5f>)^J9eV(U?8UOZR-M#gf&_m%96VBmgFy=xL3oHBmfqt1{8&C|;* zV>uTS8Kc}TV$9MhQGy(h>#BSgmLWt5*?S8)hAUqQ%0azY^ed!GsJXc(6-TM~OjWuR zavQLcIZ`FWt@=%}F>);1qgDDYA}7|2Pg5G~*q+J|st)x)&->KqA0vp03KZke2Qp&Y z<>9LIA-knjjg7bi1k>3z5yDk-Li)ADScYlHy)JXl=zAK7$hdVpG_*Lt-8B>8W(yDj zn7ktRV(??2^W-72=f&mke7DMQbAQ7CvHIEIPLF_sP7XO__}-SoBLQAsmb`1o@3y;j zgIg^}mx6%ckbR`0`;t7UtZ?0_yTc^Px5Upox)Z^bhHrgW0_RE2YdX>&C z@hjV!APW73Nnf{#IClMV{4hN4IGb6QtHV;~ z+klExxE)ad9^tneZy=ETgn0)VZ`@!Ds77&ZEZv6oEQr|#*PA!>6ew{Cs_(Iv^w4)TQG?@%s|yj2fgA;bu{{ny;eCX9wg#Mcg0RnLbg0BT}>6^z3;#cT%E45k6qHhD7ZD zgVEVUIFfi4AOaxF^_h!|kjW>i#~VEL$Be?7r^0*T0QCNfBaB62| zjpFWg3zRbft5MNs`9Xwh#Fo{3Ts#opSm>t^SXq})P={k0tpGfv$ZmisN;uh*Y}GN{ z6Lt*cU_sDrJV7^lT8;~^fysn7vc0zIMxIMI4m#Bg%A`uw<7GB#b$c{=)Jo>1yBhS) z@tidqLEvUxktLaieweUOy#ANv@8GY?Y_dLug#S&@!O4XUG{stAhp@_o6$zHGMX3a@EJT~=GQGkX&{NGA+O z_Eq(u@y;ZT0ysLQ1O5xOf~BhAfi~gU!z%@1UT*;bZ&EV&Bf&$L_XbrC5bS&lA zgs}ezWV}|etWZ3mNWqwcq=ScjGnLG8Hq1Vq*>%>wUXahIbRqL_7qsCx=*F|#pi~wN zFi*STEMK*IQl_%F=wVx4-o_QO5TjQ2!Kqa6POM!D?~PtW$|6Epq<(7bYD8bOQJs9M zU5m!AKo#4rbxaX6Cg6wUHl`TL5I&7-EfU$K7Uw1r4w!geCmR(d!gm?T*4Me)O=_ev zdUZ5-S^`XGwE$fc+JN9@#y6`}@S{iurCG{Fn|belKTyj0$eY@%bgk!~E(M?bkoV}- zAgxe(TZGta9PJ|LpbQ_)t^CZGB8ozI{i%;}e8~{X+E#!e7TL&;a6wD^-TCMhvU)+565C3o;ckkD3 zn_t5%{l(3nzcO#}YSlcs>XOWpcS)Yam)yL7UmY|15_K^s_Xd9jVLe4P&lRXAPDX?- z$pFZisA?pD9Db-LP z_mCqHfrv#dMPT|FVMPYO%@F!YBmxr_8Vz#F)oEg=xg$pNH|F)QK4hjaCWxW%R{ zMfYD9*M!PLiSJ7cfa%Lzvk|ym+JB^1DIQq8!sG2A%4Fw!F+sAB_~3`7PZz1|dJ(E) zjsT)BmI#LhQXA-GPf4nBHL~j2r(Ry>pn%{cI{u~sk1B@M;(+_FNP-3}2We93LW@l4 zz>dPv`%@@tWDvR906q}A2eYxo6jfT|V(=o!an)(wMekl9-lgHvk)WkYy;jvfb^3@R zNTwE)c^8}7cf4^zEg;n5I~lcxKYCrtEht7|MhVu@6#Z7>ZzF0obuWP-fVf?y2x zC5RWs6m15vwRd)Wij)lcdrhT<*HNAiShYf^bBR2AK5zTE?Ff~QfP$T2eRL0( zgJpVtL`nQpqpl%uEvD4CPxs-(*5_S=}agiF7{+z41yRAaoOo(T( z6y-%;6Wv3k#QvK?UAqrQ<5T9sn2W-mQ-u0M0gP8EDa-U#48Bjtk^4r24@Z#M`tbgP zqZ`6J=;(IR8-MB4>BEs_pYI=v#GHw_LCPg@zH-Hc%vVm9n^!E|F1PGQAgf5lK9j6E zih`*M_7Kt_$k9<$ITH~a?fN?tx?SeTIVh&6;j^g}6$%R2UCb)TadiTglB4lq!xq8G zkzCmv;2+>=K#TjVsIM~T?UB0-?n}--TET*k5tHr%@n!#D&NONxsj@=JQ(i`>UdH!b zVN1O4vD}#w%i%XDnqzUR;BqxSy#~e6 z(}gV{hT@9boE`0}vbrQyoeqZ+N;`s0#rs~y&e%E^Mf`yh1_~nYGnzz;mTo||4dc^@)7ZC3Rrn^X^)*H`7fO2W*(p0V-y>VYa2T@~?-Fm}AJmU`a zAN0p~o;)0#9iyausM(3a$NE9sdWrdQTS|WX@340s^MM~ox;AaKuXad#0VNr@!KM2_ zg*(Nhn^Gu0Z4)3(sC1K0f3>-#KgtZ=iyFR!r5FnxMN;j~sk^z+Ky)z!2V8Mw8@M)~ZMGrs~-mD2v9OoS@`^E3Y z>!W{&Zeru8>m9s{()&Vnc-O{y;L`OBgvdiX9s3L=v%+AJn%5CK=gXLC(D%muN5>FE zQP|j490uC)zu6p+ayT$P)Hq}tU@G+=!57KOVy9`&E0iNAWUrUF6>_gyQZk>>tg;Yc z(1M0@*8746^e+6t$3t|%bY7DcoIS{d>`yhgskphX*iC6m!4k9$sN`|)m;_KTi2bdY z#U60A_?J>w;v;$TVgU20P8v@Tt;x187t|opeSB zyukJKeok(3+0TBS+3z}K;I^a_o4fw1mBL`mWWe-7b89g9@>v7IM{oFyYGD?Dc1t|p zHo@{MVy*5Od_6~x`{S`x?!Asd>%{9z(h*yvt{>%+B+>;SSS3}4(Im`W$d#U#P#37@ z;CtqIdb|NkkIi+b=Nh?$<1qV^_m|h&(jVyTrh3M%ovzytjhAH1WOO@r*RmvbC^=ko zDF{7kFkJ6a_W9o>8wMSDdj}5zW$~VXVO(^8v&yU&gVSg9T0lmWCxTc+fMSk|Rnsa% zEB_?V?|3W80dnPV7)6J5WDr%| zs4d*_gVD(wed1ydH<4Fvh}(ihjU4fKH0eh_F#sx>JP0xto-o*_<$dpOd!_r=ze*HZ56hvNpvW*aYTH z#Yy%~1Zu5Jpz3hqP8<~H2T6lC)E3pI;2`54vFD=Ah<}ql6$H6yfwQbM5-u~g8HLO* za@J6A=L_Ki0nAKffJ|49V`$aem46`mDSRMyiIoh%{qiGtC>lX>pyFW^dz9@C5C+Qy z6BHK51rNXYWZZkS8s9=)MDZi(+JTx{Rd!%ik(!AO*kH;-*;i@qxXq2vumav@CWMeC zrL8Dl4Tm0yMbJrdFVfyB#~WvLkOTIp`Wb(vsO=I%RUihB zN5@^{SU*7a>OO|g5<$5zQITybg3{|K5pG^mLfJTLRTt9F!9y|;3^anOAB^FbHR2x1 z3$S38GZrjPyuB=c%X6ez5fLmidHNEr8PXgo5ZGuOf&UIi z*$@2Dt*Y^^3YPqh|Gw6=LYj(zS4@A_{}p^qKU=UfUY8VTfcYrR%Z)7n=~$Y9QUv{ zX&-}O8A4oq-0wa^99HcBKOLV253J*|pFER_?VgJ$T!;qnIb*Q%zRzJwhzz({b zF%u|raCt8Dbs8xRj^ob8R;R58g+F;-;D*;a>L&w&D1C%Zy~B=7w^B&ECD|#?`4LTc zV6VU!0))bal8kV&W<73B=aUbWu)% zms>$puDdi!cb7%dgx{Rqvkoz1b6KSvvzU8yy@GW!Q0RG?)wzpZ9%03h_Gb_K!}h`H zq&*P|R~T@BRCPKVw>sTdw{5cRazu^*I{t+YdhXlSwy@`pwX{p4BwdYE+$lEHjcdGsJGU!@Ch1BbVcM+aX*oVD36FW*|*Sozi7 z_UD_3aJjd&_W9net@a9VXP5;xC&O3aoe9wB7`YZ`b|H%{17|VP+F};=Qdqkt6|VG5 zqI_(6PvV{9%-o?xBNL66PfqSv@!b5L$H*_78egwa*?=QKzKR8*-9XR&GbgTvBijit zbCj5&2J1)qN8gSJ3k1e@-F^18YG2?{_4 z;_6LeYA($oOB==K;J>N8Ky??jcrI=;1g5IQsC-&SBNRG%0!@?~O1=(9_S9jD zDIdM3)$O52`;)U1TDohuCpP*5OsqLH`rew_+#|<;|1U35t41fki#EsoVM~7nxBd>{ zqWKh>e`cg&M>}szjFIc~VgD)81=$BOLmv`U)7gG~XE3wR-PzkRvzu{eHSj zE9B7rgWv2PzPb1Zen)_uu-$HzW?<3huu34X`Oi&|r5weF%>OHPp1bW|6ARAYiJuTH zLpB{fI;1Ig#GgB3x#zV#6qAO0IsWC|;b{O%S|>BOjpT@M`w@>+z>zX-Z`t-z&28W} z814y8Rd|ZN0-#nYtdU~w;LD+;fRSdcW}cHOQuyh}QqWpa+zD=s#(6s)9``?TqSyv! z)M@_;cUmZ_$Phniu~>Trg7gvmM=F{%*>Z7F@O}-#etHY#lrQAlS?}r85G8T_qX#E2 zKrJl1aU)6BzB)WOK0DO9QdQ3eQ*}{J&a@Mk<^pIFxUmHWZos@su;3jrNA#l}{1Jlx z-{Ii#!0WeqNvQU9R9MPBFjsSN-8pQ)^4cFa_Q$=0FZ-vHsZI=In?~!Z=6HYm`lE-B znCsGB?2TwZXxQ6#T{!?CQW=S0Xr8&kMq7(yw9z87L5wqsxeU`B!WJYhzR#FjO zvc7U$CJ3GC0_!fqX#14+{Dm`&mfph5Pr&!0d99^ScBfq5s&42Xc$r^+V|&K=Gs^`J?|8zsDl!Kia^}25ln^eUXI;KDk6b+mV({` z;jr5h!M1v|IYMwFqHUs%-Et^p>Tc+5QWM>|x(GYsH&L#cT&@}6bcJcew%YS_5vD;- z&Tm#OB~@#7rGOC?CGuR1?@WL`Y>qm+7MkS@Pw-O!*JFu*z3h<#x7g+t9OEiZsfrRP z+C^&;Cqtvx-EPAhtFyk+-t2a6TLlDtclT~*eOnd7{)mEEGh8~o8dOEarp=Od8)$=f zx2zwE@v)qs=N5ra1;s+??L5qEbZIB4pRjiqqd(wb0_J8f#2&$IOLz3G52?HhJ|qs; zhVhqTbgk1Tx(OY{GoDyuYVGLuC4&fdvR0f2D#FXoN(+jOPvIq}kS}g(=9EZ65IRA; zjiDl$Lq%a<(4d=NoAkUfMfF)x*2tWkQow_A+K8^IYo-`eg({YEh<93SV$8R7;cO!1~iu-tIr=pN<7yJ`SYA?Sdp3LOs} zBsARrd@=g1BXJi!Wy&T<>O0p2LkGzO{m(NeSn~03kgUk*l7f;i!!P2eq-eP_N$xI^ zJy%55?0udMbsp(iZeFEh`85Op6de4S;$+zGL!?|e8y`QrCH$()rz{4~ogeL03d>vK zN;-i+t5a{l5f>@d1!GR&@!msTGRV-AGx+Nt9iO4@l*rR`@MV<|IA5O9HNGbf5AX|O z(2Y6e`A3YzBNl*u3qD}s%j>Y1C8@V0oT&xoi&2SrzAbf*L3=PI8;__h zZ~2fl+pWx7rVb_q_`Qf={192ZRbiDiN?!On`61HDIM|t6+>CmGt?AsK`$_5TtgwEB z;p|SOi^JSet7*(UkPv~)cL@ws=GUafkQN6pYFQqoa1rIYfOC!badV7$Hs~Y#d2yhZ z!hvjd2-y`*rf#{WQ6+t}=^ONt)+w9Ma81T$inb(eSiZUbJ( zBi0BZepytV82?SPIF?h{ZaMZDw>Vv3fE}U?3p&vWTBM1zCnj#?71Ndd7lWDz5kQX_ z>${G`O!B=6YsfLYgZ=Rd>XE|;`yw6>iv9}U*K7+m!1)Q-Mmpi8q84xodeWkZlBg#$ z`eKz5cIwwxSsU>P$Laz=U>SmOUs@1p*ItZsQ#kwwD3Ng78#x4cx8T}e;A5uUl6=Kw+ znYnJ6fcsYCohkCw+|w2avf#2GN8|!)j{Kzk$)tli^TLu>`1@RN2)@iSn`WP$xBc8Q zNm=H|7FLlps%rEK#B}d&D|k|2~*v?jikvgW+Zv>4qs?ds6-~HY^4yd!Dx&yPc9Ok4cKz)9TF2_ zBPE%A5FCVZalbApG&f@7g%haLKXL~Q6{Zxz&XEj7VnWDr(>e@RhXm#3FD2A^N2ost z-s&C8)|U-nR*Iv+(+(@k^Ty@^0pN=>_Xu<_k*1*#ZSB0p?`|;Z26497KfjOdip54T z2UXxZk_8CC&$(CKom87Q53$qla{Nx6o!{vecrUg431y6XJs(kKueROlW28Q(z~*8+ z!A8-kD3X`zw#pka{HfIejSQ*oSu*+g$8g$Ly-t!eD_*$`C}%N`rre;6^U>)*_kIq@ z5F|U!IBOxAvPW})gu7tpqqU^{I2E0E;4|trJb|ac8S(QfKt(K!Kgqdg=azE;7{r>+ zKc0Y+-qWA7yyC2;3elBV|FPAdAb&?6xd-Yzi-f^RzR_+}qQ7-EIEFXOOt$AW8zLl$9`LuI1eG1Eux9#eRK(ivF+_iP>CXfV zgp+JRFOlP{yZ!lEN3CLAAUS9I!aPdtx}CeLD;sMY>ufsdp9~I0$D?7h(t3O2R}j~Y6TjWp_OQbtbZCpW&Yf#mJ#|1qhIjkOT%dFSu>WMFa zF5!&+dveO~?l@+ah|`Uu+ar0P8j7QGVKI&5Wn1B8lSyF(o{H6xW4{1guZTg1Av*0V zqRkNZ^Kq5bR=$b1TA0L$tOjR~bfDbTgN6qJ68=xPIv(ZApHMg!bs3hhX1!j{=riU1)F2_b{0__uS3-zvg+rI%Q%W19FK2O-C07#H4}(P-4ub6- z179SsRc}QaUy#vX7yFLlR_NBdM6$HY_9;Sp5(;mYTJsI;wus>J2Ar&}N)^RlYs9~K z{vtO36&tMNJwiV;|t*RhiO9E@wukFJj@G5E@VLd*lGhw|?7YgtElX{_CrCL64J z4K#WoQ9xrNnF3f3h@@OFSXrazE29mLS`s0-EG`Aj)8>19=#T8_2v5k?bwti?TFtU2 zB<@K+~2kyTUa-&Jp zxf+uH5GDWu9<%2lK0#*Zx^@3$_oOslhVy(b=^OY>msYRiL&_aLX;xY9ek0o_{FB!} z*Sk9d1yoFGrJk^Os#K)!co+Gjj75{Kb9nbHL%1!|Q+fWF`RmPBC`?x56H}FYCg&o= z-A_rjl*my2IpH|k*r(OgiG>PXtj?t#DuX^cRiuleoBq|g@NB>FKOvXO?as;?d|u57 zdo+aumRXfqBxEMMG;do!1;V|UG$SCC6AxhEU6CuG6y{UvCiGy|*n9{Al?p=n3<6{= z$B-pJBzV)OPf7);ydPbOt84&y?o@qz%ypj_cp`Ztf{7IeTk_YZ(ZA4|>Uh73Q{$M+ zvw&Ycqy!N$UuG6M2pIX}es4_6NO3fthie(czhYD1C|Mak0fLJ5vjXs)_1mj=2-x@| z0((4(G#%d9UjhEnB)I~yaOBa+++a5lIb|Bol3OJG0mf`298CaNhSOGGJ6UzWfC2hU z{`OnxH$9!SY@O;~h>S|ONK6A4LqD?&dGTh-nYSf~3*_$nJDPqU-{AC(+uImk{IFsF z3b$8@Z13>!miW;+ZBQ0+LTfYR9Wr?kT?nE)b4O17NHPrtTqOgwdk@Ng>ASyrC!%_a zn;s>kJnX+QAr)G0kmVNWudS>w$Cu$a>QQoG0=1on{>(qCIBLMs0R*C%UD9C_vB+@` zj_M9P8nk-u)q@Wpww-XCKu&x%{wj8Qv%f`!t|J5+uAoS4Sey=&$YXXQP(5Oe&WW(A zi$9?f?v>Dmfy0t=YzQdwbbvuHyiG>Zn2(NT#jx(in}Gp$w80v43nKIh@|VE}))ja3 ziWV1!@X(#EFf@plNgn()G8n$zx(IViO08dAO@E1ul2Uc?$J8`1+I2$P+ZaLqQnWr4 z7N%le0vaUB0O|S9YD%v+6&&a$q#+7ms3^+t2maG21^f}xTJq;8RDq9&T85Z^W(`f` zu|$y76p*>heG$2S0NctlL2430d58JqSq6KhO(KePcAY!zdus>*6&fWB%H{-de=Nj$pT%d(BAiB47Hfe{Pkbw}`Mr0sMUvoVCjuNndTcJdOR14`ZgxQ4| z5uHnHdh$IDccBfvHj_x>Fq9CZB(y&}4WXuy01`gs-V2buW_b1`!|!69dG~A|wWTX+ zTET-*0)^<4DGnJg_x0+laOX&;zBk zQ&y@?TxMo2B>QNJpNk-0aW7ffu5=q-%3rhIgY3@jo5F_OXD3Ia;WNPa$)nK_io{(z zH|PK3o`Du-XZdkqwL}2D)#2T<<5L!+=uaW^7l?NRMuDqKXRX831l_&%)>iv-@pcg% z`Go!}BvY!7t~CDmo_q$J*z_esrhWn=Vf$`pyR#)@Ktw{U7cg!%j#nLCnl(gr?=5bh zCO$yb6hGm{@c>)E97bV2`rFAFUOenQ#z)BDskK00P{DZ=LoS`yvziywvH9(5`rmhU zhf6djn3z%v(5;2{-+#Z^ZQtEo>oko+CNHx{Rs4=;hMGu@jdF5)!+-duvvJ!$@+aiy zPM+O+3JKc%f=W!;ROCXoesS~Nn>R7noo0_JjJ=0_7-&WZY1k&EkL>GkGh1#qFw<6f zFI3Zz^^lB@2qy#;u9+%bWNIeaMU%27s3-Ms_5Bt72%cwennYplg{;mD_)DKXvna1)+AtDq*W!r;Ei8gfA>wSU3hP2IFc#i zmx`l7i&#NulrGGCS6ksC!><8)+2QF?izkB6cUYf~22bI9XcR8PwT%`h@!x$ z#9V+;)Ac%{nyfU^mLLIWJ^-n7I10$$7xCvTc4tHTPWk z3JLb+6{=lR*!>@LQGjCHwaTKxY%HVR%zJqGItKc0wa4S$Gn)Kr_f0uS>{-z_)l+kn zT@^PH7=@(U2WLX%r}yk{%DFm+w%WMNX}yOXKF8dhMa%i9V*sy`ExFmcP;)AM(KcAK zn2Ei$L|s7e1^mDTos0Sy)L?3^pNdJ?X`O|L*e>(%78srDChkme!FB)#0wFD@W_gP9SI5YxqPPf6r}7i*z}2^R4kAh72ONiA3Ivd#jVh?{BMp){LL^_v z22x{Fr^%^oqF+5#IUF#7R&J$Vxo_$xp?at@CCw zu{%H2Y(wGeaBqEO8w|n4cTON8T#XDW;>D!y+E(hc0weRxH3pQr5wJgZ)~PFXOT@;^ zyGkm%z?PP*z6w$z_UA!@;K;`6TN7NM>{REy*D)x%Z)miaQN83IEUfU$@ne$Diw(#7 zOmNDSA3zW~-{s{)2+0Sh(i`8nj^KOl`ysyf4z)3ENnCpteeXNXQ}l#Vt#lIdlL3@3 z?)RxphX2#tw**2*0WCl3`_LK4z3{(DzX4xeYs$sJ zmI(I1eGi(yTzdV2sOn0Xh;@|$I6NfwKIv?AZf~rB8|3MDH0|wnp$na1mZ`CcNfBZ2 zJSyAZHY-@`Tq{D1SNHOQUGW|8RmExM)bzjo;RI#k!t1s|bIXH+6mdtsOUy~H$ZKVL zdr6(J$Qmp0u{(8JMSWLoIz>19O0>I?A~dKb%JYnx%Dlt#dE3{oM1b@1w55qw^GScd zlDRxe;HGYxAVBJH*`LTFFDZZz80~a$&{$+-n>eU3&nKz_ivDV+iJ!kbdnAijy;4Yp zuQ}SfX9viHjNFr^c48_Wmehuu-LPNZ2@*oD(^;mr6TB0%)HSB(VV&#-6nW!)DN_y* zhL^ZgbTvO>6E>!0Zlk@{=`!ng^P`V26Pb#!LQ`hr%f{7DNV=jY_nwI4b)8`jos~~E zNR~IZP;8tNpR!0!d2OTHk!(aVgc7*A?wRI%``#AF{`q=UJMkVZ!}VRO?R8qm*k+le zByOtj==0Ui+U@C6x=FO^`dp8IUuO>g%cjunWfO>%3}8EZJUMIn~b|B}e!!yLIU7YYuz`(_D8! zBw@Ge{a2+Uw>I<=I~c>Y(7pD3CTb7czzUC`aTm!Z@*s8KQ)_gg=(8}7}d{R9lL zh?ezI@VV3iW#M}z)<69JT&Vy}@Po=O3HlLDgVT>Dr(|hLrhFzH%zAGgTeBUpybs-O zYA^S{>qxUZGV49aBmRNv`{YFHqg%YGhLK-dxpA#A9jIS%H2Jm|>ct-l9s0~GXMK=NAjgoB(Vt1( zzk}~Ly>~#M{Hu4uE4V(nSA2cr1}32Ll=p}-mtX(&yYbh5#;>Pmz4x-y#b#)e#~74R zY%}*x!Lf+Gpg9?x^xYmeRXhRKZXY6tK(BGtt>&t00N9sC}j+6mgZEytW6fM{FN?4Uq{Ywq9O7 z>761kLi5J%)(r@E=2yh4SLeRr5oJpj<>oGn6Ewk;vE)p8SR-xX^u1(m6oD`U6?y>R z+4zu`@RPFs##rD<%Vv*`&6&q>Pfd4mU@{W9N0E1$FTcQBzN#b&Chx+t$+F8kLqE?Y zSb{~^%`CvBYm`eFh*Ad%Secd?ONgqIk7OJ=G+N|@sGe_c+`EM=c(CJKT%G!{pLrz@DMGiw3>(|!eLY7D#bp{ygf>#`42+#8S*MV4J9 zL?4Lz31nkpz-^;l{zn66_cg?23WBOpfVOTx`8n>M;TD+nNw1JFgAN^V+T%+Jh8ggj z67i2U1Y+$24mSjBTb#E<;cCuc{iP;jphOvoqTboh`HMOq$O$aE^-JLhDqTbwAetkf z+pbF(0l_Oej{#5K2^w;RXRW|$3)6V9zP-ABPvW1PnjZ`K_3Acf_VLE{h9zT2Pr{~m zzCpJ?A(-kqsoEK!nodbK0HjwaeBhxw`&0sUB4A2H@uV#dGFFsHbp{rQtCVP%wqyYM z^qqEf0uc0?OeKdSNe`fqBwNBG3kr=4#tD^n9hF^JQ5G)(g8U1C1LLH;N<#o?FiF{8 z*9mlUw(_hm!r{y<+f13~2O2JxG>k@5mxLAVh)F0;#VG*Dh*#FDZxGhT6w6TJlvKnv4`o1MnF;7U zonWTwsc$E{w|Yp*3Z`QZHKN6*8neSRFgN!f^D)cz0k;U42qHDb2qXw0e*oC9xvRIs zdjH89IErM&SvOq2?Z6KJ`4PRYqVtsvDg8-=7qnw`6Eb{kTCR!@Q{_qt%`>eW$eR_3 z;Yy=46$TiZWyQE8!>j-@2Nl3!5BC1_456qvq1gZeeD)WTY{fd%wB^95o{_xz7r$w> zZru3uKUmt`oxJgtjPo`BT>A6YjosZh@P8j=Z}8KNrNzG(TqSrAE;1kxWK-Rh;iNwX zsL1sIFr0@GAV&%+N0!)M4A`_RB@8@q=t(5AAf#zaN`^>J@`T?;*LF5&M&u*vLeG$+ z+fB&2=3N}_1J*enjj$60J>o(gh`*?ti1dV~O0)FZ>zEY54KgWYAGX-w~J*0j`$agp`ao)L}(TcdWG7ApnIX@x@( zJQ$zH^=ccB?41794lJDghY0A!E~hj9P3!s_A1$?Zw{{=Cv9x$&LfNe{zV90^Mb7Ip z37T5lpu+he(JYxF&bb_tc>)f$wTIq4?88(+c&<5=j9^sfW_x4P+Ijnn>k-^u7XfK_ z%000Wz$nX&$5ki1r57>FToW*DSoqF6v`GpssrERdKaa$l&?q(Gq%a#(%2+dzL$(Z^ z9+fb8X@i{f35?}p&!ZsnKoJMMV6>y>M05vAg85azCf8#{*SFwz`skkP1mLCH36xtWR8tG?fs-^7K|YF2!NICa;qG194aPY*ZQnD9z=bq40C1u>l! z*kvM;N}ma+Dtf8Er9090ZeKI%8e_zOxC9IMB=YX0efqpGE7z-#9}x}=J2V|xXl~m)amYXo*>-E^)?h|m;jITF-c%2ExGLaMTd&4roqDP4Fv@E(Mun} zyeoDv>p6sZKlEGW_Sj9G`24lTS)$SLP47;TTlf;7c};T5|cwAJ)K zc{n;lS!H-19F2~TM^9id-G3&Y2rj`KEsn@P=O#YY@0x~xZ^JL7nN!CCw&K6YTY!&; z>Wx*~rkY#sqL%F+!wP?i22c$ZFgiEQ%~+eH)LI<{OnMSg8)m`)ppi~O43~mm16P~( zWtsPi-8uWPO%%LS=#e<5K)=HwSNWvg4P`xD8<&W{|s7KC)z#s$!30EL67dEjC`5SU_<=bXJ2&X*^DHLL!K z0N1;b%3+I(qx?08uOfX0Qv$4|F@8K^O9v%*;XfIT54Fnk;OM?fj|9?-EO&=+>6@JP zdx!LEzR$Ga@F_!^5j>fCAi&3{&Iq+3y`8P239BQ02?wAr`;7^#EvTEs{wnV2M=s86kjab1&(AftHkgz$*2>gJaTnqNlry^0Q?zs1X7XOn^rYt zdor}7zJ^7P9y_qNNnZNOG-gRll^7b(bDfbWxF~5?WWji*G!JMghn11dr80-Qt-xvu zvqy&s-H{YrY3C6owM_ll#`yS)DBY`Uyk&Z2+Hk+`LYou11=R;nn;;o-yF-BVU&Y-< z$A+o9ln$%W&ly-0l!nQU%0S5$sKaX9r2xo^8gdcsLe~wyo_OTiB<=2uy=p6-g6)zT z*MA~na}zPkJf1qXXPHSE_|e0y(gwYx3cB?-kP(g}Jj=Ez(<2xexSl1mkCyW@#X z^;APwWF1wy;wv46{-$7LPMDZDR5pq~y9g2R!-3c8W$SCEjQc5xOrEP+&~c=r%$_UaN%mfY*uwYokc=NT<#wEHrjlvq z^U+~XYP3$FO6N+KZN3f*B zp)$upnR!53S-#P_&p?p-NT$p{vE;?hZc`LtyAl^Ao{ON(%>liV1|a9z@5e~mvxfuP zdw|$G=-Z;#U)*16AZ6^}!H|(srw>OET%#Ga?h}Qg%|1N!AlnZ4GVI|@WwLO$Ju#87 zBO+g_iuq3prC#N)S5;*^J+zFUEbf!o9l##NgpiD2lU-o>YU&t0K(K9q1X1PTA?S?^djl>3grGT%Y8%L~nXGvy_h0e{?5aaSwg;_Noy zoMe*btB9aHkSoT!Ei`+_PmqXmk7Z-_9;2QJ^9@JynbtdZ2TSUpjOqBGp8?Eu*#J)u zWs4H!e(5M=Mqx`7#?G}T_K8e8;u2psrN47na|le3l(GaZ#g zGHsyOC0tLT03xzh_XddRy#t2&-~(iuzJKKdV2FuNDN`GnCkesP4{u8)h@Y3P5`b2l zHapzSWM2MfnVU`Sho4;qMd9;tz_b*!PX$VLmhh88_Xdy4r-vr7BA8Tx^1a$;QzdtifYQG6#LI z1qUvSP~B=iq$HWm`2o1vHh?4@tGcwN9H1a*DE_o#tR7=~Hm$@kKPa zZk^w!%wfoVO}n0CWYsfLCpqzJfp8dh**of0^_V6#XI>X7l2%l(D=tSLvk~PoXQgjS zolD3^B$BE)*C`y@|IPqM*_L?#5+%4~^#DlRGC3a6k6`(7H^9uAydBjb{{dhz%ekHEbKl|CWbEyq1c0!m z*eUxR;yzpPwc9EBbKw8;5GvTc+9?;34jctYdziA(yfO`HvT9dIdD%ZYZGItH2*>zi zMyvktP}&S?+KmSf9?sF7Zzla&PLK3P&4s>=f%i*IuhF#yM3-3Z@HH&co-tjz@#G%WdxL%6{`SbN6@FJb?FZ2O|?}N{xdEs=9b>4N&I0{=K&S8FnY8aExiQZzAsVL4U{_*=LtTlD+ zd%wHBM}dS2ds-$L#qAY-^qNFi8yQ({d?X3_B)Sf#8vq{N@JK3C6E7asSmaL^K5l#TEk!#(NGmDAK+<9S|j zQ$}8Bc!&_arQdQp3co^n2x$=b-k&)ru47e^{I-54N*k2)n(jy5El|F}XUpG+D}|X# z-V`iT7<1{rF!0jCN0RnuVHpt|T#cxxr8g*wLo;4)d*1V^8)Kv;+i!}fdB=6?P9jbvJn~z=?eavmrmzRfy{)Wl$}F{v2^uKpQ&?sI{@NvDRs?@3q%aPGJE#QQQw3Tl%btefTC$ zAg1p+Qip=?m^w;-Tif_}b)~%)I&?p{4&C#w-48AhT)%fud!Matf1;HxFioj+p$%N# zDh?|-ru1iDmjkV>I>bUl!Od;Wh}jlp_p}blLZkT)(VPFz`9HsbISfCzQXl+VDuaM` z;th1T%*6P@xm0L+ln^QfHoF$dd&S6fyI+i^3G8gpF%M)!Gmup}7y)PGw&0x50jSvP zpz7?J+vD|>HoOn0J?sN1_YaX5(bsL!c4>40gLm^5?+FPGL`)AYkj@X{gkRpco={6b!sk`FV+Hf+w^MgN5>zLDHlX2T`Ov!j1ibg15PVv zmZ8b*Jy#=7Av3|L(q+m8MEyGS=Y}Uc$k&FvNmIzlNGC+#^27ToVk#0BvV$);sB@fh zMh+eTvJWCd6;)||4bn?x4O$#wrL%FT+}d$RSCE_1_vUtzBi%x7;qf!4NimN;txuMt zcER_y8oxZkrzy^>3vr`^H)A0{TT5o8P%M^2rj~rImF)Us)(UF6wU~?|gL;WWzXpQ{ z2;td8?dhvlu}Tn-1m+j}PamN|213g$b3Htesh^0(VrYqu*brvK=9PYrF?=8C?(TKr+KV2}&NmyM;mW(J} znPMkD01py44yXg3YH7N#>2p8=zX~5P!IJe7kZyb?VTas~s5d!3CFwOeilS;)TH?U3Oml?esAxsclWv-7MtDP*s7nHRoN6k^;7ago^QmsVrOX+k{MmX zh=3^_lIiXo?uJ2>h{cV+vHvHytR9=a#NMaZz-4ePod_)4dgW6nNIR&zM}ii0_JM8M zY3_iHvr;%x4i`mmZg+mY7a7c?5Ds`fgl{s71JHoG=mEJU-ptgz5mFsa-T~1s7K_oL zx?qg9I(t$Qrd%ziW@0chaG+I^I2s9*NE)zJk&vgQ)#*d$wT_-DxLNvgJqN{r{OoDA zMtz=h9|=p<4#6N7z$&MXh5etkfD}Zg!I&vd1lEhtHv4k8bGHJ0xBH7!uPsPj!h~TA!_Cq&W1ria7Z+i zEkl9E3}MIkQ>#{%s+N@p_sa=91@5=tTc_1g^Hle+pZvb zB>5yK7van%r$7Th{F|&N|505p9m!3g31C}VN#%^~2W?xruVr_7pJOeH2f(m9U|Dmg z44Q-Om4L43&#sUFoA*X)wGi^4{$)_j`)CAl=EbJ0nkt0qg{d82BBhVlH%!+uM+evv z0?>>JLshK4`co&pdK-oBsKl!uH|l80pDe2b{~xr&2d%>i`pw%67=TYFAHRKKKZ zw`KUygDv&z)h;b<^YK=vy&a7W&hx_$u=7C7#q-YFU)Eep{pNGc*MqsfUo%&@GhM>W ztd}s4CS08gJAIn08Vz1rs;emZWr6eu>m+Y)dOfRvAy*y^#Z1J?pzyU%zmd^? zigunSbWQlJN=%&m8d7=`qM^HklSjvcqe1_0^=PYqdNv-y-rq;uz*Bhcpj=a%`MP@t zr}8V5;*RHAoB)y2TUpHluY*W+HlT0>UfMXi|uQ~_zcg`s!9Z#P_JlonS)NDiDx{^NY8YOeA9l5;t`TDGD zl}t}}U6feGP@&6-y)yuP*0|3!E#$Mc5asyn0MH8Xle8_4)j|3f+V=XrA&Q1gP;!!4 zUSPr+j6<-T#KIA))#h!{qG;%W_d$6r6tT8P+5Pvjh2-D}x&H9?~ zMK0}%OUF{-(nFq_)jKLDB+{6gN8l+2HV&oE2gQOq)c**wblEQlIy!Kbq%Q^a0y>=5 z$tKJD{NjlN@7L;FkG(y4h^gGm^UucXcBl@u9Z{kx( z--Wz_vitt>a3%th?cw3w{`f(^3+*p%)FG4|k@`VL!uCQCfI>7lOYSTL&duX?F_>(C`3>9<;e%E z{Sf^d_D=efM?J*lZa#dpG7+9f^9V3K0|^hzb4qvc9g>N~?Hs4HKDsyQQ!rvKH0h$k zmdUSyJiZp`S7Du;R`pgOv9b{PHRUgXB%&I!-7~n(A03~ej@h)-aMe8nt9g0kaj5>a zX?io}lcG9D^GZcz@l|CJ*wP|Wh{z0^5|Y#*bL~Unaf+e(R|Sf9heV++uN*_kjVE~< z{78tgLGB-*lHFm{;2ky~&jL=_A}SQ_&%?Dm5*oU^oNzXRcz9IRn&ua+JL!m(FaiNR z1_wYQO74W$Rx4~dhYhdJPaKLfP^>go>?;HklnA)yRD0bXtsYexbJgOe;N&46wgt;M z?)~7X?42U0Kj^*n_#BFJ2KzMh}*2^<#;<{?#h@xpPxthbEodt!D3pY>vsE;kR^~CNhCKo@-zl+7FIV4 zEt{ylU_Les8f6hi{Hlc30_*(mA6o5G_d}rJ{KQSdy#+xH`@mz42)P{FW>kc%d4q+K z)>#+{;;{B5?gpeqbc0925nm8V#!Xh?UZE%vmg7x5rY}UL2I0cOC+tDtQLeOv$#Us( zxbb3SuelG7J-Cv#&DRyS1TsO0K#^{y6>14n16S{kmfKe@ZQ}M==9})58VcQEg!yAt zfms1m#4J!$uR>`9ulq~#5;zC@7gI@|xi3fT6)(G6h-M$0^!*#$p_iTjs>L57?F>TM zFqMpd;WXwU@K`}I`-hM2p|r(zp90II?+2i+D5In(;Gm6Hj*)y|E(9sZ?XQuXTm@}N zaacLxQ0#ekZS-Jp;PthKw{s}1CPeE@yc5Z;2oM~$DsTkrvruwVVz zA-nM(EpsRT+-+xk_tOb@Bp@p{K7jfe zxxKhMOz9R(8@fV|l4iLr@y-TJ6^#rruXl`q-LKTjrf5anKBaxhsUa8_oen~#3^JlV zN8#(acBJ*uvR8;MeH7uwXqGsjsrv&YXgj9b9NaAa%K?@GZw#{i9B4twcR$uxw9yz4 zpE+hK#>o^Rp16&Uj*vK`^As^h(0t1QL4tIl@$Lj>?WjUOgOGypKAyAV7#ujKd(VZd zf@D>$Kovj)oqDZ^N?bei2D+vudP-1)6ah6A?CF6k-Q^?&`iaUg++)d-&_Tgw8Ejhd z5Yd=u-|sCv8}w08!MtweM=a8f0pfHy@*e;x*fl&xai}~-g47s;$8VOkKR{@ zk9)_1X-zK$-qyRpzw=jMbU7hqYxTtOT+NI%6bV@zQ>4Ph zjxXt8AQF-ggMcmoT2_*|zx{olT6#NuK#-y|N&IpW3+J3(s;g`3>gwvw;}hQV{!TLX z1dEF%3=XW^rn}+rKo^JmOHf<3Z@pSte1m?Ld#-*k$(n6;+CBuU#s}eDg-T+4Nz_fje z35?KWcG;qG`Ul!(F#)G!@BZa<@RmO?Zy$xw>eLfx42GJ>hmGm$3m$n5a)BtEMPQ!3MN?Lu~`5?kkl3`jNwpNhN&6wQ9{0V8PS1;HRm)X6b zg8QF+w({rxXuk62*XRA=h+O{J{mc?Rnh!^_od2P&uOZS>o?aQ|M55fdV78S@t=-2 z?*5-2kN=hb#a-5TEiZ2Sm)p0w)?DjROjt*1;x2|)#p=KlYkwbB)6~jXsfu2=C2R_L zV&2zQjfp+q#t+f5=hY8t&5PO9Ilq|AneHquBMa+Zim4%-8S@x7cm@BRp1zr`%LVX` z$>UomQ+Uztbnx#jSU|Vrp|&)KK;_2}m@IatF1gWiG>pXA5Y5pMg#I~G8BDeD1o<)p zZ6pH{Le`iAZav8M1ni*EfP!Oo2iH%HMyfQ#ES7X4XW#Wl*c(s2oobQ>c|XG(Ni(2k z-R*eSAN{nRv{{nu`ak%`G}QApFWi8euIv}h(<_8EhSvhZkNvk>s`$687(kGuLNq-u zbh{;vwgDNlq0=F%pyb0O1p0<4=ct*o@9V35T)52Y_=mm4Wm{4$nat#^Xf{_^eK=t{ zf8?>}m*S538ymBais1A9TX48Yiy#MlD&d+sPdnlB@dFyT0L@39QA&$oA+ALH&AjPX z)U)YyuW$=X_r0-;@#@i|gt8<@5Q^XNqmdC(X*GybQ}8Lw(vdJ*+!W^knoWtq!ko#! zbYwfCkW^Ms*e7b28Sc1`{rmoC2Wi7EU_t$5G8}&oFZ+}J=}(Z#KLsSnwofUR229I= z^kNVVv(mZHDvZ`P7{Sb#1E~l08uL~+NFiwssT74Qv{jJXg1LtXU{tddO^^`mxxfB) z_E$=2cEncgr(TT?la@!0w0YU7)NvRI+o&RH83e=}DwO@9p?hl`7}C5coXrW~PS4>* z3!wq_*RKcDt*G|aPl5>p>bPL&MtEW30K$g+1)d*_e_mgE@$5x!6Q-tEmQRmxuDsiO zzPHs?$3vnTN=MoH%GwW;iz!CW3x9~j+2nknLE^562XOVw27`_psxZ9F;Jb&AC$I^t zVN3Y*f;t-$c-p7@_-h+bf9(L~;dC;l%;J%c%SbRIA#Rz7T_VYjR(eTovo zFVEHfXPWC3Wyw_^114X@1@3gZy`uw|>08|w`&}GL?rteL zwoD=>;!x*taF)#Ej3&8I7A9=fy2?ug(vzUR3ef0R<#x3?N9vSTEkIiQa9^kxCEUD3 zclwtu=H;tebIE!RD>k~`y+&B)4bPgdW+Dt4?@y7)`ZZE?ha(Q`+om80)YPU|^MWfp zvd75~8Nw-L%&{Y~N$e)YujhRZbAqZTFY#v6?QR^GfGJ>INfyu zTItC`I(-l47~XTIJ$bugKGOiQ3OX)j7+I0ltdZ-j27*s1rP#eLg_i%W2S2MT^{RM@g0k=aXsle#I{~1pji&UFEjcr8c2+-aAryHBy43b!H8Bp>=j;)wgIparc2@yRH zKma92bV3xx$c3xLJ5GsvFKElOgZEj_@n!05bEsU^c(?-S(~uz zn+?{6L9y7m7}tjJfXm@#D^V`lx+yQBcBY7^hN+{}&LfU8%ho#l79?$+B3VTDF|<`W z)QDF3S)jGxsl3^gl6(s_`efql>HvbZRw|6)?AyWn%@kf9Xi31gMJ=r2oO2Tr&&sE8 z_8~yN4s4yGQn6s|#~zKRi6$INGstTYK7e7pdK}CL`J6ukEMy z`}vE*AMEGuR@Pp3ckAiie)xvp-3`J?knt_Fu)B4D9B)1Xd_l;P53-A`IBNl0b^hxR zg=~~hw|7~BZOYFb1Lo zf7;grSjPI3sR-@YUdX1GzilG z_wJTG9zEIF-qhdw$oaNSf+67ckc?Ch=4erFt9rF`f+bg<77-KNe`4a;s4NWh9UMFQ z0|{&NM?x8r+fU!h&)(Dhz2|5GHq7V9XsAgx^rZjc4==jUury(?ZSDOXD=kZda1=h4 z&fka9WU3xWVQ)WaSq{?M+pHwhNaFA@(|vUJ4}ai~=X<0<<}@Vklm6K9rRA4y-6r!2 z?OTmydl33qzIiF`Z96A65LtZi@`0?GEkzbRvE$}9uLVl#?QA@Mvb7OQ$9HKdA<4Xu zE)-4iyEb+aAN5Mm#ud%-ypPB|*arB7?W>x8InPS8X_>r~=$iZ$Dqf~>jGC2owziG4 zo(7Ri#P^KdceY)HJntSpLk>rKkMvabOOS&HJ8R(R$)So!Dh(D}vJoS;>hl)NPH~5$ z+C0tbFijCO+*&)v=>@c~MpVX#cXa3~jnfJ6{)){@on<@lBz9o{Mm*efquX8DanD8l zR;IX2ajP{+r$aTgBq8*~>8;Mm{A7#(iU%jZJa}>|5-@!tvi>MeB+Nu;$M}s(BZ9Ar z<4BVWSuU%{hG~d@x{``Zd}CpA?t>l>jiD25i&0Eq0+G^xN&NGPkS*s(d>V0O${Yor z%G~G|mK+ydmfu`n`l1d&Bx}}f`q?32&IRcx{b;XPQ#YE@kM_#ka*ZYNeDW8BK@jY) zAYT19yxG^I^ndE`p@*ywa^HrcC5-h>=Pw6hp>+?%WTO%JpZX3toVxqS-?sUzyZJ4- zoHHh+yZiev^meiO5-*#y52Y}-txK7sb`Vy8PTAw!8q7|oLkZZE;jUqO0hb(NgGFGq z#J*S)3q0J9U7Pmbb-6ui+pAKo=)QM8dyPXj%&@TB&}>K7)j&jD!qyfUY62+8c}#iK zgJIPx)MMK>vJOrtDwU?p%M@K_Q3Wyp0mC^`_Fo>zfc^l<%P#4;g z`A^s$nV}Hxpqaf){((XPG+sT$ojD4ZZQ3&CBvPN%lhgtZAr}bT*hrFB zuigLG6Z}11yN6JW*S-IHfm?jnLs6*R`)jxFt>Ki1Zr5mF<9UC6`et3*fIJQZAOSn` z&Ae};NA7@#cS{a#|3PLlz)Lva(K|#LXawq zCL9A|OCT4GgwBpBjgt2=!XW=}#U$CeQY1rJ+&V{#H>{3SLJQgOKXBwD?Ew=>AS8M` z1CGuIxINHbnw)M3YDm~k1T6>Y>dHPgUW)c$D7xtOqLqR%?(z`>d%Prxp*T>0R{baw zPLh3xh))EX={`%SSk`$voj@9v=i?AEKwHFEBMS}I5MWNjhaTLJE-a1w$oGgO_2_i{k*wJzgQqxt|Q0%Taip z1?R?9oIY*zQ(`&|4bwh?ZdPaB3>)pyqO{c+K=orMnNHiNP}Xx_vjLW&w&-j*M$fV5*8!TLzSq3 zPlI0|{Ni{%hrmeMQE{;HQyxu@8bLdFoV9BQPJ1~uV4Usqx3J2NEK7!r5ZD`3sE|R+9(eGQ&joK#&J@~_lGm3oTAV~3Q2e= z?UE7&r10AF?S_NNI^}F4l#!}3eNs1_64DoLx5)7;MY+}vHzTy80SgpG zc!dxXu?Fh%cq%JV$B-dN31et1TQWrJtpmv#+6OP^qy<|eV#}HeKntQvnS`5nc-eWZ zCG6Rjti?7K^nUY0EDSMrt?=m483OZ9=h7O#c=tYb3QNva^yIx{$I^(LP7jaC9q!ki zL1~MA&M79e%;M0TM?VxEMM`luP#o~_8rK1m#!jY;!-D#uP7!R8-D@bEE zm*UmYnN)#cD|agu`3NKrOfDECVxjk}yWic~+mt%u zUKIx)d=A(?FwzmFu&JSVOlHFabJ>kh%fw<;oCRBNmP;1l|3zw7haaiM zY1~NMa8M50w_%0h6S=e?7fB4SXp(Uj?QBE`UbmT{K82QvIY|0$*owKZvi9>3dqu<1 zaQ~xkBKNrB%$KCaR;tR=O}1-x ziIi!!r}&9yZkBD%W0;yPhG}SPbdecmaS_c{6DnZ4aw{YwD1i0`*DI1ssz&gIMz}21 zxRt#^^Ah5)OxsehY?z8T}tZKSzQqSv2GVB8jT@ph%&%B*jd= zI9ZO{Pi4PbL-U&a-cVbq<e7SYr9!4J>-K&FkDL%ce%cB?Lu* zZOutm_zrL@ZU6k`S-%yZEA0qPM-*f!FRofY;kmo-y88!=0ovYz>iz1$KR$SnX1!UA zpr^PVO)jrmZlV&g4AqaP-R5+)iRZ*nbhV+YpG;bd=~AZt6@i!3538nDBT;krB<&nh zZOD?fKM zrI#A|Qarh|h%0-&6*M7=yiTgcxw1Tf>(Fmcmg^1q+}+vPesQoZ-_l$E{Ia4*oc@O4 zj6DRWcK3G?VY#=rYsCEMLnei}I zVm?GX>pXZsvp-2Vvy9clj^&~Iy|>9DWsF_#ai;uboHdq)zsWx^HdE$Tk<^$RT1Y14 zQ>~w~pG(7kz-5hGX67Z+r*@qbM9S@g&?C#K&NzKDIQ?lcgNcxKH({7VX5%+kA$Epw zKM2qD`3&G-5}tTDS?_S;oBSzWjE>9E>RcLuYC!KjR1GYeL7hv;%CURLP7=nxsHwy7 z{;*PKq*xrFXdD*&15stQvs}vI{U+EjwD|T7jYV4yl9@-agu}&*<#Uce(0d~Pj zi)2~GQOnc*Rpy4*lr||p&~(83`r41_EVkGsSLPTeN|dNW*F$9wA2gtw7P>w+X8Gk8^eZ|l(`IC9Zmm#EbV|#8mJK`Pm2N$Q@s-8^!YyhmGe5H4u3=l zAw-zXf&30;C7yKF^h8bbM&-?&y@M_butLGp5T6q>3b&~R$2R;;o*1rpMRi2)>(~fkspb0 zZ%581du{B{_> zxtxuc(XOoB;(z{1en_c4yD`?OH7oH^`2t9>vpeK7TUl)&<3><_DeK}WrWV5yANyg~ z&PrvT_tDq11bbE%Y@#oD@W+0owfq#2e&Q)0{grlXCxY}tB0zK=uglmqKQ4}Tw2^%( zQQeEtDk|0SpQ;SqD2isOW(No)p0*x@GpRm^pQLI4GUu|ijp*5o@&j~v4KbuZP~|j* zP>uRiC>D)m9b!Nh)_O03HJ%!5t~k;b-vEgjx<$O{x#{BA^FnJ59p zwGT<&pOUqY#QiUYHtE&ZU!pZ&$)x}>0b@;&=fiaP7Rc~?rWdMWIP5p%hH%79^l^uQ zVdYP`ujvEw;USD!`$35cI!ZXo>Yde zh%JFw;zQc3Y*Gd`Dm6v^RU~%)N@O)0X|VEf4tZlIbOL99CMN1`?DBK{!`^=W9&QjE zov$^uwf$Z7^&a+X;CsUXkMHxQ{EFws+w#ucMuBiQa^uUcU;AAB(q6B;!Z)w(2gMs$ z@((4J{QbX_AD$zRfZc4JcY%zCHS9e<+Nr(v8=3PqUhLG{eo?j^NxTY={kFKS-f z(^6q06|G8C`-dyk4avNh%596;DnM}+%!oiFD6un&)HqhYA<4iO3A_Oy^iL zm&l&W8!Z%m&6rMAesc+5HOvt-G8$mJX}Z6xD?%+0cUD^g?m ztrazO8j%;Z=pq#2lCgE;F0p{Hsq8Hz3+=xtjW-akJ7dv%Dr>zY+UI~VQI}t&;XOh# zuf7~Gh+ir;+HD&Lj1<4*BQXT#0?l!w#l}*8Yfnvr=C-_C)Ar41^0Ggw(oC?9c!?e( zV9W|wg^1YucDtKs)3sHY``_g+Xv-huuf9PFksy{sAre)aTXI(q*E_lgf@JA!W8^K3rQ zQ1!rWGV8#A{96)5`<9Co2Pf6G9pzghP|S1JM5)4)&&I=>M5S+kLdRG%kdyiQ+=QX%JUh5-l~b26qTX-5j&QkPC}q>n@pT#YiWSkZ1V15cC^ zX_;jRrS<8Z*)CTbo{<;7%K1h(ETU%Z?4YYEvle82j z&?A>9uvgYZt&2`m>4X9tqOMT({O@~J&jgetz)i~Hiu zI+B9AdMZndmbb8YX>1ODvC9&0uvo+|5?50Phm)|YT9PN=MMjfNziP)8Bo8l&mav)8w0+^92T43D_@*&x*H}HgaG59TVt(DNkV4tv4FK-?a2t@g#D% zW~>4ZCm`THARWuV1xJD-uD^VMzqZ)mYn~BC>&a@FL8&&PG#X9%#MJ6V0KOlPdsASb zFrm*mjPFoxswsY~BH7rYc|uc2L0wcM-zjZruh`O8RLfd)cER%$Br}2KPUi%Vqrn(! zuB>w=Q}eysM71R{!BrBFPbU&YL*7CNWwNE7NfwhCpW}k&{3>u2Mtn~s1_I$35{$^i zfq{a=khrp_5K(EkNSX!dUZrl1dXYVDfLdt)ffUoz`390@2hf(g5PAm3m~wCnu~yH~ zM>3^6zghK_G4xIG|K{O>oH8FG9CmRSh*yH~a9#rWwd6vPSAg=vZ;-nCMXM}WR-knxgkdbUWY3EM`%CD+o!4DUH}Z z-%*dDpWNqDb5IP^1$j^9u*~ws{fy5QYDgm1SbpR1aDV&B(P1|RuY|)!EX4;q9Au9H zL~&^8OFh1Y-|G3!G?@*=4QB39+(DoOC|15@kg&+kwD#5n(sX+L>hF;*V0emr{BNaq zKOVbu_geqE{`6YaW$Ys3F0C$Nt2~Q^^PgYQ>Qfs+9jhsJzL`!g-X0ld7mZD}=sUY(Vt~W z%VLS9w)M!i2OdJL(g_)qu_#+;QW)Pnd-8zC@ue{75DvXi7-c*_-*%_Mr^GuRJ%Q2) zD$#xqnLn0jA$kL?1)=Al!D6SmRc-1#p@+Eb!+Sc;shV{_?x)m8;fv~>aUbc5NAI74`c)e<#YT6`OGkvbp{YW9+4?fPt>fFI z7&Go?=g1IkMp6vZ7GYYp9ThZj+LoKNsLVca&fKi6=@}?>x+w8e(aamhqSLC(AME~!@X*r#zTOJKV@)JyL#mv6etXA4- zOsLrG4g056CzMkv26__1B`HC3BOOP1Ca+%M4#4g&!x=7ONdnIVxk-%O-UR~vo=h&r zXR~mr_qyNpx`wdmpZi1cHzM&UmeG$ow|+ajCFxEQ5Wqh$>1aYh)#w(uN(jqdvCXQG zu3QePYhC@;2^_6=?gm)C#}(bU4_xwwT?&gP+uBK1ARaZBDhl0}lMOjZgB>>Q;4zHD z6PwQW1LbZu#%$yO^WO3Y_S)W|Iff|@2Wu<()8XaaP(h!NcWZE*t#X2=>~9SYg!;?W7|Iq%5ZnqY|pr<(?eDSe7?S4FOMRCA$J3!z+#8Ird+8UwrET zs-%9Co9Br?4wK%xUs&1hTd=`!qq`5eClT(T1mqjvcKA|6N!^vSr0el_A8Xe^&7N|# zjp&Z__&JVW&3K!nH!pP{vJshjg0}S3h-4>esBo#1ie9LKc87zlT!-WF zV7gOg#D!b??1`_P4@J^Gdh}#xZ}VG8x{-Pcfjb2joMp}?+pdJiDYmZePqq{xJoaGA zxZX3lonlt9dB|WhmlFl7`Kmu1ImDZqmm@DrEaOC->SlFeeSlLp60!9XUno@v=VikV zDiEd<>>GGRkg}&drAtc+Ci7?HtXc!#TigPi-mvKj&!aUI^&%o0$s)flk)LfHG4mY+ z4-6t))D~3u^je~SNfC}%lr}wZLy;)Dv<(Y=laCq&i43xF@s9v3iB#iDWM7e3{f2l8 z3)V=0m&wm-?KS7Jry+5J2p6eWUBlYZYF@pGGu7?N<%5|&?@0Ll*ULjRThBJ8uP@}X z!w=-4MNu0MKiGcy{YMW2bN_m9x2>;Pl9SGx7xUEeiq+kTzWz6uUC|aCZ1lL;t)N;4$dcY zT=4QqwDKnv47sAq4i%(ALTI)S4_sEX7<*vOoGq2+%N3mo2A;DK2Gkbs^`Zg&^*@KBt~ravIp6vL(Eb)>&`T_GtC7%2P(?$%GDBtFd{g4FG# z+kvGK$A$cM#dch%9OCjnO6WA#YEU0_H$ikG1*wB}8m>Lv_+w!3GbH+TZp@X3J7BKK zg6eI_JNoaj0ux2Hz_G20jz+frrH%?Nvi|v^KN`Lo4$eN5+MA0k+ik${>f)5sl~3Ay zL`zClZEn!O{Y%Ta$5cYwPq({U^aIPAr^r_PLwxUn+j$^pKxq=FG^gqZ>53Yre@xDY zM5`bNzrbOx4}k@HNhTB_7A91Qz{`^1LuO z(vA!^4i^fJa<&GhAYEK<9(T$?(6fWtrkk(87>$PzgMd>-@;y0Gvz4)^xs z2|>x((3`y(zQVB_Imjrk%j)Sye!i@i#<9i-{IVcn#uTczleg=!I+w|26=JIzS3ysQ zXM_Fz_%*Jk5}I<_!oLAwI+*rJ3?%ev=Wr#TnV1;7G95qSO7gsTWg_*wb?r#%f7eO- zHLccDjTAB~-@G;odlp}`yUMXRTFT%45%p0F8S@oez6=XTkILn;286?YLOAWp*+c`w zr46&fibZAIut7F(3O4NDc`$dOoPu>0>--qeREFvtl8PGkRfOgr%a)j7=I#8_@{Q=b3@y- zskUGk3!O?_zPLxYxo5(yST)+ivENJMm2DjZ@=@jpZItU6#`;{k%s0!ntm`1(?mV{J zeEf}FK+}0-?`4#JD@|xE=V>k+Zhadvt9L$Md*O@z%+MBX${{v=_!fxnZ@kb|}q znzii^?-8sNj~pyBf(V3HZAhFD5kjG2M-W@ZO0pAuH9$fyOTmG~xHSJQ>}W~78Re+o zNENR>@Ha6M(Zyr+6fv%J6v0S{q6R9&-~EAH^!xi8KWJE-1a|4q z?#@AX`>FnZx@Y%q;7503^O?T&uOT@IhOE*~zaMUtYjz}hZd>l9l-n90hZw*EMWQrtoIqI(*=cXi&kNoD zFsFgeYI`?&yy>!10?e;nAkqlj7|jRM@kbYgA0EH=DYGv9XVX3l7D-`8iGj2`!C^D8 z4i1JdM+ol=-u}A}E0tAuMaZp$uWd*W4EgOk0Rh;i z$^deN#B2lpS=yzgoXnXfPlp#XCX<-wmPFQT))d&rHP1_?VBZW8TPXu#NxSgOOl@@} z%>|%*L<(!ti=3oEkZw69-QT^0a&N+BPqjkY3vu&LAV;QwCq zr<#uLLm8pwHuOa^c1By}=VAtu6AJEp{D@2Ea0XHW5x0;7jDhQ7_bIh|m`7>_%snV) z8%M;w&IJ#HBzRrI3JRScyg}AT8a z;1}|i9T(Rnvf|u5e%ai|rHmf;6+MeRAGuV#cD*bHhO1WON@dl zv1&^TW66{`{^`D6t)W;f1hahNeQ5{|{g9LYA_PJc4g(yysb5R3jTI8G?h&RV7K2^n z<8r=c)=0I6ny6GY_dU*8Z{zM|5AjsVA1?QXybqsLfCrzXCeK`puuRYrfHhxq-FNg4FxE z>egZvMd2`NxG0KIYU8ivavn&fInKSmyqFK{JgL)FJ?jdE=gMzV7i$X519ifG~l0cb_sl9j{pm?c;pJN~bE)R{K5%i3HhpE7BRn)RHvrUR)8EcRI7d z=+&b~%S<{LFSj8oofiJ?1o*lp<2hf9a}I(+ERdbeC3{xd_JnlIo2~X#huMmnW^FJ~ z*Wn|Ueo;_oN4QN^Ak}o%RnV7TVB8K-eC-P%9oSk@X4S%uV z2wAhT?C(*|prr*BmlHGhKl^Ou&#%vsHIcmb+5OBjZ)GmYnO27udmR8nOouW_dq9Ng%|X6{6qh9(gU2HX&PF(m>;(P&yXv(sk50_uAr z`1q@w$%-utx0NpUMknHkufX5uz1o+(Q(+=P!VxlX|>4~hRq0)po3?w`sbDbAc&r#Kg$pv1|xEca5pN014ItsKz`#J zS--@U9MNx-q*TzUjmW`@wuDr4Lq`)xZVjL)hm83_hKZM#TO^J`+3k`9nUYSiYzEG5 z-h-}5Fl!}_*RYmj03ZA`gt`G_96=KD*JTRzdUG^@khiIVKY|P`U%w?F8Z>uQYRWo6 z>7$*l8qnU>k(SfMq3IQ(dXO{{(Q*7KXyBT@f&^S22;yIYfRxl^;T(%!r4yGLv9>N~ z8n-b9F|s{=HL1%hhgU{s(#qdq3L&UAjK5umljnzM4_LtJ`fTv3e=(ZN<)kDuEVIWr z08&2pL?Nbcg$Q_$qt)WGmg>!f*y`V4?k26sf_K(`$1^8@$5x=Or`^i%@yHls9t~=7 z8yiNNXVPf0rVN1niGiixX%mH;^Hz|TB)qz$K)gV<8kH z4B;s?n$oXp@?KaxKeAiOi4+nC8Oxq3#BH{5*!3$16AWA(jeyxI^F-mzvYaoWe!ALg zBGRxVGFB1f%=KgE9*DJyhL~Pbt2Ee%7-T#T5nlQDbq4{$k7=;B6nNyutj|l*2$``m zb1Z@P?Jy@cD|hfq3A659i6p@asX{N|Wx!E*W8FX2=m5atk}E}n=%2Ph%RCkMkg?vz zVGzoz6*07KGNQmOPY`yopoYKh^#_^13o0wIqEG!x7vd(@Qj@q?ha*)+@7cz|GY}Xw zU*)4ELOeilCJP~&xKc>I_BIX08VMQ4rkAhs(LVWVXJUoz7Sq~&K2^v zEgp?bm}IPOO@qEB(p;0Ucg`>1o_IT<#f&W4{m!Xg6MIkHFQPca7K`b|kr96JehJ|) zt2S}3a^qv$wVQ|qZHTVj-N`u7J>VP$0Rg2^LfX!WG?3WPe^7DRh$M2!6T67pK{5|W zYT)poBlZ)~UIafS-DQVJTyt}mA`fr^L8#zE_rZ-OihSAZS_KFIarJC~+@aG!8wwla z%Ry=kGHnhc%$+G)T?8lZ>-n?~n#r^mfDo7chM)Y#lpF|mX=y!S_9lxx88Ep4@*yG^ z;9}Yzbw>l{#jM+nN>`6Mp6gerFiw^`Lyho^AadM%V)hgFYM63?{||bEJ^zyMQ+1(A z2dgv#WZDs;7K?(+YrCDo_p$~H)w8Y4@U}re!FW*PBNU9dP8b7rY>h2K8&GVa0e~ML z($?A}Qd*O%mv9vSDuZ+5jE*lOjwlmD5A;$7vJP((>G3xeR!xRtVUbF4M3r1oVXLS~ z?Sd0&K@e^|sND*lQ!#2AO}KzzC^uhECnMhm0E&fzGE^sGd_haNqHD-Igp;Pi*p~!m z2gzD4`mb>~60UMGa?;jvU^P%$l@_28)5Wq60)7~t4rYr*#bb9FyV+wh8*-h-<`!VhLY4d0RyR>C&X9r)2Tb*=#ZvS2;zUET;9}^Y#HOQ6Ml3zpY3^8)yqP*ghz9_ z^^P#xKqAz-08~=2mx|!DkTB+&Te#`8dfkORSeVk{2-n*yk2@aF)Lv3UpH?1q5T6AK z4dfSL3QJ>|G~X4j!-?ZIY=MK4vt%iWvBjlXqu#vl?8=h+y1Wv_ZS(+(E|Al;64`hi zR!M9KH!WK^rA=%H!?WZM+57`i;X(-FIj2ndSP)_|ssy^owO3nqX!oFzOl`r55o}|0 z@5>4cb!n>fXt0WP2QETj7>zLzpBSC)$8vCM{|h?|YN^RbOZ;fvC)OREU!oMH)@Mbn zhq7DNtd-k@QomU!b)89(#?)azg*8;2Jgh(GSkq(o&UCK4fVK%kUd4&ef!I^vlsw2G zR;H$)jp?;jONhl6tAGBd4xN>c9-a5+r*Ae!qxH4>C;Rs=aJ*58-+~!rE(Eo(KvM)n zQ26%KxK{;hLxeJ&DE>fb_)9&Z-%RF{o&L+g$bGcf0V};H_=;-~VcdK(In=_7*FsCh zyk^&Lq%Jc0+X{1ITVxYN-8@<)bO#p2>|`&nURd94O*U9tLt|SMOIs_2RIdWoR+q4r ztlw5PNCLgV;}H+mA_|OGE#p6b!++p(a%b3&e#Yw4M#(G}uhO7G9N!xttmIU8GeEBu zDjd#2siny;awaLLm~K`0@fcY;?XGPKLUM)R5*g>|s!BkXidVZthGMn>uJ)tz{U@E^ zjROQ1(7R~I*7eCmDo&8>ea|;KHa$?{X}>`d39#7+8y)8+Z^9PQ&|a1oqrz_Vk`B+# ziObm1G=On5yT}~PTpe=d-rtG7MT{=J=adRsaV2FNPDMn+a3)0>wEbA@6h`!j7`)Tb z7ZTzjZ*uD;Ivhh4IvnHcq+)IVCAEOcD}6(YDIrDEXHnIp*MtaTU5%z`IIRRFxyvd5 zA;vKKjAMJrI~rNM+J_6;2#dLcOsiz;)d&z2eCSg(dd*&mkP3}NX9}ka;*8r5{nIxc zo8L!|U?@nP?%C@>3|pGPQGx4gWABU88WN-hW3(NmhxC=BjqzFo6?{G>bGQzd;HSnAsXbTlzB-|AQ2{lJlXusg!ulgac{d5628TfsnP0KN%8C;F`^}>-z`3 z;1qoZk?VE@St^bhh7DE{=dPBxX2s>GI0*Fu^fl~{HYaDEJDrP2phCCtau5(YMngFL z#`;7k?s^`vjkS{#D7V-#i_dt1mJ`Zy47W?#mij1^a00CFq=1h5;mqYQ4DZJ}GLX{1u;KNOdL>zqyCOde0>;I83pe(#nJE~uZl->{X6K(ozM z`2-9EZ4=&z@L!~}|=!vPVMD_^TMnkJ;H<`&bcs!|%VhN?v zuzEjEJ_%4BciMCi7H#By^gEqfC*xbfEOFN@p6-l8ZFJayO7c!)g?v{iSxPfyR>wwu~wx&%2cy) z2h^BFYa$3fH6twT5J>Gf-Li8VvFZ!ZA_!fZoQk>8ST@zXyDH>T${31Yz$}Rtn=4uU zwo9cM)&%4EtM#?r3CKmOP#V1+{){W$rJK%g&+c?yLona^?d;Y)8a(nE|ITFr;@eL` zM7vNia3HGirph=Oj(cL3u7l+A+aPnQyG?tJE;uT_SEEUP&L03y{y|1TN>Bcty!^Mp zsl3H80#F;@(E%*~iVK;)ex3}^_%C^%{|c8fz*J;R!uZKrj?U|dWgQP*wYuwKSW2v= zF7UvnY|=gp zD7GqjA>rw3ahuAWJ4yUREzn-IILG7biIC`+aQ?r!%FU|xAH7A=^4g@9vf2o~7B`L-& zfJyCX6sxS-()G?$Tw^W$EOPz`!F%tJgdrhg=*uNG2xJwb5dM@<9wig6E3B`#qySPY zwVqLxN2H}ddg~BHv2kUs%SX694%lhfM&XM9h?Bg@lCA3fB7T8@V~YPvR+0&3jaP~_ zCEB9Zpu#hmKtWQrsN_O%>?QPbW8s-CH_>#n6)sIHt;7W>p@}6pR1NS8mGH_|r7jB7 zPdL7f^$sVb%o4QN&3H$>jM>~Kp2v$S%JJ5Tj9%g)6@tJIgI_*Gg)Nw9xSFH}Eky1d zLSRX#ilm1S-(TPS6w-{)By7XkAfd{HD6Op!-U8B;S@lK)Fpfj<>8}f1vVfqlfxkxA z%CT-Q+n&F8yJhV5!chTAe!T1Ca}>oD))UB_I~wsD#~EB%c;M=F6@kzF*?x2)ca{045VO%9r5br_zj(4^fsVndyqQFZY4yM zVrn@1KDbxPc+U_O+=j!$o?o<-dDZjw)8M9LS(uTKNS6{KhFu7$cA% zj}itN6y{inxZH|Sq-AXx-9Y*z{V$#j#ONMqOOf{7*o~f1>c1KXtgq-cfkS}{N8^C- z+uGz??o27K#;7>FCs}>UV}~M0#KhRJq!`gY+63>*+r^nVniUV;4H+3^5_Ex4B)voC z>0fHlBu&(VATX&(89><3?c(>C2`GYSNWr{D;etM1O$s**dc7+{NF(umw4N9YUJ&UT z4i99?6JPW#?L^%kNr&d(SUm;OH4lT<1WSZ;A)FBXmgt_e4Tx;1?Xkt?tu}qa9o1W&%qfaw2SC!avji(6Okl=CHi1$XT;|C;|>L zI$tl51Zy=zia%qF5G4&IPcaoISXrag@EJ9Oz(K;2sROcA646AfQ3f1?#EAKZ*Qp>K zb$&@Z83EOT0u;RL{Ch2kJ!vw67RfBWTL#>uF^3OLo#3jZ!E_F{;0##?a9Tug9$U`V zti`v*6G2|7PD9ZO1dC2ZRFRYP?xxfxuh}dA)6sgE5W50uFa^QYS7Q7H*?V1P|EU9i#G@F}fdp{!*`zg;=U9 zF`c|b8m0ip0Mr&dROm`DpPVKV{q5LL21^L^649phOqpClnh9OnaMmf^xdQ;c&~!nk*vu{*=Zt+;D~TE z(ouSjqQDD+HnF@{Zr(c=EK5!c)&tX5xH6?9k{W0e3~ju_28{Cum0Q(+6@~k{%3d^B zFNt=y$(W(s$Jq5t#|1D_Gq$!!=nT)_>Y4l5;=!Be4n__0VTPqOs0l~9RyxhkzT!j) zX5rAV%CtH!@Wpx&-(1I*=+ znmG7PA{^oKEZ|0}ho?}$F~raQJA5RZ{GiyPbS!4 z%_a^!=xjk7$;c~kgb82^b`T!}sg$+jT=cy(o#RY9{QmpjplPRYs1u{sCW}BZt zl;*-TUv6P0@fXBbw1-u&eZy|gZFm3AOWBAfW-kWj7sH(6*;Ay{g5|=j6bsL#W3j!MIS5V~(SJwA<;hfW@ z1rFg8&`hd+%amhEGYQpLS}~=KkoZ&D#fb+0 zY=Gg-VbZpWeeVgxK|?X2IJQKRQSgnBLi7H`#$cbVCw}ywk2U>Spwo1CESEip!gb=> z(#(;h4I5m8Lao~>iNER3k`{6`60Kwvc8l5pjqUw3lLdx45b{t7w>L%$Q(s`0TNODt!y-EcBVk0`HFu>%Rj> z2Xygkc!-|^&g6S|3I!Z8e)iwtV*#f$k#AS$MIHE1&|g$ZAI$Xhzk+=WI3k6R0o6s3 zE510TZDaAVwzUwkTNh0SIcD3MDdwaN8fon^kfbdy#Fjp>Fi9of)#OMn8ZbGM)n__@ z1NrB{8QYcMj+HerV|ba6hL5hSo%Tl~4HsR}2vYnLB1l&}x^!jjeE7=%QKCqXd~rUQ z4o~^h!%J7z(9`5%dWxXa6$>!MzZPJ+VgaV%q6n9Hs+b6RuxV4W%05JD$zD@a68fv# zCb6eNCMA-F0FrkVP`5g)OMLLy0eZId91F%QDPmXyA$gDOM3Sm;YtBQ;wah~})tW8) z&a8im(26WsR&LcfYZt(govvXo9E6@*`7xAeV?}4Mwie=4SHR~H@krEcA~z3W47DRw zWYm{I4&o41>@r;t^a52GalpjO&cTB@gaTT;VPqVB`R=)&%8;En zvsdCFftYZIRP8$oAm8d1@{rzj$mU|xevIvAVXkD`(=NejcF6E$URbz23nX(ez-DiM zKA8dr15Ki#rOg7a7pUIY+Roq#`#bX4M z?P?0T1WF`#EQ$Qf_QJ!!i?EuknL0U2JB#Lmp(aLC!5m0BXW+=@8)SMLz`qqk-ZafM z&uu^J&)(pR?6#=^(%|jD*m^UHmU?+H9Gy9L1~K5_B(?{b1l+oS1odX&V?n}57<77e zn=&Pa<9dDBYfQpWk!eqvlonE9=A!|mddd$v<6Y(8FG>x^Dsci6qNJN{G1NJgV3MC9 zc_C3hO%T#C>27MdW~snfuM~|U6FIgc%mC@KV+KTv7?3l$*`me5lbYjQv+Q2UpakN$ z;zYmc{x{sZqY)4VBQZaUmP9Uz>W_)Az+L#C3Csr430fnvyh4!)gfra2z!+#R#R(KC z$F_tO8ebSdP~wZpn41NWbEAPeY{*myF^|r5-ltbB$iN_RLaVV?SW}}YCBGD0k(u!o)6}4CgysI&i`=Xjs`1&JxV)5 zbdaCZN*ZB2K5l@eDC_%$V?ce{LKfQ~?c~`hYGG)hEm@eQt-Dl350uJbxc;6(If8;x z#mNtE*~<%og;rcNBT&Q(DoWB97@r;tk=3hYxf$@)f5eWr^&+OwNVPW>N;;I*&=1>6 z#}KceVg-Sh0%QHQT=C*y@|);!BbU&%olq!t%Myy&AK+SnF>Uv{xth#2mZjPD25juu zk4#lM@#upl=--`m<``OB%2gn27^99c|}Vp$s{* z!R7>aq5_ryF9(3c!Z(05wve@n0xrm&OwQgfHBosVWOK>YXQ6dj(l$A234??88437# z=TPbt+6@TeNs`3+L-?>Dw0<0dI$A!5GZEyvOb9D#!yQLfBh_OSbPZF^p;$S@5QJwL zr!Gx`F^Q5mQTD>Ij#;R>bq?PQ7(gwD{;#zpY)`aOYTy+n`;wJGq=OiB_u|r3mu$~T zhSjW{nzAoAA}cQwl&@5vwqe|P>X_pk&VqsRbyUhe$&z>KSr?ZcX$GS6bR2QsV0FkY zSk-txhSSY5KMD*OMG}9B)u1QahAJ1&8WRuTwXW*$lCHb(ZsTx!lkddAz4jxD%3zJC z%F}r*D;d?TuDT(snE-(zx@DCFUd2s;IvnwMq)I=owBY)7la0C#ZV_HD*l>&Zg~>D-A6@Sy}L~CSJm9`09!|e!7^EZdX;BKf^>2cxQsRoU{koNhiHV%wjHiqQHSANXfmY4M{k&capE}*?g7ws<~M+qAHIp}Ai+X~Qx+U$Ou3H=x7xiJ zidzYvR*p9-qiJ%-bp1Z7ISK^aq-(l{w| z;~4}M9DpZI{%$sPp~btCuLVEP2!DtKhmK7?p4W^ho$ zBoRuLP8gpc`=X)g^`zEzh}&N6!>brUPCmR$^xf)9A)FV};bc0T^YW2DGL2`yc#CN> z<)jOX5`*mwk~GQ0=^>f9mg!CUj6);Sp1gSWqW4{Q|6qG>x3|3|S?rR+GPC=4Es#qft(S#x()ZMjwO};wF9}C_3jd)3Cmj zPo$3ek<;l>K@R*@A*ju*v6Q!);(Ik2vCS4Kt-;cwdux1)SQCpqpqvO)q+;mNBW0F# zoLqSYfddl-qIJC9>uqiC_j>o%?kBL|B)xbJQBEdjIv9cXe;&{yAbWSz2W-V=RlmOI z&*3tMX`zDaPY^zFGXg!FoFrYq@pNw;_$?d83980RR$as8t7~hw@5OGPU>BD<1>$Ap)_y@^|J_Fjbczr4IWRy3jbKeZQE zaC8v)n7?YT)XV^ZG5@~3eEVfRsQ16y>q!z^&3Iusz7Dss_}be=wTIYxX~ps3;r{lM zqr)!CVUqRFC4dXEQ>4kJLh~5)C?oVt*8v^bo0k-VM`1ycQ`-S^5RxuVb=M62`z}zR zb_aCz6*4~S$t~GEOklN<2O|RZ2?8$QW&{TWi6uf(B+yTT_oDND?#pg~d^ldkTY4p> zW@i=OOhE`B)`KA{baXlz^rtf7^$<-ht!uD!&=yn(alwuf6o3{0lOaA)6Re{}5P++F z5JpjK7vtGrZeQX3$IL1GiG(NEEl_KQ)ArQq9#R8DMxp16046wW_J+7v>THnU*Ch=GqqK{i)6)xB1#qU@ zF1%Jj*EK%#`esF{lJ&OekR{9E^uIMmDe1rfo?A@xy4ZaN0zVQr)ERdfoYa>VBo=P0#hmO!2InpU=jmu zF)X3rQlP}rmqOBN`_Rx>f{U^PoFgs4*dQeYO@uXUi>YdCOK;$BeA zfovu61;%n6#?}fBB0>e4B;Q`kA-rvrFQJ#>`Co9gdt$!KjvIn4+__GTn@L7&&V-L( z{r^=(XDFfR2ZM+ZZR-j+5zq}S9L!#5j{`*UuCLDUU#Q(A8q{17&;?S$V%?;iXgG0h zL~Gx?AJ)4j-FfsVZ$E`EMBSyJ_RUiE(TWs$hZ}U}e|#`eN+P6WQw#wX2>= z?3d6<#*JbJuhLD#6#y%jBU=6d7Q40u>kxJyt*H_^$+^*3X&H?2v0P!%wD`>sS&7WC z8o*`vAvQyRZ+{hyWb0kLFzPle(IQq+t=Xi`QaBS+L?*q4U;{+3mt(hvEk|;R-`r*? zaTwaPOT@ zeje=fXRvF}&#_;^n@nl`m-`Eps=g3Odr5yU?9rASZmy#bGoGE#Y)$b{4gF*Y3?$I9 zM0>h3=}Ew4y+IPmk1oX#^ZJdcU%*lH3rM(}RM`cM;EmqtOf_atjDK;iZhDH$+xN6R ziGwjIe1Z{<2IKYQ+6!DC)A<6E{qfqR$& z=UOg8514Jf3R#(_H5IWJYjM)66sJ1Fw?}y8iT`$*N`?kT5jpFDz_I;A%8FEqG6L|1 z^?J&Z<>beUWB@>Hn5YDE8XlrROo}Wywrh{8*|&*9sO{+-BXyzrxyd`j+{$rA-K_)s zQEs`iUUGY(A&6wxgPF6SR#p1YL1dy}hDG@4n{7FCQa^Fa>U(c-JOKhJxW+=vRZ>4a z*H#ya0TR*v9~Tyx_Do8b8kNvQ`IMcUaO7}R4pPAdUwShpoNc5*^>eugk)n*RR1~6! z5VjUI-C-#KRdx(KSC#sqvySO7SXcL0C;I>{itexUtcZpJ{DiS+x7Ij3V0a}qwE7XV z*4T~o(!*91cD``WP;zo+hUg}XR)*5`rd_PKUKbHeC$$C+X*rD08Qz_JS<52(RhdgD zqWC?k0YoZd0jG;B3`6Y-dW&-1l0&clEXVS(DY^R0axVj`koMO79v)ogb9DfzRl#h@qt9boF^ z+~``W%?rqR@j0YJPKdG2r!`2#Y?0|Q<{+V02E&k9lBx%rCNqq=M5P!brsJ1TP_^I@ zqes7^>urIs267X_;^@}NVDC^`1@diWhPtL0*U&D++;Gr zZe-0nW}9hy2g8@R{QY%UC{cYTtz|;16+&S@3;0h>N}*o2)&Lk!Npk6``H~J`mEyA3 zpJ_ExZD0o5Ku$WS0W9nTNg-*NLbDm{m1(NtAq8K4pCQsg(sL#GdlCdS(2Z}|)pQU_ zi1_#%^cGq&E5sKB6EU~Dyv7i5A5vb#hD{u2Q^Nu!vVR=yja`!B#+TR2nAv-BmO8&S!;!0Y)NbZASvR^|? zLr$a!sIp3h4rMNPCv%m0*PG7E1YT&~Ep%KV5QNB`l{k+=Mg7|y#xeRR(?N0ea55+h zJ2zyAki1M%=7XJGVYD>ZWaH__n;oo7lMh%rX^vOQ6bA;xGMqIAU76q_Uik7cFFnA3 zKU;U@vkE^#y3z`Fa!NY>lxK5UUR+C4ge4Bt(j~{Bl z4Ue5`V|W9g*S3zHKmWllDb`L>Z>1Jhs%u@zHnAbve3^+3H>5xe-8~=l$5>;$x)|X$ zYYrC|#$u@o+kY~C6t9VuSS#TJLgYR=sgbY6mZi2fAl3(r^tinoFmT?r%&Esex_yFZTV6Uoc|`ot?tzPOU0k@mkMs2k)5;DJ*^To{aDa z?k94+u2e(y(5i+g;fRB7>h4S1C#%r+wMTjkK z1r|RmF4b|AN{1+)uwwK91AYKP+K56zJ7j#8{%YrK3;~(1E=KgB*~Wneyy0+$d0G)p zU+Ew)S&~681X;+^kcb;l6nb@E2@d^@mDH(n`Rz2toDBX>=ObMqSnF&dI?aQ4R?S%I zWynr-V@FL4nvv5k(8zwQQJyiQiA2>Rk~K!ZCQ?{7t>9fl>Dw&a^ht0nZVmk}+PNF*sLI!0Pe6aRWA{kjFRXILb zt;WI1FAP>ktsTRK;S;Bg$p}e%x_6e8jWSKjtWHK}+^!@<>U|a*QXVOX#2sVZKCstU z-ki63VRzK~<;Di5PXS zgwq>kV1|Yc(AbJt1`Aq;C=O02@vDftYj~3}=Hzyl`iYck-%6Snl9yI=RG0$x&Y`B} z1K(ZGdRTjYfg>DaTx8!rJL`zaU>3uC0=YOEsaw!3SfjmK(1pN-(E*9NwMGI{1Y|f9 z3{nwsL{%h*7EHnkZr!QZkSsAZRxM)4m@e|FIALY7Y%vyhE1OMw3_}#U5LXtKWJWCp zN%l6`NYR;iG?SoQnI3M3aJzni*(actkoazG28Rp%w0q#ZAmS*W%SI8{Fr5z12K&q` zmMkm}X!_VP0;X^Ps46J84G* z6fHs$c3O-ypLQX9{&s|mciw>ca5N7M$?+0f*k7rxoZm}O*6Y34+1Ttp+uPad;;0$L zz~`Um{VS)dOjnT<_R%?LxvhOQg->Nex@wZ~DsN-t+Z>&kX?!okOXk#(C&QAWVvVq< zKvF{)l8ZD^rVtA$>6GV_lc0@!N0=}i<2`Ell71{wVbDLrvgiBj?A@dkeD`Z@FE(`0 ze>E6kRUn|;>9ji0>u}-t-jI7fvAu-EFWcp~5@7Al{Sq>$YzdDqju%*OVIsM0W|9Mv zg@PkJ@eoCsO@CnzJiwHBL_RoUPK&sQbx4odH)R75X7b**-Cds6JLqa@>BlV!=SrzM zlT#znEYO!xFX{4vos@)2GL4*-uEh=F{@b^s_sKC!9P<>=1(=p&SqUI0CSV9ep>xua zo`cOoE(JhA7{yC@{`Zfa-#@@#*2p{1ou0|e4LHu=a+|+4%+l_IL@o(qKKaYcj)Y4p zZ91wZ7xT9lT*ncI`3cN$tcNUJ&X1!-*ru2rZPRrX+SXaQ`}KUX!2?D%-fN)9l-|E# z7(F=efTMLA!JW=u4sgo)1=3d>{(yhBae3E&>bu>e=iPlAyWD)%-TYQ0O-;`5jwQWm zmHvjAIvi{bA#*RUqhd}-gtIPRBcbq-^UN`dxr4Q1jo>VbfyJ}KUcp?zG}@rkXrOXt z0sL5x+Xx&t2>frZ1HFS9fe+)+MO+j9Lr0>*t`s9!45pCbVR?vDay9wjlup^up{?qz zFW5d{3+w9gIqN)r%oAs7{*WjdTapNuD?A!?oCympd{T%zHHRfS9iMItCk!L}&%KzPGWoKu!DTvZYeZSU@E z?{<674xjI&{)t%K+JiS4K~gTx@;QnDp|@$-+o;>h^l*RbvtD=e*`92tw$a=RSfIoH zh@$p6oLN-lW}(g!<8&bLFlLS?^CM-#)Sy(H72-pNC&_Z5hvA{sfk7x1!7vPp9p6e3 zvxs|262s}*4F-CRB^klN`|-RlS2!BDIUQG}#PNz;IlI-xHEa9bJNoo=Z$JL(ZfriY zr|qZqLvI4L2l(xGP}9OQOAv(%gxfa8XV00l`2g-N`UcwUrpOL3Bs4NS7z%;LtVXW8?ZY^?m3(eDuT5R;WRmeRhX*+sLL*nlAtU`DxTcwFn zn9Q&C|JD<1N1j{Izievh;7Iz2PV?&3j)XtbLZ;tk7ML+R?zF%NZ?*_XLa^37`<@Oh z{VuaEQN5WI@HK6OluH&tL)jren`MKC!KxZ)|0?=|keS1uZu4oZCzU53n^&0~@OZunN#^?&*Y7S1SeXi;U zr$6DHkw)1Om`@k%i@@Q2Va32K)Lk61B^1`L{ zsC$pjWJP*7JP2PCl622r54J+K2l|#Y$QKkAV)2vj!4mWRYCTSuH-fbU;{SCSaix7_ z4m(3Y-uAreo1-iNF}O;-2tzX z%wW0B>ZMg3i!sMZp%7Yt++#b@&;1;jd`s0pxiyxTK7?}FNrE12D||_eTljHh(?so% z;P7T1oD4nW79fFED?x%FG2qAn5KjszUWX#GAw|6q8oi5FS<>OqWsP>DCPEwlBoa2! z`y*Jjp+({A51_jgKX-Mnpo0u<$gJCu35mfCP7{wMaVs;c-~<=3Y;>vd;MhqnwhmhXxs6-pGBoIyp3e5ONQxI<)V8*<>{m5~T!sNoyJ zLV~sGHgAGi>^)_bS>D!V@jU@d4q;*)n9iSq8lg*@PbTgNhSpoLlfLVZE(YCSP6u!0 zPUR2-@*JEG<9)%ra5gwAf@z-@8DhjelT!;wiL95Q9FUHkvH5$OQ$$kM@}N`Y5h>jb zLO{pIVzHA_M^pq)y;{AC*l-F?^m90X<`A$1!l=dj^McLSJjzk{YV|QXBHSA|n8NUE z%?9Jkez!5pZfU+q?icTkfh-}fk5GzgA*?DbNeoMHdJ^*3yFj3>?Cs7fq;WLnY)%;Q=14#X?_nmD8t--J~v&&gII{Jc8O;X)c|#oIXQt70*;UtZB8A&`g* zwc(gG)GR25v8m34oY#q1P&iUZgFaeP6A(3#HvVTIHSx$mzkLYO+Ky918LG4Y_oX|N z(2XevaSQ3iQwodL|Ih$(NofbhIGul>3OnqD_0LBJ96IUkxXJ5nPvQ(R!e8my#I!O0E8XZS#ZgR>g446iMI8*O5jUxr zt<}>-LxVGmHH4}ZMJY>50Gnw&*1jzchP$56U@d`4>?z-)kb%-FI3J7{w|Y1^g0(co zRa8@KjuCA^d{@AK5z7dLO>*aZm%`@&{D)42J*h9?+Tg#`K4Z6%0yQp3QRhcgqLHj!!2L}k<-#s|o z2vC)2Vj0_y0=@0$FZT8w^fD(b3LWk5{E&j#$p1>07VZi-+Jr-Edlzo5BqeWFu{o&= zD#igmY|iV}-VXLZwDFXN4s-?{HYc_%VVqTH&TOSZ0#b8|y?l`d&f0HIZL@sRd~-_u zmdtFr9yaH+Ez6q0(VX8(g$T$O5G(~B#*Ek~w!d+>x35iq(VX4gBh1p1ov!48wo=Wx zj8|A#k>=#dJy9Dwhu!_%n1%Sk7tKkF7fM-M&3QUH==OFtop>fA6rndDz{u2AXqrX#?Be zZDPNoWdeIn|AZN%KU9S?`}a{e}j;WUEC#$M=RT$MSe`mZtm?^vgilD!+bVZ zBIUgfVKrR8D8Y5N7+Suv3tBv146o~|u3QP5-_$R$tE`515#1^}(xP48A&0yy3V60D zI<&NV)zfOGW**_^{kKovbMb>=n|fa3EhTH%o8zhg`+?E|yik`68jEL*PxAq1QKpx5 z>g%PfPleho+HyG!EC=XgCRHnib*P-xn$Iw>u-KK0u)-Jd4dKQoix392aDU=tKfKwb zF@>D{s-b!SCpL@H62a4ZH5$HUYJG3UqnH867>NSRZ|F8^=v?j84>V>lw!${uoQz)$ zUtj3$)`4nHjGW}M@p_TQ_1yJhp{2>RJO23w+Ve{)uGrLUG8&w0ApCB43jfz++yGzi zRS$ze+^@U|R(DH;7mH)6DMdLq`aaO&tB~h zfC~gdUox_+j?bd@i-0svW}ub^9Absb?euDoYk}q^JJy^-bP`&OzX~X?(uR44t&`9; zctHNbVnQ!~@P(KlEM0=-Gi-~muzODij|`-3W2eCO_S3yaMW~n1Exo*U++;(ka*0!_ z6v`-B1gBnvFli0)702oHJv?=`a(1|JYq^F^fVxiKbk>*PFYM^BIZItw1!OVBiy&1G zOWY;JUN|ucIcX3=UIQb2L_;O5CG@PJo6s`4Br6g2YWT~#29fIhP2!=zc9fE&IpAi| zi&Y&*J3_hX7$b1p*_qISVEoN=@=mnG5@^-w6m_60c_fw%{Zk5HlM}ZK>m5CQJcUp{ z;O>QLU*!9~FBR9q;N%#8%30O9(D z4p`B)qGeUNmpC8J_J^~d5L8 zi`;8r!Tv&&TTaw^g!BqxA`tD#&gAv*G)T_%H4qXHPI+eoWG3N$fy+)iW_G7@3f~`Y z`aw}#`li|9SngKh6qAX-t!&0I4S{vbDIC_RT~4P=25Jel$Q4m)^3EiDHGvNv;4MiL zQI(`>vdVAlImJd*x3U6;8E;H?2bndHu&G8Tov3w(eWl*OQa;h)1+H;y>C~`c^OIq- z<@M{q)ceO+*2SQ_)Rtda(=m$GF6R660>0K;zn$Hpj5rI%LI;fBc{fDfz?TDv4rX>e z!_YfW|GeI-^V_p~5AJn-J43d886W-$NH!U?k{C^LndbBUzfGogKNxV#!#}vsZQ7d- zdd#5IXQ8AaT%FiL0DsJ+GTd&8yVLl!F$rV;3*;pa}nT@q%b}V zBM&3{%T6WV~Vn76YK^tD)y zi(L6oVP0-I=vtjaUT8%{>CVv_X=WTAOGHVbm+1w}m1;tK6TZS$YHw*$N|tktE$YM~ z)n3+CiXkn)Sc?{4k2(qABqR?(<~}tDnD!PxH{^WGa4rNERuUnw zumqchSFR4*`dSBnFiqr~OC|;uHp-G8ypxEL7S6Y=$>|d&%|6+nSuIvU!V@3 z%Pi@7g+NB)UrOfBe1Wc@KCE_7Z%a3$W({v_#m;e~mMq@Iv$TP2*!TaAdz@*f%B`n3 zcc`zfRO=|Yk$XYK&BFyB1**%w)3J=dARlwL6IMoNlheb=Ap#DP3%g}ruyrr@mWFkf zz70#OStm?pLngSt%Kc6BQ11_3^YncO!Tu-sdwkr#`|lff|4;AamJ7m}6 z>`}K_k{U%1F3VjGjog~VQqx15*wG#wrt1Bd|=>sKHG#u_}{Au|1?cj_f z3t@S4JeZHb(cqrO(C-cDMzfA6O50__`tgdaSfxb9xa(^=F&aR_1tH3G5Trfn=m!by zpZ%e8-hbbDgBu<@7a`IYYgN1%PA;aMvx@1$YQRp^wh@|p8LDlT$By1XRKtWV_v!}R(GC{3!B#thL`=p9!h)SD?ZH8k5<>GyT zu#;N3IsooT#!Wpz2XZXWDPos-<>2R$*F4|pGrn2^0TjjtQngY7kbcWy;Fk=Jw5a(} zpf_~4ZnixRV@kjZW8j<;Nb4RL7Gr}8WZN|@Mo^yZN`_OzQawrr~TCHX}{nWX^+#rsC<3*qZ4bp$d`h*)@+I(FC!i zC3qp7M>1-0u-Ashcc4)C#B$o3mogTT(*=mDmpkf&5C-pza!p0h$ffkrv%qm2^u({3 zn$y^73V8|+5Un;*WbCn_Wbr2e@-eRH6^oWV+4lG>!AN=}tF`UbS`7-N!3Z&p0E#N; zXw36AQ1Ngk{;4y98}l6WhYx@P!G)x|1O{DSCwf`|NgBaPN#w8d9eubz?tWb}B`WoZ zCqy5&Vu~V;QCr-*$N|?qFB?^GG3POoQb)bWV=x;8jU*S*cm?##LE5nw|IWz-Y4D1% zPz;OX=tkB$*srk~i)R{PDF?lSF4ER86iLx*v%J)x1qQ7kCkkC&2ZRa1RO}B3XbRZL zn9M}^9C>>^{_L#w!@?zU=>A}SF_nr`g+VZL0&q$L``9?J1N99Q#o8i2*jFqdAtvxF zI25c~-3oFYpT&Z<>Fxbozk2oY(Y(-Hkou`^DKn?SNig(_p&)uegMbtSEiSh%ET zH+o46NyBX|N4b($pnSl#1TzmK&7)up8ATz!9S$xkC5{|- z5OygK$7@))a94GWhs$t{?3FOn?R%ZQ`5PRnm*$b%a5~V#_Ug&GC&#vlxt1pHG#X?lU?7Re zW6!wi;I1I}4uU~uSPRR%U)nE-hiHk?PRE}PA6Lq)A(qS`=wKY+#`PLbfOQ!Or(o?i zCxCo&>*>bMK^FlV5cA}F+!1k$YdY-Wh}?^0bCwH|4t~B87lN|h zIdi~K)hCETEn|}4^~k;-OWTrjLBs;5h{P@zQDpemK44m4x1;C;BM97Svy(%C?mD z>x7WRwD~X^T4v?|zXFVnHNC$?sMW9!`~~pysU$XwDO5QU8l)Ic+X4oB-4SP;&9uz4 z&x^F7v;TqTG7^(Yq$bq=VEPLAzI|%82D8)YP(m3~)29^Rsf9xdE5AefCN0IY!u6t@ z_pD62Jda|m(p0e(MvUDYzV3ha*~*_^9PED~|9wdGeRhAPfxu<4CbX2;g&2EtNi#p+(YX=)_=|B);VT{r6fm@u_kkRQo5{5vt{HL?Fy)ZiZp`_#){{Vv#c z$poy8C)0BTnEd+yesDxx^j;!i)*vk~dxI0JJ=?xL#db^b@gq&&SHA|?n%GF6Lbfin z+k$K@OndH)aEUjPeS4Yss~GxUeJVr$tG|z-e@%Y>eN=NFd*&0-(lo@!6WrQ0?9Y1c z-JJOh&)}i(-+x9J56-M|y@nM(>VR1O5i5OcrA#kQ=aXq75BT|FJRS@{M?G;=!0XFX zQn3uK;L}p#7v~NY){}B{rHA$7#W}WPd*bSiRTzkVLkq>sgYf&mj|bseRCBQZ@QaU0 zESNZ?N|Zb8dhys9_`j#luw*tq`SiWPUFWZGSt!yw{1x8EyAQwU{PE3v{&t1{ig)kc z-2*}1#V+K%$@KO8x3ek#A7$=;{ns91E^sQlKgHRr8}%Kx_=c`CvzBG$qbYt8PC9ul zhS=K6{^?H$s{M(+yxE%poOy#^2B&Gwm&nElUmr8G_rdl(4c^X5jQZoBdc01l_j15p z3lImry7V_i_`$hi6?1Ia2{`QmF~c!p4~BCD z#_KB_4e}QeNyG8!=;AD$9TY>@x+sO&{5`hx86slN=TZOs1RE7iD9W` zB|wRi7Qfej1v`eMI|d~Y=Xv16NuvOE4}MDiZ{yq*$xsiXHs;`u}6^?Hl4cj(p+&`4l6C zWCmLx$+Dd+wj|34*=+Ro2((TXlnH`C%nBGX1Cq6|^V#q3S1;Ywea;LBA>}5|)x8@t z=k)2WuCBMPs;)jorczedXbp89uqZ}=7Hh5y2W65V7QNe-94PsiW~ku~Umo+dOf zLxg`yU1|OSjt9j1g9)>CxHrnpCtxSYxcVss(#}3Vm8=r}0rIr}h>|_Qk8DnX&5_&q zDsy_!ztw!@=t5t(90^$E**f4c(OKvLRLKJ8{oN6=6ydQ)Hrv~(SKZ(-a!pby7zmxJ zfD*|Y>;f0>gTo=N@rEr}_jwFVfgp77(cT^`%DTxZ6v^JfDJ6LpB}rhY?9OKrja>Bc z>5*_erSV}L+AP#$$&lW*X~Y~1A>ms{zu7X(S5##Mb+T?rOk9q(@rNB_aQ|wKp`Y zV2vNr1Z+}6!gdSd&Tum5anx*EP^sfO*)T|4htU`r!b##6fPs=UNVWI3ouhs}^bkK! zZKg_eqetwHUa6`#>htI6B!*ZY1ax;)(6=?DOQmGf^g=j_x;i;vij9=D1D>~cz)AHS zsd)KLwr`a>%b$V?Uo%fNi2M8!9E4ac(;r016{GrI5)`59EKraL3`sHzQgZZH3K zibKZ5Y(QVogJPoDgpw=nF=j9#8H3)wb8D+CU?#vu>!KWDmmR-QgZ~luLm4I(X&! z4sNN1(7rATo*O@WhabDh==P77_D>EE;9mGNUWHGaaq{IKQkdXl`kOpc;L9A9XgVk% zy;PYe>qQ-jBIeJTZ1QFQ4=OP(&4)N8+2qTmKm0QyexH^)zWV(qrH-$@PQ!g1>iDYv z`%gn1UoHLq-=8{eeVV{V5(`zdN;KK~$c9^e)W@MU@v&vYt$(3N10uyY6W4ug6%evl zn+(oMM%Z=mgnKYjE^o1lV9@WEZvHbE^dcbx#6WI-q<8_gcVZ|7e2eRNitF@4*CLp0 z8rjKa+0?+!zerr?>HhJ`M3nPKTB`5Nw2ez84vXLiv|UuuWIWz}hph`86FHP&+p@5U zbr0X!0i5jIYVot$9dF#K7T(pN>|S4uPDXs?j{p2;A0ZC$dRakVwz5CND-jKNqnDgqDiVXGV5H|$d0Anw(;=WMhR-&oN~w|obq(QzZ*gw*$KIOka`4%?5D zK4WSV?9|~sj!S^8qQ1u}3~|*21K#5yL*cEh)a~Bd2A-P%_xH@dAHA(yIOg3-QS~#z z61YzWkugLf7%0kHN5LUZJTr>l#}%fCU%^>Dg?`d!?odf`gMl}E7$=w;hux!-ojV;A zaZu{O0z!$e)CJVVxqOWVa_cQn!5v8dF3W3k(+%gCxbV-84$LH9Yz99#Ob{Hpml7}# zw-63Qz`1flPR8Le@csWbm>DQQ{rlu&XZ@YwUR(e)a3>&NPI=W(z}*x9ru!!QA+SiJ zBVr4Y1cWXl$#X^AXu?QI>u*%AalWUFF08k`Ap5d>bCDx0Xw+Wf(Lo;R3@Xd5%qwHvtV|*WIJIirY zoc?Dtr}OfioDxQ=;^NBsqNq-k*T-eiGIYt-q-UyZ(Q0;v)FH zJ~my*!LD;1$PuNP&g2A9B$DiXcGh3^Z>jP1v3J&AF5UWPY}-Du*DbrjJ_WISbuME0 zQ0L26{jb$jOFI2S&VzYxmnV~^xOu-?`ug9W;BI}|b3egv*wkE!JT6Z<-TG9gfNuSB zP62&l>6FFACy`FsqMAW07d$-pi4G=z_0Ku4@M-BHoH+R;bdf_-Gw9+2B8gvrs%XL2 z|Eke~kLBs)J}QTn;)OF|5UtpM}nK=_4;y99$aD9Xy>U2O0*of1x?SKf93z;Q| z;1To5;d)0-JQgpA*X|hkZllBg_VEy2SF24V@4;JbXG0E8`us%s-ack_JDkQ-o@-d= zqsj4qN@1Z3MS@Y8>C^ZIjz@3lQpOe?$)z|(QAZm-(pvnJcH0+P3)DsXNLrLN*KS4* z3vpUaw@hYj(Tc}aqQe%)51@8=-Zq{>GZiXnuy+2b2wgM-NA4?*$B^Q{LG$L^Y#T;W zeg_DAmcc+?Cp6|shdyrgh1B0I;J(aICfo=TvtoFpj-BA01uE+^VtAuQg5?A!6x8xF zH$mO~-=S zyeKQp>jgE+2l}e(WR`QBQvO#tq+FH{`DjwENIi?J;CT)~u*BCh#6wr*qjiuzvJ`>L zcz$4+tR*ML@)@Sh8GR%cPT!@h1{rI{w;xJwQ=@19lz_-ZG^QmmUA{q_s?|c2G0{BO zNKMy}DAzBV&vpBEe2OC{;gki|S#pGC7|=sxq_8>$bZPt&sX92R#3MF?A`M3GGC-z= zpC5@I?eWNRfA0W?oEljG`JE~j?p*ta2=Yn?d54Mwz9TuVqaw8l*|gX&PP{VLB*Jqr z!cl3IgYmt3q0%_^_=v|`G|hphNh>vPhnXEeP-bsNILcm~C901+SFJEnPZ;CMaFMYr z$GF*nN4#wh*n5sWaB+Q70Lm}^v4o9yJ-W~7j zaova-yhW(u11h6P($eYCx$2_W>N3sAQ+VuBf)b=N_i92_$ep4fv(x&fPE*`P7K!DDD|ho~CSnlq!PI3@#})IaVck7JDUl5datS!1_$Ejd2f#Za`FAXDb_ z1pXK~JRM)jSw%fGS=OfE@FYxO10J6XY;8GqQ;btN9m{;(YEkPvfEZ zIO|!nB(&lJwaWS6@~n%0yAw_qQ65iIe(mM!4_h}17SmBp^+1J>jj%{`NeTdJaD&Z~K5EpCI;VIu5k%?6a`edfh1#UfIjN5Tn`Ehl zdCn!&L_ygwFyDE{3Q}3JXe9#R@S-L`Htxh6y#|SD3r!vj3;jVh+`mxr+oug2e)Z{` zrOb^ACmx$@p7h*@r@MTjvqoS23q=oEoNE1JRjr3VF0g7hx<+PI0}8<x=Il=_qof#?_3ZfHp%|6x<*TWgDnRITnf*`@0l>qXp&Z| zDa>|A*^C=6;-gL??mlV@e$@AhHRk-06Ar~#MR5@Lt8(|TnVX)4KPst?yxqYnFb`EM zRMk~PtbZN-NoZ+5!)^%=Wdtfd-wE+=QN6DFW>- zOHy*~jWmxAi-Wf?}<*CLhyv~aDn zcq{mFaOdO_nnRNwA0WEg>x%b*u_W6&;5sxRA0hI32G#9cnU-a5FV|k9^EOa)7$N5m zU$_;>p@A-&_$cJ|v-@%sbu@k#iM*ZwSnSyVX+ZE@@P^-wQQ{d9QI2&^{zI=Fb0A^+ zb=uSdMCLoB4IOT!n{Bt&o}|BZcBP(p0J-=h5>4PIjzkz9$Ej05nKluLiXLlhM1sV+ z!EWnFQ{HfEHzg7+kPg;EJH--!whORA7p>F;eX`5%?h2|R>>_YDG!ix-7;wR|UaiST zt+%Cz>zU;^cSTxFSCmhaX}GZ5Z)v6! zG>Jt`D>HTpwxa~wg1)z?dp78m2!Lv1dtinYB)Aqf6)uFlTD)^I5@5;MMAj@^@jZOL z$dziKQBFh3CENa>;f-^T^yH%WDELVd`nXiQAyiL=gB2;! zvC0Ry2AZe<(T&Xl;G2_yV9!bs=p#=I^^S<6XZs=1a9X5xtp_xG)p9-<^z3cgn^1 zX70P4eFVQE;MY1gzW(}aU5@#e@8E^}35x-K!bJ4~^kY+B(;{CJ`mC@5uo}0Y-^C@=M{<=q7{9aq2KD2mior|_UWVnd zqVj;&Jowj*G8IKp4%Pyj79x&JZ=-I6NZj-zebgf5QFXA^ay;VR(h}X*E$;%lmX@%i ziD99=Z0H(Lz;Q=DOgLpEgCOvwM2Fn=7O5cMuqRT)WWq+ zw?HWe11RK{&KF?y-c;%2>yfZhPR_}VDhQ;hKY=xe#P_Sm@MapYgd$!DWR|^GBF|b-%iUgf$hH%c8WfIGbBLj*&j5e)2 zh|`aZ$Epz`0x^;JoYE)XU0x$BvSU+j!qwuv2DVJk$dc)Yuw&i**`hfUol*4c4yTCi z+{;#SAS5f9T%Nd5(P2!|lpM7nrld#bVtN~Z1VM#E;M#_9tL&+xZA$ZYAKuwI1H>5gLT)xa$mUz|>G zaM^vjJ(v?+R(A0$q3It=0wI;=|WEduZtmfq8=_5T%4dpw@@Hk@_x|86? z!en%48HvTR8bAMvhb4t%X611zf@*jd}_yc?Z%_P22bGmd{OKHqqN zQl~iiF@e>>SL06V;#%im_bJ;=>qq|Q}n=^svB^`Iw}M12Rz zMneB8@|2xx7cfie|0fzI*5+4KdT{uXmUp*Lww;y{2Lc9rLf_ZqN)lhXCT+&dT^BazC^Zn7mD zae`0B^41RSwLr2}=&a_4bD)sa-jQX+me#uJ0E~%X3^<}e%XRKv#jXg(O);JmSypYp z5Pj?Gt_yogG@Byu5Vn*lY$j=zpBM`BgMi8WP!alq+k7}Rgn4y9QfM!Ok>4-gQQQMC z8{5```D)G_(i6GkBbq1)CDBYt52u+b&=V%kD_aHGQG;>&D@A41KBKdGAt=SO+8&AK zPO^a$G}nx~=-A7EgXypg z0bk}{=}SQb-f1A?^knZ3tD+=wK4Xjf4T?J|>gN8yMvv2J@8&_kV>Zemb)87n3MnVu z-qo7v^Qq7{YT7@47*zYzE+PWkyLqPSKF1Kti5T6re5>XEdrjU5CNz{1eGm=wWIXF8 zbmD@jVN=aPFWKTmoVI;dE=~B*iH+OcawK1Z&^TkPZH$QY@R1Q^a{$AxnzUumH*I7C z4U1MW1(H`pZ1pW~@4JBR;Y%EBJ7ML$R1P;f%|(vNz^bd>ZXdixJP4&CCkTu5r}w*gc&ZQ0y8|CA2j7BQQ-w=U-*&JnSDNGNTWqZ{rNuu$4KXcIV3NiHb1DL-JF2;lAmp*_v7L95VnLs^T%95@S|l)9mXznr*xuGjZg#6kXR}+D{EIQU zRj#&y#;O#Vfdh;=iR(+<@e2t0KXLOS-OGoUHTt5Co#QlWzYX`T60f^9*Ceih@oRIGhR}Hi z2pGb$rSGQk)ATI{lwP1QO?L6DnMAZv@x}p2YBJ%4FVm0oIzW)1NiR!;u!HK!-DNQ! z6KK6IlQ!G{pgU@XMjw+lS`VgFh^%w2`FT8)v%b*$#E%reYzI@6 zo6R$EL^e1Cp#@qR?`pJg*CGM0uq2Cj)Ol55U$9gnnXWTwg$hY5~ae001lWbVLV`{=<&zM`1W^m%jwDfb`%&iEI+jyxPWvDo> zBtY6{6B$2G$DMg1Ru}K6<2v?gvZcmNqDbc)4^l2Obd?R!o$=1CFN!39%T|Ng;1EQa z)=T2O#pbwx6ll>_@5^Xhl}pwCQRzR1#){LAyXyG-lF^danHH$hU8PFi7ftArj)&h| zxsHRi*C+ePqCDv=4o>Ih)*h_i?#^}RR(`zq_=nZ|{Re9gSJ!XP_g*0bf&QY-;v(|} z7Fl&1fAbOU0Y88_di&nWqh}k>|MY$5>ipkVo;-TAw$XpaPJX?*Kz_Z_;hmfEGWPxJ z)y^-SS4i#ZEdFh^bM-I1tu47+d}o4wvCZf2T_kBN+|?JqFuQ*Qb%dY1Lv~^Q>Nm{k zIO?qaY2(?w{=H{E5MD&sj!p<|r@Oew0N5f=%H9?_o?x2+zxLMA;^NlPZ;|~@fJ>Mb zzR^U9&}X;%4RSK(-k^@g2z8TyH*EYC9ZbCX8KZ$gaVz@mVg>>}pL7=A5M|?ci{sNH z{53fl9RrbzZ-yhLcfn`BxOmEA4~sjLMz;~>pZ|M?AW^m|c>FI{LP|1(WG&o~ij2Ss zGE>KI;0*>(F`4V>WQ_b?6cEBbJN%U>70s@H_SxKbuMUwg69LlLI@`6rbFyh*;nc(VCYqY-AF|exW@lrpBUHPCd&R>H zN-%Q=25`Nhq!#f`0^}D5dB)l#n=j$?o0g?~JUV&6%ZA%p&&^4`rSGxRA~oAuW+v27 z@x}Dc^9M>dxP6&r!-zmojvS-t7}g&$*J?E0;L!@8+e6>;SQ$JX@{n$NW=D&mWH;d} zO^;~@WwTcG-h%=`E$$JYznG zO*CR02|I)q;KZ=fUc_*j)dwvTHO$>WfYEa@Xe@<*B?Gd{qDRA`!X%c?5IlNYcNuz3 zLP{{Swg4S7U?YprP8dq^GzM#AZdBBZ*&Z_;Yq$&34qq|s!~bqdy83VzE7UTBmEm~j z6c?yJ^DAu=8HS!@LN@U@4K5cu);vh}uCy(J!pxT_{Oku&;#x->E&@ z0)(ZzW6bVdUfGb+|9GwnPkW4LvK66c+k5faAM&3ZUNDf0dF7$zrSrQT zECoJTyaQ-QZzr^#dJ7$-uifo-mOI#GFKGjfIpXReWDN#Tn4u&bk58;4@DZP)mt}p# zKXhVZ&p3~^fhUyZ5+&_E^gKwDx!m9e(=K-!uaiVJI=C{wO$$iRmuF66Ov_m)t*$N= z^!5aPBd!aAU~==x(vnnDOe@5oGv2Ge^LT{NTpR?1OL8cmfkx(Y&mMu68)7=Iaaj=( zU0gYXDZpw6&gk302 z>3ahiyw;0^3=t*A%y4fBPEO*AtsUG{g3L$>n@cJ-FEWYkmpU8!z`7&>BjgPW5MkP* zluGKOi*UpL7)H;U@w%c=Av%JKW{-M#S&(h_+a@TAp;eBCQIh+Z%qa>PAy*}sg=BJV zO^dX~UCDIH1!{kt#S$~5b>@u}SF=R585TxXpm|b>Kz%UeUE6i%SWE^3P<0hYxDwh( zs@FOk%+e$n9HtgZB->fUmE(9Q0D;xqK*fPA6i_@IB%KqnGy`l$(?xA>F$esAvO)T6 zfDKoaBDFa)W&?FO+IH4Exm=@PdoAp>WZ))~4TczQ^p@3-G-=sHK!d%Xk(|ApW>w>? zn`}{N(Issv{y2X@rRTcdp9#^XPaz-+g@~a4HgA#!4fOjDoviHoAIG&8;h;1uq32;Rgn=bhX|~yrTgysS#sjec#iNZ7SV-j9ZV-YalceaSzY-Vg z5dz_ju;C!a#N}ryM(Ga!DWvc4!{pq78m#K;{j@`%Ai{bt(%Xl zaN=s(yd3OolQ7sbDxEhD!)6$fK6c}p#QBJsgfpd5v(XP<@8XPCIEIw4$z3IKw?-=* z`L;ygb)r{Vv5fhq?HJeu#Vc@)WSlwD<5{2S`Ll=pAD^smh;T{>%8RISDGke69@27% zT`hF($n@<+_&5nx1Dx2N>u`DWw5gm@m>_#|hqnKBQcf`TjC6x>S3t;X6i*T*lc{ZG zkVz`WyswarBMXJhy@OpzLq*CWON^Ll#fS<-yjbITi3+lwxr~j;DKf(3GIlVzw@}O) zC3e!MOoWxzx0Css-Mte{Q{L<*W|FL3I=^4M(9q2#AjjaGi5znBhag9fj)8!Oz;Ztz4?Cv&5meOJzCW8`9Ai zmg+8}X5wThx6dzB@({A3?4Yf~a%t+7@l)bLlwuqlZvXrgd)tSDqgS|s1Unn*t4H_# z^z`1wj}KQLcNRNeKqbyvH0?|FA^g*qEuBi!hwv&EL!AS^D@lDIFtziV8jXEne~r*w z#}y8D-5nf%BlrWHF=vweZ+GR`0{oQNg$TOJu_NLHyre>}@TUhaG~a-bnz=4oMD1ID zl)|IQhO2RI=ZM)c*@1c;c&6QeUkJgapJ#E0^ib7_k^OJC<$muv>;=#)Z&WDZ&or94o4WpPpCXFNEB($%z$32{KE1ob?20(056 zTL|XB(4A0H5J+oryMt^?*|Ji-iR02fHloGT$t=kO})*KagQm&|IX6%&r9kCU?=Y$psb!?);@*Nf)E@-_;5f&)uVvUkl6`I%vRi;7Cd=3%qu7Wt0**MD63AWNsXj?WE?oN_)9-D94 zQyJ0^Tc^;``%al)ojGL%m&+>>idZhONW?Y|1RNk)=@&6q(Lb%SP5rg+4M1uaO5J|!a5FrD+ zFO{H!52un(3q?gH9->Ja0I?AU(9IhM#OOX7ek3EOIB-X;eTbgxY#-1s^-i}JRx3yx0)qPLL^g-H7 zBy<^jPXScO$u^l#R6dXj*W6<29@Fe~C!qV{{7_QWzv=&ba`Y1p@-ZVLC~qQ8wjA^l zw{1DZj9218SNIfbh3bmN&C)vx!GI81M3Gb{JX17HkI*VK)s0>OS=cj_ETOYV9hGDZ z3NvDF_w3{2v?WMpK<A!&|?pRKD=#KGpKV?R(sS0~CJY3J?78r)Ts+gGZL zUp2!xDzK)9V2J4KDt^z-QzYVvdRJ+BsPG1N9wGf@TXbiTP6U!`kM)?forri4PgZ{5 z)B(cbaD|uH-|@xph~)!f$Vq4?yb68t!|2DXWOZoSN=hV;Oh=q!A|(Ehg_=c4jW0k; zq!6bg71<4eT~ejXY+b{A1YUv9zxfrD_}sNqyG0#|Go=vi^|Lm_Qp*HxZ!E*jTQ|R4 zI9E*TIm?p35Eykd7^LJxm^-_0jNy6iw!?0hJ6qj*Pz8G1c!x*=%8^!QB)C67%% z(<*RF2iH1ZKzz_>gnIzt)ZFyN9J1f64f&aFccx#+97u2Nz{7VmIXz&Sa+x}Znpj%F zhbAWW6NfsI*qk5&`sXKuSG>#1MMM|b&pOlaBIG{nK*VecAawDCr3*?|f}8S@EVO>A zhZC%G5(*Tn;ofGUQ{MDtR{{v@r^WcIMNP~J&``bKxz1Vj?9bCD=pfM9y)o$}<3DmV z=+Q{C*(%eln)LV`U?7SV$ogT`?h41|WI{V4a}J`FnSa6@;T>}Jt}{I^z;!og<&p}* zE5yM;!g2(F3xQ6haL&(|@QrWga6c@J06)=^(1WSsKnwD_e?~GVreP;u@_@zLyb|F% zrLVRx{yz8l=i0deM2&D$+I!8b2#5gSHAmwMavjwWQqhHFFrDN+Ob^?8Tr?y&Mqq_V zl*_hx6i_$^gj*$+1e-E~kc`de*#JlPfF8C_>CkLi9_Y!l$C3y-Wjlr?7>643B)tT{ z5-K7nqcw)Y$&C70Tw7-_M^!Nd4uW7RAcJCLoxZEa{NLJ|nYks!q(g)f^R%!erlotL zd0ttHYIu0C`GTr6Z{_d^dumE7kUz6vxqt6ow;i<_*m#zkrAKYe5X(o)pn5+~7H$Xf2kK*QvwJHM1W9l`Oj@C6-Y9&7|=($Z)EoU5Z;s;)F|DNMy1dF6x}w@hW&a(Oug z93dRbZ!wDapPzZPAn(-wtM2La8ko@_VtOAbVP2pB>TpuYstz;f3jP?)wmmH|msV`aRs0_CB6-eK*z{DP@TGfrF)NG>Xr@zL+^V{# zl3mIaL|-D)xO83RW#$`R8TnS-THO~N6e_nI4H+{p?a;WfSk$WPyJv)zr^THgJbC!= z$xr?DKRs)1Vdy=Mv~7EeX(m9y(cHefS`diF=$ZXDbqiMs`-PdBK^O zpQs@piJO|9+S>TaGm4ZW{M+#DtRuT3_2mBAb~8X5&dKWSYWZ z=Lfwbn5EE=(c$9kL84A@oI%tH(@NAc(6ecM(t2ZjDGA<^mc^o&65CB4-GrBi^rHwa z0*jGPl5q+b)h;6p{3J3~v9|RWY~1{Wfa=r4&G;k9T?QZ|9FbWr^$Sd&p+mCI<<%*U zn5ohr93Ac`L}ADjqOOn!lxxw?Su5yzLnAevQi9g@}~I(M>iK( zaXxS7bcT02w`jB$+cdtR!N}5kX`d$#Z@%EO))BtI?MW!K%P|BCgf67J^K(qf6W!NW zeq4RDiuR>hRj(Cl}pHV4=0Dm4@iwjmQPS7P%^A( zI8iy4L#Lmz8w$UKF6*A_(dCf3hZHc_);Bl`1UEL=*~}Xpf=6!=pS80Yypx1_1kAnD zP;!xnug<{TCH3_JVepH?>KbCUH@<;wgp`?^_=9^BLdFnfLI<;IX=^XpaxI-64gWUW z?H!)<$Ee>%xn$vVe1|W!h7$2;hYqYO(C*Kl698K;MW8H$e!`IpaXp7FEJ58`;Ny>m z6WapRB)fa6n8;x{5Cg%aPr<}YNHFv_oXmU48XP1ZkGJ0?X=5FoSK!<_x4_|gVs-LK z7_zd38`WrYm4b#X8ih}l%emTtPAp-oVDXpRc1fW~PZ@<2pw$(~ESUR&H_o4XCJs6kZQ@S5IAZ@V<^C$#1q33;RukWw{*)M+W{O z32!)nh#99~4~M~iCr!-1OI-9Tdi8P=f+3>C2eOF&;*NGV zMi0>C|D$KKkP;H`(s+eza+5PL8v!aQ zb^_2)oa9;ubu#8*?n#imj$dLv9O)a@GgDKtZ?yw)$Ey{|(G-UX(cJwYVD>x&5w$0Co@Q zvk>#J(Q|YcmoQNEwIF34uhd|_*jeCw-y=vu{$Y5lKpf8F>YiEgoIXb5-nFfn0K)yNZT7R+f%8Su#KYY7F_)Hu=>pAp*@B1;2ck&~<;RyJ3XJ8Z1i#a2o~x)% zQ^C znAdxES;qyx;NbX-ON~k2Mqb0`O;i9}!)2OFBDXLeK*^aJG*^-4Ayz8}abY71l0H_4 z5+Ndi1u&-}CvmK%FS+>edz!an+?Nf$aLS<3-sz^ALih zTU%(i42sruD9H-%xwO)vyY!hjl9CUah4w`7pEZCK)`-?ykR`<*bm%B@xo*%iHTGLY85!|JM zL#%He7q=%LK6ja_#Q2m-{0cUWulk4EC^_Bh{^l=Rlh1m$Z~t=T_Ai^?-g$BRF6zYN z$>xp4|A77W`GWj-efa9dP~Xh|W=Jm=JHvmZ7o4}K(0_Jf>V1@t@1Ar};1iVyP!_?m zZ4hv0bdp8*5crv#Nc>a)muuTG7bL<9n_5&_=!{dr#j#(Q>B>xN^nnXkc0j5UWqyAE zZ3+$ycWMfZ^+zB`ie^$8A~wxzoa;;wYTenFFz3k#<$IYdS~c215TVn3-Ca%r{LgM9 zUUdT&{!1h(yhbr`Z85ByeDP(~eewVEG3Ahb6tRYt+@|tm&Id$c|rGODx8&b>7 zNf}!(uAMLid6BIb?_f4)(Ca=|dm6a}WQFVmg_3x0i6Op{bTmq@jOA#;l>r{-(_sUW$(_?IOXzmvcUl&%epMEDpKf{8 z3a&X>bYXbPWOr6CfZ&OXl_m^64OvbzkXqnKJtQh%SGrH~E*dKI}f6u}O z{#xjfTne^(EGp-_{MkZSV2hMvvc4 z=@E#ofMgDT2_@FCmJ}H_L$@Ed_YZeTf5|fZ0reAK9YHsM(Bz+y#c5iOI-q35&EnT)EKfqV5z*XmcXwc|%84nM?#_#{vlJUc?t zmvkxO#}Yg*GrCa6tr%@a@!fy?Mg5WT@xnhQs>{7tt6a=mgOi0CCTD$Bi0iro-^T)vJ`9SM+{pDBfQLnfu&Mczp&BYPEki*ifJVt z)#G*rJIO?Vf`8EZDm$>x zIG8pU5mU8U*4+c+>+gnn`Oo~bOYly&kMxlA^L=$e` zI2t|TUbKAQzJ%wcDj5(?Y|!u#iUOK=w1NCN=`Al#@rfMfg#(x0i&D|0i}TQdHQX7zW!V&}A5`^`Jo02Gzgl)6tbb2LV0=)`P z)55`bsZtfv)%pvzLZn&EqBqWqSY`XXCQYngbnwg_F76XJm~hS1iZRGMr{I7xAydH@ zkwuOT)9+sYOK<7#x32wqcVTmQIQjYX-u>q=nb9ws!Uf1Op9WfdV4t%X*GGTgiv-@|d z`(L|&ViQqK{Jo%mZ}RUK`nPU}yU2c|;7U<769Qbz3@_k)aa{;x&(yU)AmagTEl|%tSVQHC!!5UVgj<@N5qf$dluQvv zChsJRDbM7?&01L_U3g@o9h~kC?)!=5DeP34sPXEv<|$^7buwTb>%nEpLV@6*2_oO& z=|BP51ti&O8NQ)we%{}iEn$M7#&JPoj?YL^W|-hufSk@oGFhM+2b7kj{|%~9h7Tae z_eDYTG$|h%Uz>&E6G|F@Cv_YKmF|vz3itGum)2M%0sr6~^h4U%=UO>waC+P!G;*ow z+?jqU12|k__Jn!(|P1|3v zX~TcIOR4C@FWfRZkk|(E_4Qxo7k*`I7ry7~+( zn?=6WD)64ruGqO`g&GEQ92y#YMVKd<=uJAJ2GE{MjS~|(G+lsl>a3RB9ucV=ha^%t zP{dr}YsxtjQqjb*{wv^ho%l_2bHp{MmjL%{uHfwXF3PL6B#%TsW4@N5HA(K`YZ z)#+nS>k>8l!|nfl=Mt$9+y3z0t5?`xK+d*_?FV`}Fg2f^CrP$>l(zYNjpNh4Ymu+^ zh8U?D%X-$sP(Rx8Gcza_WdXeJh69x6llph{iaG?O`VU9wOyhJF_moI6m@V$`CX@S8 zzdt>le*2sRAVVsfDK%1I|4nQRm{V5?w-y&IkQ>djfa4^$u<7mHTLc=NH9gAnwc`^0znO=7Tk|JG8f_s5+ z9ry&b&qml%s+c7BCZMUz_slP)xvo=eMxCvd_<-mzanwH7Rve^{e0|7L>{eZBz`c0! z+ll~lgLnm*a#9TkRRSOomzSSEUi*_=%7F_vXoM(4t?Sy>r*au-4*xne8z=oGWJz6^ zv$BkssK_`49oHTTB(oaei(FYjKZVFxSNc@m=VPVWEy4>CI(` z$W7qkVLF5P{0M$jh~L5Pe{CO}hTEU#lM~s-ZUb899TqR|mhQ1AK+!SYBC!$|=deX_!Gxh&ZfN-j-VX+@P7VI*0Rr@yqi$)s=33<`)jCjv+?BF z+A5oT0k%vQ1TWelo8n(h2GLw>jZmq-2OR{P(e4_QD{nZ?hj05*&gk+H7?U*zfY)j?eR{??_owbXjiEA4ene00 zN(#7bF;_DGG{P|BmhUd;Z`6n#U3p~af6JJt$eiZog(=!e$!6ySf*f+XlGBC<1Ez+O z%rh-Q>OGR=RYDMt|TY6O-5X!-&!MZiI>sMm7k6vY${&oAM87X(yb zGg*+$1w@tk5v?=ItBgz^fhg3!xjpnj0qu9NkGQZhoTWuitXS4nlia3b1X4l@M-Ph;CI)N19Ycn&Rm#;sgB`KD$N zZf~$kXxYw9;=QuaBO&=$c|$<^uo2lWVwn)2HD$JjK|eYH3C*j9S%-Uvf;y23V-qN2 zcyu!9B>S~+okl}>{mHY9{`Y_GKYsFf73+y(NQE7pUi13XrkU-pH~##TuVG@hetmCc zWp#ah^?rY2O}e=?rQOPp_a6U{o8jP8Yj=;H++TaJmfL+br5(>v_8;Hdc>e6(LqPX6 zRgCM`A(%^3=hCAI5b37h%uPXSxovtb(1H5`?b_ZaW1MHg*g}wDzu?2;RdO!F4=}Rk zNSBd%==!;Zcd^G2=29EnQ7;$MN-{2o7ip`yjX%+So$K41-v+2J?JTH{7`WU(_>6LT z=Mc9nZkz1)lD3_@2;k_$Y}>KNws!h3x1(^!|F5QoSHlpT4a3Vd=XRR{Lj?LnSpn9D^>pmCHU;bV8%t z)13y=$&HHb!E9pBPkegukc6fC+zD&W;vAV%#dkz3pKn%=l!mkb3gOT6pr13eAaMk zqa@oIky@vMtv2_=dB2_F_&WFJQxf&g`#sPwBj4-1y-eLvy-x?+6_@+5^L`z38qWI- z4+yk49MAoEC3xJV^=-258uVny>@*A1=UW-!urwuA?R{VS;qjAatNs64S)b~Iw61MS&PQQz0m>cMc@$EYre8=XX@X?9aRA%@684x>YI->K8N;k!n-Z$hIDH- zU~>7~c)=Ynu1#t@$CWwURJXl4hO?=yJx%(?^R}>Jo^(RHDdqV$I}>z+1yG1^!tu=! zlgj({-% zUdqSrxEbk-{RsIYnpmMF`i4wa(Z`b<9)oyAZzF61h7UUC1Xfxh2*wXbdf2@L{J$wet8U9UR~>? z34rf~F#*C13^hhp@!LLl7R_zr+uQdBK^Lk9#3fxTB>oaC)B=gWy(CD2Y;6T5yl;mm zG`Jv0O-7?sZ-s_0DArr>BCjqD0?g{^G$8EV6gd3t1wpAPg<2h171ZtRtgLFEtjxax zE6a;ER&I(L`7&-}gdwy1b!k%rXJ(6BG80b#WOJrvq3mVA4=sn;jNBv<)#a#{OXV`b z8EDau{+p;0e^m7t8)TC;`l9noL!m~k>6^duo8R5;{9~r7ZC7ILl0e~rnd(!(pB40c zat^?gsf%?xH{kK3>5{Zw_XPBsV12h2^GngCJ#Nm!Uz~F~h0XoG)2cr{b9%K^w7t8F zxj+n1(_T({c2=fzN=!u!m zE2yf0QN^*ZaOFT@Oq=BCw&zDflpBC$K6pDCzutN@+Ijut<^N#B@aMFz$D`x@!Opv_ zr}ZC5j%63=0)QzUaInGnos5*)l1RQo!gkw5YxK|AC2L5n12%Bi8Y(aD;}TkyG=%kd zRXGlRn#bF?0(kp?dpOXL?C`E8Zyaw*qDKp8?R>R_I|ZPfa3vcq&*6S=cyh)KZC|j; z(|K-an{NPe1GLZ}53IdV4E%tknBEOa{faoNp6=#t1g981mbhosgM%@UwtU_%X3~Ef zbAA7gyO_AsF^)<*o#`Ml$})4nX$+@ntAkzjvNxFd977jzim5Qv6E1xNanj`*5S>Qe zXV~EsT6OT51Cwya!j3@3e9#19*uV8hTeqm|eUxWiFj&qP~ed}w2_8OaT( zAT>I8Gl-{Ma~f6JFN$+Y_Pe;54U(6}VdDz7*p+H)_41=;+Tr#Atn2$sibhvd#VPP3 zHvnKlEcY*OVcBkpj75El?hg;2eBb~6*}aujsjRb=e%tad=uGaC z!{4gKCmk)|X-A-_f_YyoRJwY*{g@Mpv%K&Ay&+CX8z4+qu(;G@XMgSJzAu&gR)}$4 zeF`kgo=FE2)rKR`_H`-rWk2FLA~Vw_nW~B)8(BzhA|H=eou%wrqkyu`a%TzExv^b=O#wON* zZ*l{UQ^+K02z`bKt720>)RY;2n4shf`TSpO$y61~|JICa_)ja6w~t0Wg-!1(lQPGI zCKc(9Ez_F*Q#K0zozPVl;@+lpjI+DOQl!3$I|RL7kt3K|qSPWrjHS$E;Gf9))734* z^A9q!{1-tI)H&Z7K-O%9Lu@?dF7KC>9l|S355_ovAzTGcCl`IIy#={Rm>-j>j9DC# zgh!ty$UG~G8Hole*Or$nLD+da9zpnd&Vb!+t@Iq(M+m%?R&ad%*k(OVx_Kp^mhTt1RRxzf|#RF|gR!kbw0BLO017cO+ zQ1+UUIxU;*MY9p?0oKr+j3fx1u|F{(?tAV=lt|CRl!2n;1j4ajUwLutDA8s(3S+|_ z#p%?yy&)cRR!wA*?4PHttlSUS`R?`Ri$O{9bsKzF#rR!i__&_p0O@-g3n3j8_h zJpACrPji7K4pZIG(J}x{51NKvmgA9-7UP*09ZII8i!Hch{Zds4#lHyVeA(I*Wa`1=t zz1kP(e=16)c2-NOPlPLxJrL`}r2HH#Q$5Z(V9(QVRV%wnWCMYxeb+#EV77!~#S&L$QW8Po=Yu1Lvt~o%!$g46 zAT>-91DrYZI@}s(t*|0h`>IFKB!ihmgv^2Sji7ziBkXAs)XZ75r4hCek9SoMf#?mw z%H$GPXER5m-am7lq)#kT>QM%D>(*t8JXEXG633FQ7=1NXn8VFPH5y?fk_T9xL^4~s zuf#(55cny*(+YvC%+=52sMu2LSvV7au`=jy{?eOF_P^L#TDUv8yLWPoo5_FUwvAwk z-Sd`8J$Y6Sf1#6TkgQq;2=L&a29EB#-{NuYk4lHnrtU<5s>=hUwU9)HVOp7s_l5!C zCe}a#4(MNK7SFc#`6isL+H6$xIRe*?j!#e4waUX;XRuN--2CWh_3-$F3D>MM6Ot2$ z><*8Mj764?z%z3xW9{lqzI7Kak}n4cj^q5ofyms_==Uv>(UB-2K)K@}7sk=Yi8;7(i8(v7K1(=NL#;M__P?l6p2}EkMSAG%Es85VEo${qC_lLjlnE>bcr^Dj`C4>D# z$&bN!5BIEecYdwf~mGl3(BY1GAX%ucj8P`hDDXIvyUg zHU!JX$)?W-Y-tXC$dt^gVN2KCZQeWD{Ym&$qu4JG5Fm#a#Lp%QfkTQ2L6=?DBcqPV z6HqS)W?${IVceXjdDpep*zCr}UF3)NsqIlO%*93a>@RH`UkO<~)sH`+}kw(uNDattk*hbMyrT)f~md@I;467qMENBVW6N2s+Z*AIouP&|2Kb3o}81vl{1GE z^!5k`!Eg-e2*MJDm-})HX&(V}tk*ciBie3MO}$}8$Wjh{=bKgGRe=o0tw->_hZM<;u|?r$esTa&&1F-(~LZ*P3@r={OABi^P=4M)qE z9~=6w%+r&$N7bR8>ZR@yNe&-%-{P81tOHkx!}KMvh?GD6@MhA&H3-jn{|Y6C$|hqp zClV8yFktpvHxzvL9&Rr@L_xys@jIzL*nx`|bunSY)2T-A;8r^s!GR5PL)>YcBCNCy zZr+8S$9*YF8NIR(7PYs>$@Jz?mT~Lhla)XASO3IFul)J=`xfB&k=+KWN+j^#rr=*M zaBEltO|qL&Q( z=@GcXjgZ#ql>}l_4MNW_Yf}yHQJ|SLU&Khv12}`w;H_#ev_*?hXroQ{_WP5A!Qfa7 zyiBTF-*4|~X50!&)}#$mue+iy-wAH0l^g{SU`oH!F`9DpEslDgzV8S`?|Y1~3-%kI z?%2IGN}xfvw#|Hs)d967JY?(9BBJMMk6}2}qf2Djef<0(rN<6yZ@b02Ik(y6Lh{8J z2@r^+q%W%HQ`#P$ctw0`fF}8WH$2@h_JjJ|J3gep0yXocvdj2i{ z`cBuPkH`?RLVELz`@hBi>7{o`6SCR{)MfuE%HXZ7BgK>V{H}gYs!hSvz=URgaDY=~ zk@NHfv}F~R@#(e<)!7NM`b3>&QNTfXHf9^MwaH+e!bRh`=`~z#fVpYcM3vY=NV!3; zDXGF_IeTQPg>>KkMdx!k#W5tDlki)ky{~}v$Ti?&(t|94Fcmx81HT>NdR%OSBXmr% zbdj8&^P%b_1*4Fc0{VG%htIPRzj+{tPV3H4)EtQmPU?25ClaTTd&T{3%QtwYYB#OB zYX8vaMs1$F0Sxn+)};wKbmhW7iM?|Zq8fG8qUuB3wi6cA8eaNhCPN@hn3UHb7Lx`a zx{sZ`=}GEts)G+AUjC(9c63ivY=7cm;-|FbTeivB$cMbnyCv~Be1E#PC&hB;tw=%Lt8*lG5h^2DI<;RqbN(g1ETt3>6B3#{~voed+9HIQ?dkkR!Z7d5Tg2IN@ma2

*%F9vO_2> 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 z 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.0.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Cache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for caching libraries", - "keywords": [ - "cache", - "psr", - "psr-6" - ], - "support": { - "source": "https://github.com/php-fig/cache/tree/3.0.0" - }, - "time": "2021-02-03T23:26:27+00:00" - }, - { - "name": "psr/container", - "version": "1.1.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", - "shasum": "" - }, - "require": { - "php": ">=7.2.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Psr\\Container\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", - "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" - ], - "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.1" - }, - "time": "2021-03-05T17:36:06+00:00" - }, - { - "name": "psr/event-dispatcher", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/event-dispatcher.git", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", - "shasum": "" - }, - "require": { - "php": ">=7.2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\EventDispatcher\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Standard interfaces for event handling.", - "keywords": [ - "events", - "psr", - "psr-14" - ], - "support": { - "issues": "https://github.com/php-fig/event-dispatcher/issues", - "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" - }, - "time": "2019-01-08T18:20:26+00:00" - }, - { - "name": "psr/log", - "version": "2.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/ef29f6d262798707a9edd554e2b82517ef3a9376", - "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376", - "shasum": "" - }, - "require": { - "php": ">=8.0.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Log\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "support": { - "source": "https://github.com/php-fig/log/tree/2.0.0" - }, - "time": "2021-07-14T16:41:46+00:00" - }, - { - "name": "symfony/console", - "version": "v5.3.7", - "source": { - "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "8b1008344647462ae6ec57559da166c2bfa5e16a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/8b1008344647462ae6ec57559da166c2bfa5e16a", - "reference": "8b1008344647462ae6ec57559da166c2bfa5e16a", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.8", - "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2", - "symfony/string": "^5.1" - }, - "conflict": { - "psr/log": ">=3", - "symfony/dependency-injection": "<4.4", - "symfony/dotenv": "<5.1", - "symfony/event-dispatcher": "<4.4", - "symfony/lock": "<4.4", - "symfony/process": "<4.4" - }, - "provide": { - "psr/log-implementation": "1.0|2.0" - }, - "require-dev": { - "psr/log": "^1|^2", - "symfony/config": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/event-dispatcher": "^4.4|^5.0", - "symfony/lock": "^4.4|^5.0", - "symfony/process": "^4.4|^5.0", - "symfony/var-dumper": "^4.4|^5.0" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Console\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Eases the creation of beautiful and testable command line interfaces", - "homepage": "https://symfony.com", - "keywords": [ - "cli", - "command line", - "console", - "terminal" - ], - "support": { - "source": "https://github.com/symfony/console/tree/v5.3.7" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-08-25T20:02:16+00:00" - }, - { - "name": "symfony/deprecation-contracts", - "version": "v2.4.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5f38c8804a9e97d23e0c8d63341088cd8a22d627", - "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.4-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "files": [ - "function.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "A generic function and convention to trigger deprecation notices", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.4.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-03-23T23:28:01+00:00" - }, - { - "name": "symfony/event-dispatcher", - "version": "v5.3.7", - "source": { - "type": "git", - "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "ce7b20d69c66a20939d8952b617506a44d102130" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/ce7b20d69c66a20939d8952b617506a44d102130", - "reference": "ce7b20d69c66a20939d8952b617506a44d102130", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/event-dispatcher-contracts": "^2", - "symfony/polyfill-php80": "^1.16" - }, - "conflict": { - "symfony/dependency-injection": "<4.4" - }, - "provide": { - "psr/event-dispatcher-implementation": "1.0", - "symfony/event-dispatcher-implementation": "2.0" - }, - "require-dev": { - "psr/log": "^1|^2|^3", - "symfony/config": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/error-handler": "^4.4|^5.0", - "symfony/expression-language": "^4.4|^5.0", - "symfony/http-foundation": "^4.4|^5.0", - "symfony/service-contracts": "^1.1|^2", - "symfony/stopwatch": "^4.4|^5.0" - }, - "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\EventDispatcher\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "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.3.7" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-08-04T21:20:46+00:00" - }, - { - "name": "symfony/event-dispatcher-contracts", - "version": "v2.4.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "69fee1ad2332a7cbab3aca13591953da9cdb7a11" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/69fee1ad2332a7cbab3aca13591953da9cdb7a11", - "reference": "69fee1ad2332a7cbab3aca13591953da9cdb7a11", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "psr/event-dispatcher": "^1" - }, - "suggest": { - "symfony/event-dispatcher-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.4-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\EventDispatcher\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to dispatching event", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.4.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-03-23T23:28:01+00:00" - }, - { - "name": "symfony/filesystem", - "version": "v5.3.4", - "source": { - "type": "git", - "url": "https://github.com/symfony/filesystem.git", - "reference": "343f4fe324383ca46792cae728a3b6e2f708fb32" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/343f4fe324383ca46792cae728a3b6e2f708fb32", - "reference": "343f4fe324383ca46792cae728a3b6e2f708fb32", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-php80": "^1.16" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Filesystem\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides basic utilities for the filesystem", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.3.4" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-07-21T12:40:44+00:00" - }, - { - "name": "symfony/finder", - "version": "v5.3.7", - "source": { - "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/a10000ada1e600d109a6c7632e9ac42e8bf2fb93", - "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.16" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Finder\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Finds files and directories via an intuitive fluent interface", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/finder/tree/v5.3.7" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-08-04T21:20:46+00:00" - }, - { - "name": "symfony/options-resolver", - "version": "v5.3.7", - "source": { - "type": "git", - "url": "https://github.com/symfony/options-resolver.git", - "reference": "4b78e55b179003a42523a362cc0e8327f7a69b5e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/4b78e55b179003a42523a362cc0e8327f7a69b5e", - "reference": "4b78e55b179003a42523a362cc0e8327f7a69b5e", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-php73": "~1.0", - "symfony/polyfill-php80": "^1.16" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\OptionsResolver\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides an improved replacement for the array_replace PHP function", - "homepage": "https://symfony.com", - "keywords": [ - "config", - "configuration", - "options" - ], - "support": { - "source": "https://github.com/symfony/options-resolver/tree/v5.3.7" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-08-04T21:20:46+00:00" - }, - { - "name": "symfony/polyfill-ctype", - "version": "v1.23.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce", - "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-ctype": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for ctype functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" - ], - "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-02-19T12:13:01+00:00" - }, - { - "name": "symfony/polyfill-intl-grapheme", - "version": "v1.23.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "16880ba9c5ebe3642d1995ab866db29270b36535" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/16880ba9c5ebe3642d1995ab866db29270b36535", - "reference": "16880ba9c5ebe3642d1995ab866db29270b36535", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's grapheme_* functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "grapheme", - "intl", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.23.1" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-05-27T12:26:48+00:00" - }, - { - "name": "symfony/polyfill-intl-normalizer", - "version": "v1.23.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's Normalizer class and related functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "intl", - "normalizer", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-02-19T12:13:01+00:00" - }, - { - "name": "symfony/polyfill-mbstring", - "version": "v1.23.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9174a3d80210dca8daa7f31fec659150bbeabfc6", - "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.1" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-05-27T12:26:48+00:00" - }, - { - "name": "symfony/polyfill-php72", - "version": "v1.23.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "9a142215a36a3888e30d0a9eeea9766764e96976" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/9a142215a36a3888e30d0a9eeea9766764e96976", - "reference": "9a142215a36a3888e30d0a9eeea9766764e96976", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php72\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.23.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-05-27T09:17:38+00:00" - }, - { - "name": "symfony/polyfill-php73", - "version": "v1.23.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fba8933c384d6476ab14fb7b8526e5287ca7e010", - "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php73\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-02-19T12:13:01+00:00" - }, - { - "name": "symfony/polyfill-php80", - "version": "v1.23.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/1100343ed1a92e3a38f9ae122fc0eb21602547be", - "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.1" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-07-28T13:41:28+00:00" - }, - { - "name": "symfony/polyfill-php81", - "version": "v1.23.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "e66119f3de95efc359483f810c4c3e6436279436" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/e66119f3de95efc359483f810c4c3e6436279436", - "reference": "e66119f3de95efc359483f810c4c3e6436279436", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php81\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.23.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-05-21T13:25:03+00:00" - }, - { - "name": "symfony/process", - "version": "v5.3.7", - "source": { - "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "38f26c7d6ed535217ea393e05634cb0b244a1967" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/38f26c7d6ed535217ea393e05634cb0b244a1967", - "reference": "38f26c7d6ed535217ea393e05634cb0b244a1967", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.16" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Process\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Executes commands in sub-processes", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/process/tree/v5.3.7" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-08-04T21:20:46+00:00" - }, - { - "name": "symfony/service-contracts", - "version": "v2.4.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", - "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "psr/container": "^1.1" - }, - "suggest": { - "symfony/service-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.4-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\Service\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to writing services", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.4.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-04-01T10:43:52+00:00" - }, - { - "name": "symfony/stopwatch", - "version": "v5.3.4", - "source": { - "type": "git", - "url": "https://github.com/symfony/stopwatch.git", - "reference": "b24c6a92c6db316fee69e38c80591e080e41536c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/b24c6a92c6db316fee69e38c80591e080e41536c", - "reference": "b24c6a92c6db316fee69e38c80591e080e41536c", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/service-contracts": "^1.0|^2" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Stopwatch\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides a way to profile code", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/stopwatch/tree/v5.3.4" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-07-10T08:58:57+00:00" - }, - { - "name": "symfony/string", - "version": "v5.3.7", - "source": { - "type": "git", - "url": "https://github.com/symfony/string.git", - "reference": "8d224396e28d30f81969f083a58763b8b9ceb0a5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/8d224396e28d30f81969f083a58763b8b9ceb0a5", - "reference": "8d224396e28d30f81969f083a58763b8b9ceb0a5", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.0", - "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "~1.15" - }, - "require-dev": { - "symfony/error-handler": "^4.4|^5.0", - "symfony/http-client": "^4.4|^5.0", - "symfony/translation-contracts": "^1.1|^2", - "symfony/var-exporter": "^4.4|^5.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\String\\": "" - }, - "files": [ - "Resources/functions.php" - ], - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", - "homepage": "https://symfony.com", - "keywords": [ - "grapheme", - "i18n", - "string", - "unicode", - "utf-8", - "utf8" - ], - "support": { - "source": "https://github.com/symfony/string/tree/v5.3.7" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-08-26T08:00:08+00:00" - } - ], - "packages-dev": [], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": [], - "prefer-stable": false, - "prefer-lowest": false, - "platform": [], - "platform-dev": [], - "plugin-api-version": "2.0.0" -} diff --git a/tools/php-cs-fixer/vendor/autoload.php b/tools/php-cs-fixer/vendor/autoload.php deleted file mode 100644 index fcc140c..0000000 --- a/tools/php-cs-fixer/vendor/autoload.php +++ /dev/null @@ -1,7 +0,0 @@ - - * Jordi Boggiano - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Composer\Autoload; - -/** - * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. - * - * $loader = new \Composer\Autoload\ClassLoader(); - * - * // register classes with namespaces - * $loader->add('Symfony\Component', __DIR__.'/component'); - * $loader->add('Symfony', __DIR__.'/framework'); - * - * // activate the autoloader - * $loader->register(); - * - * // to enable searching the include path (eg. for PEAR packages) - * $loader->setUseIncludePath(true); - * - * In this example, if you try to use a class in the Symfony\Component - * namespace or one of its children (Symfony\Component\Console for instance), - * the autoloader will first look for the class under the component/ - * directory, and it will then fallback to the framework/ directory if not - * found before giving up. - * - * This class is loosely based on the Symfony UniversalClassLoader. - * - * @author Fabien Potencier - * @author Jordi Boggiano - * @see https://www.php-fig.org/psr/psr-0/ - * @see https://www.php-fig.org/psr/psr-4/ - */ -class ClassLoader -{ - private $vendorDir; - - // PSR-4 - private $prefixLengthsPsr4 = array(); - private $prefixDirsPsr4 = array(); - private $fallbackDirsPsr4 = array(); - - // PSR-0 - private $prefixesPsr0 = array(); - private $fallbackDirsPsr0 = array(); - - private $useIncludePath = false; - private $classMap = array(); - private $classMapAuthoritative = false; - private $missingClasses = array(); - private $apcuPrefix; - - private static $registeredLoaders = array(); - - public function __construct($vendorDir = null) - { - $this->vendorDir = $vendorDir; - } - - public function getPrefixes() - { - if (!empty($this->prefixesPsr0)) { - return call_user_func_array('array_merge', array_values($this->prefixesPsr0)); - } - - return array(); - } - - public function getPrefixesPsr4() - { - return $this->prefixDirsPsr4; - } - - public function getFallbackDirs() - { - return $this->fallbackDirsPsr0; - } - - public function getFallbackDirsPsr4() - { - return $this->fallbackDirsPsr4; - } - - public function getClassMap() - { - return $this->classMap; - } - - /** - * @param array $classMap Class to filename map - */ - public function addClassMap(array $classMap) - { - if ($this->classMap) { - $this->classMap = array_merge($this->classMap, $classMap); - } else { - $this->classMap = $classMap; - } - } - - /** - * Registers a set of PSR-0 directories for a given prefix, either - * appending or prepending to the ones previously set for this prefix. - * - * @param string $prefix The prefix - * @param array|string $paths The PSR-0 root directories - * @param bool $prepend Whether to prepend the directories - */ - public function add($prefix, $paths, $prepend = false) - { - if (!$prefix) { - if ($prepend) { - $this->fallbackDirsPsr0 = array_merge( - (array) $paths, - $this->fallbackDirsPsr0 - ); - } else { - $this->fallbackDirsPsr0 = array_merge( - $this->fallbackDirsPsr0, - (array) $paths - ); - } - - return; - } - - $first = $prefix[0]; - if (!isset($this->prefixesPsr0[$first][$prefix])) { - $this->prefixesPsr0[$first][$prefix] = (array) $paths; - - return; - } - if ($prepend) { - $this->prefixesPsr0[$first][$prefix] = array_merge( - (array) $paths, - $this->prefixesPsr0[$first][$prefix] - ); - } else { - $this->prefixesPsr0[$first][$prefix] = array_merge( - $this->prefixesPsr0[$first][$prefix], - (array) $paths - ); - } - } - - /** - * Registers a set of PSR-4 directories for a given namespace, either - * appending or prepending to the ones previously set for this namespace. - * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param array|string $paths The PSR-4 base directories - * @param bool $prepend Whether to prepend the directories - * - * @throws \InvalidArgumentException - */ - public function addPsr4($prefix, $paths, $prepend = false) - { - if (!$prefix) { - // Register directories for the root namespace. - if ($prepend) { - $this->fallbackDirsPsr4 = array_merge( - (array) $paths, - $this->fallbackDirsPsr4 - ); - } else { - $this->fallbackDirsPsr4 = array_merge( - $this->fallbackDirsPsr4, - (array) $paths - ); - } - } elseif (!isset($this->prefixDirsPsr4[$prefix])) { - // Register directories for a new namespace. - $length = strlen($prefix); - if ('\\' !== $prefix[$length - 1]) { - throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); - } - $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; - $this->prefixDirsPsr4[$prefix] = (array) $paths; - } elseif ($prepend) { - // Prepend directories for an already registered namespace. - $this->prefixDirsPsr4[$prefix] = array_merge( - (array) $paths, - $this->prefixDirsPsr4[$prefix] - ); - } else { - // Append directories for an already registered namespace. - $this->prefixDirsPsr4[$prefix] = array_merge( - $this->prefixDirsPsr4[$prefix], - (array) $paths - ); - } - } - - /** - * Registers a set of PSR-0 directories for a given prefix, - * replacing any others previously set for this prefix. - * - * @param string $prefix The prefix - * @param array|string $paths The PSR-0 base directories - */ - public function set($prefix, $paths) - { - if (!$prefix) { - $this->fallbackDirsPsr0 = (array) $paths; - } else { - $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; - } - } - - /** - * Registers a set of PSR-4 directories for a given namespace, - * replacing any others previously set for this namespace. - * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param array|string $paths The PSR-4 base directories - * - * @throws \InvalidArgumentException - */ - public function setPsr4($prefix, $paths) - { - if (!$prefix) { - $this->fallbackDirsPsr4 = (array) $paths; - } else { - $length = strlen($prefix); - if ('\\' !== $prefix[$length - 1]) { - throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); - } - $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; - $this->prefixDirsPsr4[$prefix] = (array) $paths; - } - } - - /** - * Turns on searching the include path for class files. - * - * @param bool $useIncludePath - */ - public function setUseIncludePath($useIncludePath) - { - $this->useIncludePath = $useIncludePath; - } - - /** - * Can be used to check if the autoloader uses the include path to check - * for classes. - * - * @return bool - */ - public function getUseIncludePath() - { - return $this->useIncludePath; - } - - /** - * Turns off searching the prefix and fallback directories for classes - * that have not been registered with the class map. - * - * @param bool $classMapAuthoritative - */ - public function setClassMapAuthoritative($classMapAuthoritative) - { - $this->classMapAuthoritative = $classMapAuthoritative; - } - - /** - * Should class lookup fail if not found in the current class map? - * - * @return bool - */ - public function isClassMapAuthoritative() - { - return $this->classMapAuthoritative; - } - - /** - * APCu prefix to use to cache found/not-found classes, if the extension is enabled. - * - * @param string|null $apcuPrefix - */ - public function setApcuPrefix($apcuPrefix) - { - $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; - } - - /** - * The APCu prefix in use, or null if APCu caching is not enabled. - * - * @return string|null - */ - public function getApcuPrefix() - { - return $this->apcuPrefix; - } - - /** - * Registers this instance as an autoloader. - * - * @param bool $prepend Whether to prepend the autoloader or not - */ - public function register($prepend = false) - { - spl_autoload_register(array($this, 'loadClass'), true, $prepend); - - if (null === $this->vendorDir) { - return; - } - - if ($prepend) { - self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders; - } else { - unset(self::$registeredLoaders[$this->vendorDir]); - self::$registeredLoaders[$this->vendorDir] = $this; - } - } - - /** - * Unregisters this instance as an autoloader. - */ - public function unregister() - { - spl_autoload_unregister(array($this, 'loadClass')); - - if (null !== $this->vendorDir) { - unset(self::$registeredLoaders[$this->vendorDir]); - } - } - - /** - * Loads the given class or interface. - * - * @param string $class The name of the class - * @return bool|null True if loaded, null otherwise - */ - public function loadClass($class) - { - if ($file = $this->findFile($class)) { - includeFile($file); - - return true; - } - } - - /** - * Finds the path to the file where the class is defined. - * - * @param string $class The name of the class - * - * @return string|false The path if found, false otherwise - */ - public function findFile($class) - { - // class map lookup - if (isset($this->classMap[$class])) { - return $this->classMap[$class]; - } - if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { - return false; - } - if (null !== $this->apcuPrefix) { - $file = apcu_fetch($this->apcuPrefix.$class, $hit); - if ($hit) { - return $file; - } - } - - $file = $this->findFileWithExtension($class, '.php'); - - // Search for Hack files if we are running on HHVM - if (false === $file && defined('HHVM_VERSION')) { - $file = $this->findFileWithExtension($class, '.hh'); - } - - if (null !== $this->apcuPrefix) { - apcu_add($this->apcuPrefix.$class, $file); - } - - if (false === $file) { - // Remember that this class does not exist. - $this->missingClasses[$class] = true; - } - - return $file; - } - - /** - * Returns the currently registered loaders indexed by their corresponding vendor directories. - * - * @return self[] - */ - public static function getRegisteredLoaders() - { - return self::$registeredLoaders; - } - - private function findFileWithExtension($class, $ext) - { - // PSR-4 lookup - $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; - - $first = $class[0]; - if (isset($this->prefixLengthsPsr4[$first])) { - $subPath = $class; - while (false !== $lastPos = strrpos($subPath, '\\')) { - $subPath = substr($subPath, 0, $lastPos); - $search = $subPath . '\\'; - if (isset($this->prefixDirsPsr4[$search])) { - $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); - foreach ($this->prefixDirsPsr4[$search] as $dir) { - if (file_exists($file = $dir . $pathEnd)) { - return $file; - } - } - } - } - } - - // PSR-4 fallback dirs - foreach ($this->fallbackDirsPsr4 as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { - return $file; - } - } - - // PSR-0 lookup - if (false !== $pos = strrpos($class, '\\')) { - // namespaced class name - $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) - . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); - } else { - // PEAR-like class name - $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; - } - - if (isset($this->prefixesPsr0[$first])) { - foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { - if (0 === strpos($class, $prefix)) { - foreach ($dirs as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { - return $file; - } - } - } - } - } - - // PSR-0 fallback dirs - foreach ($this->fallbackDirsPsr0 as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { - return $file; - } - } - - // PSR-0 include paths. - if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { - return $file; - } - - return false; - } -} - -/** - * Scope isolated include. - * - * Prevents access to $this/self from included files. - */ -function includeFile($file) -{ - include $file; -} diff --git a/tools/php-cs-fixer/vendor/composer/InstalledVersions.php b/tools/php-cs-fixer/vendor/composer/InstalledVersions.php deleted file mode 100644 index 0e69272..0000000 --- a/tools/php-cs-fixer/vendor/composer/InstalledVersions.php +++ /dev/null @@ -1,565 +0,0 @@ - - array ( - 'pretty_version' => 'dev-master', - 'version' => 'dev-master', - 'aliases' => - array ( - ), - 'reference' => '9d98583ba4b0609c03f1e0708c9c3bb16ea3e693', - 'name' => '__root__', - ), - 'versions' => - array ( - '__root__' => - array ( - 'pretty_version' => 'dev-master', - 'version' => 'dev-master', - 'aliases' => - array ( - ), - 'reference' => '9d98583ba4b0609c03f1e0708c9c3bb16ea3e693', - ), - 'composer/semver' => - array ( - 'pretty_version' => '3.2.5', - 'version' => '3.2.5.0', - 'aliases' => - array ( - ), - 'reference' => '31f3ea725711245195f62e54ffa402d8ef2fdba9', - ), - 'composer/xdebug-handler' => - array ( - 'pretty_version' => '2.0.2', - 'version' => '2.0.2.0', - 'aliases' => - array ( - ), - 'reference' => '84674dd3a7575ba617f5a76d7e9e29a7d3891339', - ), - 'doctrine/annotations' => - array ( - 'pretty_version' => '1.13.2', - 'version' => '1.13.2.0', - 'aliases' => - array ( - ), - 'reference' => '5b668aef16090008790395c02c893b1ba13f7e08', - ), - 'doctrine/lexer' => - array ( - 'pretty_version' => '1.2.1', - 'version' => '1.2.1.0', - 'aliases' => - array ( - ), - 'reference' => 'e864bbf5904cb8f5bb334f99209b48018522f042', - ), - 'friendsofphp/php-cs-fixer' => - array ( - 'pretty_version' => 'v3.1.0', - 'version' => '3.1.0.0', - 'aliases' => - array ( - ), - 'reference' => 'cf4cedb9e8991c2daa94a756176d81bf487e4c4b', - ), - 'php-cs-fixer/diff' => - array ( - 'pretty_version' => 'v2.0.2', - 'version' => '2.0.2.0', - 'aliases' => - array ( - ), - 'reference' => '29dc0d507e838c4580d018bd8b5cb412474f7ec3', - ), - 'psr/cache' => - array ( - 'pretty_version' => '3.0.0', - 'version' => '3.0.0.0', - 'aliases' => - array ( - ), - 'reference' => 'aa5030cfa5405eccfdcb1083ce040c2cb8d253bf', - ), - 'psr/container' => - array ( - 'pretty_version' => '1.1.1', - 'version' => '1.1.1.0', - 'aliases' => - array ( - ), - 'reference' => '8622567409010282b7aeebe4bb841fe98b58dcaf', - ), - 'psr/event-dispatcher' => - array ( - 'pretty_version' => '1.0.0', - 'version' => '1.0.0.0', - 'aliases' => - array ( - ), - 'reference' => 'dbefd12671e8a14ec7f180cab83036ed26714bb0', - ), - 'psr/event-dispatcher-implementation' => - array ( - 'provided' => - array ( - 0 => '1.0', - ), - ), - 'psr/log' => - array ( - 'pretty_version' => '2.0.0', - 'version' => '2.0.0.0', - 'aliases' => - array ( - ), - 'reference' => 'ef29f6d262798707a9edd554e2b82517ef3a9376', - ), - 'psr/log-implementation' => - array ( - 'provided' => - array ( - 0 => '1.0|2.0', - ), - ), - 'symfony/console' => - array ( - 'pretty_version' => 'v5.3.7', - 'version' => '5.3.7.0', - 'aliases' => - array ( - ), - 'reference' => '8b1008344647462ae6ec57559da166c2bfa5e16a', - ), - 'symfony/deprecation-contracts' => - array ( - 'pretty_version' => 'v2.4.0', - 'version' => '2.4.0.0', - 'aliases' => - array ( - ), - 'reference' => '5f38c8804a9e97d23e0c8d63341088cd8a22d627', - ), - 'symfony/event-dispatcher' => - array ( - 'pretty_version' => 'v5.3.7', - 'version' => '5.3.7.0', - 'aliases' => - array ( - ), - 'reference' => 'ce7b20d69c66a20939d8952b617506a44d102130', - ), - 'symfony/event-dispatcher-contracts' => - array ( - 'pretty_version' => 'v2.4.0', - 'version' => '2.4.0.0', - 'aliases' => - array ( - ), - 'reference' => '69fee1ad2332a7cbab3aca13591953da9cdb7a11', - ), - 'symfony/event-dispatcher-implementation' => - array ( - 'provided' => - array ( - 0 => '2.0', - ), - ), - 'symfony/filesystem' => - array ( - 'pretty_version' => 'v5.3.4', - 'version' => '5.3.4.0', - 'aliases' => - array ( - ), - 'reference' => '343f4fe324383ca46792cae728a3b6e2f708fb32', - ), - 'symfony/finder' => - array ( - 'pretty_version' => 'v5.3.7', - 'version' => '5.3.7.0', - 'aliases' => - array ( - ), - 'reference' => 'a10000ada1e600d109a6c7632e9ac42e8bf2fb93', - ), - 'symfony/options-resolver' => - array ( - 'pretty_version' => 'v5.3.7', - 'version' => '5.3.7.0', - 'aliases' => - array ( - ), - 'reference' => '4b78e55b179003a42523a362cc0e8327f7a69b5e', - ), - 'symfony/polyfill-ctype' => - array ( - 'pretty_version' => 'v1.23.0', - 'version' => '1.23.0.0', - 'aliases' => - array ( - ), - 'reference' => '46cd95797e9df938fdd2b03693b5fca5e64b01ce', - ), - 'symfony/polyfill-intl-grapheme' => - array ( - 'pretty_version' => 'v1.23.1', - 'version' => '1.23.1.0', - 'aliases' => - array ( - ), - 'reference' => '16880ba9c5ebe3642d1995ab866db29270b36535', - ), - 'symfony/polyfill-intl-normalizer' => - array ( - 'pretty_version' => 'v1.23.0', - 'version' => '1.23.0.0', - 'aliases' => - array ( - ), - 'reference' => '8590a5f561694770bdcd3f9b5c69dde6945028e8', - ), - 'symfony/polyfill-mbstring' => - array ( - 'pretty_version' => 'v1.23.1', - 'version' => '1.23.1.0', - 'aliases' => - array ( - ), - 'reference' => '9174a3d80210dca8daa7f31fec659150bbeabfc6', - ), - 'symfony/polyfill-php72' => - array ( - 'pretty_version' => 'v1.23.0', - 'version' => '1.23.0.0', - 'aliases' => - array ( - ), - 'reference' => '9a142215a36a3888e30d0a9eeea9766764e96976', - ), - 'symfony/polyfill-php73' => - array ( - 'pretty_version' => 'v1.23.0', - 'version' => '1.23.0.0', - 'aliases' => - array ( - ), - 'reference' => 'fba8933c384d6476ab14fb7b8526e5287ca7e010', - ), - 'symfony/polyfill-php80' => - array ( - 'pretty_version' => 'v1.23.1', - 'version' => '1.23.1.0', - 'aliases' => - array ( - ), - 'reference' => '1100343ed1a92e3a38f9ae122fc0eb21602547be', - ), - 'symfony/polyfill-php81' => - array ( - 'pretty_version' => 'v1.23.0', - 'version' => '1.23.0.0', - 'aliases' => - array ( - ), - 'reference' => 'e66119f3de95efc359483f810c4c3e6436279436', - ), - 'symfony/process' => - array ( - 'pretty_version' => 'v5.3.7', - 'version' => '5.3.7.0', - 'aliases' => - array ( - ), - 'reference' => '38f26c7d6ed535217ea393e05634cb0b244a1967', - ), - 'symfony/service-contracts' => - array ( - 'pretty_version' => 'v2.4.0', - 'version' => '2.4.0.0', - 'aliases' => - array ( - ), - 'reference' => 'f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb', - ), - 'symfony/stopwatch' => - array ( - 'pretty_version' => 'v5.3.4', - 'version' => '5.3.4.0', - 'aliases' => - array ( - ), - 'reference' => 'b24c6a92c6db316fee69e38c80591e080e41536c', - ), - 'symfony/string' => - array ( - 'pretty_version' => 'v5.3.7', - 'version' => '5.3.7.0', - 'aliases' => - array ( - ), - 'reference' => '8d224396e28d30f81969f083a58763b8b9ceb0a5', - ), - ), -); -private static $canGetVendors; -private static $installedByVendor = array(); - - - - - - - -public static function getInstalledPackages() -{ -$packages = array(); -foreach (self::getInstalled() as $installed) { -$packages[] = array_keys($installed['versions']); -} - - -if (1 === \count($packages)) { -return $packages[0]; -} - -return array_keys(array_flip(\call_user_func_array('array_merge', $packages))); -} - - - - - - - - - -public static function isInstalled($packageName) -{ -foreach (self::getInstalled() as $installed) { -if (isset($installed['versions'][$packageName])) { -return true; -} -} - -return false; -} - - - - - - - - - - - - - - -public static function satisfies(VersionParser $parser, $packageName, $constraint) -{ -$constraint = $parser->parseConstraints($constraint); -$provided = $parser->parseConstraints(self::getVersionRanges($packageName)); - -return $provided->matches($constraint); -} - - - - - - - - - - -public static function getVersionRanges($packageName) -{ -foreach (self::getInstalled() as $installed) { -if (!isset($installed['versions'][$packageName])) { -continue; -} - -$ranges = array(); -if (isset($installed['versions'][$packageName]['pretty_version'])) { -$ranges[] = $installed['versions'][$packageName]['pretty_version']; -} -if (array_key_exists('aliases', $installed['versions'][$packageName])) { -$ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']); -} -if (array_key_exists('replaced', $installed['versions'][$packageName])) { -$ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']); -} -if (array_key_exists('provided', $installed['versions'][$packageName])) { -$ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']); -} - -return implode(' || ', $ranges); -} - -throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); -} - - - - - -public static function getVersion($packageName) -{ -foreach (self::getInstalled() as $installed) { -if (!isset($installed['versions'][$packageName])) { -continue; -} - -if (!isset($installed['versions'][$packageName]['version'])) { -return null; -} - -return $installed['versions'][$packageName]['version']; -} - -throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); -} - - - - - -public static function getPrettyVersion($packageName) -{ -foreach (self::getInstalled() as $installed) { -if (!isset($installed['versions'][$packageName])) { -continue; -} - -if (!isset($installed['versions'][$packageName]['pretty_version'])) { -return null; -} - -return $installed['versions'][$packageName]['pretty_version']; -} - -throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); -} - - - - - -public static function getReference($packageName) -{ -foreach (self::getInstalled() as $installed) { -if (!isset($installed['versions'][$packageName])) { -continue; -} - -if (!isset($installed['versions'][$packageName]['reference'])) { -return null; -} - -return $installed['versions'][$packageName]['reference']; -} - -throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); -} - - - - - -public static function getRootPackage() -{ -$installed = self::getInstalled(); - -return $installed[0]['root']; -} - - - - - - - -public static function getRawData() -{ -return self::$installed; -} - - - - - - - - - - - - - - - - - - - -public static function reload($data) -{ -self::$installed = $data; -self::$installedByVendor = array(); -} - - - - -private static function getInstalled() -{ -if (null === self::$canGetVendors) { -self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders'); -} - -$installed = array(); - -if (self::$canGetVendors) { -foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { -if (isset(self::$installedByVendor[$vendorDir])) { -$installed[] = self::$installedByVendor[$vendorDir]; -} elseif (is_file($vendorDir.'/composer/installed.php')) { -$installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php'; -} -} -} - -$installed[] = self::$installed; - -return $installed; -} -} diff --git a/tools/php-cs-fixer/vendor/composer/LICENSE b/tools/php-cs-fixer/vendor/composer/LICENSE deleted file mode 100644 index f27399a..0000000 --- a/tools/php-cs-fixer/vendor/composer/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ - -Copyright (c) Nils Adermann, Jordi Boggiano - -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/tools/php-cs-fixer/vendor/composer/autoload_classmap.php b/tools/php-cs-fixer/vendor/composer/autoload_classmap.php deleted file mode 100644 index 530109a..0000000 --- a/tools/php-cs-fixer/vendor/composer/autoload_classmap.php +++ /dev/null @@ -1,33 +0,0 @@ - $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Attribute.php', - 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php', - 'JsonException' => $vendorDir . '/symfony/polyfill-php73/Resources/stubs/JsonException.php', - 'Normalizer' => $vendorDir . '/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php', - 'PhpCsFixer\\Diff\\Chunk' => $vendorDir . '/php-cs-fixer/diff/src/Chunk.php', - 'PhpCsFixer\\Diff\\ConfigurationException' => $vendorDir . '/php-cs-fixer/diff/src/Exception/ConfigurationException.php', - 'PhpCsFixer\\Diff\\Diff' => $vendorDir . '/php-cs-fixer/diff/src/Diff.php', - 'PhpCsFixer\\Diff\\Differ' => $vendorDir . '/php-cs-fixer/diff/src/Differ.php', - 'PhpCsFixer\\Diff\\Exception' => $vendorDir . '/php-cs-fixer/diff/src/Exception/Exception.php', - 'PhpCsFixer\\Diff\\InvalidArgumentException' => $vendorDir . '/php-cs-fixer/diff/src/Exception/InvalidArgumentException.php', - 'PhpCsFixer\\Diff\\Line' => $vendorDir . '/php-cs-fixer/diff/src/Line.php', - 'PhpCsFixer\\Diff\\LongestCommonSubsequenceCalculator' => $vendorDir . '/php-cs-fixer/diff/src/LongestCommonSubsequenceCalculator.php', - 'PhpCsFixer\\Diff\\MemoryEfficientLongestCommonSubsequenceCalculator' => $vendorDir . '/php-cs-fixer/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php', - 'PhpCsFixer\\Diff\\Output\\AbstractChunkOutputBuilder' => $vendorDir . '/php-cs-fixer/diff/src/Output/AbstractChunkOutputBuilder.php', - 'PhpCsFixer\\Diff\\Output\\DiffOnlyOutputBuilder' => $vendorDir . '/php-cs-fixer/diff/src/Output/DiffOnlyOutputBuilder.php', - 'PhpCsFixer\\Diff\\Output\\DiffOutputBuilderInterface' => $vendorDir . '/php-cs-fixer/diff/src/Output/DiffOutputBuilderInterface.php', - 'PhpCsFixer\\Diff\\Output\\StrictUnifiedDiffOutputBuilder' => $vendorDir . '/php-cs-fixer/diff/src/Output/StrictUnifiedDiffOutputBuilder.php', - 'PhpCsFixer\\Diff\\Output\\UnifiedDiffOutputBuilder' => $vendorDir . '/php-cs-fixer/diff/src/Output/UnifiedDiffOutputBuilder.php', - 'PhpCsFixer\\Diff\\Parser' => $vendorDir . '/php-cs-fixer/diff/src/Parser.php', - 'PhpCsFixer\\Diff\\TimeEfficientLongestCommonSubsequenceCalculator' => $vendorDir . '/php-cs-fixer/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php', - 'ReturnTypeWillChange' => $vendorDir . '/symfony/polyfill-php81/Resources/stubs/ReturnTypeWillChange.php', - 'Stringable' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Stringable.php', - 'UnhandledMatchError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php', - 'ValueError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/ValueError.php', -); diff --git a/tools/php-cs-fixer/vendor/composer/autoload_files.php b/tools/php-cs-fixer/vendor/composer/autoload_files.php deleted file mode 100644 index 301006a..0000000 --- a/tools/php-cs-fixer/vendor/composer/autoload_files.php +++ /dev/null @@ -1,19 +0,0 @@ - $vendorDir . '/symfony/polyfill-php80/bootstrap.php', - '6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php', - '320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php', - '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php', - '0d59ee240a4cd96ddbb4ff164fccea4d' => $vendorDir . '/symfony/polyfill-php73/bootstrap.php', - 'e69f7f6ee287b969198c3c9d6777bd38' => $vendorDir . '/symfony/polyfill-intl-normalizer/bootstrap.php', - '8825ede83f2f289127722d4e842cf7e8' => $vendorDir . '/symfony/polyfill-intl-grapheme/bootstrap.php', - 'b6b991a57620e2fb6b2f66f03fe9ddc2' => $vendorDir . '/symfony/string/Resources/functions.php', - '23c18046f52bef3eea034657bafda50f' => $vendorDir . '/symfony/polyfill-php81/bootstrap.php', - '25072dd6e2470089de65ae7bf11d3109' => $vendorDir . '/symfony/polyfill-php72/bootstrap.php', -); diff --git a/tools/php-cs-fixer/vendor/composer/autoload_namespaces.php b/tools/php-cs-fixer/vendor/composer/autoload_namespaces.php deleted file mode 100644 index b7fc012..0000000 --- a/tools/php-cs-fixer/vendor/composer/autoload_namespaces.php +++ /dev/null @@ -1,9 +0,0 @@ - array($vendorDir . '/symfony/polyfill-php81'), - 'Symfony\\Polyfill\\Php80\\' => array($vendorDir . '/symfony/polyfill-php80'), - 'Symfony\\Polyfill\\Php73\\' => array($vendorDir . '/symfony/polyfill-php73'), - 'Symfony\\Polyfill\\Php72\\' => array($vendorDir . '/symfony/polyfill-php72'), - 'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'), - 'Symfony\\Polyfill\\Intl\\Normalizer\\' => array($vendorDir . '/symfony/polyfill-intl-normalizer'), - 'Symfony\\Polyfill\\Intl\\Grapheme\\' => array($vendorDir . '/symfony/polyfill-intl-grapheme'), - 'Symfony\\Polyfill\\Ctype\\' => array($vendorDir . '/symfony/polyfill-ctype'), - 'Symfony\\Contracts\\Service\\' => array($vendorDir . '/symfony/service-contracts'), - 'Symfony\\Contracts\\EventDispatcher\\' => array($vendorDir . '/symfony/event-dispatcher-contracts'), - 'Symfony\\Component\\String\\' => array($vendorDir . '/symfony/string'), - 'Symfony\\Component\\Stopwatch\\' => array($vendorDir . '/symfony/stopwatch'), - 'Symfony\\Component\\Process\\' => array($vendorDir . '/symfony/process'), - 'Symfony\\Component\\OptionsResolver\\' => array($vendorDir . '/symfony/options-resolver'), - 'Symfony\\Component\\Finder\\' => array($vendorDir . '/symfony/finder'), - 'Symfony\\Component\\Filesystem\\' => array($vendorDir . '/symfony/filesystem'), - 'Symfony\\Component\\EventDispatcher\\' => array($vendorDir . '/symfony/event-dispatcher'), - 'Symfony\\Component\\Console\\' => array($vendorDir . '/symfony/console'), - 'Psr\\Log\\' => array($vendorDir . '/psr/log/src'), - 'Psr\\EventDispatcher\\' => array($vendorDir . '/psr/event-dispatcher/src'), - 'Psr\\Container\\' => array($vendorDir . '/psr/container/src'), - 'Psr\\Cache\\' => array($vendorDir . '/psr/cache/src'), - 'PhpCsFixer\\' => array($vendorDir . '/friendsofphp/php-cs-fixer/src'), - 'Doctrine\\Common\\Lexer\\' => array($vendorDir . '/doctrine/lexer/lib/Doctrine/Common/Lexer'), - 'Doctrine\\Common\\Annotations\\' => array($vendorDir . '/doctrine/annotations/lib/Doctrine/Common/Annotations'), - 'Composer\\XdebugHandler\\' => array($vendorDir . '/composer/xdebug-handler/src'), - 'Composer\\Semver\\' => array($vendorDir . '/composer/semver/src'), -); diff --git a/tools/php-cs-fixer/vendor/composer/autoload_real.php b/tools/php-cs-fixer/vendor/composer/autoload_real.php deleted file mode 100644 index f8d6680..0000000 --- a/tools/php-cs-fixer/vendor/composer/autoload_real.php +++ /dev/null @@ -1,75 +0,0 @@ -= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); - if ($useStaticLoader) { - require __DIR__ . '/autoload_static.php'; - - call_user_func(\Composer\Autoload\ComposerStaticInit5709d3240acb8ca9e8f085a14e8ba8b2::getInitializer($loader)); - } else { - $map = require __DIR__ . '/autoload_namespaces.php'; - foreach ($map as $namespace => $path) { - $loader->set($namespace, $path); - } - - $map = require __DIR__ . '/autoload_psr4.php'; - foreach ($map as $namespace => $path) { - $loader->setPsr4($namespace, $path); - } - - $classMap = require __DIR__ . '/autoload_classmap.php'; - if ($classMap) { - $loader->addClassMap($classMap); - } - } - - $loader->register(true); - - if ($useStaticLoader) { - $includeFiles = Composer\Autoload\ComposerStaticInit5709d3240acb8ca9e8f085a14e8ba8b2::$files; - } else { - $includeFiles = require __DIR__ . '/autoload_files.php'; - } - foreach ($includeFiles as $fileIdentifier => $file) { - composerRequire5709d3240acb8ca9e8f085a14e8ba8b2($fileIdentifier, $file); - } - - return $loader; - } -} - -function composerRequire5709d3240acb8ca9e8f085a14e8ba8b2($fileIdentifier, $file) -{ - if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { - require $file; - - $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; - } -} diff --git a/tools/php-cs-fixer/vendor/composer/autoload_static.php b/tools/php-cs-fixer/vendor/composer/autoload_static.php deleted file mode 100644 index 5973adc..0000000 --- a/tools/php-cs-fixer/vendor/composer/autoload_static.php +++ /dev/null @@ -1,211 +0,0 @@ - __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php', - '6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php', - '320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php', - '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php', - '0d59ee240a4cd96ddbb4ff164fccea4d' => __DIR__ . '/..' . '/symfony/polyfill-php73/bootstrap.php', - 'e69f7f6ee287b969198c3c9d6777bd38' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/bootstrap.php', - '8825ede83f2f289127722d4e842cf7e8' => __DIR__ . '/..' . '/symfony/polyfill-intl-grapheme/bootstrap.php', - 'b6b991a57620e2fb6b2f66f03fe9ddc2' => __DIR__ . '/..' . '/symfony/string/Resources/functions.php', - '23c18046f52bef3eea034657bafda50f' => __DIR__ . '/..' . '/symfony/polyfill-php81/bootstrap.php', - '25072dd6e2470089de65ae7bf11d3109' => __DIR__ . '/..' . '/symfony/polyfill-php72/bootstrap.php', - ); - - public static $prefixLengthsPsr4 = array ( - 'S' => - array ( - 'Symfony\\Polyfill\\Php81\\' => 23, - 'Symfony\\Polyfill\\Php80\\' => 23, - 'Symfony\\Polyfill\\Php73\\' => 23, - 'Symfony\\Polyfill\\Php72\\' => 23, - 'Symfony\\Polyfill\\Mbstring\\' => 26, - 'Symfony\\Polyfill\\Intl\\Normalizer\\' => 33, - 'Symfony\\Polyfill\\Intl\\Grapheme\\' => 31, - 'Symfony\\Polyfill\\Ctype\\' => 23, - 'Symfony\\Contracts\\Service\\' => 26, - 'Symfony\\Contracts\\EventDispatcher\\' => 34, - 'Symfony\\Component\\String\\' => 25, - 'Symfony\\Component\\Stopwatch\\' => 28, - 'Symfony\\Component\\Process\\' => 26, - 'Symfony\\Component\\OptionsResolver\\' => 34, - 'Symfony\\Component\\Finder\\' => 25, - 'Symfony\\Component\\Filesystem\\' => 29, - 'Symfony\\Component\\EventDispatcher\\' => 34, - 'Symfony\\Component\\Console\\' => 26, - ), - 'P' => - array ( - 'Psr\\Log\\' => 8, - 'Psr\\EventDispatcher\\' => 20, - 'Psr\\Container\\' => 14, - 'Psr\\Cache\\' => 10, - 'PhpCsFixer\\' => 11, - ), - 'D' => - array ( - 'Doctrine\\Common\\Lexer\\' => 22, - 'Doctrine\\Common\\Annotations\\' => 28, - ), - 'C' => - array ( - 'Composer\\XdebugHandler\\' => 23, - 'Composer\\Semver\\' => 16, - ), - ); - - public static $prefixDirsPsr4 = array ( - 'Symfony\\Polyfill\\Php81\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/polyfill-php81', - ), - 'Symfony\\Polyfill\\Php80\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/polyfill-php80', - ), - 'Symfony\\Polyfill\\Php73\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/polyfill-php73', - ), - 'Symfony\\Polyfill\\Php72\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/polyfill-php72', - ), - 'Symfony\\Polyfill\\Mbstring\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring', - ), - 'Symfony\\Polyfill\\Intl\\Normalizer\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer', - ), - 'Symfony\\Polyfill\\Intl\\Grapheme\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/polyfill-intl-grapheme', - ), - 'Symfony\\Polyfill\\Ctype\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/polyfill-ctype', - ), - 'Symfony\\Contracts\\Service\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/service-contracts', - ), - 'Symfony\\Contracts\\EventDispatcher\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/event-dispatcher-contracts', - ), - 'Symfony\\Component\\String\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/string', - ), - 'Symfony\\Component\\Stopwatch\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/stopwatch', - ), - 'Symfony\\Component\\Process\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/process', - ), - 'Symfony\\Component\\OptionsResolver\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/options-resolver', - ), - 'Symfony\\Component\\Finder\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/finder', - ), - 'Symfony\\Component\\Filesystem\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/filesystem', - ), - 'Symfony\\Component\\EventDispatcher\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/event-dispatcher', - ), - 'Symfony\\Component\\Console\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/console', - ), - 'Psr\\Log\\' => - array ( - 0 => __DIR__ . '/..' . '/psr/log/src', - ), - 'Psr\\EventDispatcher\\' => - array ( - 0 => __DIR__ . '/..' . '/psr/event-dispatcher/src', - ), - 'Psr\\Container\\' => - array ( - 0 => __DIR__ . '/..' . '/psr/container/src', - ), - 'Psr\\Cache\\' => - array ( - 0 => __DIR__ . '/..' . '/psr/cache/src', - ), - 'PhpCsFixer\\' => - array ( - 0 => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src', - ), - 'Doctrine\\Common\\Lexer\\' => - array ( - 0 => __DIR__ . '/..' . '/doctrine/lexer/lib/Doctrine/Common/Lexer', - ), - 'Doctrine\\Common\\Annotations\\' => - array ( - 0 => __DIR__ . '/..' . '/doctrine/annotations/lib/Doctrine/Common/Annotations', - ), - 'Composer\\XdebugHandler\\' => - array ( - 0 => __DIR__ . '/..' . '/composer/xdebug-handler/src', - ), - 'Composer\\Semver\\' => - array ( - 0 => __DIR__ . '/..' . '/composer/semver/src', - ), - ); - - public static $classMap = array ( - 'Attribute' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Attribute.php', - 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', - 'JsonException' => __DIR__ . '/..' . '/symfony/polyfill-php73/Resources/stubs/JsonException.php', - 'Normalizer' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php', - 'PhpCsFixer\\Diff\\Chunk' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/Chunk.php', - 'PhpCsFixer\\Diff\\ConfigurationException' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/Exception/ConfigurationException.php', - 'PhpCsFixer\\Diff\\Diff' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/Diff.php', - 'PhpCsFixer\\Diff\\Differ' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/Differ.php', - 'PhpCsFixer\\Diff\\Exception' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/Exception/Exception.php', - 'PhpCsFixer\\Diff\\InvalidArgumentException' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/Exception/InvalidArgumentException.php', - 'PhpCsFixer\\Diff\\Line' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/Line.php', - 'PhpCsFixer\\Diff\\LongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/LongestCommonSubsequenceCalculator.php', - 'PhpCsFixer\\Diff\\MemoryEfficientLongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php', - 'PhpCsFixer\\Diff\\Output\\AbstractChunkOutputBuilder' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/Output/AbstractChunkOutputBuilder.php', - 'PhpCsFixer\\Diff\\Output\\DiffOnlyOutputBuilder' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/Output/DiffOnlyOutputBuilder.php', - 'PhpCsFixer\\Diff\\Output\\DiffOutputBuilderInterface' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/Output/DiffOutputBuilderInterface.php', - 'PhpCsFixer\\Diff\\Output\\StrictUnifiedDiffOutputBuilder' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/Output/StrictUnifiedDiffOutputBuilder.php', - 'PhpCsFixer\\Diff\\Output\\UnifiedDiffOutputBuilder' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/Output/UnifiedDiffOutputBuilder.php', - 'PhpCsFixer\\Diff\\Parser' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/Parser.php', - 'PhpCsFixer\\Diff\\TimeEfficientLongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/php-cs-fixer/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php', - 'ReturnTypeWillChange' => __DIR__ . '/..' . '/symfony/polyfill-php81/Resources/stubs/ReturnTypeWillChange.php', - 'Stringable' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Stringable.php', - 'UnhandledMatchError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php', - 'ValueError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/ValueError.php', - ); - - public static function getInitializer(ClassLoader $loader) - { - return \Closure::bind(function () use ($loader) { - $loader->prefixLengthsPsr4 = ComposerStaticInit5709d3240acb8ca9e8f085a14e8ba8b2::$prefixLengthsPsr4; - $loader->prefixDirsPsr4 = ComposerStaticInit5709d3240acb8ca9e8f085a14e8ba8b2::$prefixDirsPsr4; - $loader->classMap = ComposerStaticInit5709d3240acb8ca9e8f085a14e8ba8b2::$classMap; - - }, null, ClassLoader::class); - } -} diff --git a/tools/php-cs-fixer/vendor/composer/installed.json b/tools/php-cs-fixer/vendor/composer/installed.json deleted file mode 100644 index 9b3a103..0000000 --- a/tools/php-cs-fixer/vendor/composer/installed.json +++ /dev/null @@ -1,2179 +0,0 @@ -{ - "packages": [ - { - "name": "composer/semver", - "version": "3.2.5", - "version_normalized": "3.2.5.0", - "source": { - "type": "git", - "url": "https://github.com/composer/semver.git", - "reference": "31f3ea725711245195f62e54ffa402d8ef2fdba9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/31f3ea725711245195f62e54ffa402d8ef2fdba9", - "reference": "31f3ea725711245195f62e54ffa402d8ef2fdba9", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^0.12.54", - "symfony/phpunit-bridge": "^4.2 || ^5" - }, - "time": "2021-05-24T12:41:47+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Composer\\Semver\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "http://www.naderman.de" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - }, - { - "name": "Rob Bast", - "email": "rob.bast@gmail.com", - "homepage": "http://robbast.nl" - } - ], - "description": "Semver library that offers utilities, version constraint parsing and validation.", - "keywords": [ - "semantic", - "semver", - "validation", - "versioning" - ], - "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.2.5" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "install-path": "./semver" - }, - { - "name": "composer/xdebug-handler", - "version": "2.0.2", - "version_normalized": "2.0.2.0", - "source": { - "type": "git", - "url": "https://github.com/composer/xdebug-handler.git", - "reference": "84674dd3a7575ba617f5a76d7e9e29a7d3891339" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/84674dd3a7575ba617f5a76d7e9e29a7d3891339", - "reference": "84674dd3a7575ba617f5a76d7e9e29a7d3891339", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0 || ^8.0", - "psr/log": "^1 || ^2 || ^3" - }, - "require-dev": { - "phpstan/phpstan": "^0.12.55", - "symfony/phpunit-bridge": "^4.2 || ^5" - }, - "time": "2021-07-31T17:03:58+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "Composer\\XdebugHandler\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "John Stevenson", - "email": "john-stevenson@blueyonder.co.uk" - } - ], - "description": "Restarts a process without Xdebug.", - "keywords": [ - "Xdebug", - "performance" - ], - "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/xdebug-handler/issues", - "source": "https://github.com/composer/xdebug-handler/tree/2.0.2" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "install-path": "./xdebug-handler" - }, - { - "name": "doctrine/annotations", - "version": "1.13.2", - "version_normalized": "1.13.2.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/annotations.git", - "reference": "5b668aef16090008790395c02c893b1ba13f7e08" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/5b668aef16090008790395c02c893b1ba13f7e08", - "reference": "5b668aef16090008790395c02c893b1ba13f7e08", - "shasum": "" - }, - "require": { - "doctrine/lexer": "1.*", - "ext-tokenizer": "*", - "php": "^7.1 || ^8.0", - "psr/cache": "^1 || ^2 || ^3" - }, - "require-dev": { - "doctrine/cache": "^1.11 || ^2.0", - "doctrine/coding-standard": "^6.0 || ^8.1", - "phpstan/phpstan": "^0.12.20", - "phpunit/phpunit": "^7.5 || ^8.0 || ^9.1.5", - "symfony/cache": "^4.4 || ^5.2" - }, - "time": "2021-08-05T19:00:23+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "Docblock Annotations Parser", - "homepage": "https://www.doctrine-project.org/projects/annotations.html", - "keywords": [ - "annotations", - "docblock", - "parser" - ], - "support": { - "issues": "https://github.com/doctrine/annotations/issues", - "source": "https://github.com/doctrine/annotations/tree/1.13.2" - }, - "install-path": "../doctrine/annotations" - }, - { - "name": "doctrine/lexer", - "version": "1.2.1", - "version_normalized": "1.2.1.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/lexer.git", - "reference": "e864bbf5904cb8f5bb334f99209b48018522f042" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/e864bbf5904cb8f5bb334f99209b48018522f042", - "reference": "e864bbf5904cb8f5bb334f99209b48018522f042", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^6.0", - "phpstan/phpstan": "^0.11.8", - "phpunit/phpunit": "^8.2" - }, - "time": "2020-05-25T17:44:05+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", - "homepage": "https://www.doctrine-project.org/projects/lexer.html", - "keywords": [ - "annotations", - "docblock", - "lexer", - "parser", - "php" - ], - "support": { - "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/1.2.1" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", - "type": "tidelift" - } - ], - "install-path": "../doctrine/lexer" - }, - { - "name": "friendsofphp/php-cs-fixer", - "version": "v3.1.0", - "version_normalized": "3.1.0.0", - "source": { - "type": "git", - "url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git", - "reference": "cf4cedb9e8991c2daa94a756176d81bf487e4c4b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/cf4cedb9e8991c2daa94a756176d81bf487e4c4b", - "reference": "cf4cedb9e8991c2daa94a756176d81bf487e4c4b", - "shasum": "" - }, - "require": { - "composer/semver": "^3.2", - "composer/xdebug-handler": "^2.0", - "doctrine/annotations": "^1.12", - "ext-json": "*", - "ext-tokenizer": "*", - "php": "^7.1.3 || ^8.0", - "php-cs-fixer/diff": "^2.0", - "symfony/console": "^4.4.20 || ^5.1.3", - "symfony/event-dispatcher": "^4.4.20 || ^5.0", - "symfony/filesystem": "^4.4.20 || ^5.0", - "symfony/finder": "^4.4.20 || ^5.0", - "symfony/options-resolver": "^4.4.20 || ^5.0", - "symfony/polyfill-php72": "^1.23", - "symfony/polyfill-php81": "^1.23", - "symfony/process": "^4.4.20 || ^5.0", - "symfony/stopwatch": "^4.4.20 || ^5.0" - }, - "require-dev": { - "justinrainbow/json-schema": "^5.2", - "keradus/cli-executor": "^1.4", - "mikey179/vfsstream": "^1.6.8", - "php-coveralls/php-coveralls": "^2.4.3", - "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.10.3", - "phpspec/prophecy-phpunit": "^1.1 || ^2.0", - "phpunit/phpunit": "^7.5.20 || ^8.5.14 || ^9.5", - "phpunitgoodpractices/polyfill": "^1.5", - "phpunitgoodpractices/traits": "^1.9.1", - "symfony/phpunit-bridge": "^5.2.4", - "symfony/yaml": "^4.4.20 || ^5.0" - }, - "suggest": { - "ext-dom": "For handling output formats in XML", - "ext-mbstring": "For handling non-UTF8 characters.", - "symfony/polyfill-mbstring": "When enabling `ext-mbstring` is not possible." - }, - "time": "2021-08-29T20:16:20+00:00", - "bin": [ - "php-cs-fixer" - ], - "type": "application", - "installation-source": "dist", - "autoload": { - "psr-4": { - "PhpCsFixer\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Dariusz Rumiński", - "email": "dariusz.ruminski@gmail.com" - } - ], - "description": "A tool to automatically fix PHP code style", - "support": { - "issues": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/issues", - "source": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/tree/v3.1.0" - }, - "funding": [ - { - "url": "https://github.com/keradus", - "type": "github" - } - ], - "install-path": "../friendsofphp/php-cs-fixer" - }, - { - "name": "php-cs-fixer/diff", - "version": "v2.0.2", - "version_normalized": "2.0.2.0", - "source": { - "type": "git", - "url": "https://github.com/PHP-CS-Fixer/diff.git", - "reference": "29dc0d507e838c4580d018bd8b5cb412474f7ec3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/diff/zipball/29dc0d507e838c4580d018bd8b5cb412474f7ec3", - "reference": "29dc0d507e838c4580d018bd8b5cb412474f7ec3", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.7.23 || ^6.4.3 || ^7.0", - "symfony/process": "^3.3" - }, - "time": "2020-10-14T08:32:19+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - } - ], - "description": "sebastian/diff v3 backport support for PHP 5.6+", - "homepage": "https://github.com/PHP-CS-Fixer", - "keywords": [ - "diff" - ], - "support": { - "issues": "https://github.com/PHP-CS-Fixer/diff/issues", - "source": "https://github.com/PHP-CS-Fixer/diff/tree/v2.0.2" - }, - "install-path": "../php-cs-fixer/diff" - }, - { - "name": "psr/cache", - "version": "3.0.0", - "version_normalized": "3.0.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/cache.git", - "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", - "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", - "shasum": "" - }, - "require": { - "php": ">=8.0.0" - }, - "time": "2021-02-03T23:26:27+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Psr\\Cache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for caching libraries", - "keywords": [ - "cache", - "psr", - "psr-6" - ], - "support": { - "source": "https://github.com/php-fig/cache/tree/3.0.0" - }, - "install-path": "../psr/cache" - }, - { - "name": "psr/container", - "version": "1.1.1", - "version_normalized": "1.1.1.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", - "shasum": "" - }, - "require": { - "php": ">=7.2.0" - }, - "time": "2021-03-05T17:36:06+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "Psr\\Container\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", - "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" - ], - "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.1" - }, - "install-path": "../psr/container" - }, - { - "name": "psr/event-dispatcher", - "version": "1.0.0", - "version_normalized": "1.0.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/event-dispatcher.git", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", - "shasum": "" - }, - "require": { - "php": ">=7.2.0" - }, - "time": "2019-01-08T18:20:26+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Psr\\EventDispatcher\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Standard interfaces for event handling.", - "keywords": [ - "events", - "psr", - "psr-14" - ], - "support": { - "issues": "https://github.com/php-fig/event-dispatcher/issues", - "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" - }, - "install-path": "../psr/event-dispatcher" - }, - { - "name": "psr/log", - "version": "2.0.0", - "version_normalized": "2.0.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/ef29f6d262798707a9edd554e2b82517ef3a9376", - "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376", - "shasum": "" - }, - "require": { - "php": ">=8.0.0" - }, - "time": "2021-07-14T16:41:46+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Psr\\Log\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "support": { - "source": "https://github.com/php-fig/log/tree/2.0.0" - }, - "install-path": "../psr/log" - }, - { - "name": "symfony/console", - "version": "v5.3.7", - "version_normalized": "5.3.7.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "8b1008344647462ae6ec57559da166c2bfa5e16a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/8b1008344647462ae6ec57559da166c2bfa5e16a", - "reference": "8b1008344647462ae6ec57559da166c2bfa5e16a", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.8", - "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2", - "symfony/string": "^5.1" - }, - "conflict": { - "psr/log": ">=3", - "symfony/dependency-injection": "<4.4", - "symfony/dotenv": "<5.1", - "symfony/event-dispatcher": "<4.4", - "symfony/lock": "<4.4", - "symfony/process": "<4.4" - }, - "provide": { - "psr/log-implementation": "1.0|2.0" - }, - "require-dev": { - "psr/log": "^1|^2", - "symfony/config": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/event-dispatcher": "^4.4|^5.0", - "symfony/lock": "^4.4|^5.0", - "symfony/process": "^4.4|^5.0", - "symfony/var-dumper": "^4.4|^5.0" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" - }, - "time": "2021-08-25T20:02:16+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Component\\Console\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Eases the creation of beautiful and testable command line interfaces", - "homepage": "https://symfony.com", - "keywords": [ - "cli", - "command line", - "console", - "terminal" - ], - "support": { - "source": "https://github.com/symfony/console/tree/v5.3.7" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "install-path": "../symfony/console" - }, - { - "name": "symfony/deprecation-contracts", - "version": "v2.4.0", - "version_normalized": "2.4.0.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5f38c8804a9e97d23e0c8d63341088cd8a22d627", - "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "time": "2021-03-23T23:28:01+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.4-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "installation-source": "dist", - "autoload": { - "files": [ - "function.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "A generic function and convention to trigger deprecation notices", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.4.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "install-path": "../symfony/deprecation-contracts" - }, - { - "name": "symfony/event-dispatcher", - "version": "v5.3.7", - "version_normalized": "5.3.7.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "ce7b20d69c66a20939d8952b617506a44d102130" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/ce7b20d69c66a20939d8952b617506a44d102130", - "reference": "ce7b20d69c66a20939d8952b617506a44d102130", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/event-dispatcher-contracts": "^2", - "symfony/polyfill-php80": "^1.16" - }, - "conflict": { - "symfony/dependency-injection": "<4.4" - }, - "provide": { - "psr/event-dispatcher-implementation": "1.0", - "symfony/event-dispatcher-implementation": "2.0" - }, - "require-dev": { - "psr/log": "^1|^2|^3", - "symfony/config": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/error-handler": "^4.4|^5.0", - "symfony/expression-language": "^4.4|^5.0", - "symfony/http-foundation": "^4.4|^5.0", - "symfony/service-contracts": "^1.1|^2", - "symfony/stopwatch": "^4.4|^5.0" - }, - "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" - }, - "time": "2021-08-04T21:20:46+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Component\\EventDispatcher\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "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.3.7" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "install-path": "../symfony/event-dispatcher" - }, - { - "name": "symfony/event-dispatcher-contracts", - "version": "v2.4.0", - "version_normalized": "2.4.0.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "69fee1ad2332a7cbab3aca13591953da9cdb7a11" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/69fee1ad2332a7cbab3aca13591953da9cdb7a11", - "reference": "69fee1ad2332a7cbab3aca13591953da9cdb7a11", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "psr/event-dispatcher": "^1" - }, - "suggest": { - "symfony/event-dispatcher-implementation": "" - }, - "time": "2021-03-23T23:28:01+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.4-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Contracts\\EventDispatcher\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to dispatching event", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.4.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "install-path": "../symfony/event-dispatcher-contracts" - }, - { - "name": "symfony/filesystem", - "version": "v5.3.4", - "version_normalized": "5.3.4.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/filesystem.git", - "reference": "343f4fe324383ca46792cae728a3b6e2f708fb32" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/343f4fe324383ca46792cae728a3b6e2f708fb32", - "reference": "343f4fe324383ca46792cae728a3b6e2f708fb32", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-php80": "^1.16" - }, - "time": "2021-07-21T12:40:44+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Component\\Filesystem\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides basic utilities for the filesystem", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.3.4" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "install-path": "../symfony/filesystem" - }, - { - "name": "symfony/finder", - "version": "v5.3.7", - "version_normalized": "5.3.7.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/a10000ada1e600d109a6c7632e9ac42e8bf2fb93", - "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.16" - }, - "time": "2021-08-04T21:20:46+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Component\\Finder\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Finds files and directories via an intuitive fluent interface", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/finder/tree/v5.3.7" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "install-path": "../symfony/finder" - }, - { - "name": "symfony/options-resolver", - "version": "v5.3.7", - "version_normalized": "5.3.7.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/options-resolver.git", - "reference": "4b78e55b179003a42523a362cc0e8327f7a69b5e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/4b78e55b179003a42523a362cc0e8327f7a69b5e", - "reference": "4b78e55b179003a42523a362cc0e8327f7a69b5e", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-php73": "~1.0", - "symfony/polyfill-php80": "^1.16" - }, - "time": "2021-08-04T21:20:46+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Component\\OptionsResolver\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides an improved replacement for the array_replace PHP function", - "homepage": "https://symfony.com", - "keywords": [ - "config", - "configuration", - "options" - ], - "support": { - "source": "https://github.com/symfony/options-resolver/tree/v5.3.7" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "install-path": "../symfony/options-resolver" - }, - { - "name": "symfony/polyfill-ctype", - "version": "v1.23.0", - "version_normalized": "1.23.0.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce", - "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-ctype": "For best performance" - }, - "time": "2021-02-19T12:13:01+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for ctype functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" - ], - "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "install-path": "../symfony/polyfill-ctype" - }, - { - "name": "symfony/polyfill-intl-grapheme", - "version": "v1.23.1", - "version_normalized": "1.23.1.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "16880ba9c5ebe3642d1995ab866db29270b36535" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/16880ba9c5ebe3642d1995ab866db29270b36535", - "reference": "16880ba9c5ebe3642d1995ab866db29270b36535", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "time": "2021-05-27T12:26:48+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's grapheme_* functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "grapheme", - "intl", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.23.1" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "install-path": "../symfony/polyfill-intl-grapheme" - }, - { - "name": "symfony/polyfill-intl-normalizer", - "version": "v1.23.0", - "version_normalized": "1.23.0.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "time": "2021-02-19T12:13:01+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's Normalizer class and related functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "intl", - "normalizer", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "install-path": "../symfony/polyfill-intl-normalizer" - }, - { - "name": "symfony/polyfill-mbstring", - "version": "v1.23.1", - "version_normalized": "1.23.1.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9174a3d80210dca8daa7f31fec659150bbeabfc6", - "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "time": "2021-05-27T12:26:48+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.1" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "install-path": "../symfony/polyfill-mbstring" - }, - { - "name": "symfony/polyfill-php72", - "version": "v1.23.0", - "version_normalized": "1.23.0.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "9a142215a36a3888e30d0a9eeea9766764e96976" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/9a142215a36a3888e30d0a9eeea9766764e96976", - "reference": "9a142215a36a3888e30d0a9eeea9766764e96976", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "time": "2021-05-27T09:17:38+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php72\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.23.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "install-path": "../symfony/polyfill-php72" - }, - { - "name": "symfony/polyfill-php73", - "version": "v1.23.0", - "version_normalized": "1.23.0.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fba8933c384d6476ab14fb7b8526e5287ca7e010", - "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "time": "2021-02-19T12:13:01+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php73\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "install-path": "../symfony/polyfill-php73" - }, - { - "name": "symfony/polyfill-php80", - "version": "v1.23.1", - "version_normalized": "1.23.1.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/1100343ed1a92e3a38f9ae122fc0eb21602547be", - "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "time": "2021-07-28T13:41:28+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.1" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "install-path": "../symfony/polyfill-php80" - }, - { - "name": "symfony/polyfill-php81", - "version": "v1.23.0", - "version_normalized": "1.23.0.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "e66119f3de95efc359483f810c4c3e6436279436" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/e66119f3de95efc359483f810c4c3e6436279436", - "reference": "e66119f3de95efc359483f810c4c3e6436279436", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "time": "2021-05-21T13:25:03+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php81\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.23.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "install-path": "../symfony/polyfill-php81" - }, - { - "name": "symfony/process", - "version": "v5.3.7", - "version_normalized": "5.3.7.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "38f26c7d6ed535217ea393e05634cb0b244a1967" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/38f26c7d6ed535217ea393e05634cb0b244a1967", - "reference": "38f26c7d6ed535217ea393e05634cb0b244a1967", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.16" - }, - "time": "2021-08-04T21:20:46+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Component\\Process\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Executes commands in sub-processes", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/process/tree/v5.3.7" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "install-path": "../symfony/process" - }, - { - "name": "symfony/service-contracts", - "version": "v2.4.0", - "version_normalized": "2.4.0.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", - "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "psr/container": "^1.1" - }, - "suggest": { - "symfony/service-implementation": "" - }, - "time": "2021-04-01T10:43:52+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.4-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Contracts\\Service\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to writing services", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.4.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "install-path": "../symfony/service-contracts" - }, - { - "name": "symfony/stopwatch", - "version": "v5.3.4", - "version_normalized": "5.3.4.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/stopwatch.git", - "reference": "b24c6a92c6db316fee69e38c80591e080e41536c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/b24c6a92c6db316fee69e38c80591e080e41536c", - "reference": "b24c6a92c6db316fee69e38c80591e080e41536c", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/service-contracts": "^1.0|^2" - }, - "time": "2021-07-10T08:58:57+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Component\\Stopwatch\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides a way to profile code", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/stopwatch/tree/v5.3.4" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "install-path": "../symfony/stopwatch" - }, - { - "name": "symfony/string", - "version": "v5.3.7", - "version_normalized": "5.3.7.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/string.git", - "reference": "8d224396e28d30f81969f083a58763b8b9ceb0a5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/8d224396e28d30f81969f083a58763b8b9ceb0a5", - "reference": "8d224396e28d30f81969f083a58763b8b9ceb0a5", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.0", - "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "~1.15" - }, - "require-dev": { - "symfony/error-handler": "^4.4|^5.0", - "symfony/http-client": "^4.4|^5.0", - "symfony/translation-contracts": "^1.1|^2", - "symfony/var-exporter": "^4.4|^5.0" - }, - "time": "2021-08-26T08:00:08+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Component\\String\\": "" - }, - "files": [ - "Resources/functions.php" - ], - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", - "homepage": "https://symfony.com", - "keywords": [ - "grapheme", - "i18n", - "string", - "unicode", - "utf-8", - "utf8" - ], - "support": { - "source": "https://github.com/symfony/string/tree/v5.3.7" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "install-path": "../symfony/string" - } - ], - "dev": true, - "dev-package-names": [] -} diff --git a/tools/php-cs-fixer/vendor/composer/installed.php b/tools/php-cs-fixer/vendor/composer/installed.php deleted file mode 100644 index 293166c..0000000 --- a/tools/php-cs-fixer/vendor/composer/installed.php +++ /dev/null @@ -1,306 +0,0 @@ - - array ( - 'pretty_version' => 'dev-master', - 'version' => 'dev-master', - 'aliases' => - array ( - ), - 'reference' => '9d98583ba4b0609c03f1e0708c9c3bb16ea3e693', - 'name' => '__root__', - ), - 'versions' => - array ( - '__root__' => - array ( - 'pretty_version' => 'dev-master', - 'version' => 'dev-master', - 'aliases' => - array ( - ), - 'reference' => '9d98583ba4b0609c03f1e0708c9c3bb16ea3e693', - ), - 'composer/semver' => - array ( - 'pretty_version' => '3.2.5', - 'version' => '3.2.5.0', - 'aliases' => - array ( - ), - 'reference' => '31f3ea725711245195f62e54ffa402d8ef2fdba9', - ), - 'composer/xdebug-handler' => - array ( - 'pretty_version' => '2.0.2', - 'version' => '2.0.2.0', - 'aliases' => - array ( - ), - 'reference' => '84674dd3a7575ba617f5a76d7e9e29a7d3891339', - ), - 'doctrine/annotations' => - array ( - 'pretty_version' => '1.13.2', - 'version' => '1.13.2.0', - 'aliases' => - array ( - ), - 'reference' => '5b668aef16090008790395c02c893b1ba13f7e08', - ), - 'doctrine/lexer' => - array ( - 'pretty_version' => '1.2.1', - 'version' => '1.2.1.0', - 'aliases' => - array ( - ), - 'reference' => 'e864bbf5904cb8f5bb334f99209b48018522f042', - ), - 'friendsofphp/php-cs-fixer' => - array ( - 'pretty_version' => 'v3.1.0', - 'version' => '3.1.0.0', - 'aliases' => - array ( - ), - 'reference' => 'cf4cedb9e8991c2daa94a756176d81bf487e4c4b', - ), - 'php-cs-fixer/diff' => - array ( - 'pretty_version' => 'v2.0.2', - 'version' => '2.0.2.0', - 'aliases' => - array ( - ), - 'reference' => '29dc0d507e838c4580d018bd8b5cb412474f7ec3', - ), - 'psr/cache' => - array ( - 'pretty_version' => '3.0.0', - 'version' => '3.0.0.0', - 'aliases' => - array ( - ), - 'reference' => 'aa5030cfa5405eccfdcb1083ce040c2cb8d253bf', - ), - 'psr/container' => - array ( - 'pretty_version' => '1.1.1', - 'version' => '1.1.1.0', - 'aliases' => - array ( - ), - 'reference' => '8622567409010282b7aeebe4bb841fe98b58dcaf', - ), - 'psr/event-dispatcher' => - array ( - 'pretty_version' => '1.0.0', - 'version' => '1.0.0.0', - 'aliases' => - array ( - ), - 'reference' => 'dbefd12671e8a14ec7f180cab83036ed26714bb0', - ), - 'psr/event-dispatcher-implementation' => - array ( - 'provided' => - array ( - 0 => '1.0', - ), - ), - 'psr/log' => - array ( - 'pretty_version' => '2.0.0', - 'version' => '2.0.0.0', - 'aliases' => - array ( - ), - 'reference' => 'ef29f6d262798707a9edd554e2b82517ef3a9376', - ), - 'psr/log-implementation' => - array ( - 'provided' => - array ( - 0 => '1.0|2.0', - ), - ), - 'symfony/console' => - array ( - 'pretty_version' => 'v5.3.7', - 'version' => '5.3.7.0', - 'aliases' => - array ( - ), - 'reference' => '8b1008344647462ae6ec57559da166c2bfa5e16a', - ), - 'symfony/deprecation-contracts' => - array ( - 'pretty_version' => 'v2.4.0', - 'version' => '2.4.0.0', - 'aliases' => - array ( - ), - 'reference' => '5f38c8804a9e97d23e0c8d63341088cd8a22d627', - ), - 'symfony/event-dispatcher' => - array ( - 'pretty_version' => 'v5.3.7', - 'version' => '5.3.7.0', - 'aliases' => - array ( - ), - 'reference' => 'ce7b20d69c66a20939d8952b617506a44d102130', - ), - 'symfony/event-dispatcher-contracts' => - array ( - 'pretty_version' => 'v2.4.0', - 'version' => '2.4.0.0', - 'aliases' => - array ( - ), - 'reference' => '69fee1ad2332a7cbab3aca13591953da9cdb7a11', - ), - 'symfony/event-dispatcher-implementation' => - array ( - 'provided' => - array ( - 0 => '2.0', - ), - ), - 'symfony/filesystem' => - array ( - 'pretty_version' => 'v5.3.4', - 'version' => '5.3.4.0', - 'aliases' => - array ( - ), - 'reference' => '343f4fe324383ca46792cae728a3b6e2f708fb32', - ), - 'symfony/finder' => - array ( - 'pretty_version' => 'v5.3.7', - 'version' => '5.3.7.0', - 'aliases' => - array ( - ), - 'reference' => 'a10000ada1e600d109a6c7632e9ac42e8bf2fb93', - ), - 'symfony/options-resolver' => - array ( - 'pretty_version' => 'v5.3.7', - 'version' => '5.3.7.0', - 'aliases' => - array ( - ), - 'reference' => '4b78e55b179003a42523a362cc0e8327f7a69b5e', - ), - 'symfony/polyfill-ctype' => - array ( - 'pretty_version' => 'v1.23.0', - 'version' => '1.23.0.0', - 'aliases' => - array ( - ), - 'reference' => '46cd95797e9df938fdd2b03693b5fca5e64b01ce', - ), - 'symfony/polyfill-intl-grapheme' => - array ( - 'pretty_version' => 'v1.23.1', - 'version' => '1.23.1.0', - 'aliases' => - array ( - ), - 'reference' => '16880ba9c5ebe3642d1995ab866db29270b36535', - ), - 'symfony/polyfill-intl-normalizer' => - array ( - 'pretty_version' => 'v1.23.0', - 'version' => '1.23.0.0', - 'aliases' => - array ( - ), - 'reference' => '8590a5f561694770bdcd3f9b5c69dde6945028e8', - ), - 'symfony/polyfill-mbstring' => - array ( - 'pretty_version' => 'v1.23.1', - 'version' => '1.23.1.0', - 'aliases' => - array ( - ), - 'reference' => '9174a3d80210dca8daa7f31fec659150bbeabfc6', - ), - 'symfony/polyfill-php72' => - array ( - 'pretty_version' => 'v1.23.0', - 'version' => '1.23.0.0', - 'aliases' => - array ( - ), - 'reference' => '9a142215a36a3888e30d0a9eeea9766764e96976', - ), - 'symfony/polyfill-php73' => - array ( - 'pretty_version' => 'v1.23.0', - 'version' => '1.23.0.0', - 'aliases' => - array ( - ), - 'reference' => 'fba8933c384d6476ab14fb7b8526e5287ca7e010', - ), - 'symfony/polyfill-php80' => - array ( - 'pretty_version' => 'v1.23.1', - 'version' => '1.23.1.0', - 'aliases' => - array ( - ), - 'reference' => '1100343ed1a92e3a38f9ae122fc0eb21602547be', - ), - 'symfony/polyfill-php81' => - array ( - 'pretty_version' => 'v1.23.0', - 'version' => '1.23.0.0', - 'aliases' => - array ( - ), - 'reference' => 'e66119f3de95efc359483f810c4c3e6436279436', - ), - 'symfony/process' => - array ( - 'pretty_version' => 'v5.3.7', - 'version' => '5.3.7.0', - 'aliases' => - array ( - ), - 'reference' => '38f26c7d6ed535217ea393e05634cb0b244a1967', - ), - 'symfony/service-contracts' => - array ( - 'pretty_version' => 'v2.4.0', - 'version' => '2.4.0.0', - 'aliases' => - array ( - ), - 'reference' => 'f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb', - ), - 'symfony/stopwatch' => - array ( - 'pretty_version' => 'v5.3.4', - 'version' => '5.3.4.0', - 'aliases' => - array ( - ), - 'reference' => 'b24c6a92c6db316fee69e38c80591e080e41536c', - ), - 'symfony/string' => - array ( - 'pretty_version' => 'v5.3.7', - 'version' => '5.3.7.0', - 'aliases' => - array ( - ), - 'reference' => '8d224396e28d30f81969f083a58763b8b9ceb0a5', - ), - ), -); diff --git a/tools/php-cs-fixer/vendor/composer/platform_check.php b/tools/php-cs-fixer/vendor/composer/platform_check.php deleted file mode 100644 index adfb472..0000000 --- a/tools/php-cs-fixer/vendor/composer/platform_check.php +++ /dev/null @@ -1,26 +0,0 @@ -= 80000)) { - $issues[] = 'Your Composer dependencies require a PHP version ">= 8.0.0". You are running ' . PHP_VERSION . '.'; -} - -if ($issues) { - if (!headers_sent()) { - header('HTTP/1.1 500 Internal Server Error'); - } - if (!ini_get('display_errors')) { - if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') { - fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL); - } elseif (!headers_sent()) { - echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL; - } - } - trigger_error( - 'Composer detected issues in your platform: ' . implode(' ', $issues), - E_USER_ERROR - ); -} diff --git a/tools/php-cs-fixer/vendor/composer/semver/CHANGELOG.md b/tools/php-cs-fixer/vendor/composer/semver/CHANGELOG.md deleted file mode 100644 index 67785e4..0000000 --- a/tools/php-cs-fixer/vendor/composer/semver/CHANGELOG.md +++ /dev/null @@ -1,172 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -This project adheres to [Semantic Versioning](http://semver.org/). - -### [3.2.5] 2021-05-24 - - * Fixed: issue comparing disjunctive MultiConstraints to conjunctive ones (#127) - * Fixed: added complete type information using phpstan annotations - -### [3.2.4] 2020-11-13 - - * Fixed: code clean-up - -### [3.2.3] 2020-11-12 - - * Fixed: constraints in the form of `X || Y, >=Y.1` and other such complex constructs were in some cases being optimized into a more restrictive constraint - -### [3.2.2] 2020-10-14 - - * Fixed: internal code cleanups - -### [3.2.1] 2020-09-27 - - * Fixed: accidental validation of broken constraints combining ^/~ and wildcards, and -dev suffix allowing weird cases - * Fixed: normalization of beta0 and such which was dropping the 0 - -### [3.2.0] 2020-09-09 - - * Added: support for `x || @dev`, not very useful but seen in the wild and failed to validate with 1.5.2/1.6.0 - * Added: support for `foobar-dev` being equal to `dev-foobar`, dev-foobar is the official way to write it but we need to support the other for BC and convenience - -### [3.1.0] 2020-09-08 - - * Added: support for constraints like `^2.x-dev` and `~2.x-dev`, not very useful but seen in the wild and failed to validate with 3.0.1 - * Fixed: invalid aliases will no longer throw, unless explicitly validated by Composer in the root package - -### [3.0.1] 2020-09-08 - - * Fixed: handling of some invalid -dev versions which were seen as valid - -### [3.0.0] 2020-05-26 - - * Break: Renamed `EmptyConstraint`, replace it with `MatchAllConstraint` - * Break: Unlikely to affect anyone but strictly speaking a breaking change, `*.*` and such variants will not match all `dev-*` versions anymore, only `*` does - * Break: ConstraintInterface is now considered internal/private and not meant to be implemented by third parties anymore - * Added `Intervals` class to check if a constraint is a subsets of another one, and allow compacting complex MultiConstraints into simpler ones - * Added `CompilingMatcher` class to speed up constraint matching against simple Constraint instances - * Added `MatchAllConstraint` and `MatchNoneConstraint` which match everything and nothing - * Added more advanced optimization of contiguous constraints inside MultiConstraint - * Added tentative support for PHP 8 - * Fixed ConstraintInterface::matches to be commutative in all cases - -### [2.0.0] 2020-04-21 - - * Break: `dev-master`, `dev-trunk` and `dev-default` now normalize to `dev-master`, `dev-trunk` and `dev-default` instead of `9999999-dev` in 1.x - * Break: Removed the deprecated `AbstractConstraint` - * Added `getUpperBound` and `getLowerBound` to ConstraintInterface. They return `Composer\Semver\Constraint\Bound` instances - * Added `MultiConstraint::create` to create the most-optimal form of ConstraintInterface from an array of constraint strings - -### [1.7.2] 2020-12-03 - - * Fixed: Allow installing on php 8 - -### [1.7.1] 2020-09-27 - - * Fixed: accidental validation of broken constraints combining ^/~ and wildcards, and -dev suffix allowing weird cases - * Fixed: normalization of beta0 and such which was dropping the 0 - -### [1.7.0] 2020-09-09 - - * Added: support for `x || @dev`, not very useful but seen in the wild and failed to validate with 1.5.2/1.6.0 - * Added: support for `foobar-dev` being equal to `dev-foobar`, dev-foobar is the official way to write it but we need to support the other for BC and convenience - -### [1.6.0] 2020-09-08 - - * Added: support for constraints like `^2.x-dev` and `~2.x-dev`, not very useful but seen in the wild and failed to validate with 1.5.2 - * Fixed: invalid aliases will no longer throw, unless explicitly validated by Composer in the root package - -### [1.5.2] 2020-09-08 - - * Fixed: handling of some invalid -dev versions which were seen as valid - * Fixed: some doctypes - -### [1.5.1] 2020-01-13 - - * Fixed: Parsing of aliased version was not validating the alias to be a valid version - -### [1.5.0] 2019-03-19 - - * Added: some support for date versions (e.g. 201903) in `~` operator - * Fixed: support for stabilities in `~` operator was inconsistent - -### [1.4.2] 2016-08-30 - - * Fixed: collapsing of complex constraints lead to buggy constraints - -### [1.4.1] 2016-06-02 - - * Changed: branch-like requirements no longer strip build metadata - [composer/semver#38](https://github.com/composer/semver/pull/38). - -### [1.4.0] 2016-03-30 - - * Added: getters on MultiConstraint - [composer/semver#35](https://github.com/composer/semver/pull/35). - -### [1.3.0] 2016-02-25 - - * Fixed: stability parsing - [composer/composer#1234](https://github.com/composer/composer/issues/4889). - * Changed: collapse contiguous constraints when possible. - -### [1.2.0] 2015-11-10 - - * Changed: allow multiple numerical identifiers in 'pre-release' version part. - * Changed: add more 'v' prefix support. - -### [1.1.0] 2015-11-03 - - * Changed: dropped redundant `test` namespace. - * Changed: minor adjustment in datetime parsing normalization. - * Changed: `ConstraintInterface` relaxed, setPrettyString is not required anymore. - * Changed: `AbstractConstraint` marked deprecated, will be removed in 2.0. - * Changed: `Constraint` is now extensible. - -### [1.0.0] 2015-09-21 - - * Break: `VersionConstraint` renamed to `Constraint`. - * Break: `SpecificConstraint` renamed to `AbstractConstraint`. - * Break: `LinkConstraintInterface` renamed to `ConstraintInterface`. - * Break: `VersionParser::parseNameVersionPairs` was removed. - * Changed: `VersionParser::parseConstraints` allows (but ignores) build metadata now. - * Changed: `VersionParser::parseConstraints` allows (but ignores) prefixing numeric versions with a 'v' now. - * Changed: Fixed namespace(s) of test files. - * Changed: `Comparator::compare` no longer throws `InvalidArgumentException`. - * Changed: `Constraint` now throws `InvalidArgumentException`. - -### [0.1.0] 2015-07-23 - - * Added: `Composer\Semver\Comparator`, various methods to compare versions. - * Added: various documents such as README.md, LICENSE, etc. - * Added: configuration files for Git, Travis, php-cs-fixer, phpunit. - * Break: the following namespaces were renamed: - - Namespace: `Composer\Package\Version` -> `Composer\Semver` - - Namespace: `Composer\Package\LinkConstraint` -> `Composer\Semver\Constraint` - - Namespace: `Composer\Test\Package\Version` -> `Composer\Test\Semver` - - Namespace: `Composer\Test\Package\LinkConstraint` -> `Composer\Test\Semver\Constraint` - * Changed: code style using php-cs-fixer. - -[3.2.5]: https://github.com/composer/semver/compare/3.2.4...3.2.5 -[3.2.4]: https://github.com/composer/semver/compare/3.2.3...3.2.4 -[3.2.3]: https://github.com/composer/semver/compare/3.2.2...3.2.3 -[3.2.2]: https://github.com/composer/semver/compare/3.2.1...3.2.2 -[3.2.1]: https://github.com/composer/semver/compare/3.2.0...3.2.1 -[3.2.0]: https://github.com/composer/semver/compare/3.1.0...3.2.0 -[3.1.0]: https://github.com/composer/semver/compare/3.0.1...3.1.0 -[3.0.1]: https://github.com/composer/semver/compare/3.0.0...3.0.1 -[3.0.0]: https://github.com/composer/semver/compare/2.0.0...3.0.0 -[2.0.0]: https://github.com/composer/semver/compare/1.5.1...2.0.0 -[1.7.2]: https://github.com/composer/semver/compare/1.7.1...1.7.2 -[1.7.1]: https://github.com/composer/semver/compare/1.7.0...1.7.1 -[1.7.0]: https://github.com/composer/semver/compare/1.6.0...1.7.0 -[1.6.0]: https://github.com/composer/semver/compare/1.5.2...1.6.0 -[1.5.2]: https://github.com/composer/semver/compare/1.5.1...1.5.2 -[1.5.1]: https://github.com/composer/semver/compare/1.5.0...1.5.1 -[1.5.0]: https://github.com/composer/semver/compare/1.4.2...1.5.0 -[1.4.2]: https://github.com/composer/semver/compare/1.4.1...1.4.2 -[1.4.1]: https://github.com/composer/semver/compare/1.4.0...1.4.1 -[1.4.0]: https://github.com/composer/semver/compare/1.3.0...1.4.0 -[1.3.0]: https://github.com/composer/semver/compare/1.2.0...1.3.0 -[1.2.0]: https://github.com/composer/semver/compare/1.1.0...1.2.0 -[1.1.0]: https://github.com/composer/semver/compare/1.0.0...1.1.0 -[1.0.0]: https://github.com/composer/semver/compare/0.1.0...1.0.0 -[0.1.0]: https://github.com/composer/semver/compare/5e0b9a4da...0.1.0 diff --git a/tools/php-cs-fixer/vendor/composer/semver/LICENSE b/tools/php-cs-fixer/vendor/composer/semver/LICENSE deleted file mode 100644 index 4669758..0000000 --- a/tools/php-cs-fixer/vendor/composer/semver/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (C) 2015 Composer - -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/tools/php-cs-fixer/vendor/composer/semver/README.md b/tools/php-cs-fixer/vendor/composer/semver/README.md deleted file mode 100644 index 99bc461..0000000 --- a/tools/php-cs-fixer/vendor/composer/semver/README.md +++ /dev/null @@ -1,98 +0,0 @@ -composer/semver -=============== - -Semver library that offers utilities, version constraint parsing and validation. - -Originally written as part of [composer/composer](https://github.com/composer/composer), -now extracted and made available as a stand-alone library. - -[![Continuous Integration](https://github.com/composer/semver/workflows/Continuous%20Integration/badge.svg?branch=main)](https://github.com/composer/semver/actions) - - -Installation ------------- - -Install the latest version with: - -```bash -$ composer require composer/semver -``` - - -Requirements ------------- - -* PHP 5.3.2 is required but using the latest version of PHP is highly recommended. - - -Version Comparison ------------------- - -For details on how versions are compared, refer to the [Versions](https://getcomposer.org/doc/articles/versions.md) -article in the documentation section of the [getcomposer.org](https://getcomposer.org) website. - - -Basic usage ------------ - -### Comparator - -The [`Composer\Semver\Comparator`](https://github.com/composer/semver/blob/main/src/Comparator.php) class provides the following methods for comparing versions: - -* greaterThan($v1, $v2) -* greaterThanOrEqualTo($v1, $v2) -* lessThan($v1, $v2) -* lessThanOrEqualTo($v1, $v2) -* equalTo($v1, $v2) -* notEqualTo($v1, $v2) - -Each function takes two version strings as arguments and returns a boolean. For example: - -```php -use Composer\Semver\Comparator; - -Comparator::greaterThan('1.25.0', '1.24.0'); // 1.25.0 > 1.24.0 -``` - -### Semver - -The [`Composer\Semver\Semver`](https://github.com/composer/semver/blob/main/src/Semver.php) class provides the following methods: - -* satisfies($version, $constraints) -* satisfiedBy(array $versions, $constraint) -* sort($versions) -* rsort($versions) - -### Intervals - -The [`Composer\Semver\Intervals`](https://github.com/composer/semver/blob/main/src/Intervals.php) static class provides -a few utilities to work with complex constraints or read version intervals from a constraint: - -```php -use Composer\Semver\Intervals; - -// Checks whether $candidate is a subset of $constraint -Intervals::isSubsetOf(ConstraintInterface $candidate, ConstraintInterface $constraint); - -// Checks whether $a and $b have any intersection, equivalent to $a->matches($b) -Intervals::haveIntersections(ConstraintInterface $a, ConstraintInterface $b); - -// Optimizes a complex multi constraint by merging all intervals down to the smallest -// possible multi constraint. The drawbacks are this is not very fast, and the resulting -// multi constraint will have no human readable prettyConstraint configured on it -Intervals::compactConstraint(ConstraintInterface $constraint); - -// Creates an array of numeric intervals and branch constraints representing a given constraint -Intervals::get(ConstraintInterface $constraint); - -// Clears the memoization cache when you are done processing constraints -Intervals::clear() -``` - -See the class docblocks for more details. - - -License -------- - -composer/semver is licensed under the MIT License, see the LICENSE file for details. diff --git a/tools/php-cs-fixer/vendor/composer/semver/composer.json b/tools/php-cs-fixer/vendor/composer/semver/composer.json deleted file mode 100644 index 030df2e..0000000 --- a/tools/php-cs-fixer/vendor/composer/semver/composer.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "name": "composer/semver", - "description": "Semver library that offers utilities, version constraint parsing and validation.", - "type": "library", - "license": "MIT", - "keywords": [ - "semver", - "semantic", - "versioning", - "validation" - ], - "authors": [ - { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "http://www.naderman.de" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - }, - { - "name": "Rob Bast", - "email": "rob.bast@gmail.com", - "homepage": "http://robbast.nl" - } - ], - "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/semver/issues" - }, - "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" - }, - "require-dev": { - "symfony/phpunit-bridge": "^4.2 || ^5", - "phpstan/phpstan": "^0.12.54" - }, - "autoload": { - "psr-4": { - "Composer\\Semver\\": "src" - } - }, - "autoload-dev": { - "psr-4": { - "Composer\\Semver\\": "tests" - } - }, - "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - } - }, - "scripts": { - "test": "SYMFONY_PHPUNIT_REMOVE_RETURN_TYPEHINT=1 vendor/bin/simple-phpunit", - "phpstan": "phpstan analyse" - } -} diff --git a/tools/php-cs-fixer/vendor/composer/semver/src/Comparator.php b/tools/php-cs-fixer/vendor/composer/semver/src/Comparator.php deleted file mode 100644 index 38f483a..0000000 --- a/tools/php-cs-fixer/vendor/composer/semver/src/Comparator.php +++ /dev/null @@ -1,113 +0,0 @@ - - * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. - */ - -namespace Composer\Semver; - -use Composer\Semver\Constraint\Constraint; - -class Comparator -{ - /** - * Evaluates the expression: $version1 > $version2. - * - * @param string $version1 - * @param string $version2 - * - * @return bool - */ - public static function greaterThan($version1, $version2) - { - return self::compare($version1, '>', $version2); - } - - /** - * Evaluates the expression: $version1 >= $version2. - * - * @param string $version1 - * @param string $version2 - * - * @return bool - */ - public static function greaterThanOrEqualTo($version1, $version2) - { - return self::compare($version1, '>=', $version2); - } - - /** - * Evaluates the expression: $version1 < $version2. - * - * @param string $version1 - * @param string $version2 - * - * @return bool - */ - public static function lessThan($version1, $version2) - { - return self::compare($version1, '<', $version2); - } - - /** - * Evaluates the expression: $version1 <= $version2. - * - * @param string $version1 - * @param string $version2 - * - * @return bool - */ - public static function lessThanOrEqualTo($version1, $version2) - { - return self::compare($version1, '<=', $version2); - } - - /** - * Evaluates the expression: $version1 == $version2. - * - * @param string $version1 - * @param string $version2 - * - * @return bool - */ - public static function equalTo($version1, $version2) - { - return self::compare($version1, '==', $version2); - } - - /** - * Evaluates the expression: $version1 != $version2. - * - * @param string $version1 - * @param string $version2 - * - * @return bool - */ - public static function notEqualTo($version1, $version2) - { - return self::compare($version1, '!=', $version2); - } - - /** - * Evaluates the expression: $version1 $operator $version2. - * - * @param string $version1 - * @param string $operator - * @param string $version2 - * - * @return bool - * - * @phpstan-param Constraint::STR_OP_* $operator - */ - public static function compare($version1, $operator, $version2) - { - $constraint = new Constraint($operator, $version2); - - return $constraint->matchSpecific(new Constraint('==', $version1), true); - } -} diff --git a/tools/php-cs-fixer/vendor/composer/semver/src/CompilingMatcher.php b/tools/php-cs-fixer/vendor/composer/semver/src/CompilingMatcher.php deleted file mode 100644 index f118667..0000000 --- a/tools/php-cs-fixer/vendor/composer/semver/src/CompilingMatcher.php +++ /dev/null @@ -1,71 +0,0 @@ - - * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. - */ - -namespace Composer\Semver; - -use Composer\Semver\Constraint\Constraint; -use Composer\Semver\Constraint\ConstraintInterface; - -/** - * Helper class to evaluate constraint by compiling and reusing the code to evaluate - */ -class CompilingMatcher -{ - /** - * @var array - * @phpstan-var array - */ - private static $compiledCheckerCache = array(); - /** @var bool */ - private static $enabled; - - /** - * @phpstan-var array - */ - private static $transOpInt = array( - Constraint::OP_EQ => Constraint::STR_OP_EQ, - Constraint::OP_LT => Constraint::STR_OP_LT, - Constraint::OP_LE => Constraint::STR_OP_LE, - Constraint::OP_GT => Constraint::STR_OP_GT, - Constraint::OP_GE => Constraint::STR_OP_GE, - Constraint::OP_NE => Constraint::STR_OP_NE, - ); - - /** - * Evaluates the expression: $constraint match $operator $version - * - * @param ConstraintInterface $constraint - * @param int $operator - * @phpstan-param Constraint::OP_* $operator - * @param string $version - * - * @return mixed - */ - public static function match(ConstraintInterface $constraint, $operator, $version) - { - if (self::$enabled === null) { - self::$enabled = !\in_array('eval', explode(',', (string) ini_get('disable_functions')), true); - } - if (!self::$enabled) { - return $constraint->matches(new Constraint(self::$transOpInt[$operator], $version)); - } - - $cacheKey = $operator.$constraint; - if (!isset(self::$compiledCheckerCache[$cacheKey])) { - $code = $constraint->compile($operator); - self::$compiledCheckerCache[$cacheKey] = $function = eval('return function($v, $b){return '.$code.';};'); - } else { - $function = self::$compiledCheckerCache[$cacheKey]; - } - - return $function($version, strpos($version, 'dev-') === 0); - } -} diff --git a/tools/php-cs-fixer/vendor/composer/semver/src/Constraint/Bound.php b/tools/php-cs-fixer/vendor/composer/semver/src/Constraint/Bound.php deleted file mode 100644 index 7effb11..0000000 --- a/tools/php-cs-fixer/vendor/composer/semver/src/Constraint/Bound.php +++ /dev/null @@ -1,122 +0,0 @@ - - * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. - */ - -namespace Composer\Semver\Constraint; - -class Bound -{ - /** - * @var string - */ - private $version; - - /** - * @var bool - */ - private $isInclusive; - - /** - * @param string $version - * @param bool $isInclusive - */ - public function __construct($version, $isInclusive) - { - $this->version = $version; - $this->isInclusive = $isInclusive; - } - - /** - * @return string - */ - public function getVersion() - { - return $this->version; - } - - /** - * @return bool - */ - public function isInclusive() - { - return $this->isInclusive; - } - - /** - * @return bool - */ - public function isZero() - { - return $this->getVersion() === '0.0.0.0-dev' && $this->isInclusive(); - } - - /** - * @return bool - */ - public function isPositiveInfinity() - { - return $this->getVersion() === PHP_INT_MAX.'.0.0.0' && !$this->isInclusive(); - } - - /** - * Compares a bound to another with a given operator. - * - * @param Bound $other - * @param string $operator - * - * @return bool - */ - public function compareTo(Bound $other, $operator) - { - if (!\in_array($operator, array('<', '>'), true)) { - throw new \InvalidArgumentException('Does not support any other operator other than > or <.'); - } - - // If they are the same it doesn't matter - if ($this == $other) { - return false; - } - - $compareResult = version_compare($this->getVersion(), $other->getVersion()); - - // Not the same version means we don't need to check if the bounds are inclusive or not - if (0 !== $compareResult) { - return (('>' === $operator) ? 1 : -1) === $compareResult; - } - - // Question we're answering here is "am I higher than $other?" - return '>' === $operator ? $other->isInclusive() : !$other->isInclusive(); - } - - public function __toString() - { - return sprintf( - '%s [%s]', - $this->getVersion(), - $this->isInclusive() ? 'inclusive' : 'exclusive' - ); - } - - /** - * @return self - */ - public static function zero() - { - return new Bound('0.0.0.0-dev', true); - } - - /** - * @return self - */ - public static function positiveInfinity() - { - return new Bound(PHP_INT_MAX.'.0.0.0', false); - } -} diff --git a/tools/php-cs-fixer/vendor/composer/semver/src/Constraint/Constraint.php b/tools/php-cs-fixer/vendor/composer/semver/src/Constraint/Constraint.php deleted file mode 100644 index dc39482..0000000 --- a/tools/php-cs-fixer/vendor/composer/semver/src/Constraint/Constraint.php +++ /dev/null @@ -1,435 +0,0 @@ - - * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. - */ - -namespace Composer\Semver\Constraint; - -/** - * Defines a constraint. - */ -class Constraint implements ConstraintInterface -{ - /* operator integer values */ - const OP_EQ = 0; - const OP_LT = 1; - const OP_LE = 2; - const OP_GT = 3; - const OP_GE = 4; - const OP_NE = 5; - - /* operator string values */ - const STR_OP_EQ = '=='; - const STR_OP_EQ_ALT = '='; - const STR_OP_LT = '<'; - const STR_OP_LE = '<='; - const STR_OP_GT = '>'; - const STR_OP_GE = '>='; - const STR_OP_NE = '!='; - const STR_OP_NE_ALT = '<>'; - - /** - * Operator to integer translation table. - * - * @var array - * @phpstan-var array - */ - private static $transOpStr = array( - '=' => self::OP_EQ, - '==' => self::OP_EQ, - '<' => self::OP_LT, - '<=' => self::OP_LE, - '>' => self::OP_GT, - '>=' => self::OP_GE, - '<>' => self::OP_NE, - '!=' => self::OP_NE, - ); - - /** - * Integer to operator translation table. - * - * @var array - * @phpstan-var array - */ - private static $transOpInt = array( - self::OP_EQ => '==', - self::OP_LT => '<', - self::OP_LE => '<=', - self::OP_GT => '>', - self::OP_GE => '>=', - self::OP_NE => '!=', - ); - - /** - * @var int - * @phpstan-var self::OP_* - */ - protected $operator; - - /** @var string */ - protected $version; - - /** @var string|null */ - protected $prettyString; - - /** @var Bound */ - protected $lowerBound; - - /** @var Bound */ - protected $upperBound; - - /** - * Sets operator and version to compare with. - * - * @param string $operator - * @param string $version - * - * @throws \InvalidArgumentException if invalid operator is given. - * - * @phpstan-param self::STR_OP_* $operator - */ - public function __construct($operator, $version) - { - if (!isset(self::$transOpStr[$operator])) { - throw new \InvalidArgumentException(sprintf( - 'Invalid operator "%s" given, expected one of: %s', - $operator, - implode(', ', self::getSupportedOperators()) - )); - } - - $this->operator = self::$transOpStr[$operator]; - $this->version = $version; - } - - /** - * @return string - */ - public function getVersion() - { - return $this->version; - } - - /** - * @return string - * - * @phpstan-return self::STR_OP_* - */ - public function getOperator() - { - return self::$transOpInt[$this->operator]; - } - - /** - * @param ConstraintInterface $provider - * - * @return bool - */ - public function matches(ConstraintInterface $provider) - { - if ($provider instanceof self) { - return $this->matchSpecific($provider); - } - - // turn matching around to find a match - return $provider->matches($this); - } - - /** - * {@inheritDoc} - */ - public function setPrettyString($prettyString) - { - $this->prettyString = $prettyString; - } - - /** - * {@inheritDoc} - */ - public function getPrettyString() - { - if ($this->prettyString) { - return $this->prettyString; - } - - return $this->__toString(); - } - - /** - * Get all supported comparison operators. - * - * @return array - * - * @phpstan-return list - */ - public static function getSupportedOperators() - { - return array_keys(self::$transOpStr); - } - - /** - * @param string $operator - * @return int - * - * @phpstan-param self::STR_OP_* $operator - * @phpstan-return self::OP_* - */ - public static function getOperatorConstant($operator) - { - return self::$transOpStr[$operator]; - } - - /** - * @param string $a - * @param string $b - * @param string $operator - * @param bool $compareBranches - * - * @throws \InvalidArgumentException if invalid operator is given. - * - * @return bool - * - * @phpstan-param self::STR_OP_* $operator - */ - public function versionCompare($a, $b, $operator, $compareBranches = false) - { - if (!isset(self::$transOpStr[$operator])) { - throw new \InvalidArgumentException(sprintf( - 'Invalid operator "%s" given, expected one of: %s', - $operator, - implode(', ', self::getSupportedOperators()) - )); - } - - $aIsBranch = strpos($a, 'dev-') === 0; - $bIsBranch = strpos($b, 'dev-') === 0; - - if ($operator === '!=' && ($aIsBranch || $bIsBranch)) { - return $a !== $b; - } - - if ($aIsBranch && $bIsBranch) { - return $operator === '==' && $a === $b; - } - - // when branches are not comparable, we make sure dev branches never match anything - if (!$compareBranches && ($aIsBranch || $bIsBranch)) { - return false; - } - - return \version_compare($a, $b, $operator); - } - - /** - * {@inheritDoc} - */ - public function compile($otherOperator) - { - if (strpos($this->version, 'dev-') === 0) { - if (self::OP_EQ === $this->operator) { - if (self::OP_EQ === $otherOperator) { - return sprintf('$b && $v === %s', \var_export($this->version, true)); - } - if (self::OP_NE === $otherOperator) { - return sprintf('!$b || $v !== %s', \var_export($this->version, true)); - } - return 'false'; - } - - if (self::OP_NE === $this->operator) { - if (self::OP_EQ === $otherOperator) { - return sprintf('!$b || $v !== %s', \var_export($this->version, true)); - } - if (self::OP_NE === $otherOperator) { - return 'true'; - } - return '!$b'; - } - - return 'false'; - } - - if (self::OP_EQ === $this->operator) { - if (self::OP_EQ === $otherOperator) { - return sprintf('\version_compare($v, %s, \'==\')', \var_export($this->version, true)); - } - if (self::OP_NE === $otherOperator) { - return sprintf('$b || \version_compare($v, %s, \'!=\')', \var_export($this->version, true)); - } - - return sprintf('!$b && \version_compare(%s, $v, \'%s\')', \var_export($this->version, true), self::$transOpInt[$otherOperator]); - } - - if (self::OP_NE === $this->operator) { - if (self::OP_EQ === $otherOperator) { - return sprintf('$b || (!$b && \version_compare($v, %s, \'!=\'))', \var_export($this->version, true)); - } - - if (self::OP_NE === $otherOperator) { - return 'true'; - } - return '!$b'; - } - - if (self::OP_LT === $this->operator || self::OP_LE === $this->operator) { - if (self::OP_LT === $otherOperator || self::OP_LE === $otherOperator) { - return '!$b'; - } - } else { // $this->operator must be self::OP_GT || self::OP_GE here - if (self::OP_GT === $otherOperator || self::OP_GE === $otherOperator) { - return '!$b'; - } - } - - if (self::OP_NE === $otherOperator) { - return 'true'; - } - - $codeComparison = sprintf('\version_compare($v, %s, \'%s\')', \var_export($this->version, true), self::$transOpInt[$this->operator]); - if ($this->operator === self::OP_LE) { - if ($otherOperator === self::OP_GT) { - return sprintf('!$b && \version_compare($v, %s, \'!=\') && ', \var_export($this->version, true)) . $codeComparison; - } - } elseif ($this->operator === self::OP_GE) { - if ($otherOperator === self::OP_LT) { - return sprintf('!$b && \version_compare($v, %s, \'!=\') && ', \var_export($this->version, true)) . $codeComparison; - } - } - - return sprintf('!$b && %s', $codeComparison); - } - - /** - * @param Constraint $provider - * @param bool $compareBranches - * - * @return bool - */ - public function matchSpecific(Constraint $provider, $compareBranches = false) - { - $noEqualOp = str_replace('=', '', self::$transOpInt[$this->operator]); - $providerNoEqualOp = str_replace('=', '', self::$transOpInt[$provider->operator]); - - $isEqualOp = self::OP_EQ === $this->operator; - $isNonEqualOp = self::OP_NE === $this->operator; - $isProviderEqualOp = self::OP_EQ === $provider->operator; - $isProviderNonEqualOp = self::OP_NE === $provider->operator; - - // '!=' operator is match when other operator is not '==' operator or version is not match - // these kinds of comparisons always have a solution - if ($isNonEqualOp || $isProviderNonEqualOp) { - if ($isNonEqualOp && !$isProviderNonEqualOp && !$isProviderEqualOp && strpos($provider->version, 'dev-') === 0) { - return false; - } - - if ($isProviderNonEqualOp && !$isNonEqualOp && !$isEqualOp && strpos($this->version, 'dev-') === 0) { - return false; - } - - if (!$isEqualOp && !$isProviderEqualOp) { - return true; - } - return $this->versionCompare($provider->version, $this->version, '!=', $compareBranches); - } - - // an example for the condition is <= 2.0 & < 1.0 - // these kinds of comparisons always have a solution - if ($this->operator !== self::OP_EQ && $noEqualOp === $providerNoEqualOp) { - return !(strpos($this->version, 'dev-') === 0 || strpos($provider->version, 'dev-') === 0); - } - - $version1 = $isEqualOp ? $this->version : $provider->version; - $version2 = $isEqualOp ? $provider->version : $this->version; - $operator = $isEqualOp ? $provider->operator : $this->operator; - - if ($this->versionCompare($version1, $version2, self::$transOpInt[$operator], $compareBranches)) { - // special case, e.g. require >= 1.0 and provide < 1.0 - // 1.0 >= 1.0 but 1.0 is outside of the provided interval - - return !(self::$transOpInt[$provider->operator] === $providerNoEqualOp - && self::$transOpInt[$this->operator] !== $noEqualOp - && \version_compare($provider->version, $this->version, '==')); - } - - return false; - } - - /** - * @return string - */ - public function __toString() - { - return self::$transOpInt[$this->operator] . ' ' . $this->version; - } - - /** - * {@inheritDoc} - */ - public function getLowerBound() - { - $this->extractBounds(); - - return $this->lowerBound; - } - - /** - * {@inheritDoc} - */ - public function getUpperBound() - { - $this->extractBounds(); - - return $this->upperBound; - } - - /** - * @return void - */ - private function extractBounds() - { - if (null !== $this->lowerBound) { - return; - } - - // Branches - if (strpos($this->version, 'dev-') === 0) { - $this->lowerBound = Bound::zero(); - $this->upperBound = Bound::positiveInfinity(); - - return; - } - - switch ($this->operator) { - case self::OP_EQ: - $this->lowerBound = new Bound($this->version, true); - $this->upperBound = new Bound($this->version, true); - break; - case self::OP_LT: - $this->lowerBound = Bound::zero(); - $this->upperBound = new Bound($this->version, false); - break; - case self::OP_LE: - $this->lowerBound = Bound::zero(); - $this->upperBound = new Bound($this->version, true); - break; - case self::OP_GT: - $this->lowerBound = new Bound($this->version, false); - $this->upperBound = Bound::positiveInfinity(); - break; - case self::OP_GE: - $this->lowerBound = new Bound($this->version, true); - $this->upperBound = Bound::positiveInfinity(); - break; - case self::OP_NE: - $this->lowerBound = Bound::zero(); - $this->upperBound = Bound::positiveInfinity(); - break; - } - } -} diff --git a/tools/php-cs-fixer/vendor/composer/semver/src/Constraint/ConstraintInterface.php b/tools/php-cs-fixer/vendor/composer/semver/src/Constraint/ConstraintInterface.php deleted file mode 100644 index 389b935..0000000 --- a/tools/php-cs-fixer/vendor/composer/semver/src/Constraint/ConstraintInterface.php +++ /dev/null @@ -1,75 +0,0 @@ - - * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. - */ - -namespace Composer\Semver\Constraint; - -/** - * DO NOT IMPLEMENT this interface. It is only meant for usage as a type hint - * in libraries relying on composer/semver but creating your own constraint class - * that implements this interface is not a supported use case and will cause the - * composer/semver components to return unexpected results. - */ -interface ConstraintInterface -{ - /** - * Checks whether the given constraint intersects in any way with this constraint - * - * @param ConstraintInterface $provider - * - * @return bool - */ - public function matches(ConstraintInterface $provider); - - /** - * Provides a compiled version of the constraint for the given operator - * The compiled version must be a PHP expression. - * Executor of compile version must provide 2 variables: - * - $v = the string version to compare with - * - $b = whether or not the version is a non-comparable branch (starts with "dev-") - * - * @see Constraint::OP_* for the list of available operators. - * @example return '!$b && version_compare($v, '1.0', '>')'; - * - * @param int $otherOperator one Constraint::OP_* - * - * @return string - * - * @phpstan-param Constraint::OP_* $otherOperator - */ - public function compile($otherOperator); - - /** - * @return Bound - */ - public function getUpperBound(); - - /** - * @return Bound - */ - public function getLowerBound(); - - /** - * @return string - */ - public function getPrettyString(); - - /** - * @param string|null $prettyString - * - * @return void - */ - public function setPrettyString($prettyString); - - /** - * @return string - */ - public function __toString(); -} diff --git a/tools/php-cs-fixer/vendor/composer/semver/src/Constraint/MatchAllConstraint.php b/tools/php-cs-fixer/vendor/composer/semver/src/Constraint/MatchAllConstraint.php deleted file mode 100644 index 5e51af9..0000000 --- a/tools/php-cs-fixer/vendor/composer/semver/src/Constraint/MatchAllConstraint.php +++ /dev/null @@ -1,85 +0,0 @@ - - * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. - */ - -namespace Composer\Semver\Constraint; - -/** - * Defines the absence of a constraint. - * - * This constraint matches everything. - */ -class MatchAllConstraint implements ConstraintInterface -{ - /** @var string|null */ - protected $prettyString; - - /** - * @param ConstraintInterface $provider - * - * @return bool - */ - public function matches(ConstraintInterface $provider) - { - return true; - } - - /** - * {@inheritDoc} - */ - public function compile($otherOperator) - { - return 'true'; - } - - /** - * {@inheritDoc} - */ - public function setPrettyString($prettyString) - { - $this->prettyString = $prettyString; - } - - /** - * {@inheritDoc} - */ - public function getPrettyString() - { - if ($this->prettyString) { - return $this->prettyString; - } - - return (string) $this; - } - - /** - * {@inheritDoc} - */ - public function __toString() - { - return '*'; - } - - /** - * {@inheritDoc} - */ - public function getUpperBound() - { - return Bound::positiveInfinity(); - } - - /** - * {@inheritDoc} - */ - public function getLowerBound() - { - return Bound::zero(); - } -} diff --git a/tools/php-cs-fixer/vendor/composer/semver/src/Constraint/MatchNoneConstraint.php b/tools/php-cs-fixer/vendor/composer/semver/src/Constraint/MatchNoneConstraint.php deleted file mode 100644 index dadcf62..0000000 --- a/tools/php-cs-fixer/vendor/composer/semver/src/Constraint/MatchNoneConstraint.php +++ /dev/null @@ -1,83 +0,0 @@ - - * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. - */ - -namespace Composer\Semver\Constraint; - -/** - * Blackhole of constraints, nothing escapes it - */ -class MatchNoneConstraint implements ConstraintInterface -{ - /** @var string|null */ - protected $prettyString; - - /** - * @param ConstraintInterface $provider - * - * @return bool - */ - public function matches(ConstraintInterface $provider) - { - return false; - } - - /** - * {@inheritDoc} - */ - public function compile($otherOperator) - { - return 'false'; - } - - /** - * {@inheritDoc} - */ - public function setPrettyString($prettyString) - { - $this->prettyString = $prettyString; - } - - /** - * {@inheritDoc} - */ - public function getPrettyString() - { - if ($this->prettyString) { - return $this->prettyString; - } - - return (string) $this; - } - - /** - * {@inheritDoc} - */ - public function __toString() - { - return '[]'; - } - - /** - * {@inheritDoc} - */ - public function getUpperBound() - { - return new Bound('0.0.0.0-dev', false); - } - - /** - * {@inheritDoc} - */ - public function getLowerBound() - { - return new Bound('0.0.0.0-dev', false); - } -} diff --git a/tools/php-cs-fixer/vendor/composer/semver/src/Constraint/MultiConstraint.php b/tools/php-cs-fixer/vendor/composer/semver/src/Constraint/MultiConstraint.php deleted file mode 100644 index 1f4c006..0000000 --- a/tools/php-cs-fixer/vendor/composer/semver/src/Constraint/MultiConstraint.php +++ /dev/null @@ -1,325 +0,0 @@ - - * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. - */ - -namespace Composer\Semver\Constraint; - -/** - * Defines a conjunctive or disjunctive set of constraints. - */ -class MultiConstraint implements ConstraintInterface -{ - /** - * @var ConstraintInterface[] - * @phpstan-var non-empty-array - */ - protected $constraints; - - /** @var string|null */ - protected $prettyString; - - /** @var string|null */ - protected $string; - - /** @var bool */ - protected $conjunctive; - - /** @var Bound|null */ - protected $lowerBound; - - /** @var Bound|null */ - protected $upperBound; - - /** - * @param ConstraintInterface[] $constraints A set of constraints - * @param bool $conjunctive Whether the constraints should be treated as conjunctive or disjunctive - * - * @throws \InvalidArgumentException If less than 2 constraints are passed - */ - public function __construct(array $constraints, $conjunctive = true) - { - if (\count($constraints) < 2) { - throw new \InvalidArgumentException( - 'Must provide at least two constraints for a MultiConstraint. Use '. - 'the regular Constraint class for one constraint only or MatchAllConstraint for none. You may use '. - 'MultiConstraint::create() which optimizes and handles those cases automatically.' - ); - } - - $this->constraints = $constraints; - $this->conjunctive = $conjunctive; - } - - /** - * @return ConstraintInterface[] - */ - public function getConstraints() - { - return $this->constraints; - } - - /** - * @return bool - */ - public function isConjunctive() - { - return $this->conjunctive; - } - - /** - * @return bool - */ - public function isDisjunctive() - { - return !$this->conjunctive; - } - - /** - * {@inheritDoc} - */ - public function compile($otherOperator) - { - $parts = array(); - foreach ($this->constraints as $constraint) { - $code = $constraint->compile($otherOperator); - if ($code === 'true') { - if (!$this->conjunctive) { - return 'true'; - } - } elseif ($code === 'false') { - if ($this->conjunctive) { - return 'false'; - } - } else { - $parts[] = '('.$code.')'; - } - } - - if (!$parts) { - return $this->conjunctive ? 'true' : 'false'; - } - - return $this->conjunctive ? implode('&&', $parts) : implode('||', $parts); - } - - /** - * @param ConstraintInterface $provider - * - * @return bool - */ - public function matches(ConstraintInterface $provider) - { - if (false === $this->conjunctive) { - foreach ($this->constraints as $constraint) { - if ($provider->matches($constraint)) { - return true; - } - } - - return false; - } - - // when matching a conjunctive and a disjunctive multi constraint we have to iterate over the disjunctive one - // otherwise we'd return true if different parts of the disjunctive constraint match the conjunctive one - // which would lead to incorrect results, e.g. [>1 and <2] would match [<1 or >2] although they do not intersect - if ($provider instanceof MultiConstraint && $provider->isDisjunctive()) { - return $provider->matches($this); - } - - foreach ($this->constraints as $constraint) { - if (!$provider->matches($constraint)) { - return false; - } - } - - return true; - } - - /** - * {@inheritDoc} - */ - public function setPrettyString($prettyString) - { - $this->prettyString = $prettyString; - } - - /** - * {@inheritDoc} - */ - public function getPrettyString() - { - if ($this->prettyString) { - return $this->prettyString; - } - - return (string) $this; - } - - /** - * {@inheritDoc} - */ - public function __toString() - { - if ($this->string !== null) { - return $this->string; - } - - $constraints = array(); - foreach ($this->constraints as $constraint) { - $constraints[] = (string) $constraint; - } - - return $this->string = '[' . implode($this->conjunctive ? ' ' : ' || ', $constraints) . ']'; - } - - /** - * {@inheritDoc} - */ - public function getLowerBound() - { - $this->extractBounds(); - - if (null === $this->lowerBound) { - throw new \LogicException('extractBounds should have populated the lowerBound property'); - } - - return $this->lowerBound; - } - - /** - * {@inheritDoc} - */ - public function getUpperBound() - { - $this->extractBounds(); - - if (null === $this->upperBound) { - throw new \LogicException('extractBounds should have populated the upperBound property'); - } - - return $this->upperBound; - } - - /** - * Tries to optimize the constraints as much as possible, meaning - * reducing/collapsing congruent constraints etc. - * Does not necessarily return a MultiConstraint instance if - * things can be reduced to a simple constraint - * - * @param ConstraintInterface[] $constraints A set of constraints - * @param bool $conjunctive Whether the constraints should be treated as conjunctive or disjunctive - * - * @return ConstraintInterface - */ - public static function create(array $constraints, $conjunctive = true) - { - if (0 === \count($constraints)) { - return new MatchAllConstraint(); - } - - if (1 === \count($constraints)) { - return $constraints[0]; - } - - $optimized = self::optimizeConstraints($constraints, $conjunctive); - if ($optimized !== null) { - list($constraints, $conjunctive) = $optimized; - if (\count($constraints) === 1) { - return $constraints[0]; - } - } - - return new self($constraints, $conjunctive); - } - - /** - * @param ConstraintInterface[] $constraints - * @param bool $conjunctive - * @return ?array - * - * @phpstan-return array{0: list, 1: bool}|null - */ - private static function optimizeConstraints(array $constraints, $conjunctive) - { - // parse the two OR groups and if they are contiguous we collapse - // them into one constraint - // [>= 1 < 2] || [>= 2 < 3] || [>= 3 < 4] => [>= 1 < 4] - if (!$conjunctive) { - $left = $constraints[0]; - $mergedConstraints = array(); - $optimized = false; - for ($i = 1, $l = \count($constraints); $i < $l; $i++) { - $right = $constraints[$i]; - if ( - $left instanceof self - && $left->conjunctive - && $right instanceof self - && $right->conjunctive - && \count($left->constraints) === 2 - && \count($right->constraints) === 2 - && ($left0 = (string) $left->constraints[0]) - && $left0[0] === '>' && $left0[1] === '=' - && ($left1 = (string) $left->constraints[1]) - && $left1[0] === '<' - && ($right0 = (string) $right->constraints[0]) - && $right0[0] === '>' && $right0[1] === '=' - && ($right1 = (string) $right->constraints[1]) - && $right1[0] === '<' - && substr($left1, 2) === substr($right0, 3) - ) { - $optimized = true; - $left = new MultiConstraint( - array( - $left->constraints[0], - $right->constraints[1], - ), - true); - } else { - $mergedConstraints[] = $left; - $left = $right; - } - } - if ($optimized) { - $mergedConstraints[] = $left; - return array($mergedConstraints, false); - } - } - - // TODO: Here's the place to put more optimizations - - return null; - } - - /** - * @return void - */ - private function extractBounds() - { - if (null !== $this->lowerBound) { - return; - } - - foreach ($this->constraints as $constraint) { - if (null === $this->lowerBound || null === $this->upperBound) { - $this->lowerBound = $constraint->getLowerBound(); - $this->upperBound = $constraint->getUpperBound(); - continue; - } - - if ($constraint->getLowerBound()->compareTo($this->lowerBound, $this->isConjunctive() ? '>' : '<')) { - $this->lowerBound = $constraint->getLowerBound(); - } - - if ($constraint->getUpperBound()->compareTo($this->upperBound, $this->isConjunctive() ? '<' : '>')) { - $this->upperBound = $constraint->getUpperBound(); - } - } - } -} diff --git a/tools/php-cs-fixer/vendor/composer/semver/src/Interval.php b/tools/php-cs-fixer/vendor/composer/semver/src/Interval.php deleted file mode 100644 index 43d5a4f..0000000 --- a/tools/php-cs-fixer/vendor/composer/semver/src/Interval.php +++ /dev/null @@ -1,98 +0,0 @@ - - * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. - */ - -namespace Composer\Semver; - -use Composer\Semver\Constraint\Constraint; - -class Interval -{ - /** @var Constraint */ - private $start; - /** @var Constraint */ - private $end; - - public function __construct(Constraint $start, Constraint $end) - { - $this->start = $start; - $this->end = $end; - } - - /** - * @return Constraint - */ - public function getStart() - { - return $this->start; - } - - /** - * @return Constraint - */ - public function getEnd() - { - return $this->end; - } - - /** - * @return Constraint - */ - public static function fromZero() - { - static $zero; - - if (null === $zero) { - $zero = new Constraint('>=', '0.0.0.0-dev'); - } - - return $zero; - } - - /** - * @return Constraint - */ - public static function untilPositiveInfinity() - { - static $positiveInfinity; - - if (null === $positiveInfinity) { - $positiveInfinity = new Constraint('<', PHP_INT_MAX.'.0.0.0'); - } - - return $positiveInfinity; - } - - /** - * @return self - */ - public static function any() - { - return new self(self::fromZero(), self::untilPositiveInfinity()); - } - - /** - * @return array{'names': string[], 'exclude': bool} - */ - public static function anyDev() - { - // any == exclude nothing - return array('names' => array(), 'exclude' => true); - } - - /** - * @return array{'names': string[], 'exclude': bool} - */ - public static function noDev() - { - // nothing == no names included - return array('names' => array(), 'exclude' => false); - } -} diff --git a/tools/php-cs-fixer/vendor/composer/semver/src/Intervals.php b/tools/php-cs-fixer/vendor/composer/semver/src/Intervals.php deleted file mode 100644 index f2e4c8c..0000000 --- a/tools/php-cs-fixer/vendor/composer/semver/src/Intervals.php +++ /dev/null @@ -1,478 +0,0 @@ - - * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. - */ - -namespace Composer\Semver; - -use Composer\Semver\Constraint\Constraint; -use Composer\Semver\Constraint\ConstraintInterface; -use Composer\Semver\Constraint\MatchAllConstraint; -use Composer\Semver\Constraint\MatchNoneConstraint; -use Composer\Semver\Constraint\MultiConstraint; - -/** - * Helper class generating intervals from constraints - * - * This contains utilities for: - * - * - compacting an existing constraint which can be used to combine several into one - * by creating a MultiConstraint out of the many constraints you have. - * - * - checking whether one subset is a subset of another. - * - * Note: You should call clear to free memoization memory usage when you are done using this class - */ -class Intervals -{ - /** - * @phpstan-var array - */ - private static $intervalsCache = array(); - - /** - * @phpstan-var array - */ - private static $opSortOrder = array( - '>=' => -3, - '<' => -2, - '>' => 2, - '<=' => 3, - ); - - /** - * Clears the memoization cache once you are done - * - * @return void - */ - public static function clear() - { - self::$intervalsCache = array(); - } - - /** - * Checks whether $candidate is a subset of $constraint - * - * @return bool - */ - public static function isSubsetOf(ConstraintInterface $candidate, ConstraintInterface $constraint) - { - if ($constraint instanceof MatchAllConstraint) { - return true; - } - - if ($candidate instanceof MatchNoneConstraint || $constraint instanceof MatchNoneConstraint) { - return false; - } - - $intersectionIntervals = self::get(new MultiConstraint(array($candidate, $constraint), true)); - $candidateIntervals = self::get($candidate); - if (\count($intersectionIntervals['numeric']) !== \count($candidateIntervals['numeric'])) { - return false; - } - - foreach ($intersectionIntervals['numeric'] as $index => $interval) { - if (!isset($candidateIntervals['numeric'][$index])) { - return false; - } - - if ((string) $candidateIntervals['numeric'][$index]->getStart() !== (string) $interval->getStart()) { - return false; - } - - if ((string) $candidateIntervals['numeric'][$index]->getEnd() !== (string) $interval->getEnd()) { - return false; - } - } - - if ($intersectionIntervals['branches']['exclude'] !== $candidateIntervals['branches']['exclude']) { - return false; - } - if (\count($intersectionIntervals['branches']['names']) !== \count($candidateIntervals['branches']['names'])) { - return false; - } - foreach ($intersectionIntervals['branches']['names'] as $index => $name) { - if ($name !== $candidateIntervals['branches']['names'][$index]) { - return false; - } - } - - return true; - } - - /** - * Checks whether $a and $b have any intersection, equivalent to $a->matches($b) - * - * @return bool - */ - public static function haveIntersections(ConstraintInterface $a, ConstraintInterface $b) - { - if ($a instanceof MatchAllConstraint || $b instanceof MatchAllConstraint) { - return true; - } - - if ($a instanceof MatchNoneConstraint || $b instanceof MatchNoneConstraint) { - return false; - } - - $intersectionIntervals = self::generateIntervals(new MultiConstraint(array($a, $b), true), true); - - return \count($intersectionIntervals['numeric']) > 0 || $intersectionIntervals['branches']['exclude'] || \count($intersectionIntervals['branches']['names']) > 0; - } - - /** - * Attempts to optimize a MultiConstraint - * - * When merging MultiConstraints together they can get very large, this will - * compact it by looking at the real intervals covered by all the constraints - * and then creates a new constraint containing only the smallest amount of rules - * to match the same intervals. - * - * @return ConstraintInterface - */ - public static function compactConstraint(ConstraintInterface $constraint) - { - if (!$constraint instanceof MultiConstraint) { - return $constraint; - } - - $intervals = self::generateIntervals($constraint); - $constraints = array(); - $hasNumericMatchAll = false; - - if (\count($intervals['numeric']) === 1 && (string) $intervals['numeric'][0]->getStart() === (string) Interval::fromZero() && (string) $intervals['numeric'][0]->getEnd() === (string) Interval::untilPositiveInfinity()) { - $constraints[] = $intervals['numeric'][0]->getStart(); - $hasNumericMatchAll = true; - } else { - $unEqualConstraints = array(); - for ($i = 0, $count = \count($intervals['numeric']); $i < $count; $i++) { - $interval = $intervals['numeric'][$i]; - - // if current interval ends with < N and next interval begins with > N we can swap this out for != N - // but this needs to happen as a conjunctive expression together with the start of the current interval - // and end of next interval, so [>=M, N, [>=M, !=N, getEnd()->getOperator() === '<' && $i+1 < $count) { - $nextInterval = $intervals['numeric'][$i+1]; - if ($interval->getEnd()->getVersion() === $nextInterval->getStart()->getVersion() && $nextInterval->getStart()->getOperator() === '>') { - // only add a start if we didn't already do so, can be skipped if we're looking at second - // interval in [>=M, N, P, =M, !=N] already and we only want to add !=P right now - if (\count($unEqualConstraints) === 0 && (string) $interval->getStart() !== (string) Interval::fromZero()) { - $unEqualConstraints[] = $interval->getStart(); - } - $unEqualConstraints[] = new Constraint('!=', $interval->getEnd()->getVersion()); - continue; - } - } - - if (\count($unEqualConstraints) > 0) { - // this is where the end of the following interval of a != constraint is added as explained above - if ((string) $interval->getEnd() !== (string) Interval::untilPositiveInfinity()) { - $unEqualConstraints[] = $interval->getEnd(); - } - - // count is 1 if entire constraint is just one != expression - if (\count($unEqualConstraints) > 1) { - $constraints[] = new MultiConstraint($unEqualConstraints, true); - } else { - $constraints[] = $unEqualConstraints[0]; - } - - $unEqualConstraints = array(); - continue; - } - - // convert back >= x - <= x intervals to == x - if ($interval->getStart()->getVersion() === $interval->getEnd()->getVersion() && $interval->getStart()->getOperator() === '>=' && $interval->getEnd()->getOperator() === '<=') { - $constraints[] = new Constraint('==', $interval->getStart()->getVersion()); - continue; - } - - if ((string) $interval->getStart() === (string) Interval::fromZero()) { - $constraints[] = $interval->getEnd(); - } elseif ((string) $interval->getEnd() === (string) Interval::untilPositiveInfinity()) { - $constraints[] = $interval->getStart(); - } else { - $constraints[] = new MultiConstraint(array($interval->getStart(), $interval->getEnd()), true); - } - } - } - - $devConstraints = array(); - - if (0 === \count($intervals['branches']['names'])) { - if ($intervals['branches']['exclude']) { - if ($hasNumericMatchAll) { - return new MatchAllConstraint; - } - // otherwise constraint should contain a != operator and already cover this - } - } else { - foreach ($intervals['branches']['names'] as $branchName) { - if ($intervals['branches']['exclude']) { - $devConstraints[] = new Constraint('!=', $branchName); - } else { - $devConstraints[] = new Constraint('==', $branchName); - } - } - - // excluded branches, e.g. != dev-foo are conjunctive with the interval, so - // > 2.0 != dev-foo must return a conjunctive constraint - if ($intervals['branches']['exclude']) { - if (\count($constraints) > 1) { - return new MultiConstraint(array_merge( - array(new MultiConstraint($constraints, false)), - $devConstraints - ), true); - } - - if (\count($constraints) === 1 && (string)$constraints[0] === (string)Interval::fromZero()) { - if (\count($devConstraints) > 1) { - return new MultiConstraint($devConstraints, true); - } - return $devConstraints[0]; - } - - return new MultiConstraint(array_merge($constraints, $devConstraints), true); - } - - // otherwise devConstraints contains a list of == operators for branches which are disjunctive with the - // rest of the constraint - $constraints = array_merge($constraints, $devConstraints); - } - - if (\count($constraints) > 1) { - return new MultiConstraint($constraints, false); - } - - if (\count($constraints) === 1) { - return $constraints[0]; - } - - return new MatchNoneConstraint; - } - - /** - * Creates an array of numeric intervals and branch constraints representing a given constraint - * - * if the returned numeric array is empty it means the constraint matches nothing in the numeric range (0 - +inf) - * if the returned branches array is empty it means no dev-* versions are matched - * if a constraint matches all possible dev-* versions, branches will contain Interval::anyDev() - * - * @return array - * @phpstan-return array{'numeric': Interval[], 'branches': array{'names': string[], 'exclude': bool}} - */ - public static function get(ConstraintInterface $constraint) - { - $key = (string) $constraint; - - if (!isset(self::$intervalsCache[$key])) { - self::$intervalsCache[$key] = self::generateIntervals($constraint); - } - - return self::$intervalsCache[$key]; - } - - /** - * @param bool $stopOnFirstValidInterval - * - * @phpstan-return array{'numeric': Interval[], 'branches': array{'names': string[], 'exclude': bool}} - */ - private static function generateIntervals(ConstraintInterface $constraint, $stopOnFirstValidInterval = false) - { - if ($constraint instanceof MatchAllConstraint) { - return array('numeric' => array(new Interval(Interval::fromZero(), Interval::untilPositiveInfinity())), 'branches' => Interval::anyDev()); - } - - if ($constraint instanceof MatchNoneConstraint) { - return array('numeric' => array(), 'branches' => array('names' => array(), 'exclude' => false)); - } - - if ($constraint instanceof Constraint) { - return self::generateSingleConstraintIntervals($constraint); - } - - if (!$constraint instanceof MultiConstraint) { - throw new \UnexpectedValueException('The constraint passed in should be an MatchAllConstraint, Constraint or MultiConstraint instance, got '.\get_class($constraint).'.'); - } - - $constraints = $constraint->getConstraints(); - - $numericGroups = array(); - $constraintBranches = array(); - foreach ($constraints as $c) { - $res = self::get($c); - $numericGroups[] = $res['numeric']; - $constraintBranches[] = $res['branches']; - } - - if ($constraint->isDisjunctive()) { - $branches = Interval::noDev(); - foreach ($constraintBranches as $b) { - if ($b['exclude']) { - if ($branches['exclude']) { - // disjunctive constraint, so only exclude what's excluded in all constraints - // !=a,!=b || !=b,!=c => !=b - $branches['names'] = array_intersect($branches['names'], $b['names']); - } else { - // disjunctive constraint so exclude all names which are not explicitly included in the alternative - // (==b || ==c) || !=a,!=b => !=a - $branches['exclude'] = true; - $branches['names'] = array_diff($b['names'], $branches['names']); - } - } else { - if ($branches['exclude']) { - // disjunctive constraint so exclude all names which are not explicitly included in the alternative - // !=a,!=b || (==b || ==c) => !=a - $branches['names'] = array_diff($branches['names'], $b['names']); - } else { - // disjunctive constraint, so just add all the other branches - // (==a || ==b) || ==c => ==a || ==b || ==c - $branches['names'] = array_merge($branches['names'], $b['names']); - } - } - } - } else { - $branches = Interval::anyDev(); - foreach ($constraintBranches as $b) { - if ($b['exclude']) { - if ($branches['exclude']) { - // conjunctive, so just add all branch names to be excluded - // !=a && !=b => !=a,!=b - $branches['names'] = array_merge($branches['names'], $b['names']); - } else { - // conjunctive, so only keep included names which are not excluded - // (==a||==c) && !=a,!=b => ==c - $branches['names'] = array_diff($branches['names'], $b['names']); - } - } else { - if ($branches['exclude']) { - // conjunctive, so only keep included names which are not excluded - // !=a,!=b && (==a||==c) => ==c - $branches['names'] = array_diff($b['names'], $branches['names']); - $branches['exclude'] = false; - } else { - // conjunctive, so only keep names that are included in both - // (==a||==b) && (==a||==c) => ==a - $branches['names'] = array_intersect($branches['names'], $b['names']); - } - } - } - } - - $branches['names'] = array_unique($branches['names']); - - if (\count($numericGroups) === 1) { - return array('numeric' => $numericGroups[0], 'branches' => $branches); - } - - $borders = array(); - foreach ($numericGroups as $group) { - foreach ($group as $interval) { - $borders[] = array('version' => $interval->getStart()->getVersion(), 'operator' => $interval->getStart()->getOperator(), 'side' => 'start'); - $borders[] = array('version' => $interval->getEnd()->getVersion(), 'operator' => $interval->getEnd()->getOperator(), 'side' => 'end'); - } - } - - $opSortOrder = self::$opSortOrder; - usort($borders, function ($a, $b) use ($opSortOrder) { - $order = version_compare($a['version'], $b['version']); - if ($order === 0) { - return $opSortOrder[$a['operator']] - $opSortOrder[$b['operator']]; - } - - return $order; - }); - - $activeIntervals = 0; - $intervals = array(); - $index = 0; - $activationThreshold = $constraint->isConjunctive() ? \count($numericGroups) : 1; - $start = null; - foreach ($borders as $border) { - if ($border['side'] === 'start') { - $activeIntervals++; - } else { - $activeIntervals--; - } - if (!$start && $activeIntervals >= $activationThreshold) { - $start = new Constraint($border['operator'], $border['version']); - } elseif ($start && $activeIntervals < $activationThreshold) { - // filter out invalid intervals like > x - <= x, or >= x - < x - if ( - version_compare($start->getVersion(), $border['version'], '=') - && ( - ($start->getOperator() === '>' && $border['operator'] === '<=') - || ($start->getOperator() === '>=' && $border['operator'] === '<') - ) - ) { - unset($intervals[$index]); - } else { - $intervals[$index] = new Interval($start, new Constraint($border['operator'], $border['version'])); - $index++; - - if ($stopOnFirstValidInterval) { - break; - } - } - - $start = null; - } - } - - return array('numeric' => $intervals, 'branches' => $branches); - } - - /** - * @phpstan-return array{'numeric': Interval[], 'branches': array{'names': string[], 'exclude': bool}}} - */ - private static function generateSingleConstraintIntervals(Constraint $constraint) - { - $op = $constraint->getOperator(); - - // handle branch constraints first - if (strpos($constraint->getVersion(), 'dev-') === 0) { - $intervals = array(); - $branches = array('names' => array(), 'exclude' => false); - - // != dev-foo means any numeric version may match, we treat >/< like != they are not really defined for branches - if ($op === '!=') { - $intervals[] = new Interval(Interval::fromZero(), Interval::untilPositiveInfinity()); - $branches = array('names' => array($constraint->getVersion()), 'exclude' => true); - } elseif ($op === '==') { - $branches['names'][] = $constraint->getVersion(); - } - - return array( - 'numeric' => $intervals, - 'branches' => $branches, - ); - } - - if ($op[0] === '>') { // > & >= - return array('numeric' => array(new Interval($constraint, Interval::untilPositiveInfinity())), 'branches' => Interval::noDev()); - } - if ($op[0] === '<') { // < & <= - return array('numeric' => array(new Interval(Interval::fromZero(), $constraint)), 'branches' => Interval::noDev()); - } - if ($op === '!=') { - // convert !=x to intervals of 0 - x - +inf + dev* - return array('numeric' => array( - new Interval(Interval::fromZero(), new Constraint('<', $constraint->getVersion())), - new Interval(new Constraint('>', $constraint->getVersion()), Interval::untilPositiveInfinity()), - ), 'branches' => Interval::anyDev()); - } - - // convert ==x to an interval of >=x - <=x - return array('numeric' => array( - new Interval(new Constraint('>=', $constraint->getVersion()), new Constraint('<=', $constraint->getVersion())), - ), 'branches' => Interval::noDev()); - } -} diff --git a/tools/php-cs-fixer/vendor/composer/semver/src/Semver.php b/tools/php-cs-fixer/vendor/composer/semver/src/Semver.php deleted file mode 100644 index 4d6de3c..0000000 --- a/tools/php-cs-fixer/vendor/composer/semver/src/Semver.php +++ /dev/null @@ -1,129 +0,0 @@ - - * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. - */ - -namespace Composer\Semver; - -use Composer\Semver\Constraint\Constraint; - -class Semver -{ - const SORT_ASC = 1; - const SORT_DESC = -1; - - /** @var VersionParser */ - private static $versionParser; - - /** - * Determine if given version satisfies given constraints. - * - * @param string $version - * @param string $constraints - * - * @return bool - */ - public static function satisfies($version, $constraints) - { - if (null === self::$versionParser) { - self::$versionParser = new VersionParser(); - } - - $versionParser = self::$versionParser; - $provider = new Constraint('==', $versionParser->normalize($version)); - $parsedConstraints = $versionParser->parseConstraints($constraints); - - return $parsedConstraints->matches($provider); - } - - /** - * Return all versions that satisfy given constraints. - * - * @param string[] $versions - * @param string $constraints - * - * @return string[] - */ - public static function satisfiedBy(array $versions, $constraints) - { - $versions = array_filter($versions, function ($version) use ($constraints) { - return Semver::satisfies($version, $constraints); - }); - - return array_values($versions); - } - - /** - * Sort given array of versions. - * - * @param string[] $versions - * - * @return string[] - */ - public static function sort(array $versions) - { - return self::usort($versions, self::SORT_ASC); - } - - /** - * Sort given array of versions in reverse. - * - * @param string[] $versions - * - * @return string[] - */ - public static function rsort(array $versions) - { - return self::usort($versions, self::SORT_DESC); - } - - /** - * @param string[] $versions - * @param int $direction - * - * @return string[] - */ - private static function usort(array $versions, $direction) - { - if (null === self::$versionParser) { - self::$versionParser = new VersionParser(); - } - - $versionParser = self::$versionParser; - $normalized = array(); - - // Normalize outside of usort() scope for minor performance increase. - // Creates an array of arrays: [[normalized, key], ...] - foreach ($versions as $key => $version) { - $normalizedVersion = $versionParser->normalize($version); - $normalizedVersion = $versionParser->normalizeDefaultBranch($normalizedVersion); - $normalized[] = array($normalizedVersion, $key); - } - - usort($normalized, function (array $left, array $right) use ($direction) { - if ($left[0] === $right[0]) { - return 0; - } - - if (Comparator::lessThan($left[0], $right[0])) { - return -$direction; - } - - return $direction; - }); - - // Recreate input array, using the original indexes which are now in sorted order. - $sorted = array(); - foreach ($normalized as $item) { - $sorted[] = $versions[$item[1]]; - } - - return $sorted; - } -} diff --git a/tools/php-cs-fixer/vendor/composer/semver/src/VersionParser.php b/tools/php-cs-fixer/vendor/composer/semver/src/VersionParser.php deleted file mode 100644 index ee4420a..0000000 --- a/tools/php-cs-fixer/vendor/composer/semver/src/VersionParser.php +++ /dev/null @@ -1,583 +0,0 @@ - - * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. - */ - -namespace Composer\Semver; - -use Composer\Semver\Constraint\ConstraintInterface; -use Composer\Semver\Constraint\MatchAllConstraint; -use Composer\Semver\Constraint\MultiConstraint; -use Composer\Semver\Constraint\Constraint; - -/** - * Version parser. - * - * @author Jordi Boggiano - */ -class VersionParser -{ - /** - * Regex to match pre-release data (sort of). - * - * Due to backwards compatibility: - * - Instead of enforcing hyphen, an underscore, dot or nothing at all are also accepted. - * - Only stabilities as recognized by Composer are allowed to precede a numerical identifier. - * - Numerical-only pre-release identifiers are not supported, see tests. - * - * |--------------| - * [major].[minor].[patch] -[pre-release] +[build-metadata] - * - * @var string - */ - private static $modifierRegex = '[._-]?(?:(stable|beta|b|RC|alpha|a|patch|pl|p)((?:[.-]?\d+)*+)?)?([.-]?dev)?'; - - /** @var string */ - private static $stabilitiesRegex = 'stable|RC|beta|alpha|dev'; - - /** - * Returns the stability of a version. - * - * @param string $version - * - * @return string - */ - public static function parseStability($version) - { - $version = (string) preg_replace('{#.+$}', '', $version); - - if (strpos($version, 'dev-') === 0 || '-dev' === substr($version, -4)) { - return 'dev'; - } - - preg_match('{' . self::$modifierRegex . '(?:\+.*)?$}i', strtolower($version), $match); - - if (!empty($match[3])) { - return 'dev'; - } - - if (!empty($match[1])) { - if ('beta' === $match[1] || 'b' === $match[1]) { - return 'beta'; - } - if ('alpha' === $match[1] || 'a' === $match[1]) { - return 'alpha'; - } - if ('rc' === $match[1]) { - return 'RC'; - } - } - - return 'stable'; - } - - /** - * @param string $stability - * - * @return string - */ - public static function normalizeStability($stability) - { - $stability = strtolower($stability); - - return $stability === 'rc' ? 'RC' : $stability; - } - - /** - * Normalizes a version string to be able to perform comparisons on it. - * - * @param string $version - * @param string $fullVersion optional complete version string to give more context - * - * @throws \UnexpectedValueException - * - * @return string - */ - public function normalize($version, $fullVersion = null) - { - $version = trim($version); - $origVersion = $version; - if (null === $fullVersion) { - $fullVersion = $version; - } - - // strip off aliasing - if (preg_match('{^([^,\s]++) ++as ++([^,\s]++)$}', $version, $match)) { - $version = $match[1]; - } - - // strip off stability flag - if (preg_match('{@(?:' . self::$stabilitiesRegex . ')$}i', $version, $match)) { - $version = substr($version, 0, strlen($version) - strlen($match[0])); - } - - // normalize master/trunk/default branches to dev-name for BC with 1.x as these used to be valid constraints - if (\in_array($version, array('master', 'trunk', 'default'), true)) { - $version = 'dev-' . $version; - } - - // if requirement is branch-like, use full name - if (stripos($version, 'dev-') === 0) { - return 'dev-' . substr($version, 4); - } - - // strip off build metadata - if (preg_match('{^([^,\s+]++)\+[^\s]++$}', $version, $match)) { - $version = $match[1]; - } - - // match classical versioning - if (preg_match('{^v?(\d{1,5})(\.\d++)?(\.\d++)?(\.\d++)?' . self::$modifierRegex . '$}i', $version, $matches)) { - $version = $matches[1] - . (!empty($matches[2]) ? $matches[2] : '.0') - . (!empty($matches[3]) ? $matches[3] : '.0') - . (!empty($matches[4]) ? $matches[4] : '.0'); - $index = 5; - // match date(time) based versioning - } elseif (preg_match('{^v?(\d{4}(?:[.:-]?\d{2}){1,6}(?:[.:-]?\d{1,3})?)' . self::$modifierRegex . '$}i', $version, $matches)) { - $version = preg_replace('{\D}', '.', $matches[1]); - $index = 2; - } - - // add version modifiers if a version was matched - if (isset($index)) { - if (!empty($matches[$index])) { - if ('stable' === $matches[$index]) { - return $version; - } - $version .= '-' . $this->expandStability($matches[$index]) . (isset($matches[$index + 1]) && '' !== $matches[$index + 1] ? ltrim($matches[$index + 1], '.-') : ''); - } - - if (!empty($matches[$index + 2])) { - $version .= '-dev'; - } - - return $version; - } - - // match dev branches - if (preg_match('{(.*?)[.-]?dev$}i', $version, $match)) { - try { - $normalized = $this->normalizeBranch($match[1]); - // a branch ending with -dev is only valid if it is numeric - // if it gets prefixed with dev- it means the branch name should - // have had a dev- prefix already when passed to normalize - if (strpos($normalized, 'dev-') === false) { - return $normalized; - } - } catch (\Exception $e) { - } - } - - $extraMessage = ''; - if (preg_match('{ +as +' . preg_quote($version) . '(?:@(?:'.self::$stabilitiesRegex.'))?$}', $fullVersion)) { - $extraMessage = ' in "' . $fullVersion . '", the alias must be an exact version'; - } elseif (preg_match('{^' . preg_quote($version) . '(?:@(?:'.self::$stabilitiesRegex.'))? +as +}', $fullVersion)) { - $extraMessage = ' in "' . $fullVersion . '", the alias source must be an exact version, if it is a branch name you should prefix it with dev-'; - } - - throw new \UnexpectedValueException('Invalid version string "' . $origVersion . '"' . $extraMessage); - } - - /** - * Extract numeric prefix from alias, if it is in numeric format, suitable for version comparison. - * - * @param string $branch Branch name (e.g. 2.1.x-dev) - * - * @return string|false Numeric prefix if present (e.g. 2.1.) or false - */ - public function parseNumericAliasPrefix($branch) - { - if (preg_match('{^(?P(\d++\\.)*\d++)(?:\.x)?-dev$}i', $branch, $matches)) { - return $matches['version'] . '.'; - } - - return false; - } - - /** - * Normalizes a branch name to be able to perform comparisons on it. - * - * @param string $name - * - * @return string - */ - public function normalizeBranch($name) - { - $name = trim($name); - - if (preg_match('{^v?(\d++)(\.(?:\d++|[xX*]))?(\.(?:\d++|[xX*]))?(\.(?:\d++|[xX*]))?$}i', $name, $matches)) { - $version = ''; - for ($i = 1; $i < 5; ++$i) { - $version .= isset($matches[$i]) ? str_replace(array('*', 'X'), 'x', $matches[$i]) : '.x'; - } - - return str_replace('x', '9999999', $version) . '-dev'; - } - - return 'dev-' . $name; - } - - /** - * Normalizes a default branch name (i.e. master on git) to 9999999-dev. - * - * @param string $name - * - * @return string - */ - public function normalizeDefaultBranch($name) - { - if ($name === 'dev-master' || $name === 'dev-default' || $name === 'dev-trunk') { - return '9999999-dev'; - } - - return $name; - } - - /** - * Parses a constraint string into MultiConstraint and/or Constraint objects. - * - * @param string $constraints - * - * @return ConstraintInterface - */ - public function parseConstraints($constraints) - { - $prettyConstraint = $constraints; - - $orConstraints = preg_split('{\s*\|\|?\s*}', trim($constraints)); - if (false === $orConstraints) { - throw new \RuntimeException('Failed to preg_split string: '.$constraints); - } - $orGroups = array(); - - foreach ($orConstraints as $constraints) { - $andConstraints = preg_split('{(?< ,]) *(? 1) { - $constraintObjects = array(); - foreach ($andConstraints as $constraint) { - foreach ($this->parseConstraint($constraint) as $parsedConstraint) { - $constraintObjects[] = $parsedConstraint; - } - } - } else { - $constraintObjects = $this->parseConstraint($andConstraints[0]); - } - - if (1 === \count($constraintObjects)) { - $constraint = $constraintObjects[0]; - } else { - $constraint = new MultiConstraint($constraintObjects); - } - - $orGroups[] = $constraint; - } - - $constraint = MultiConstraint::create($orGroups, false); - - $constraint->setPrettyString($prettyConstraint); - - return $constraint; - } - - /** - * @param string $constraint - * - * @throws \UnexpectedValueException - * - * @return array - * - * @phpstan-return non-empty-array - */ - private function parseConstraint($constraint) - { - // strip off aliasing - if (preg_match('{^([^,\s]++) ++as ++([^,\s]++)$}', $constraint, $match)) { - $constraint = $match[1]; - } - - // strip @stability flags, and keep it for later use - if (preg_match('{^([^,\s]*?)@(' . self::$stabilitiesRegex . ')$}i', $constraint, $match)) { - $constraint = '' !== $match[1] ? $match[1] : '*'; - if ($match[2] !== 'stable') { - $stabilityModifier = $match[2]; - } - } - - // get rid of #refs as those are used by composer only - if (preg_match('{^(dev-[^,\s@]+?|[^,\s@]+?\.x-dev)#.+$}i', $constraint, $match)) { - $constraint = $match[1]; - } - - if (preg_match('{^(v)?[xX*](\.[xX*])*$}i', $constraint, $match)) { - if (!empty($match[1]) || !empty($match[2])) { - return array(new Constraint('>=', '0.0.0.0-dev')); - } - - return array(new MatchAllConstraint()); - } - - $versionRegex = 'v?(\d++)(?:\.(\d++))?(?:\.(\d++))?(?:\.(\d++))?(?:' . self::$modifierRegex . '|\.([xX*][.-]?dev))(?:\+[^\s]+)?'; - - // Tilde Range - // - // Like wildcard constraints, unsuffixed tilde constraints say that they must be greater than the previous - // version, to ensure that unstable instances of the current version are allowed. However, if a stability - // suffix is added to the constraint, then a >= match on the current version is used instead. - if (preg_match('{^~>?' . $versionRegex . '$}i', $constraint, $matches)) { - if (strpos($constraint, '~>') === 0) { - throw new \UnexpectedValueException( - 'Could not parse version constraint ' . $constraint . ': ' . - 'Invalid operator "~>", you probably meant to use the "~" operator' - ); - } - - // Work out which position in the version we are operating at - if (isset($matches[4]) && '' !== $matches[4] && null !== $matches[4]) { - $position = 4; - } elseif (isset($matches[3]) && '' !== $matches[3] && null !== $matches[3]) { - $position = 3; - } elseif (isset($matches[2]) && '' !== $matches[2] && null !== $matches[2]) { - $position = 2; - } else { - $position = 1; - } - - // when matching 2.x-dev or 3.0.x-dev we have to shift the second or third number, despite no second/third number matching above - if (!empty($matches[8])) { - $position++; - } - - // Calculate the stability suffix - $stabilitySuffix = ''; - if (empty($matches[5]) && empty($matches[7]) && empty($matches[8])) { - $stabilitySuffix .= '-dev'; - } - - $lowVersion = $this->normalize(substr($constraint . $stabilitySuffix, 1)); - $lowerBound = new Constraint('>=', $lowVersion); - - // For upper bound, we increment the position of one more significance, - // but highPosition = 0 would be illegal - $highPosition = max(1, $position - 1); - $highVersion = $this->manipulateVersionString($matches, $highPosition, 1) . '-dev'; - $upperBound = new Constraint('<', $highVersion); - - return array( - $lowerBound, - $upperBound, - ); - } - - // Caret Range - // - // Allows changes that do not modify the left-most non-zero digit in the [major, minor, patch] tuple. - // In other words, this allows patch and minor updates for versions 1.0.0 and above, patch updates for - // versions 0.X >=0.1.0, and no updates for versions 0.0.X - if (preg_match('{^\^' . $versionRegex . '($)}i', $constraint, $matches)) { - // Work out which position in the version we are operating at - if ('0' !== $matches[1] || '' === $matches[2] || null === $matches[2]) { - $position = 1; - } elseif ('0' !== $matches[2] || '' === $matches[3] || null === $matches[3]) { - $position = 2; - } else { - $position = 3; - } - - // Calculate the stability suffix - $stabilitySuffix = ''; - if (empty($matches[5]) && empty($matches[7]) && empty($matches[8])) { - $stabilitySuffix .= '-dev'; - } - - $lowVersion = $this->normalize(substr($constraint . $stabilitySuffix, 1)); - $lowerBound = new Constraint('>=', $lowVersion); - - // For upper bound, we increment the position of one more significance, - // but highPosition = 0 would be illegal - $highVersion = $this->manipulateVersionString($matches, $position, 1) . '-dev'; - $upperBound = new Constraint('<', $highVersion); - - return array( - $lowerBound, - $upperBound, - ); - } - - // X Range - // - // Any of X, x, or * may be used to "stand in" for one of the numeric values in the [major, minor, patch] tuple. - // A partial version range is treated as an X-Range, so the special character is in fact optional. - if (preg_match('{^v?(\d++)(?:\.(\d++))?(?:\.(\d++))?(?:\.[xX*])++$}', $constraint, $matches)) { - if (isset($matches[3]) && '' !== $matches[3] && null !== $matches[3]) { - $position = 3; - } elseif (isset($matches[2]) && '' !== $matches[2] && null !== $matches[2]) { - $position = 2; - } else { - $position = 1; - } - - $lowVersion = $this->manipulateVersionString($matches, $position) . '-dev'; - $highVersion = $this->manipulateVersionString($matches, $position, 1) . '-dev'; - - if ($lowVersion === '0.0.0.0-dev') { - return array(new Constraint('<', $highVersion)); - } - - return array( - new Constraint('>=', $lowVersion), - new Constraint('<', $highVersion), - ); - } - - // Hyphen Range - // - // Specifies an inclusive set. If a partial version is provided as the first version in the inclusive range, - // then the missing pieces are replaced with zeroes. If a partial version is provided as the second version in - // the inclusive range, then all versions that start with the supplied parts of the tuple are accepted, but - // nothing that would be greater than the provided tuple parts. - if (preg_match('{^(?P' . $versionRegex . ') +- +(?P' . $versionRegex . ')($)}i', $constraint, $matches)) { - // Calculate the stability suffix - $lowStabilitySuffix = ''; - if (empty($matches[6]) && empty($matches[8]) && empty($matches[9])) { - $lowStabilitySuffix = '-dev'; - } - - $lowVersion = $this->normalize($matches['from']); - $lowerBound = new Constraint('>=', $lowVersion . $lowStabilitySuffix); - - $empty = function ($x) { - return ($x === 0 || $x === '0') ? false : empty($x); - }; - - if ((!$empty($matches[12]) && !$empty($matches[13])) || !empty($matches[15]) || !empty($matches[17]) || !empty($matches[18])) { - $highVersion = $this->normalize($matches['to']); - $upperBound = new Constraint('<=', $highVersion); - } else { - $highMatch = array('', $matches[11], $matches[12], $matches[13], $matches[14]); - - // validate to version - $this->normalize($matches['to']); - - $highVersion = $this->manipulateVersionString($highMatch, $empty($matches[12]) ? 1 : 2, 1) . '-dev'; - $upperBound = new Constraint('<', $highVersion); - } - - return array( - $lowerBound, - $upperBound, - ); - } - - // Basic Comparators - if (preg_match('{^(<>|!=|>=?|<=?|==?)?\s*(.*)}', $constraint, $matches)) { - try { - try { - $version = $this->normalize($matches[2]); - } catch (\UnexpectedValueException $e) { - // recover from an invalid constraint like foobar-dev which should be dev-foobar - // except if the constraint uses a known operator, in which case it must be a parse error - if (substr($matches[2], -4) === '-dev' && preg_match('{^[0-9a-zA-Z-./]+$}', $matches[2])) { - $version = $this->normalize('dev-'.substr($matches[2], 0, -4)); - } else { - throw $e; - } - } - - $op = $matches[1] ?: '='; - - if ($op !== '==' && $op !== '=' && !empty($stabilityModifier) && self::parseStability($version) === 'stable') { - $version .= '-' . $stabilityModifier; - } elseif ('<' === $op || '>=' === $op) { - if (!preg_match('/-' . self::$modifierRegex . '$/', strtolower($matches[2]))) { - if (strpos($matches[2], 'dev-') !== 0) { - $version .= '-dev'; - } - } - } - - return array(new Constraint($matches[1] ?: '=', $version)); - } catch (\Exception $e) { - } - } - - $message = 'Could not parse version constraint ' . $constraint; - if (isset($e)) { - $message .= ': ' . $e->getMessage(); - } - - throw new \UnexpectedValueException($message); - } - - /** - * Increment, decrement, or simply pad a version number. - * - * Support function for {@link parseConstraint()} - * - * @param array $matches Array with version parts in array indexes 1,2,3,4 - * @param int $position 1,2,3,4 - which segment of the version to increment/decrement - * @param int $increment - * @param string $pad The string to pad version parts after $position - * - * @return string|null The new version - * - * @phpstan-param string[] $matches - */ - private function manipulateVersionString(array $matches, $position, $increment = 0, $pad = '0') - { - for ($i = 4; $i > 0; --$i) { - if ($i > $position) { - $matches[$i] = $pad; - } elseif ($i === $position && $increment) { - $matches[$i] += $increment; - // If $matches[$i] was 0, carry the decrement - if ($matches[$i] < 0) { - $matches[$i] = $pad; - --$position; - - // Return null on a carry overflow - if ($i === 1) { - return null; - } - } - } - } - - return $matches[1] . '.' . $matches[2] . '.' . $matches[3] . '.' . $matches[4]; - } - - /** - * Expand shorthand stability string to long version. - * - * @param string $stability - * - * @return string - */ - private function expandStability($stability) - { - $stability = strtolower($stability); - - switch ($stability) { - case 'a': - return 'alpha'; - case 'b': - return 'beta'; - case 'p': - case 'pl': - return 'patch'; - case 'rc': - return 'RC'; - default: - return $stability; - } - } -} diff --git a/tools/php-cs-fixer/vendor/composer/xdebug-handler/CHANGELOG.md b/tools/php-cs-fixer/vendor/composer/xdebug-handler/CHANGELOG.md deleted file mode 100644 index d7d46f9..0000000 --- a/tools/php-cs-fixer/vendor/composer/xdebug-handler/CHANGELOG.md +++ /dev/null @@ -1,112 +0,0 @@ -## [Unreleased] - -## [2.0.2] - 2021-07-31 - * Added: support for `xdebug_info('mode')` in Xdebug 3.1. - * Added: support for Psr\Log versions 2 and 3. - * Fixed: remove ini directives from non-cli HOST/PATH sections. - -## [2.0.1] - 2021-05-05 - * Fixed: don't restart if the cwd is a UNC path and cmd.exe will be invoked. - -## [2.0.0] - 2021-04-09 - * Break: this is a major release, see [UPGRADE.md](UPGRADE.md) for more information. - * Break: removed optional `$colorOption` constructor param and passthru fallback. - * Break: renamed `requiresRestart` param from `$isLoaded` to `$default`. - * Break: changed `restart` param `$command` from a string to an array. - * Added: support for Xdebug3 to only restart if Xdebug is not running with `xdebug.mode=off`. - * Added: `isXdebugActive()` method to determine if Xdebug is still running in the restart. - * Added: feature to bypass the shell in PHP-7.4+ by giving `proc_open` an array of arguments. - * Added: Process utility class to the API. - -## [1.4.6] - 2021-03-25 - * Fixed: fail restart if `proc_open` has been disabled in `disable_functions`. - * Fixed: enable Windows CTRL event handling in the restarted process. - -## [1.4.5] - 2020-11-13 - * Fixed: use `proc_open` when available for correct FD forwarding to the restarted process. - -## [1.4.4] - 2020-10-24 - * Fixed: exception if 'pcntl_signal' is disabled. - -## [1.4.3] - 2020-08-19 - * Fixed: restore SIGINT to default handler in restarted process if no other handler exists. - -## [1.4.2] - 2020-06-04 - * Fixed: ignore SIGINTs to let the restarted process handle them. - -## [1.4.1] - 2020-03-01 - * Fixed: restart fails if an ini file is empty. - -## [1.4.0] - 2019-11-06 - * Added: support for `NO_COLOR` environment variable: https://no-color.org - * Added: color support for Hyper terminal: https://github.com/zeit/hyper - * Fixed: correct capitalization of Xdebug (apparently). - * Fixed: improved handling for uopz extension. - -## [1.3.3] - 2019-05-27 - * Fixed: add environment changes to `$_ENV` if it is being used. - -## [1.3.2] - 2019-01-28 - * Fixed: exit call being blocked by uopz extension, resulting in application code running twice. - -## [1.3.1] - 2018-11-29 - * Fixed: fail restart if `passthru` has been disabled in `disable_functions`. - * Fixed: fail restart if an ini file cannot be opened, otherwise settings will be missing. - -## [1.3.0] - 2018-08-31 - * Added: `setPersistent` method to use environment variables for the restart. - * Fixed: improved debugging by writing output to stderr. - * Fixed: no restart when `php_ini_scanned_files` is not functional and is needed. - -## [1.2.1] - 2018-08-23 - * Fixed: fatal error with apc, when using `apc.mmap_file_mask`. - -## [1.2.0] - 2018-08-16 - * Added: debug information using `XDEBUG_HANDLER_DEBUG`. - * Added: fluent interface for setters. - * Added: `PhpConfig` helper class for calling PHP sub-processes. - * Added: `PHPRC` original value to restart stettings, for use in a restarted process. - * Changed: internal procedure to disable ini-scanning, using `-n` command-line option. - * Fixed: replaced `escapeshellarg` usage to avoid locale problems. - * Fixed: improved color-option handling to respect double-dash delimiter. - * Fixed: color-option handling regression from main script changes. - * Fixed: improved handling when checking main script. - * Fixed: handling for standard input, that never actually did anything. - * Fixed: fatal error when ctype extension is not available. - -## [1.1.0] - 2018-04-11 - * Added: `getRestartSettings` method for calling PHP processes in a restarted process. - * Added: API definition and @internal class annotations. - * Added: protected `requiresRestart` method for extending classes. - * Added: `setMainScript` method for applications that change the working directory. - * Changed: private `tmpIni` variable to protected for extending classes. - * Fixed: environment variables not available in $_SERVER when restored in the restart. - * Fixed: relative path problems caused by Phar::interceptFileFuncs. - * Fixed: incorrect handling when script file cannot be found. - -## [1.0.0] - 2018-03-08 - * Added: PSR3 logging for optional status output. - * Added: existing ini settings are merged to catch command-line overrides. - * Added: code, tests and other artefacts to decouple from Composer. - * Break: the following class was renamed: - - `Composer\XdebugHandler` -> `Composer\XdebugHandler\XdebugHandler` - -[Unreleased]: https://github.com/composer/xdebug-handler/compare/2.0.2...HEAD -[2.0.2]: https://github.com/composer/xdebug-handler/compare/2.0.1...2.0.2 -[2.0.1]: https://github.com/composer/xdebug-handler/compare/2.0.0...2.0.1 -[2.0.0]: https://github.com/composer/xdebug-handler/compare/1.4.6...2.0.0 -[1.4.6]: https://github.com/composer/xdebug-handler/compare/1.4.5...1.4.6 -[1.4.5]: https://github.com/composer/xdebug-handler/compare/1.4.4...1.4.5 -[1.4.4]: https://github.com/composer/xdebug-handler/compare/1.4.3...1.4.4 -[1.4.3]: https://github.com/composer/xdebug-handler/compare/1.4.2...1.4.3 -[1.4.2]: https://github.com/composer/xdebug-handler/compare/1.4.1...1.4.2 -[1.4.1]: https://github.com/composer/xdebug-handler/compare/1.4.0...1.4.1 -[1.4.0]: https://github.com/composer/xdebug-handler/compare/1.3.3...1.4.0 -[1.3.3]: https://github.com/composer/xdebug-handler/compare/1.3.2...1.3.3 -[1.3.2]: https://github.com/composer/xdebug-handler/compare/1.3.1...1.3.2 -[1.3.1]: https://github.com/composer/xdebug-handler/compare/1.3.0...1.3.1 -[1.3.0]: https://github.com/composer/xdebug-handler/compare/1.2.1...1.3.0 -[1.2.1]: https://github.com/composer/xdebug-handler/compare/1.2.0...1.2.1 -[1.2.0]: https://github.com/composer/xdebug-handler/compare/1.1.0...1.2.0 -[1.1.0]: https://github.com/composer/xdebug-handler/compare/1.0.0...1.1.0 -[1.0.0]: https://github.com/composer/xdebug-handler/compare/d66f0d15cb57...1.0.0 diff --git a/tools/php-cs-fixer/vendor/composer/xdebug-handler/LICENSE b/tools/php-cs-fixer/vendor/composer/xdebug-handler/LICENSE deleted file mode 100644 index 963618a..0000000 --- a/tools/php-cs-fixer/vendor/composer/xdebug-handler/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2017 Composer - -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/tools/php-cs-fixer/vendor/composer/xdebug-handler/README.md b/tools/php-cs-fixer/vendor/composer/xdebug-handler/README.md deleted file mode 100644 index 020cf48..0000000 --- a/tools/php-cs-fixer/vendor/composer/xdebug-handler/README.md +++ /dev/null @@ -1,291 +0,0 @@ -# composer/xdebug-handler - -[![packagist](https://img.shields.io/packagist/v/composer/xdebug-handler.svg)](https://packagist.org/packages/composer/xdebug-handler) -[![Continuous Integration](https://github.com/composer/xdebug-handler/workflows/Continuous%20Integration/badge.svg?branch=main)](https://github.com/composer/xdebug-handler/actions) -![license](https://img.shields.io/github/license/composer/xdebug-handler.svg) -![php](https://img.shields.io/packagist/php-v/composer/xdebug-handler.svg?colorB=8892BF&label=php) - -Restart a CLI process without loading the Xdebug extension, unless `xdebug.mode=off`. - -Originally written as part of [composer/composer](https://github.com/composer/composer), -now extracted and made available as a stand-alone library. - -### Version 2 - -Support added for Xdebug3. See [UPGRADE](UPGRADE.md) for more information. - -## Installation - -Install the latest version with: - -```bash -$ composer require composer/xdebug-handler -``` - -## Requirements - -* PHP 5.3.2 minimum, although functionality is disabled below PHP 5.4.0. Using the latest PHP version is highly recommended. - -## Basic Usage -```php -use Composer\XdebugHandler\XdebugHandler; - -$xdebug = new XdebugHandler('myapp'); -$xdebug->check(); -unset($xdebug); -``` - -The constructor takes a single parameter, `$envPrefix`, which is upper-cased and prepended to default base values to create two distinct environment variables. The above example enables the use of: - -- `MYAPP_ALLOW_XDEBUG=1` to override automatic restart and allow Xdebug -- `MYAPP_ORIGINAL_INIS` to obtain ini file locations in a restarted process - -## Advanced Usage - -* [How it works](#how-it-works) -* [Limitations](#limitations) -* [Helper methods](#helper-methods) -* [Setter methods](#setter-methods) -* [Process configuration](#process-configuration) -* [Troubleshooting](#troubleshooting) -* [Extending the library](#extending-the-library) - -### How it works - -A temporary ini file is created from the loaded (and scanned) ini files, with any references to the Xdebug extension commented out. Current ini settings are merged, so that most ini settings made on the command-line or by the application are included (see [Limitations](#limitations)) - -* `MYAPP_ALLOW_XDEBUG` is set with internal data to flag and use in the restart. -* The command-line and environment are [configured](#process-configuration) for the restart. -* The application is restarted in a new process. - * The restart settings are stored in the environment. - * `MYAPP_ALLOW_XDEBUG` is unset. - * The application runs and exits. -* The main process exits with the exit code from the restarted process. - -#### Signal handling -From PHP 7.1 with the pcntl extension loaded, asynchronous signal handling is automatically enabled. `SIGINT` is set to `SIG_IGN` in the parent -process and restored to `SIG_DFL` in the restarted process (if no other handler has been set). - -From PHP 7.4 on Windows, `CTRL+C` and `CTRL+BREAK` handling is ignored in the parent process and automatically enabled in the restarted process. - -### Limitations -There are a few things to be aware of when running inside a restarted process. - -* Extensions set on the command-line will not be loaded. -* Ini file locations will be reported as per the restart - see [getAllIniFiles()](#getallinifiles). -* Php sub-processes may be loaded with Xdebug enabled - see [Process configuration](#process-configuration). - -### Helper methods -These static methods provide information from the current process, regardless of whether it has been restarted or not. - -#### _getAllIniFiles()_ -Returns an array of the original ini file locations. Use this instead of calling `php_ini_loaded_file` and `php_ini_scanned_files`, which will report the wrong values in a restarted process. - -```php -use Composer\XdebugHandler\XdebugHandler; - -$files = XdebugHandler::getAllIniFiles(); - -# $files[0] always exists, it could be an empty string -$loadedIni = array_shift($files); -$scannedInis = $files; -``` - -These locations are also available in the `MYAPP_ORIGINAL_INIS` environment variable. This is a path-separated string comprising the location returned from `php_ini_loaded_file`, which could be empty, followed by locations parsed from calling `php_ini_scanned_files`. - -#### _getRestartSettings()_ -Returns an array of settings that can be used with PHP [sub-processes](#sub-processes), or null if the process was not restarted. - -```php -use Composer\XdebugHandler\XdebugHandler; - -$settings = XdebugHandler::getRestartSettings(); -/** - * $settings: array (if the current process was restarted, - * or called with the settings from a previous restart), or null - * - * 'tmpIni' => the temporary ini file used in the restart (string) - * 'scannedInis' => if there were any scanned inis (bool) - * 'scanDir' => the original PHP_INI_SCAN_DIR value (false|string) - * 'phprc' => the original PHPRC value (false|string) - * 'inis' => the original inis from getAllIniFiles (array) - * 'skipped' => the skipped version from getSkippedVersion (string) - */ -``` - -#### _getSkippedVersion()_ -Returns the Xdebug version string that was skipped by the restart, or an empty value if there was no restart (or Xdebug is still loaded, perhaps by an extending class restarting for a reason other than removing Xdebug). - -```php -use Composer\XdebugHandler\XdebugHandler; - -$version = XdebugHandler::getSkippedVersion(); -# $version: '2.6.0' (for example), or an empty string -``` - -#### _isXdebugActive()_ -Returns true if Xdebug is loaded and is running in an active mode (if it supports modes). Returns false if Xdebug is not loaded, or it is running with `xdebug.mode=off`. - -### Setter methods -These methods implement a fluent interface and must be called before the main `check()` method. - -#### _setLogger($logger)_ -Enables the output of status messages to an external PSR3 logger. All messages are reported with either `DEBUG` or `WARNING` log levels. For example (showing the level and message): - -``` -// Restart overridden -DEBUG Checking MYAPP_ALLOW_XDEBUG -DEBUG The Xdebug extension is loaded (2.5.0) -DEBUG No restart (MYAPP_ALLOW_XDEBUG=1) - -// Failed restart -DEBUG Checking MYAPP_ALLOW_XDEBUG -DEBUG The Xdebug extension is loaded (2.5.0) -WARNING No restart (Unable to create temp ini file at: ...) -``` - -Status messages can also be output with `XDEBUG_HANDLER_DEBUG`. See [Troubleshooting](#troubleshooting). - -#### _setMainScript($script)_ -Sets the location of the main script to run in the restart. This is only needed in more esoteric use-cases, or if the `argv[0]` location is inaccessible. The script name `--` is supported for standard input. - -#### _setPersistent()_ -Configures the restart using [persistent settings](#persistent-settings), so that Xdebug is not loaded in any sub-process. - -Use this method if your application invokes one or more PHP sub-process and the Xdebug extension is not needed. This avoids the overhead of implementing specific [sub-process](#sub-processes) strategies. - -Alternatively, this method can be used to set up a default _Xdebug-free_ environment which can be changed if a sub-process requires Xdebug, then restored afterwards: - -```php -function SubProcessWithXdebug() -{ - $phpConfig = new Composer\XdebugHandler\PhpConfig(); - - # Set the environment to the original configuration - $phpConfig->useOriginal(); - - # run the process with Xdebug loaded - ... - - # Restore Xdebug-free environment - $phpConfig->usePersistent(); -} -``` - -### Process configuration -The library offers two strategies to invoke a new PHP process without loading Xdebug, using either _standard_ or _persistent_ settings. Note that this is only important if the application calls a PHP sub-process. - -#### Standard settings -Uses command-line options to remove Xdebug from the new process only. - -* The -n option is added to the command-line. This tells PHP not to scan for additional inis. -* The temporary ini is added to the command-line with the -c option. - ->_If the new process calls a PHP sub-process, Xdebug will be loaded in that sub-process (unless it implements xdebug-handler, in which case there will be another restart)._ - -This is the default strategy used in the restart. - -#### Persistent settings -Uses environment variables to remove Xdebug from the new process and persist these settings to any sub-process. - -* `PHP_INI_SCAN_DIR` is set to an empty string. This tells PHP not to scan for additional inis. -* `PHPRC` is set to the temporary ini. - ->_If the new process calls a PHP sub-process, Xdebug will not be loaded in that sub-process._ - -This strategy can be used in the restart by calling [setPersistent()](#setpersistent). - -#### Sub-processes -The `PhpConfig` helper class makes it easy to invoke a PHP sub-process (with or without Xdebug loaded), regardless of whether there has been a restart. - -Each of its methods returns an array of PHP options (to add to the command-line) and sets up the environment for the required strategy. The [getRestartSettings()](#getrestartsettings) method is used internally. - -* `useOriginal()` - Xdebug will be loaded in the new process. -* `useStandard()` - Xdebug will **not** be loaded in the new process - see [standard settings](#standard-settings). -* `userPersistent()` - Xdebug will **not** be loaded in the new process - see [persistent settings](#persistent-settings) - -If there was no restart, an empty options array is returned and the environment is not changed. - -```php -use Composer\XdebugHandler\PhpConfig; - -$config = new PhpConfig; - -$options = $config->useOriginal(); -# $options: empty array -# environment: PHPRC and PHP_INI_SCAN_DIR set to original values - -$options = $config->useStandard(); -# $options: [-n, -c, tmpIni] -# environment: PHPRC and PHP_INI_SCAN_DIR set to original values - -$options = $config->usePersistent(); -# $options: empty array -# environment: PHPRC=tmpIni, PHP_INI_SCAN_DIR='' -``` - -### Troubleshooting -The following environment settings can be used to troubleshoot unexpected behavior: - -* `XDEBUG_HANDLER_DEBUG=1` Outputs status messages to `STDERR`, if it is defined, irrespective of any PSR3 logger. Each message is prefixed `xdebug-handler[pid]`, where pid is the process identifier. - -* `XDEBUG_HANDLER_DEBUG=2` As above, but additionally saves the temporary ini file and reports its location in a status message. - -### Extending the library -The API is defined by classes and their accessible elements that are not annotated as @internal. The main class has two protected methods that can be overridden to provide additional functionality: - -#### _requiresRestart($default)_ -By default the process will restart if Xdebug is loaded and not running with `xdebug.mode=off`. Extending this method allows an application to decide, by returning a boolean (or equivalent) value. -It is only called if `MYAPP_ALLOW_XDEBUG` is empty, so it will not be called in the restarted process (where this variable contains internal data), or if the restart has been overridden. - -Note that the [setMainScript()](#setmainscriptscript) and [setPersistent()](#setpersistent) setters can be used here, if required. - -#### _restart($command)_ -An application can extend this to modify the temporary ini file, its location given in the `tmpIni` property. New settings can be safely appended to the end of the data, which is `PHP_EOL` terminated. - -The `$command` parameter is an array of unescaped command-line arguments that will be used for the new process. - -Remember to finish with `parent::restart($command)`. - -#### Example -This example demonstrates two ways to extend basic functionality: - -* To avoid the overhead of spinning up a new process, the restart is skipped if a simple help command is requested. - -* The application needs write-access to phar files, so it will force a restart if `phar.readonly` is set (regardless of whether Xdebug is loaded) and change this value in the temporary ini file. - -```php -use Composer\XdebugHandler\XdebugHandler; -use MyApp\Command; - -class MyRestarter extends XdebugHandler -{ - private $required; - - protected function requiresRestart($default) - { - if (Command::isHelp()) { - # No need to disable Xdebug for this - return false; - } - - $this->required = (bool) ini_get('phar.readonly'); - return $this->required || $default; - } - - protected function restart($command) - { - if ($this->required) { - # Add required ini setting to tmpIni - $content = file_get_contents($this->tmpIni); - $content .= 'phar.readonly=0'.PHP_EOL; - file_put_contents($this->tmpIni, $content); - } - - parent::restart($command); - } -} -``` - -## License -composer/xdebug-handler is licensed under the MIT License, see the LICENSE file for details. diff --git a/tools/php-cs-fixer/vendor/composer/xdebug-handler/UPGRADE.md b/tools/php-cs-fixer/vendor/composer/xdebug-handler/UPGRADE.md deleted file mode 100644 index 3d62e17..0000000 --- a/tools/php-cs-fixer/vendor/composer/xdebug-handler/UPGRADE.md +++ /dev/null @@ -1,30 +0,0 @@ -## Upgrading from 1.x - -The default behaviour has changed from always restarting if Xdebug is loaded, to only restarting if -Xdebug is _active_. This has been introduced to support Xdebug3 -[modes](https://xdebug.org/docs/all_settings#mode). Xdebug is considered active if it is loaded, and -for Xdebug3, if it is running in a mode other than `xdebug.mode=off`. - -* Break: removed optional `$colorOption` constructor param and passthru fallback. - - Just use `new XdebugHandler('myapp')` to instantiate the class and color support will be -detectable in the restarted process. - -* Added: `isXdebugActive()` method to determine if Xdebug is still running in the restart. - - Returns true if Xdebug is loaded and is running in an active mode (if it supports modes). -Returns false if Xdebug is not loaded, or it is running with `xdebug.mode=off`. - -### Extending classes - -* Break: renamed `requiresRestart` param from `$isLoaded` to `$default`. - - This reflects the new default behaviour which is to restart only if Xdebug is active. - -* Break: changed `restart` param `$command` from a string to an array. - - Only important if you modified the string. `$command` is now an array of unescaped arguments. - -* Added: Process utility class to the API. - - This class was previously annotated as @internal and has been refactored due to recent changes. diff --git a/tools/php-cs-fixer/vendor/composer/xdebug-handler/composer.json b/tools/php-cs-fixer/vendor/composer/xdebug-handler/composer.json deleted file mode 100644 index 75cb1f7..0000000 --- a/tools/php-cs-fixer/vendor/composer/xdebug-handler/composer.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "composer/xdebug-handler", - "description": "Restarts a process without Xdebug.", - "type": "library", - "license": "MIT", - "keywords": [ - "xdebug", - "performance" - ], - "authors": [ - { - "name": "John Stevenson", - "email": "john-stevenson@blueyonder.co.uk" - } - ], - "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/xdebug-handler/issues" - }, - "require": { - "php": "^5.3.2 || ^7.0 || ^8.0", - "psr/log": "^1 || ^2 || ^3" - }, - "require-dev": { - "symfony/phpunit-bridge": "^4.2 || ^5", - "phpstan/phpstan": "^0.12.55" - }, - "autoload": { - "psr-4": { - "Composer\\XdebugHandler\\": "src" - } - }, - "autoload-dev": { - "psr-4": { - "Composer\\XdebugHandler\\": "tests" - } - }, - "scripts": { - "test": "vendor/bin/simple-phpunit", - "phpstan": "vendor/bin/phpstan analyse" - } -} diff --git a/tools/php-cs-fixer/vendor/composer/xdebug-handler/src/PhpConfig.php b/tools/php-cs-fixer/vendor/composer/xdebug-handler/src/PhpConfig.php deleted file mode 100644 index c61cd7c..0000000 --- a/tools/php-cs-fixer/vendor/composer/xdebug-handler/src/PhpConfig.php +++ /dev/null @@ -1,84 +0,0 @@ - - * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. - */ - -namespace Composer\XdebugHandler; - -/** - * @author John Stevenson - */ -class PhpConfig -{ - /** - * Use the original PHP configuration - * - * @return array PHP cli options - */ - public function useOriginal() - { - $this->getDataAndReset(); - return array(); - } - - /** - * Use standard restart settings - * - * @return array PHP cli options - */ - public function useStandard() - { - if ($data = $this->getDataAndReset()) { - return array('-n', '-c', $data['tmpIni']); - } - - return array(); - } - - /** - * Use environment variables to persist settings - * - * @return array PHP cli options - */ - public function usePersistent() - { - if ($data = $this->getDataAndReset()) { - $this->updateEnv('PHPRC', $data['tmpIni']); - $this->updateEnv('PHP_INI_SCAN_DIR', ''); - } - - return array(); - } - - /** - * Returns restart data if available and resets the environment - * - * @return array|null - */ - private function getDataAndReset() - { - if ($data = XdebugHandler::getRestartSettings()) { - $this->updateEnv('PHPRC', $data['phprc']); - $this->updateEnv('PHP_INI_SCAN_DIR', $data['scanDir']); - } - - return $data; - } - - /** - * Updates a restart settings value in the environment - * - * @param string $name - * @param string|false $value - */ - private function updateEnv($name, $value) - { - Process::setEnv($name, false !== $value ? $value : null); - } -} diff --git a/tools/php-cs-fixer/vendor/composer/xdebug-handler/src/Process.php b/tools/php-cs-fixer/vendor/composer/xdebug-handler/src/Process.php deleted file mode 100644 index c60dff1..0000000 --- a/tools/php-cs-fixer/vendor/composer/xdebug-handler/src/Process.php +++ /dev/null @@ -1,114 +0,0 @@ - - * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. - */ - -namespace Composer\XdebugHandler; - -/** - * Process utility functions - * - * @author John Stevenson - */ -class Process -{ - /** - * Escapes a string to be used as a shell argument. - * - * From https://github.com/johnstevenson/winbox-args - * MIT Licensed (c) John Stevenson - * - * @param string $arg The argument to be escaped - * @param bool $meta Additionally escape cmd.exe meta characters - * @param bool $module The argument is the module to invoke - * - * @return string The escaped argument - */ - public static function escape($arg, $meta = true, $module = false) - { - if (!defined('PHP_WINDOWS_VERSION_BUILD')) { - return "'".str_replace("'", "'\\''", $arg)."'"; - } - - $quote = strpbrk($arg, " \t") !== false || $arg === ''; - - $arg = preg_replace('/(\\\\*)"/', '$1$1\\"', $arg, -1, $dquotes); - - if ($meta) { - $meta = $dquotes || preg_match('/%[^%]+%/', $arg); - - if (!$meta) { - $quote = $quote || strpbrk($arg, '^&|<>()') !== false; - } elseif ($module && !$dquotes && $quote) { - $meta = false; - } - } - - if ($quote) { - $arg = '"'.preg_replace('/(\\\\*)$/', '$1$1', $arg).'"'; - } - - if ($meta) { - $arg = preg_replace('/(["^&|<>()%])/', '^$1', $arg); - } - - return $arg; - } - - /** - * Escapes an array of arguments that make up a shell command - * - * @param array $args Argument list, with the module name first - * - * @return string The escaped command line - */ - public static function escapeShellCommand(array $args) - { - $cmd = self::escape(array_shift($args), true, true); - foreach ($args as $arg) { - $cmd .= ' '.self::escape($arg); - } - - return $cmd; - } - - /** - * Makes putenv environment changes available in $_SERVER and $_ENV - * - * @param string $name - * @param string|null $value A null value unsets the variable - * - * @return bool Whether the environment variable was set - */ - public static function setEnv($name, $value = null) - { - $unset = null === $value; - - if (!putenv($unset ? $name : $name.'='.$value)) { - return false; - } - - if ($unset) { - unset($_SERVER[$name]); - } else { - $_SERVER[$name] = $value; - } - - // Update $_ENV if it is being used - if (false !== stripos((string) ini_get('variables_order'), 'E')) { - if ($unset) { - unset($_ENV[$name]); - } else { - $_ENV[$name] = $value; - } - } - - return true; - } -} diff --git a/tools/php-cs-fixer/vendor/composer/xdebug-handler/src/Status.php b/tools/php-cs-fixer/vendor/composer/xdebug-handler/src/Status.php deleted file mode 100644 index b3dcb87..0000000 --- a/tools/php-cs-fixer/vendor/composer/xdebug-handler/src/Status.php +++ /dev/null @@ -1,169 +0,0 @@ - - * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. - */ - -namespace Composer\XdebugHandler; - -use Psr\Log\LoggerInterface; -use Psr\Log\LogLevel; - -/** - * @author John Stevenson - * @internal - */ -class Status -{ - const ENV_RESTART = 'XDEBUG_HANDLER_RESTART'; - const CHECK = 'Check'; - const ERROR = 'Error'; - const INFO = 'Info'; - const NORESTART = 'NoRestart'; - const RESTART = 'Restart'; - const RESTARTING = 'Restarting'; - const RESTARTED = 'Restarted'; - - private $debug; - private $envAllowXdebug; - private $loaded; - private $logger; - private $modeOff; - private $time; - - /** - * Constructor - * - * @param string $envAllowXdebug Prefixed _ALLOW_XDEBUG name - * @param bool $debug Whether debug output is required - */ - public function __construct($envAllowXdebug, $debug) - { - $start = getenv(self::ENV_RESTART); - Process::setEnv(self::ENV_RESTART); - $this->time = $start ? round((microtime(true) - $start) * 1000) : 0; - - $this->envAllowXdebug = $envAllowXdebug; - $this->debug = $debug && defined('STDERR'); - } - - /** - * @param LoggerInterface $logger - */ - public function setLogger(LoggerInterface $logger) - { - $this->logger = $logger; - } - - /** - * Calls a handler method to report a message - * - * @param string $op The handler constant - * @param null|string $data Data required by the handler - */ - public function report($op, $data) - { - if ($this->logger || $this->debug) { - call_user_func(array($this, 'report'.$op), $data); - } - } - - /** - * Outputs a status message - * - * @param string $text - * @param string $level - */ - private function output($text, $level = null) - { - if ($this->logger) { - $this->logger->log($level ?: LogLevel::DEBUG, $text); - } - - if ($this->debug) { - fwrite(STDERR, sprintf('xdebug-handler[%d] %s', getmypid(), $text.PHP_EOL)); - } - } - - private function reportCheck($loaded) - { - list($version, $mode) = explode('|', $loaded); - - if ($version) { - $this->loaded = '('.$version.')'.($mode ? ' mode='.$mode : ''); - } - $this->modeOff = $mode === 'off'; - $this->output('Checking '.$this->envAllowXdebug); - } - - private function reportError($error) - { - $this->output(sprintf('No restart (%s)', $error), LogLevel::WARNING); - } - - private function reportInfo($info) - { - $this->output($info); - } - - private function reportNoRestart() - { - $this->output($this->getLoadedMessage()); - - if ($this->loaded) { - $text = sprintf('No restart (%s)', $this->getEnvAllow()); - if (!getenv($this->envAllowXdebug)) { - $text .= ' Allowed by '.($this->modeOff ? 'mode' : 'application'); - } - $this->output($text); - } - } - - private function reportRestart() - { - $this->output($this->getLoadedMessage()); - Process::setEnv(self::ENV_RESTART, (string) microtime(true)); - } - - private function reportRestarted() - { - $loaded = $this->getLoadedMessage(); - $text = sprintf('Restarted (%d ms). %s', $this->time, $loaded); - $level = $this->loaded ? LogLevel::WARNING : null; - $this->output($text, $level); - } - - private function reportRestarting($command) - { - $text = sprintf('Process restarting (%s)', $this->getEnvAllow()); - $this->output($text); - $text = 'Running '.$command; - $this->output($text); - } - - /** - * Returns the _ALLOW_XDEBUG environment variable as name=value - * - * @return string - */ - private function getEnvAllow() - { - return $this->envAllowXdebug.'='.getenv($this->envAllowXdebug); - } - - /** - * Returns the Xdebug status and version - * - * @return string - */ - private function getLoadedMessage() - { - $loaded = $this->loaded ? sprintf('loaded %s', $this->loaded) : 'not loaded'; - return 'The Xdebug extension is '.$loaded; - } -} diff --git a/tools/php-cs-fixer/vendor/composer/xdebug-handler/src/XdebugHandler.php b/tools/php-cs-fixer/vendor/composer/xdebug-handler/src/XdebugHandler.php deleted file mode 100644 index cd1a738..0000000 --- a/tools/php-cs-fixer/vendor/composer/xdebug-handler/src/XdebugHandler.php +++ /dev/null @@ -1,649 +0,0 @@ - - * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. - */ - -namespace Composer\XdebugHandler; - -use Psr\Log\LoggerInterface; - -/** - * @author John Stevenson - */ -class XdebugHandler -{ - const SUFFIX_ALLOW = '_ALLOW_XDEBUG'; - const SUFFIX_INIS = '_ORIGINAL_INIS'; - const RESTART_ID = 'internal'; - const RESTART_SETTINGS = 'XDEBUG_HANDLER_SETTINGS'; - const DEBUG = 'XDEBUG_HANDLER_DEBUG'; - - /** @var string|null */ - protected $tmpIni; - - private static $inRestart; - private static $name; - private static $skipped; - private static $xdebugActive; - - private $cli; - private $debug; - private $envAllowXdebug; - private $envOriginalInis; - private $loaded; - private $mode; - private $persistent; - private $script; - /** @var Status|null */ - private $statusWriter; - - /** - * Constructor - * - * The $envPrefix is used to create distinct environment variables. It is - * uppercased and prepended to the default base values. For example 'myapp' - * would result in MYAPP_ALLOW_XDEBUG and MYAPP_ORIGINAL_INIS. - * - * @param string $envPrefix Value used in environment variables - * @throws \RuntimeException If the parameter is invalid - */ - public function __construct($envPrefix) - { - if (!is_string($envPrefix) || empty($envPrefix)) { - throw new \RuntimeException('Invalid constructor parameter'); - } - - self::$name = strtoupper($envPrefix); - $this->envAllowXdebug = self::$name.self::SUFFIX_ALLOW; - $this->envOriginalInis = self::$name.self::SUFFIX_INIS; - - if (extension_loaded('xdebug')) { - $this->loaded = phpversion('xdebug') ?: 'unknown'; - - if (version_compare($this->loaded, '3.1', '>=')) { - /** @phpstan-ignore-next-line */ - $modes = xdebug_info('mode'); - $this->mode = empty($modes) ? 'off' : implode(',', $modes); - } elseif (false !== ($mode = ini_get('xdebug.mode'))) { - $this->mode = getenv('XDEBUG_MODE') ?: ($mode ?: 'off'); - if (preg_match('/^,+$/', str_replace(' ', '', $this->mode))) { - $this->mode = 'off'; - } - } - } - - self::$xdebugActive = $this->loaded && $this->mode !== 'off'; - - if ($this->cli = PHP_SAPI === 'cli') { - $this->debug = getenv(self::DEBUG); - } - - $this->statusWriter = new Status($this->envAllowXdebug, (bool) $this->debug); - } - - /** - * Activates status message output to a PSR3 logger - * - * @param LoggerInterface $logger - * - * @return $this - */ - public function setLogger(LoggerInterface $logger) - { - $this->statusWriter->setLogger($logger); - return $this; - } - - /** - * Sets the main script location if it cannot be called from argv - * - * @param string $script - * - * @return $this - */ - public function setMainScript($script) - { - $this->script = $script; - return $this; - } - - /** - * Persist the settings to keep Xdebug out of sub-processes - * - * @return $this - */ - public function setPersistent() - { - $this->persistent = true; - return $this; - } - - /** - * Checks if Xdebug is loaded and the process needs to be restarted - * - * This behaviour can be disabled by setting the MYAPP_ALLOW_XDEBUG - * environment variable to 1. This variable is used internally so that - * the restarted process is created only once. - */ - public function check() - { - $this->notify(Status::CHECK, $this->loaded.'|'.$this->mode); - $envArgs = explode('|', (string) getenv($this->envAllowXdebug)); - - if (empty($envArgs[0]) && $this->requiresRestart(self::$xdebugActive)) { - // Restart required - $this->notify(Status::RESTART); - - if ($this->prepareRestart()) { - $command = $this->getCommand(); - $this->restart($command); - } - return; - } - - if (self::RESTART_ID === $envArgs[0] && count($envArgs) === 5) { - // Restarted, so unset environment variable and use saved values - $this->notify(Status::RESTARTED); - - Process::setEnv($this->envAllowXdebug); - self::$inRestart = true; - - if (!$this->loaded) { - // Skipped version is only set if Xdebug is not loaded - self::$skipped = $envArgs[1]; - } - - $this->tryEnableSignals(); - - // Put restart settings in the environment - $this->setEnvRestartSettings($envArgs); - return; - } - - $this->notify(Status::NORESTART); - - if ($settings = self::getRestartSettings()) { - // Called with existing settings, so sync our settings - $this->syncSettings($settings); - } - } - - /** - * Returns an array of php.ini locations with at least one entry - * - * The equivalent of calling php_ini_loaded_file then php_ini_scanned_files. - * The loaded ini location is the first entry and may be empty. - * - * @return array - */ - public static function getAllIniFiles() - { - if (!empty(self::$name)) { - $env = getenv(self::$name.self::SUFFIX_INIS); - - if (false !== $env) { - return explode(PATH_SEPARATOR, $env); - } - } - - $paths = array((string) php_ini_loaded_file()); - - if ($scanned = php_ini_scanned_files()) { - $paths = array_merge($paths, array_map('trim', explode(',', $scanned))); - } - - return $paths; - } - - /** - * Returns an array of restart settings or null - * - * Settings will be available if the current process was restarted, or - * called with the settings from an existing restart. - * - * @return array|null - */ - public static function getRestartSettings() - { - $envArgs = explode('|', (string) getenv(self::RESTART_SETTINGS)); - - if (count($envArgs) !== 6 - || (!self::$inRestart && php_ini_loaded_file() !== $envArgs[0])) { - return null; - } - - return array( - 'tmpIni' => $envArgs[0], - 'scannedInis' => (bool) $envArgs[1], - 'scanDir' => '*' === $envArgs[2] ? false : $envArgs[2], - 'phprc' => '*' === $envArgs[3] ? false : $envArgs[3], - 'inis' => explode(PATH_SEPARATOR, $envArgs[4]), - 'skipped' => $envArgs[5], - ); - } - - /** - * Returns the Xdebug version that triggered a successful restart - * - * @return string - */ - public static function getSkippedVersion() - { - return (string) self::$skipped; - } - - /** - * Returns whether Xdebug is loaded and active - * - * true: if Xdebug is loaded and is running in an active mode. - * false: if Xdebug is not loaded, or it is running with xdebug.mode=off. - * - * @return bool - */ - public static function isXdebugActive() - { - return self::$xdebugActive; - } - - /** - * Allows an extending class to decide if there should be a restart - * - * The default is to restart if Xdebug is loaded and its mode is not "off". - * Do not typehint for 1.x compatibility. - * - * @param bool $default The default behaviour - * - * @return bool Whether the process should restart - */ - protected function requiresRestart($default) - { - return $default; - } - - /** - * Allows an extending class to access the tmpIni - * - * Do not typehint for 1.x compatibility - * - * @param array $command - */ - protected function restart($command) - { - $this->doRestart($command); - } - - /** - * Executes the restarted command then deletes the tmp ini - * - * @param array $command - */ - private function doRestart(array $command) - { - $this->tryEnableSignals(); - $this->notify(Status::RESTARTING, implode(' ', $command)); - - if (PHP_VERSION_ID >= 70400) { - $cmd = $command; - } else { - $cmd = Process::escapeShellCommand($command); - if (defined('PHP_WINDOWS_VERSION_BUILD')) { - // Outer quotes required on cmd string below PHP 8 - $cmd = '"'.$cmd.'"'; - } - } - - $process = proc_open($cmd, array(), $pipes); - if (is_resource($process)) { - $exitCode = proc_close($process); - } - - if (!isset($exitCode)) { - // Unlikely that php or the default shell cannot be invoked - $this->notify(Status::ERROR, 'Unable to restart process'); - $exitCode = -1; - } else { - $this->notify(Status::INFO, 'Restarted process exited '.$exitCode); - } - - if ($this->debug === '2') { - $this->notify(Status::INFO, 'Temp ini saved: '.$this->tmpIni); - } else { - @unlink($this->tmpIni); - } - - exit($exitCode); - } - - /** - * Returns true if everything was written for the restart - * - * If any of the following fails (however unlikely) we must return false to - * stop potential recursion: - * - tmp ini file creation - * - environment variable creation - * - * @return bool - */ - private function prepareRestart() - { - $error = ''; - $iniFiles = self::getAllIniFiles(); - $scannedInis = count($iniFiles) > 1; - $tmpDir = sys_get_temp_dir(); - - if (!$this->cli) { - $error = 'Unsupported SAPI: '.PHP_SAPI; - } elseif (!defined('PHP_BINARY')) { - $error = 'PHP version is too old: '.PHP_VERSION; - } elseif (!$this->checkConfiguration($info)) { - $error = $info; - } elseif (!$this->checkScanDirConfig()) { - $error = 'PHP version does not report scanned inis: '.PHP_VERSION; - } elseif (!$this->checkMainScript()) { - $error = 'Unable to access main script: '.$this->script; - } elseif (!$this->writeTmpIni($iniFiles, $tmpDir, $error)) { - $error = $error ?: 'Unable to create temp ini file at: '.$tmpDir; - } elseif (!$this->setEnvironment($scannedInis, $iniFiles)) { - $error = 'Unable to set environment variables'; - } - - if ($error) { - $this->notify(Status::ERROR, $error); - } - - return empty($error); - } - - /** - * Returns true if the tmp ini file was written - * - * @param array $iniFiles All ini files used in the current process - * @param string $tmpDir The system temporary directory - * @param string $error Set by method if ini file cannot be read - * - * @return bool - */ - private function writeTmpIni(array $iniFiles, $tmpDir, &$error) - { - if (!$this->tmpIni = @tempnam($tmpDir, '')) { - return false; - } - - // $iniFiles has at least one item and it may be empty - if (empty($iniFiles[0])) { - array_shift($iniFiles); - } - - $content = ''; - $sectionRegex = '/^\s*\[(?:PATH|HOST)\s*=/mi'; - $xdebugRegex = '/^\s*(zend_extension\s*=.*xdebug.*)$/mi'; - - foreach ($iniFiles as $file) { - // Check for inaccessible ini files - if (($data = @file_get_contents($file)) === false) { - $error = 'Unable to read ini: '.$file; - return false; - } - // Check and remove directives after HOST and PATH sections - if (preg_match($sectionRegex, $data, $matches, PREG_OFFSET_CAPTURE)) { - $data = substr($data, 0, $matches[0][1]); - } - $content .= preg_replace($xdebugRegex, ';$1', $data).PHP_EOL; - } - - // Merge loaded settings into our ini content, if it is valid - if ($config = parse_ini_string($content)) { - $loaded = ini_get_all(null, false); - $content .= $this->mergeLoadedConfig($loaded, $config); - } - - // Work-around for https://bugs.php.net/bug.php?id=75932 - $content .= 'opcache.enable_cli=0'.PHP_EOL; - - return @file_put_contents($this->tmpIni, $content); - } - - /** - * Returns the command line arguments for the restart - * - * @return array - */ - private function getCommand() - { - $php = array(PHP_BINARY); - $args = array_slice($_SERVER['argv'], 1); - - if (!$this->persistent) { - // Use command-line options - array_push($php, '-n', '-c', $this->tmpIni); - } - - return array_merge($php, array($this->script), $args); - } - - /** - * Returns true if the restart environment variables were set - * - * No need to update $_SERVER since this is set in the restarted process. - * - * @param bool $scannedInis Whether there were scanned ini files - * @param array $iniFiles All ini files used in the current process - * - * @return bool - */ - private function setEnvironment($scannedInis, array $iniFiles) - { - $scanDir = getenv('PHP_INI_SCAN_DIR'); - $phprc = getenv('PHPRC'); - - // Make original inis available to restarted process - if (!putenv($this->envOriginalInis.'='.implode(PATH_SEPARATOR, $iniFiles))) { - return false; - } - - if ($this->persistent) { - // Use the environment to persist the settings - if (!putenv('PHP_INI_SCAN_DIR=') || !putenv('PHPRC='.$this->tmpIni)) { - return false; - } - } - - // Flag restarted process and save values for it to use - $envArgs = array( - self::RESTART_ID, - $this->loaded, - (int) $scannedInis, - false === $scanDir ? '*' : $scanDir, - false === $phprc ? '*' : $phprc, - ); - - return putenv($this->envAllowXdebug.'='.implode('|', $envArgs)); - } - - /** - * Logs status messages - * - * @param string $op Status handler constant - * @param null|string $data Optional data - */ - private function notify($op, $data = null) - { - $this->statusWriter->report($op, $data); - } - - /** - * Returns default, changed and command-line ini settings - * - * @param array $loadedConfig All current ini settings - * @param array $iniConfig Settings from user ini files - * - * @return string - */ - private function mergeLoadedConfig(array $loadedConfig, array $iniConfig) - { - $content = ''; - - foreach ($loadedConfig as $name => $value) { - // Value will either be null, string or array (HHVM only) - if (!is_string($value) - || strpos($name, 'xdebug') === 0 - || $name === 'apc.mmap_file_mask') { - continue; - } - - if (!isset($iniConfig[$name]) || $iniConfig[$name] !== $value) { - // Double-quote escape each value - $content .= $name.'="'.addcslashes($value, '\\"').'"'.PHP_EOL; - } - } - - return $content; - } - - /** - * Returns true if the script name can be used - * - * @return bool - */ - private function checkMainScript() - { - if (null !== $this->script) { - // Allow an application to set -- for standard input - return file_exists($this->script) || '--' === $this->script; - } - - if (file_exists($this->script = $_SERVER['argv'][0])) { - return true; - } - - // Use a backtrace to resolve Phar and chdir issues - $options = PHP_VERSION_ID >= 50306 ? DEBUG_BACKTRACE_IGNORE_ARGS : false; - $trace = debug_backtrace($options); - - if (($main = end($trace)) && isset($main['file'])) { - return file_exists($this->script = $main['file']); - } - - return false; - } - - /** - * Adds restart settings to the environment - * - * @param string[] $envArgs - */ - private function setEnvRestartSettings($envArgs) - { - $settings = array( - php_ini_loaded_file(), - $envArgs[2], - $envArgs[3], - $envArgs[4], - getenv($this->envOriginalInis), - self::$skipped, - ); - - Process::setEnv(self::RESTART_SETTINGS, implode('|', $settings)); - } - - /** - * Syncs settings and the environment if called with existing settings - * - * @param array $settings - */ - private function syncSettings(array $settings) - { - if (false === getenv($this->envOriginalInis)) { - // Called by another app, so make original inis available - Process::setEnv($this->envOriginalInis, implode(PATH_SEPARATOR, $settings['inis'])); - } - - self::$skipped = $settings['skipped']; - $this->notify(Status::INFO, 'Process called with existing restart settings'); - } - - /** - * Returns true if there are scanned inis and PHP is able to report them - * - * php_ini_scanned_files will fail when PHP_CONFIG_FILE_SCAN_DIR is empty. - * Fixed in 7.1.13 and 7.2.1 - * - * @return bool - */ - private function checkScanDirConfig() - { - return !(getenv('PHP_INI_SCAN_DIR') - && !PHP_CONFIG_FILE_SCAN_DIR - && (PHP_VERSION_ID < 70113 - || PHP_VERSION_ID === 70200)); - } - - /** - * Returns true if there are no known configuration issues - * - * @param string $info Set by method - * @return bool - */ - private function checkConfiguration(&$info) - { - if (!function_exists('proc_open')) { - $info = 'proc_open function is disabled'; - return false; - } - - if (extension_loaded('uopz') && !ini_get('uopz.disable')) { - // uopz works at opcode level and disables exit calls - if (function_exists('uopz_allow_exit')) { - @uopz_allow_exit(true); - } else { - $info = 'uopz extension is not compatible'; - return false; - } - } - - - $workingDir = getcwd(); - if (0 === strpos($workingDir, '\\\\')) { - if (defined('PHP_WINDOWS_VERSION_BUILD') && PHP_VERSION_ID < 70400) { - $info = 'cmd.exe does not support UNC paths: '.$workingDir; - return false; - } - } - - return true; - } - - /** - * Enables async signals and control interrupts in the restarted process - * - * Available on Unix PHP 7.1+ with the pcntl extension and Windows PHP 7.4+. - */ - private function tryEnableSignals() - { - if (function_exists('pcntl_async_signals') && function_exists('pcntl_signal')) { - pcntl_async_signals(true); - $message = 'Async signals enabled'; - - if (!self::$inRestart) { - // Restarting, so ignore SIGINT in parent - pcntl_signal(SIGINT, SIG_IGN); - } elseif (is_int(pcntl_signal_get_handler(SIGINT))) { - // Restarted, no handler set so force default action - pcntl_signal(SIGINT, SIG_DFL); - } - } - - if (!self::$inRestart && function_exists('sapi_windows_set_ctrl_handler')) { - // Restarting, so set a handler to ignore CTRL events in the parent. - // This ensures that CTRL+C events will be available in the child - // process without having to enable them there, which is unreliable. - sapi_windows_set_ctrl_handler(function ($evt) {}); - } - } -} diff --git a/tools/php-cs-fixer/vendor/doctrine/annotations/LICENSE b/tools/php-cs-fixer/vendor/doctrine/annotations/LICENSE deleted file mode 100644 index 5e781fc..0000000 --- a/tools/php-cs-fixer/vendor/doctrine/annotations/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2006-2013 Doctrine Project - -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/tools/php-cs-fixer/vendor/doctrine/annotations/README.md b/tools/php-cs-fixer/vendor/doctrine/annotations/README.md deleted file mode 100644 index c2c7eb7..0000000 --- a/tools/php-cs-fixer/vendor/doctrine/annotations/README.md +++ /dev/null @@ -1,18 +0,0 @@ -# Doctrine Annotations - -[![Build Status](https://github.com/doctrine/annotations/workflows/Continuous%20Integration/badge.svg?label=build)](https://github.com/doctrine/persistence/actions) -[![Dependency Status](https://www.versioneye.com/package/php--doctrine--annotations/badge.png)](https://www.versioneye.com/package/php--doctrine--annotations) -[![Reference Status](https://www.versioneye.com/php/doctrine:annotations/reference_badge.svg)](https://www.versioneye.com/php/doctrine:annotations/references) -[![Total Downloads](https://poser.pugx.org/doctrine/annotations/downloads.png)](https://packagist.org/packages/doctrine/annotations) -[![Latest Stable Version](https://img.shields.io/packagist/v/doctrine/annotations.svg?label=stable)](https://packagist.org/packages/doctrine/annotations) - -Docblock Annotations Parser library (extracted from [Doctrine Common](https://github.com/doctrine/common)). - -## Documentation - -See the [doctrine-project website](https://www.doctrine-project.org/projects/doctrine-annotations/en/latest/index.html). - -## Contributing - -When making a pull request, make sure your changes follow the -[Coding Standard Guidelines](https://www.doctrine-project.org/projects/doctrine-coding-standard/en/current/reference/index.html#introduction). diff --git a/tools/php-cs-fixer/vendor/doctrine/annotations/composer.json b/tools/php-cs-fixer/vendor/doctrine/annotations/composer.json deleted file mode 100644 index 00d0231..0000000 --- a/tools/php-cs-fixer/vendor/doctrine/annotations/composer.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "doctrine/annotations", - "type": "library", - "description": "Docblock Annotations Parser", - "keywords": ["annotations", "docblock", "parser"], - "homepage": "https://www.doctrine-project.org/projects/annotations.html", - "license": "MIT", - "authors": [ - {"name": "Guilherme Blanco", "email": "guilhermeblanco@gmail.com"}, - {"name": "Roman Borschel", "email": "roman@code-factory.org"}, - {"name": "Benjamin Eberlei", "email": "kontakt@beberlei.de"}, - {"name": "Jonathan Wage", "email": "jonwage@gmail.com"}, - {"name": "Johannes Schmitt", "email": "schmittjoh@gmail.com"} - ], - "require": { - "php": "^7.1 || ^8.0", - "ext-tokenizer": "*", - "doctrine/lexer": "1.*", - "psr/cache": "^1 || ^2 || ^3" - }, - "require-dev": { - "doctrine/cache": "^1.11 || ^2.0", - "doctrine/coding-standard": "^6.0 || ^8.1", - "phpstan/phpstan": "^0.12.20", - "phpunit/phpunit": "^7.5 || ^8.0 || ^9.1.5", - "symfony/cache": "^4.4 || ^5.2" - }, - "config": { - "sort-packages": true - }, - "autoload": { - "psr-4": { "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" } - }, - "autoload-dev": { - "psr-4": { - "Doctrine\\Performance\\Common\\Annotations\\": "tests/Doctrine/Performance/Common/Annotations", - "Doctrine\\Tests\\Common\\Annotations\\": "tests/Doctrine/Tests/Common/Annotations" - }, - "files": [ - "tests/Doctrine/Tests/Common/Annotations/Fixtures/functions.php", - "tests/Doctrine/Tests/Common/Annotations/Fixtures/SingleClassLOC1000.php" - ] - } -} diff --git a/tools/php-cs-fixer/vendor/doctrine/annotations/docs/en/annotations.rst b/tools/php-cs-fixer/vendor/doctrine/annotations/docs/en/annotations.rst deleted file mode 100644 index 2c3c428..0000000 --- a/tools/php-cs-fixer/vendor/doctrine/annotations/docs/en/annotations.rst +++ /dev/null @@ -1,252 +0,0 @@ -Handling Annotations -==================== - -There are several different approaches to handling annotations in PHP. -Doctrine Annotations maps docblock annotations to PHP classes. Because -not all docblock annotations are used for metadata purposes a filter is -applied to ignore or skip classes that are not Doctrine annotations. - -Take a look at the following code snippet: - -.. code-block:: php - - namespace MyProject\Entities; - - use Doctrine\ORM\Mapping AS ORM; - use Symfony\Component\Validator\Constraints AS Assert; - - /** - * @author Benjamin Eberlei - * @ORM\Entity - * @MyProject\Annotations\Foobarable - */ - class User - { - /** - * @ORM\Id @ORM\Column @ORM\GeneratedValue - * @dummy - * @var int - */ - private $id; - - /** - * @ORM\Column(type="string") - * @Assert\NotEmpty - * @Assert\Email - * @var string - */ - private $email; - } - -In this snippet you can see a variety of different docblock annotations: - -- Documentation annotations such as ``@var`` and ``@author``. These - annotations are ignored and never considered for throwing an - exception due to wrongly used annotations. -- Annotations imported through use statements. The statement ``use - Doctrine\ORM\Mapping AS ORM`` makes all classes under that namespace - available as ``@ORM\ClassName``. Same goes for the import of - ``@Assert``. -- The ``@dummy`` annotation. It is not a documentation annotation and - not ignored. For Doctrine Annotations it is not entirely clear how - to handle this annotation. Depending on the configuration an exception - (unknown annotation) will be thrown when parsing this annotation. -- The fully qualified annotation ``@MyProject\Annotations\Foobarable``. - This is transformed directly into the given class name. - -How are these annotations loaded? From looking at the code you could -guess that the ORM Mapping, Assert Validation and the fully qualified -annotation can just be loaded using -the defined PHP autoloaders. This is not the case however: For error -handling reasons every check for class existence inside the -``AnnotationReader`` sets the second parameter $autoload -of ``class_exists($name, $autoload)`` to false. To work flawlessly the -``AnnotationReader`` requires silent autoloaders which many autoloaders are -not. Silent autoloading is NOT part of the `PSR-0 specification -`_ -for autoloading. - -This is why Doctrine Annotations uses its own autoloading mechanism -through a global registry. If you are wondering about the annotation -registry being global, there is no other way to solve the architectural -problems of autoloading annotation classes in a straightforward fashion. -Additionally if you think about PHP autoloading then you recognize it is -a global as well. - -To anticipate the configuration section, making the above PHP class work -with Doctrine Annotations requires this setup: - -.. code-block:: php - - use Doctrine\Common\Annotations\AnnotationReader; - use Doctrine\Common\Annotations\AnnotationRegistry; - - AnnotationRegistry::registerFile("/path/to/doctrine/lib/Doctrine/ORM/Mapping/Driver/DoctrineAnnotations.php"); - AnnotationRegistry::registerAutoloadNamespace("Symfony\Component\Validator\Constraint", "/path/to/symfony/src"); - AnnotationRegistry::registerAutoloadNamespace("MyProject\Annotations", "/path/to/myproject/src"); - - $reader = new AnnotationReader(); - AnnotationReader::addGlobalIgnoredName('dummy'); - -The second block with the annotation registry calls registers all the -three different annotation namespaces that are used. -Doctrine Annotations saves all its annotations in a single file, that is -why ``AnnotationRegistry#registerFile`` is used in contrast to -``AnnotationRegistry#registerAutoloadNamespace`` which creates a PSR-0 -compatible loading mechanism for class to file names. - -In the third block, we create the actual ``AnnotationReader`` instance. -Note that we also add ``dummy`` to the global list of ignored -annotations for which we do not throw exceptions. Setting this is -necessary in our example case, otherwise ``@dummy`` would trigger an -exception to be thrown during the parsing of the docblock of -``MyProject\Entities\User#id``. - -Setup and Configuration ------------------------ - -To use the annotations library is simple, you just need to create a new -``AnnotationReader`` instance: - -.. code-block:: php - - $reader = new \Doctrine\Common\Annotations\AnnotationReader(); - -This creates a simple annotation reader with no caching other than in -memory (in php arrays). Since parsing docblocks can be expensive you -should cache this process by using a caching reader. - -To cache annotations, you can create a ``Doctrine\Common\Annotations\PsrCachedReader``. -This reader decorates the original reader and stores all annotations in a PSR-6 -cache: - -.. code-block:: php - - use Doctrine\Common\Annotations\AnnotationReader; - use Doctrine\Common\Annotations\PsrCachedReader; - - $cache = ... // instantiate a PSR-6 Cache pool - - $reader = new PsrCachedReader( - new AnnotationReader(), - $cache, - $debug = true - ); - -The ``debug`` flag is used here as well to invalidate the cache files -when the PHP class with annotations changed and should be used during -development. - -.. warning :: - - The ``AnnotationReader`` works and caches under the - assumption that all annotations of a doc-block are processed at - once. That means that annotation classes that do not exist and - aren't loaded and cannot be autoloaded (using the - AnnotationRegistry) would never be visible and not accessible if a - cache is used unless the cache is cleared and the annotations - requested again, this time with all annotations defined. - -By default the annotation reader returns a list of annotations with -numeric indexes. If you want your annotations to be indexed by their -class name you can wrap the reader in an ``IndexedReader``: - -.. code-block:: php - - use Doctrine\Common\Annotations\AnnotationReader; - use Doctrine\Common\Annotations\IndexedReader; - - $reader = new IndexedReader(new AnnotationReader()); - -.. warning:: - - You should never wrap the indexed reader inside a cached reader, - only the other way around. This way you can re-use the cache with - indexed or numeric keys, otherwise your code may experience failures - due to caching in a numerical or indexed format. - -Registering Annotations -~~~~~~~~~~~~~~~~~~~~~~~ - -As explained in the introduction, Doctrine Annotations uses its own -autoloading mechanism to determine if a given annotation has a -corresponding PHP class that can be autoloaded. For annotation -autoloading you have to configure the -``Doctrine\Common\Annotations\AnnotationRegistry``. There are three -different mechanisms to configure annotation autoloading: - -- Calling ``AnnotationRegistry#registerFile($file)`` to register a file - that contains one or more annotation classes. -- Calling ``AnnotationRegistry#registerNamespace($namespace, $dirs = - null)`` to register that the given namespace contains annotations and - that their base directory is located at the given $dirs or in the - include path if ``NULL`` is passed. The given directories should *NOT* - be the directory where classes of the namespace are in, but the base - directory of the root namespace. The AnnotationRegistry uses a - namespace to directory separator approach to resolve the correct path. -- Calling ``AnnotationRegistry#registerLoader($callable)`` to register - an autoloader callback. The callback accepts the class as first and - only parameter and has to return ``true`` if the corresponding file - was found and included. - -.. note:: - - Loaders have to fail silently, if a class is not found even if it - matches for example the namespace prefix of that loader. Never is a - loader to throw a warning or exception if the loading failed - otherwise parsing doc block annotations will become a huge pain. - -A sample loader callback could look like: - -.. code-block:: php - - use Doctrine\Common\Annotations\AnnotationRegistry; - use Symfony\Component\ClassLoader\UniversalClassLoader; - - AnnotationRegistry::registerLoader(function($class) { - $file = str_replace("\\", DIRECTORY_SEPARATOR, $class) . ".php"; - - if (file_exists("/my/base/path/" . $file)) { - // file_exists() makes sure that the loader fails silently - require "/my/base/path/" . $file; - } - }); - - $loader = new UniversalClassLoader(); - AnnotationRegistry::registerLoader(array($loader, "loadClass")); - - -Ignoring missing exceptions -~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -By default an exception is thrown from the ``AnnotationReader`` if an -annotation was found that: - -- is not part of the list of ignored "documentation annotations"; -- was not imported through a use statement; -- is not a fully qualified class that exists. - -You can disable this behavior for specific names if your docblocks do -not follow strict requirements: - -.. code-block:: php - - $reader = new \Doctrine\Common\Annotations\AnnotationReader(); - AnnotationReader::addGlobalIgnoredName('foo'); - -PHP Imports -~~~~~~~~~~~ - -By default the annotation reader parses the use-statement of a php file -to gain access to the import rules and register them for the annotation -processing. Only if you are using PHP Imports can you validate the -correct usage of annotations and throw exceptions if you misspelled an -annotation. This mechanism is enabled by default. - -To ease the upgrade path, we still allow you to disable this mechanism. -Note however that we will remove this in future versions: - -.. code-block:: php - - $reader = new \Doctrine\Common\Annotations\AnnotationReader(); - $reader->setEnabledPhpImports(false); diff --git a/tools/php-cs-fixer/vendor/doctrine/annotations/docs/en/custom.rst b/tools/php-cs-fixer/vendor/doctrine/annotations/docs/en/custom.rst deleted file mode 100644 index 11fbe1a..0000000 --- a/tools/php-cs-fixer/vendor/doctrine/annotations/docs/en/custom.rst +++ /dev/null @@ -1,443 +0,0 @@ -Custom Annotation Classes -========================= - -If you want to define your own annotations, you just have to group them -in a namespace and register this namespace in the ``AnnotationRegistry``. -Annotation classes have to contain a class-level docblock with the text -``@Annotation``: - -.. code-block:: php - - namespace MyCompany\Annotations; - - /** @Annotation */ - class Bar - { - // some code - } - -Inject annotation values ------------------------- - -The annotation parser checks if the annotation constructor has arguments, -if so then it will pass the value array, otherwise it will try to inject -values into public properties directly: - - -.. code-block:: php - - namespace MyCompany\Annotations; - - /** - * @Annotation - * - * Some Annotation using a constructor - */ - class Bar - { - private $foo; - - public function __construct(array $values) - { - $this->foo = $values['foo']; - } - } - - /** - * @Annotation - * - * Some Annotation without a constructor - */ - class Foo - { - public $bar; - } - -Optional: Constructors with Named Parameters --------------------------------------------- - -Starting with Annotations v1.11 a new annotation instantiation strategy -is available that aims at compatibility of Annotation classes with the PHP 8 -attribute feature. You need to declare a constructor with regular parameter -names that match the named arguments in the annotation syntax. - -To enable this feature, you can tag your annotation class with -``@NamedArgumentConstructor`` (available from v1.12) or implement the -``Doctrine\Common\Annotations\NamedArgumentConstructorAnnotation`` interface -(available from v1.11 and deprecated as of v1.12). -When using the ``@NamedArgumentConstructor`` tag, the first argument of the -constructor is considered as the default one. - - -Usage with the ``@NamedArgumentContrustor`` tag - -.. code-block:: php - - namespace MyCompany\Annotations; - - /** - * @Annotation - * @NamedArgumentConstructor - */ - class Bar implements NamedArgumentConstructorAnnotation - { - private $foo; - - public function __construct(string $foo) - { - $this->foo = $foo; - } - } - - /** Usable with @Bar(foo="baz") */ - /** Usable with @Bar("baz") */ - -In combination with PHP 8's constructor property promotion feature -you can simplify this to: - -.. code-block:: php - - namespace MyCompany\Annotations; - - /** - * @Annotation - * @NamedArgumentConstructor - */ - class Bar implements NamedArgumentConstructorAnnotation - { - public function __construct(private string $foo) {} - } - - -Usage with the -``Doctrine\Common\Annotations\NamedArgumentConstructorAnnotation`` -interface (v1.11, deprecated as of v1.12): -.. code-block:: php - - namespace MyCompany\Annotations; - - use Doctrine\Common\Annotations\NamedArgumentConstructorAnnotation; - - /** @Annotation */ - class Bar implements NamedArgumentConstructorAnnotation - { - private $foo; - - public function __construct(private string $foo) {} - } - - /** Usable with @Bar(foo="baz") */ - -Annotation Target ------------------ - -``@Target`` indicates the kinds of class elements to which an annotation -type is applicable. Then you could define one or more targets: - -- ``CLASS`` Allowed in class docblocks -- ``PROPERTY`` Allowed in property docblocks -- ``METHOD`` Allowed in the method docblocks -- ``FUNCTION`` Allowed in function dockblocks -- ``ALL`` Allowed in class, property, method and function docblocks -- ``ANNOTATION`` Allowed inside other annotations - -If the annotations is not allowed in the current context, an -``AnnotationException`` is thrown. - -.. code-block:: php - - namespace MyCompany\Annotations; - - /** - * @Annotation - * @Target({"METHOD","PROPERTY"}) - */ - class Bar - { - // some code - } - - /** - * @Annotation - * @Target("CLASS") - */ - class Foo - { - // some code - } - -Attribute types ---------------- - -The annotation parser checks the given parameters using the phpdoc -annotation ``@var``, The data type could be validated using the ``@var`` -annotation on the annotation properties or using the ``@Attributes`` and -``@Attribute`` annotations. - -If the data type does not match you get an ``AnnotationException`` - -.. code-block:: php - - namespace MyCompany\Annotations; - - /** - * @Annotation - * @Target({"METHOD","PROPERTY"}) - */ - class Bar - { - /** @var mixed */ - public $mixed; - - /** @var boolean */ - public $boolean; - - /** @var bool */ - public $bool; - - /** @var float */ - public $float; - - /** @var string */ - public $string; - - /** @var integer */ - public $integer; - - /** @var array */ - public $array; - - /** @var SomeAnnotationClass */ - public $annotation; - - /** @var array */ - public $arrayOfIntegers; - - /** @var array */ - public $arrayOfAnnotations; - } - - /** - * @Annotation - * @Target({"METHOD","PROPERTY"}) - * @Attributes({ - * @Attribute("stringProperty", type = "string"), - * @Attribute("annotProperty", type = "SomeAnnotationClass"), - * }) - */ - class Foo - { - public function __construct(array $values) - { - $this->stringProperty = $values['stringProperty']; - $this->annotProperty = $values['annotProperty']; - } - - // some code - } - -Annotation Required -------------------- - -``@Required`` indicates that the field must be specified when the -annotation is used. If it is not used you get an ``AnnotationException`` -stating that this value can not be null. - -Declaring a required field: - -.. code-block:: php - - /** - * @Annotation - * @Target("ALL") - */ - class Foo - { - /** @Required */ - public $requiredField; - } - -Usage: - -.. code-block:: php - - /** @Foo(requiredField="value") */ - public $direction; // Valid - - /** @Foo */ - public $direction; // Required field missing, throws an AnnotationException - - -Enumerated values ------------------ - -- An annotation property marked with ``@Enum`` is a field that accepts a - fixed set of scalar values. -- You should use ``@Enum`` fields any time you need to represent fixed - values. -- The annotation parser checks the given value and throws an - ``AnnotationException`` if the value does not match. - - -Declaring an enumerated property: - -.. code-block:: php - - /** - * @Annotation - * @Target("ALL") - */ - class Direction - { - /** - * @Enum({"NORTH", "SOUTH", "EAST", "WEST"}) - */ - public $value; - } - -Annotation usage: - -.. code-block:: php - - /** @Direction("NORTH") */ - public $direction; // Valid value - - /** @Direction("NORTHEAST") */ - public $direction; // Invalid value, throws an AnnotationException - - -Constants ---------- - -The use of constants and class constants is available on the annotations -parser. - -The following usages are allowed: - -.. code-block:: php - - namespace MyCompany\Entity; - - use MyCompany\Annotations\Foo; - use MyCompany\Annotations\Bar; - use MyCompany\Entity\SomeClass; - - /** - * @Foo(PHP_EOL) - * @Bar(Bar::FOO) - * @Foo({SomeClass::FOO, SomeClass::BAR}) - * @Bar({SomeClass::FOO_KEY = SomeClass::BAR_VALUE}) - */ - class User - { - } - - -Be careful with constants and the cache ! - -.. note:: - - The cached reader will not re-evaluate each time an annotation is - loaded from cache. When a constant is changed the cache must be - cleaned. - - -Usage ------ - -Using the library API is simple. Using the annotations described in the -previous section, you can now annotate other classes with your -annotations: - -.. code-block:: php - - namespace MyCompany\Entity; - - use MyCompany\Annotations\Foo; - use MyCompany\Annotations\Bar; - - /** - * @Foo(bar="foo") - * @Bar(foo="bar") - */ - class User - { - } - -Now we can write a script to get the annotations above: - -.. code-block:: php - - $reflClass = new ReflectionClass('MyCompany\Entity\User'); - $classAnnotations = $reader->getClassAnnotations($reflClass); - - foreach ($classAnnotations AS $annot) { - if ($annot instanceof \MyCompany\Annotations\Foo) { - echo $annot->bar; // prints "foo"; - } else if ($annot instanceof \MyCompany\Annotations\Bar) { - echo $annot->foo; // prints "bar"; - } - } - -You have a complete API for retrieving annotation class instances from a -class, property or method docblock: - - -Reader API -~~~~~~~~~~ - -Access all annotations of a class -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: php - - public function getClassAnnotations(\ReflectionClass $class); - -Access one annotation of a class -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: php - - public function getClassAnnotation(\ReflectionClass $class, $annotationName); - -Access all annotations of a method -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: php - - public function getMethodAnnotations(\ReflectionMethod $method); - -Access one annotation of a method -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: php - - public function getMethodAnnotation(\ReflectionMethod $method, $annotationName); - -Access all annotations of a property -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: php - - public function getPropertyAnnotations(\ReflectionProperty $property); - -Access one annotation of a property -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: php - - public function getPropertyAnnotation(\ReflectionProperty $property, $annotationName); - -Access all annotations of a function -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: php - - public function getFunctionAnnotations(\ReflectionFunction $property); - -Access one annotation of a function -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: php - - public function getFunctionAnnotation(\ReflectionFunction $property, $annotationName); diff --git a/tools/php-cs-fixer/vendor/doctrine/annotations/docs/en/index.rst b/tools/php-cs-fixer/vendor/doctrine/annotations/docs/en/index.rst deleted file mode 100644 index 95476c3..0000000 --- a/tools/php-cs-fixer/vendor/doctrine/annotations/docs/en/index.rst +++ /dev/null @@ -1,101 +0,0 @@ -Introduction -============ - -Doctrine Annotations allows to implement custom annotation -functionality for PHP classes and functions. - -.. code-block:: php - - class Foo - { - /** - * @MyAnnotation(myProperty="value") - */ - private $bar; - } - -Annotations aren't implemented in PHP itself which is why this component -offers a way to use the PHP doc-blocks as a place for the well known -annotation syntax using the ``@`` char. - -Annotations in Doctrine are used for the ORM configuration to build the -class mapping, but it can be used in other projects for other purposes -too. - -Installation -============ - -You can install the Annotation component with composer: - -.. code-block:: - -   $ composer require doctrine/annotations - -Create an annotation class -========================== - -An annotation class is a representation of the later used annotation -configuration in classes. The annotation class of the previous example -looks like this: - -.. code-block:: php - - /** - * @Annotation - */ - final class MyAnnotation - { - public $myProperty; - } - -The annotation class is declared as an annotation by ``@Annotation``. - -:ref:`Read more about custom annotations. ` - -Reading annotations -=================== - -The access to the annotations happens by reflection of the class or function -containing them. There are multiple reader-classes implementing the -``Doctrine\Common\Annotations\Reader`` interface, that can access the -annotations of a class. A common one is -``Doctrine\Common\Annotations\AnnotationReader``: - -.. code-block:: php - - use Doctrine\Common\Annotations\AnnotationReader; - use Doctrine\Common\Annotations\AnnotationRegistry; - - // Deprecated and will be removed in 2.0 but currently needed - AnnotationRegistry::registerLoader('class_exists'); - - $reflectionClass = new ReflectionClass(Foo::class); - $property = $reflectionClass->getProperty('bar'); - - $reader = new AnnotationReader(); - $myAnnotation = $reader->getPropertyAnnotation( - $property, - MyAnnotation::class - ); - - echo $myAnnotation->myProperty; // result: "value" - -Note that ``AnnotationRegistry::registerLoader('class_exists')`` only works -if you already have an autoloader configured (i.e. composer autoloader). -Otherwise, :ref:`please take a look to the other annotation autoload mechanisms `. - -A reader has multiple methods to access the annotations of a class or -function. - -:ref:`Read more about handling annotations. ` - -IDE Support ------------ - -Some IDEs already provide support for annotations: - -- Eclipse via the `Symfony2 Plugin `_ -- PhpStorm via the `PHP Annotations Plugin `_ or the `Symfony Plugin `_ - -.. _Read more about handling annotations.: annotations -.. _Read more about custom annotations.: custom diff --git a/tools/php-cs-fixer/vendor/doctrine/annotations/docs/en/sidebar.rst b/tools/php-cs-fixer/vendor/doctrine/annotations/docs/en/sidebar.rst deleted file mode 100644 index 6f5d13c..0000000 --- a/tools/php-cs-fixer/vendor/doctrine/annotations/docs/en/sidebar.rst +++ /dev/null @@ -1,6 +0,0 @@ -.. toctree:: - :depth: 3 - - index - annotations - custom diff --git a/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation.php b/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation.php deleted file mode 100644 index 750270e..0000000 --- a/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation.php +++ /dev/null @@ -1,59 +0,0 @@ - $data Key-value for properties to be defined in this class. - */ - final public function __construct(array $data) - { - foreach ($data as $key => $value) { - $this->$key = $value; - } - } - - /** - * Error handler for unknown property accessor in Annotation class. - * - * @param string $name Unknown property name. - * - * @throws BadMethodCallException - */ - public function __get($name) - { - throw new BadMethodCallException( - sprintf("Unknown property '%s' on annotation '%s'.", $name, static::class) - ); - } - - /** - * Error handler for unknown property mutator in Annotation class. - * - * @param string $name Unknown property name. - * @param mixed $value Property value. - * - * @throws BadMethodCallException - */ - public function __set($name, $value) - { - throw new BadMethodCallException( - sprintf("Unknown property '%s' on annotation '%s'.", $name, static::class) - ); - } -} diff --git a/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Attribute.php b/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Attribute.php deleted file mode 100644 index b1f8514..0000000 --- a/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Attribute.php +++ /dev/null @@ -1,21 +0,0 @@ - */ - public $value; -} diff --git a/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Enum.php b/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Enum.php deleted file mode 100644 index 35d6410..0000000 --- a/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Enum.php +++ /dev/null @@ -1,69 +0,0 @@ - */ - public $value; - - /** - * Literal target declaration. - * - * @var mixed[] - */ - public $literal; - - /** - * @throws InvalidArgumentException - * - * @phpstan-param array{literal?: mixed[], value: list} $values - */ - public function __construct(array $values) - { - if (! isset($values['literal'])) { - $values['literal'] = []; - } - - foreach ($values['value'] as $var) { - if (! is_scalar($var)) { - throw new InvalidArgumentException(sprintf( - '@Enum supports only scalar values "%s" given.', - is_object($var) ? get_class($var) : gettype($var) - )); - } - } - - foreach ($values['literal'] as $key => $var) { - if (! in_array($key, $values['value'])) { - throw new InvalidArgumentException(sprintf( - 'Undefined enumerator value "%s" for literal "%s".', - $key, - $var - )); - } - } - - $this->value = $values['value']; - $this->literal = $values['literal']; - } -} diff --git a/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php b/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php deleted file mode 100644 index ae60f7d..0000000 --- a/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php +++ /dev/null @@ -1,43 +0,0 @@ - */ - public $names; - - /** - * @throws RuntimeException - * - * @phpstan-param array{value: string|list} $values - */ - public function __construct(array $values) - { - if (is_string($values['value'])) { - $values['value'] = [$values['value']]; - } - - if (! is_array($values['value'])) { - throw new RuntimeException(sprintf( - '@IgnoreAnnotation expects either a string name, or an array of strings, but got %s.', - json_encode($values['value']) - )); - } - - $this->names = $values['value']; - } -} diff --git a/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/NamedArgumentConstructor.php b/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/NamedArgumentConstructor.php deleted file mode 100644 index 1690601..0000000 --- a/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/NamedArgumentConstructor.php +++ /dev/null @@ -1,13 +0,0 @@ - */ - private static $map = [ - 'ALL' => self::TARGET_ALL, - 'CLASS' => self::TARGET_CLASS, - 'METHOD' => self::TARGET_METHOD, - 'PROPERTY' => self::TARGET_PROPERTY, - 'FUNCTION' => self::TARGET_FUNCTION, - 'ANNOTATION' => self::TARGET_ANNOTATION, - ]; - - /** @phpstan-var list */ - public $value; - - /** - * Targets as bitmask. - * - * @var int - */ - public $targets; - - /** - * Literal target declaration. - * - * @var string - */ - public $literal; - - /** - * @throws InvalidArgumentException - * - * @phpstan-param array{value?: string|list} $values - */ - public function __construct(array $values) - { - if (! isset($values['value'])) { - $values['value'] = null; - } - - if (is_string($values['value'])) { - $values['value'] = [$values['value']]; - } - - if (! is_array($values['value'])) { - throw new InvalidArgumentException( - sprintf( - '@Target expects either a string value, or an array of strings, "%s" given.', - is_object($values['value']) ? get_class($values['value']) : gettype($values['value']) - ) - ); - } - - $bitmask = 0; - foreach ($values['value'] as $literal) { - if (! isset(self::$map[$literal])) { - throw new InvalidArgumentException( - sprintf( - 'Invalid Target "%s". Available targets: [%s]', - $literal, - implode(', ', array_keys(self::$map)) - ) - ); - } - - $bitmask |= self::$map[$literal]; - } - - $this->targets = $bitmask; - $this->value = $values['value']; - $this->literal = implode(', ', $this->value); - } -} diff --git a/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationException.php b/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationException.php deleted file mode 100644 index b1ea64e..0000000 --- a/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationException.php +++ /dev/null @@ -1,171 +0,0 @@ - $available - */ - public static function enumeratorError($attributeName, $annotationName, $context, $available, $given) - { - return new self(sprintf( - '[Enum Error] Attribute "%s" of @%s declared on %s accepts only [%s], but got %s.', - $attributeName, - $annotationName, - $context, - implode(', ', $available), - is_object($given) ? get_class($given) : $given - )); - } - - /** - * @return AnnotationException - */ - public static function optimizerPlusSaveComments() - { - return new self( - 'You have to enable opcache.save_comments=1 or zend_optimizerplus.save_comments=1.' - ); - } - - /** - * @return AnnotationException - */ - public static function optimizerPlusLoadComments() - { - return new self( - 'You have to enable opcache.load_comments=1 or zend_optimizerplus.load_comments=1.' - ); - } -} diff --git a/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationReader.php b/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationReader.php deleted file mode 100644 index 1f538ee..0000000 --- a/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationReader.php +++ /dev/null @@ -1,389 +0,0 @@ - - */ - private static $globalImports = [ - 'ignoreannotation' => Annotation\IgnoreAnnotation::class, - ]; - - /** - * A list with annotations that are not causing exceptions when not resolved to an annotation class. - * - * The names are case sensitive. - * - * @var array - */ - private static $globalIgnoredNames = ImplicitlyIgnoredAnnotationNames::LIST; - - /** - * A list with annotations that are not causing exceptions when not resolved to an annotation class. - * - * The names are case sensitive. - * - * @var array - */ - private static $globalIgnoredNamespaces = []; - - /** - * Add a new annotation to the globally ignored annotation names with regard to exception handling. - * - * @param string $name - */ - public static function addGlobalIgnoredName($name) - { - self::$globalIgnoredNames[$name] = true; - } - - /** - * Add a new annotation to the globally ignored annotation namespaces with regard to exception handling. - * - * @param string $namespace - */ - public static function addGlobalIgnoredNamespace($namespace) - { - self::$globalIgnoredNamespaces[$namespace] = true; - } - - /** - * Annotations parser. - * - * @var DocParser - */ - private $parser; - - /** - * Annotations parser used to collect parsing metadata. - * - * @var DocParser - */ - private $preParser; - - /** - * PHP parser used to collect imports. - * - * @var PhpParser - */ - private $phpParser; - - /** - * In-memory cache mechanism to store imported annotations per class. - * - * @psalm-var array<'class'|'function', array>> - */ - private $imports = []; - - /** - * In-memory cache mechanism to store ignored annotations per class. - * - * @psalm-var array<'class'|'function', array>> - */ - private $ignoredAnnotationNames = []; - - /** - * Initializes a new AnnotationReader. - * - * @throws AnnotationException - */ - public function __construct(?DocParser $parser = null) - { - if ( - extension_loaded('Zend Optimizer+') && (ini_get('zend_optimizerplus.save_comments') === '0' || - ini_get('opcache.save_comments') === '0') - ) { - throw AnnotationException::optimizerPlusSaveComments(); - } - - if (extension_loaded('Zend OPcache') && ini_get('opcache.save_comments') === 0) { - throw AnnotationException::optimizerPlusSaveComments(); - } - - // Make sure that the IgnoreAnnotation annotation is loaded - class_exists(IgnoreAnnotation::class); - - $this->parser = $parser ?: new DocParser(); - - $this->preParser = new DocParser(); - - $this->preParser->setImports(self::$globalImports); - $this->preParser->setIgnoreNotImportedAnnotations(true); - $this->preParser->setIgnoredAnnotationNames(self::$globalIgnoredNames); - - $this->phpParser = new PhpParser(); - } - - /** - * {@inheritDoc} - */ - public function getClassAnnotations(ReflectionClass $class) - { - $this->parser->setTarget(Target::TARGET_CLASS); - $this->parser->setImports($this->getImports($class)); - $this->parser->setIgnoredAnnotationNames($this->getIgnoredAnnotationNames($class)); - $this->parser->setIgnoredAnnotationNamespaces(self::$globalIgnoredNamespaces); - - return $this->parser->parse($class->getDocComment(), 'class ' . $class->getName()); - } - - /** - * {@inheritDoc} - */ - public function getClassAnnotation(ReflectionClass $class, $annotationName) - { - $annotations = $this->getClassAnnotations($class); - - foreach ($annotations as $annotation) { - if ($annotation instanceof $annotationName) { - return $annotation; - } - } - - return null; - } - - /** - * {@inheritDoc} - */ - public function getPropertyAnnotations(ReflectionProperty $property) - { - $class = $property->getDeclaringClass(); - $context = 'property ' . $class->getName() . '::$' . $property->getName(); - - $this->parser->setTarget(Target::TARGET_PROPERTY); - $this->parser->setImports($this->getPropertyImports($property)); - $this->parser->setIgnoredAnnotationNames($this->getIgnoredAnnotationNames($class)); - $this->parser->setIgnoredAnnotationNamespaces(self::$globalIgnoredNamespaces); - - return $this->parser->parse($property->getDocComment(), $context); - } - - /** - * {@inheritDoc} - */ - public function getPropertyAnnotation(ReflectionProperty $property, $annotationName) - { - $annotations = $this->getPropertyAnnotations($property); - - foreach ($annotations as $annotation) { - if ($annotation instanceof $annotationName) { - return $annotation; - } - } - - return null; - } - - /** - * {@inheritDoc} - */ - public function getMethodAnnotations(ReflectionMethod $method) - { - $class = $method->getDeclaringClass(); - $context = 'method ' . $class->getName() . '::' . $method->getName() . '()'; - - $this->parser->setTarget(Target::TARGET_METHOD); - $this->parser->setImports($this->getMethodImports($method)); - $this->parser->setIgnoredAnnotationNames($this->getIgnoredAnnotationNames($class)); - $this->parser->setIgnoredAnnotationNamespaces(self::$globalIgnoredNamespaces); - - return $this->parser->parse($method->getDocComment(), $context); - } - - /** - * {@inheritDoc} - */ - public function getMethodAnnotation(ReflectionMethod $method, $annotationName) - { - $annotations = $this->getMethodAnnotations($method); - - foreach ($annotations as $annotation) { - if ($annotation instanceof $annotationName) { - return $annotation; - } - } - - return null; - } - - /** - * Gets the annotations applied to a function. - * - * @phpstan-return list An array of Annotations. - */ - public function getFunctionAnnotations(ReflectionFunction $function): array - { - $context = 'function ' . $function->getName(); - - $this->parser->setTarget(Target::TARGET_FUNCTION); - $this->parser->setImports($this->getImports($function)); - $this->parser->setIgnoredAnnotationNames($this->getIgnoredAnnotationNames($function)); - $this->parser->setIgnoredAnnotationNamespaces(self::$globalIgnoredNamespaces); - - return $this->parser->parse($function->getDocComment(), $context); - } - - /** - * Gets a function annotation. - * - * @return object|null The Annotation or NULL, if the requested annotation does not exist. - */ - public function getFunctionAnnotation(ReflectionFunction $function, string $annotationName) - { - $annotations = $this->getFunctionAnnotations($function); - - foreach ($annotations as $annotation) { - if ($annotation instanceof $annotationName) { - return $annotation; - } - } - - return null; - } - - /** - * Returns the ignored annotations for the given class or function. - * - * @param ReflectionClass|ReflectionFunction $reflection - * - * @return array - */ - private function getIgnoredAnnotationNames($reflection): array - { - $type = $reflection instanceof ReflectionClass ? 'class' : 'function'; - $name = $reflection->getName(); - - if (isset($this->ignoredAnnotationNames[$type][$name])) { - return $this->ignoredAnnotationNames[$type][$name]; - } - - $this->collectParsingMetadata($reflection); - - return $this->ignoredAnnotationNames[$type][$name]; - } - - /** - * Retrieves imports for a class or a function. - * - * @param ReflectionClass|ReflectionFunction $reflection - * - * @return array - */ - private function getImports($reflection): array - { - $type = $reflection instanceof ReflectionClass ? 'class' : 'function'; - $name = $reflection->getName(); - - if (isset($this->imports[$type][$name])) { - return $this->imports[$type][$name]; - } - - $this->collectParsingMetadata($reflection); - - return $this->imports[$type][$name]; - } - - /** - * Retrieves imports for methods. - * - * @return array - */ - private function getMethodImports(ReflectionMethod $method) - { - $class = $method->getDeclaringClass(); - $classImports = $this->getImports($class); - - $traitImports = []; - - foreach ($class->getTraits() as $trait) { - if ( - ! $trait->hasMethod($method->getName()) - || $trait->getFileName() !== $method->getFileName() - ) { - continue; - } - - $traitImports = array_merge($traitImports, $this->phpParser->parseUseStatements($trait)); - } - - return array_merge($classImports, $traitImports); - } - - /** - * Retrieves imports for properties. - * - * @return array - */ - private function getPropertyImports(ReflectionProperty $property) - { - $class = $property->getDeclaringClass(); - $classImports = $this->getImports($class); - - $traitImports = []; - - foreach ($class->getTraits() as $trait) { - if (! $trait->hasProperty($property->getName())) { - continue; - } - - $traitImports = array_merge($traitImports, $this->phpParser->parseUseStatements($trait)); - } - - return array_merge($classImports, $traitImports); - } - - /** - * Collects parsing metadata for a given class or function. - * - * @param ReflectionClass|ReflectionFunction $reflection - */ - private function collectParsingMetadata($reflection): void - { - $type = $reflection instanceof ReflectionClass ? 'class' : 'function'; - $name = $reflection->getName(); - - $ignoredAnnotationNames = self::$globalIgnoredNames; - $annotations = $this->preParser->parse($reflection->getDocComment(), $type . ' ' . $name); - - foreach ($annotations as $annotation) { - if (! ($annotation instanceof IgnoreAnnotation)) { - continue; - } - - foreach ($annotation->names as $annot) { - $ignoredAnnotationNames[$annot] = true; - } - } - - $this->imports[$type][$name] = array_merge( - self::$globalImports, - $this->phpParser->parseUseStatements($reflection), - [ - '__NAMESPACE__' => $reflection->getNamespaceName(), - 'self' => $name, - ] - ); - - $this->ignoredAnnotationNames[$type][$name] = $ignoredAnnotationNames; - } -} diff --git a/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationRegistry.php b/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationRegistry.php deleted file mode 100644 index 259d497..0000000 --- a/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationRegistry.php +++ /dev/null @@ -1,190 +0,0 @@ -|null $dirs - */ - public static function registerAutoloadNamespace(string $namespace, $dirs = null): void - { - self::$autoloadNamespaces[$namespace] = $dirs; - } - - /** - * Registers multiple namespaces. - * - * Loading of this namespaces will be done with a PSR-0 namespace loading algorithm. - * - * @deprecated This method is deprecated and will be removed in - * doctrine/annotations 2.0. Annotations will be autoloaded in 2.0. - * - * @param string[][]|string[]|null[] $namespaces indexed by namespace name - */ - public static function registerAutoloadNamespaces(array $namespaces): void - { - self::$autoloadNamespaces = array_merge(self::$autoloadNamespaces, $namespaces); - } - - /** - * Registers an autoloading callable for annotations, much like spl_autoload_register(). - * - * NOTE: These class loaders HAVE to be silent when a class was not found! - * IMPORTANT: Loaders have to return true if they loaded a class that could contain the searched annotation class. - * - * @deprecated This method is deprecated and will be removed in - * doctrine/annotations 2.0. Annotations will be autoloaded in 2.0. - */ - public static function registerLoader(callable $callable): void - { - // Reset our static cache now that we have a new loader to work with - self::$failedToAutoload = []; - self::$loaders[] = $callable; - } - - /** - * Registers an autoloading callable for annotations, if it is not already registered - * - * @deprecated This method is deprecated and will be removed in - * doctrine/annotations 2.0. Annotations will be autoloaded in 2.0. - */ - public static function registerUniqueLoader(callable $callable): void - { - if (in_array($callable, self::$loaders, true)) { - return; - } - - self::registerLoader($callable); - } - - /** - * Autoloads an annotation class silently. - */ - public static function loadAnnotationClass(string $class): bool - { - if (class_exists($class, false)) { - return true; - } - - if (array_key_exists($class, self::$failedToAutoload)) { - return false; - } - - foreach (self::$autoloadNamespaces as $namespace => $dirs) { - if (strpos($class, $namespace) !== 0) { - continue; - } - - $file = str_replace('\\', DIRECTORY_SEPARATOR, $class) . '.php'; - - if ($dirs === null) { - $path = stream_resolve_include_path($file); - if ($path) { - require $path; - - return true; - } - } else { - foreach ((array) $dirs as $dir) { - if (is_file($dir . DIRECTORY_SEPARATOR . $file)) { - require $dir . DIRECTORY_SEPARATOR . $file; - - return true; - } - } - } - } - - foreach (self::$loaders as $loader) { - if ($loader($class) === true) { - return true; - } - } - - if ( - self::$loaders === [] && - self::$autoloadNamespaces === [] && - self::$registerFileUsed === false && - class_exists($class) - ) { - return true; - } - - self::$failedToAutoload[$class] = null; - - return false; - } -} diff --git a/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/CachedReader.php b/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/CachedReader.php deleted file mode 100644 index c036b2d..0000000 --- a/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/CachedReader.php +++ /dev/null @@ -1,268 +0,0 @@ -> */ - private $loadedAnnotations = []; - - /** @var int[] */ - private $loadedFilemtimes = []; - - /** - * @param bool $debug - */ - public function __construct(Reader $reader, Cache $cache, $debug = false) - { - $this->delegate = $reader; - $this->cache = $cache; - $this->debug = (bool) $debug; - } - - /** - * {@inheritDoc} - */ - public function getClassAnnotations(ReflectionClass $class) - { - $cacheKey = $class->getName(); - - if (isset($this->loadedAnnotations[$cacheKey])) { - return $this->loadedAnnotations[$cacheKey]; - } - - $annots = $this->fetchFromCache($cacheKey, $class); - if ($annots === false) { - $annots = $this->delegate->getClassAnnotations($class); - $this->saveToCache($cacheKey, $annots); - } - - return $this->loadedAnnotations[$cacheKey] = $annots; - } - - /** - * {@inheritDoc} - */ - public function getClassAnnotation(ReflectionClass $class, $annotationName) - { - foreach ($this->getClassAnnotations($class) as $annot) { - if ($annot instanceof $annotationName) { - return $annot; - } - } - - return null; - } - - /** - * {@inheritDoc} - */ - public function getPropertyAnnotations(ReflectionProperty $property) - { - $class = $property->getDeclaringClass(); - $cacheKey = $class->getName() . '$' . $property->getName(); - - if (isset($this->loadedAnnotations[$cacheKey])) { - return $this->loadedAnnotations[$cacheKey]; - } - - $annots = $this->fetchFromCache($cacheKey, $class); - if ($annots === false) { - $annots = $this->delegate->getPropertyAnnotations($property); - $this->saveToCache($cacheKey, $annots); - } - - return $this->loadedAnnotations[$cacheKey] = $annots; - } - - /** - * {@inheritDoc} - */ - public function getPropertyAnnotation(ReflectionProperty $property, $annotationName) - { - foreach ($this->getPropertyAnnotations($property) as $annot) { - if ($annot instanceof $annotationName) { - return $annot; - } - } - - return null; - } - - /** - * {@inheritDoc} - */ - public function getMethodAnnotations(ReflectionMethod $method) - { - $class = $method->getDeclaringClass(); - $cacheKey = $class->getName() . '#' . $method->getName(); - - if (isset($this->loadedAnnotations[$cacheKey])) { - return $this->loadedAnnotations[$cacheKey]; - } - - $annots = $this->fetchFromCache($cacheKey, $class); - if ($annots === false) { - $annots = $this->delegate->getMethodAnnotations($method); - $this->saveToCache($cacheKey, $annots); - } - - return $this->loadedAnnotations[$cacheKey] = $annots; - } - - /** - * {@inheritDoc} - */ - public function getMethodAnnotation(ReflectionMethod $method, $annotationName) - { - foreach ($this->getMethodAnnotations($method) as $annot) { - if ($annot instanceof $annotationName) { - return $annot; - } - } - - return null; - } - - /** - * Clears loaded annotations. - * - * @return void - */ - public function clearLoadedAnnotations() - { - $this->loadedAnnotations = []; - $this->loadedFilemtimes = []; - } - - /** - * Fetches a value from the cache. - * - * @param string $cacheKey The cache key. - * - * @return mixed The cached value or false when the value is not in cache. - */ - private function fetchFromCache($cacheKey, ReflectionClass $class) - { - $data = $this->cache->fetch($cacheKey); - if ($data !== false) { - if (! $this->debug || $this->isCacheFresh($cacheKey, $class)) { - return $data; - } - } - - return false; - } - - /** - * Saves a value to the cache. - * - * @param string $cacheKey The cache key. - * @param mixed $value The value. - * - * @return void - */ - private function saveToCache($cacheKey, $value) - { - $this->cache->save($cacheKey, $value); - if (! $this->debug) { - return; - } - - $this->cache->save('[C]' . $cacheKey, time()); - } - - /** - * Checks if the cache is fresh. - * - * @param string $cacheKey - * - * @return bool - */ - private function isCacheFresh($cacheKey, ReflectionClass $class) - { - $lastModification = $this->getLastModification($class); - if ($lastModification === 0) { - return true; - } - - return $this->cache->fetch('[C]' . $cacheKey) >= $lastModification; - } - - /** - * Returns the time the class was last modified, testing traits and parents - */ - private function getLastModification(ReflectionClass $class): int - { - $filename = $class->getFileName(); - - if (isset($this->loadedFilemtimes[$filename])) { - return $this->loadedFilemtimes[$filename]; - } - - $parent = $class->getParentClass(); - - $lastModification = max(array_merge( - [$filename ? filemtime($filename) : 0], - array_map(function (ReflectionClass $reflectionTrait): int { - return $this->getTraitLastModificationTime($reflectionTrait); - }, $class->getTraits()), - array_map(function (ReflectionClass $class): int { - return $this->getLastModification($class); - }, $class->getInterfaces()), - $parent ? [$this->getLastModification($parent)] : [] - )); - - assert($lastModification !== false); - - return $this->loadedFilemtimes[$filename] = $lastModification; - } - - private function getTraitLastModificationTime(ReflectionClass $reflectionTrait): int - { - $fileName = $reflectionTrait->getFileName(); - - if (isset($this->loadedFilemtimes[$fileName])) { - return $this->loadedFilemtimes[$fileName]; - } - - $lastModificationTime = max(array_merge( - [$fileName ? filemtime($fileName) : 0], - array_map(function (ReflectionClass $reflectionTrait): int { - return $this->getTraitLastModificationTime($reflectionTrait); - }, $reflectionTrait->getTraits()) - )); - - assert($lastModificationTime !== false); - - return $this->loadedFilemtimes[$fileName] = $lastModificationTime; - } -} diff --git a/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/DocLexer.php b/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/DocLexer.php deleted file mode 100644 index f6567c5..0000000 --- a/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/DocLexer.php +++ /dev/null @@ -1,129 +0,0 @@ -= 100 - public const T_IDENTIFIER = 100; - public const T_AT = 101; - public const T_CLOSE_CURLY_BRACES = 102; - public const T_CLOSE_PARENTHESIS = 103; - public const T_COMMA = 104; - public const T_EQUALS = 105; - public const T_FALSE = 106; - public const T_NAMESPACE_SEPARATOR = 107; - public const T_OPEN_CURLY_BRACES = 108; - public const T_OPEN_PARENTHESIS = 109; - public const T_TRUE = 110; - public const T_NULL = 111; - public const T_COLON = 112; - public const T_MINUS = 113; - - /** @var array */ - protected $noCase = [ - '@' => self::T_AT, - ',' => self::T_COMMA, - '(' => self::T_OPEN_PARENTHESIS, - ')' => self::T_CLOSE_PARENTHESIS, - '{' => self::T_OPEN_CURLY_BRACES, - '}' => self::T_CLOSE_CURLY_BRACES, - '=' => self::T_EQUALS, - ':' => self::T_COLON, - '-' => self::T_MINUS, - '\\' => self::T_NAMESPACE_SEPARATOR, - ]; - - /** @var array */ - protected $withCase = [ - 'true' => self::T_TRUE, - 'false' => self::T_FALSE, - 'null' => self::T_NULL, - ]; - - /** - * Whether the next token starts immediately, or if there were - * non-captured symbols before that - */ - public function nextTokenIsAdjacent(): bool - { - return $this->token === null - || ($this->lookahead !== null - && ($this->lookahead['position'] - $this->token['position']) === strlen($this->token['value'])); - } - - /** - * {@inheritdoc} - */ - protected function getCatchablePatterns() - { - return [ - '[a-z_\\\][a-z0-9_\:\\\]*[a-z_][a-z0-9_]*', - '(?:[+-]?[0-9]+(?:[\.][0-9]+)*)(?:[eE][+-]?[0-9]+)?', - '"(?:""|[^"])*+"', - ]; - } - - /** - * {@inheritdoc} - */ - protected function getNonCatchablePatterns() - { - return ['\s+', '\*+', '(.)']; - } - - /** - * {@inheritdoc} - */ - protected function getType(&$value) - { - $type = self::T_NONE; - - if ($value[0] === '"') { - $value = str_replace('""', '"', substr($value, 1, strlen($value) - 2)); - - return self::T_STRING; - } - - if (isset($this->noCase[$value])) { - return $this->noCase[$value]; - } - - if ($value[0] === '_' || $value[0] === '\\' || ctype_alpha($value[0])) { - return self::T_IDENTIFIER; - } - - $lowerValue = strtolower($value); - - if (isset($this->withCase[$lowerValue])) { - return $this->withCase[$lowerValue]; - } - - // Checking numeric value - if (is_numeric($value)) { - return strpos($value, '.') !== false || stripos($value, 'e') !== false - ? self::T_FLOAT : self::T_INTEGER; - } - - return $type; - } -} diff --git a/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/DocParser.php b/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/DocParser.php deleted file mode 100644 index ae530c5..0000000 --- a/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/DocParser.php +++ /dev/null @@ -1,1459 +0,0 @@ - - */ - private static $classIdentifiers = [ - DocLexer::T_IDENTIFIER, - DocLexer::T_TRUE, - DocLexer::T_FALSE, - DocLexer::T_NULL, - ]; - - /** - * The lexer. - * - * @var DocLexer - */ - private $lexer; - - /** - * Current target context. - * - * @var int - */ - private $target; - - /** - * Doc parser used to collect annotation target. - * - * @var DocParser - */ - private static $metadataParser; - - /** - * Flag to control if the current annotation is nested or not. - * - * @var bool - */ - private $isNestedAnnotation = false; - - /** - * Hashmap containing all use-statements that are to be used when parsing - * the given doc block. - * - * @var array - */ - private $imports = []; - - /** - * This hashmap is used internally to cache results of class_exists() - * look-ups. - * - * @var array - */ - private $classExists = []; - - /** - * Whether annotations that have not been imported should be ignored. - * - * @var bool - */ - private $ignoreNotImportedAnnotations = false; - - /** - * An array of default namespaces if operating in simple mode. - * - * @var string[] - */ - private $namespaces = []; - - /** - * A list with annotations that are not causing exceptions when not resolved to an annotation class. - * - * The names must be the raw names as used in the class, not the fully qualified - * - * @var bool[] indexed by annotation name - */ - private $ignoredAnnotationNames = []; - - /** - * A list with annotations in namespaced format - * that are not causing exceptions when not resolved to an annotation class. - * - * @var bool[] indexed by namespace name - */ - private $ignoredAnnotationNamespaces = []; - - /** @var string */ - private $context = ''; - - /** - * Hash-map for caching annotation metadata. - * - * @var array - */ - private static $annotationMetadata = [ - Annotation\Target::class => [ - 'is_annotation' => true, - 'has_constructor' => true, - 'has_named_argument_constructor' => false, - 'properties' => [], - 'targets_literal' => 'ANNOTATION_CLASS', - 'targets' => Target::TARGET_CLASS, - 'default_property' => 'value', - 'attribute_types' => [ - 'value' => [ - 'required' => false, - 'type' => 'array', - 'array_type' => 'string', - 'value' => 'array', - ], - ], - ], - Annotation\Attribute::class => [ - 'is_annotation' => true, - 'has_constructor' => false, - 'has_named_argument_constructor' => false, - 'targets_literal' => 'ANNOTATION_ANNOTATION', - 'targets' => Target::TARGET_ANNOTATION, - 'default_property' => 'name', - 'properties' => [ - 'name' => 'name', - 'type' => 'type', - 'required' => 'required', - ], - 'attribute_types' => [ - 'value' => [ - 'required' => true, - 'type' => 'string', - 'value' => 'string', - ], - 'type' => [ - 'required' => true, - 'type' => 'string', - 'value' => 'string', - ], - 'required' => [ - 'required' => false, - 'type' => 'boolean', - 'value' => 'boolean', - ], - ], - ], - Annotation\Attributes::class => [ - 'is_annotation' => true, - 'has_constructor' => false, - 'has_named_argument_constructor' => false, - 'targets_literal' => 'ANNOTATION_CLASS', - 'targets' => Target::TARGET_CLASS, - 'default_property' => 'value', - 'properties' => ['value' => 'value'], - 'attribute_types' => [ - 'value' => [ - 'type' => 'array', - 'required' => true, - 'array_type' => Annotation\Attribute::class, - 'value' => 'array<' . Annotation\Attribute::class . '>', - ], - ], - ], - Annotation\Enum::class => [ - 'is_annotation' => true, - 'has_constructor' => true, - 'has_named_argument_constructor' => false, - 'targets_literal' => 'ANNOTATION_PROPERTY', - 'targets' => Target::TARGET_PROPERTY, - 'default_property' => 'value', - 'properties' => ['value' => 'value'], - 'attribute_types' => [ - 'value' => [ - 'type' => 'array', - 'required' => true, - ], - 'literal' => [ - 'type' => 'array', - 'required' => false, - ], - ], - ], - Annotation\NamedArgumentConstructor::class => [ - 'is_annotation' => true, - 'has_constructor' => false, - 'has_named_argument_constructor' => false, - 'targets_literal' => 'ANNOTATION_CLASS', - 'targets' => Target::TARGET_CLASS, - 'default_property' => null, - 'properties' => [], - 'attribute_types' => [], - ], - ]; - - /** - * Hash-map for handle types declaration. - * - * @var array - */ - private static $typeMap = [ - 'float' => 'double', - 'bool' => 'boolean', - // allow uppercase Boolean in honor of George Boole - 'Boolean' => 'boolean', - 'int' => 'integer', - ]; - - /** - * Constructs a new DocParser. - */ - public function __construct() - { - $this->lexer = new DocLexer(); - } - - /** - * Sets the annotation names that are ignored during the parsing process. - * - * The names are supposed to be the raw names as used in the class, not the - * fully qualified class names. - * - * @param bool[] $names indexed by annotation name - * - * @return void - */ - public function setIgnoredAnnotationNames(array $names) - { - $this->ignoredAnnotationNames = $names; - } - - /** - * Sets the annotation namespaces that are ignored during the parsing process. - * - * @param bool[] $ignoredAnnotationNamespaces indexed by annotation namespace name - * - * @return void - */ - public function setIgnoredAnnotationNamespaces($ignoredAnnotationNamespaces) - { - $this->ignoredAnnotationNamespaces = $ignoredAnnotationNamespaces; - } - - /** - * Sets ignore on not-imported annotations. - * - * @param bool $bool - * - * @return void - */ - public function setIgnoreNotImportedAnnotations($bool) - { - $this->ignoreNotImportedAnnotations = (bool) $bool; - } - - /** - * Sets the default namespaces. - * - * @param string $namespace - * - * @return void - * - * @throws RuntimeException - */ - public function addNamespace($namespace) - { - if ($this->imports) { - throw new RuntimeException('You must either use addNamespace(), or setImports(), but not both.'); - } - - $this->namespaces[] = $namespace; - } - - /** - * Sets the imports. - * - * @param array $imports - * - * @return void - * - * @throws RuntimeException - */ - public function setImports(array $imports) - { - if ($this->namespaces) { - throw new RuntimeException('You must either use addNamespace(), or setImports(), but not both.'); - } - - $this->imports = $imports; - } - - /** - * Sets current target context as bitmask. - * - * @param int $target - * - * @return void - */ - public function setTarget($target) - { - $this->target = $target; - } - - /** - * Parses the given docblock string for annotations. - * - * @param string $input The docblock string to parse. - * @param string $context The parsing context. - * - * @throws AnnotationException - * @throws ReflectionException - * - * @phpstan-return list Array of annotations. If no annotations are found, an empty array is returned. - */ - public function parse($input, $context = '') - { - $pos = $this->findInitialTokenPosition($input); - if ($pos === null) { - return []; - } - - $this->context = $context; - - $this->lexer->setInput(trim(substr($input, $pos), '* /')); - $this->lexer->moveNext(); - - return $this->Annotations(); - } - - /** - * Finds the first valid annotation - * - * @param string $input The docblock string to parse - */ - private function findInitialTokenPosition($input): ?int - { - $pos = 0; - - // search for first valid annotation - while (($pos = strpos($input, '@', $pos)) !== false) { - $preceding = substr($input, $pos - 1, 1); - - // if the @ is preceded by a space, a tab or * it is valid - if ($pos === 0 || $preceding === ' ' || $preceding === '*' || $preceding === "\t") { - return $pos; - } - - $pos++; - } - - return null; - } - - /** - * Attempts to match the given token with the current lookahead token. - * If they match, updates the lookahead token; otherwise raises a syntax error. - * - * @param int $token Type of token. - * - * @return bool True if tokens match; false otherwise. - * - * @throws AnnotationException - */ - private function match(int $token): bool - { - if (! $this->lexer->isNextToken($token)) { - throw $this->syntaxError($this->lexer->getLiteral($token)); - } - - return $this->lexer->moveNext(); - } - - /** - * Attempts to match the current lookahead token with any of the given tokens. - * - * If any of them matches, this method updates the lookahead token; otherwise - * a syntax error is raised. - * - * @throws AnnotationException - * - * @phpstan-param list $tokens - */ - private function matchAny(array $tokens): bool - { - if (! $this->lexer->isNextTokenAny($tokens)) { - throw $this->syntaxError(implode(' or ', array_map([$this->lexer, 'getLiteral'], $tokens))); - } - - return $this->lexer->moveNext(); - } - - /** - * Generates a new syntax error. - * - * @param string $expected Expected string. - * @param mixed[]|null $token Optional token. - */ - private function syntaxError(string $expected, ?array $token = null): AnnotationException - { - if ($token === null) { - $token = $this->lexer->lookahead; - } - - $message = sprintf('Expected %s, got ', $expected); - $message .= $this->lexer->lookahead === null - ? 'end of string' - : sprintf("'%s' at position %s", $token['value'], $token['position']); - - if (strlen($this->context)) { - $message .= ' in ' . $this->context; - } - - $message .= '.'; - - return AnnotationException::syntaxError($message); - } - - /** - * Attempts to check if a class exists or not. This never goes through the PHP autoloading mechanism - * but uses the {@link AnnotationRegistry} to load classes. - * - * @param class-string $fqcn - */ - private function classExists(string $fqcn): bool - { - if (isset($this->classExists[$fqcn])) { - return $this->classExists[$fqcn]; - } - - // first check if the class already exists, maybe loaded through another AnnotationReader - if (class_exists($fqcn, false)) { - return $this->classExists[$fqcn] = true; - } - - // final check, does this class exist? - return $this->classExists[$fqcn] = AnnotationRegistry::loadAnnotationClass($fqcn); - } - - /** - * Collects parsing metadata for a given annotation class - * - * @param class-string $name The annotation name - * - * @throws AnnotationException - * @throws ReflectionException - */ - private function collectAnnotationMetadata(string $name): void - { - if (self::$metadataParser === null) { - self::$metadataParser = new self(); - - self::$metadataParser->setIgnoreNotImportedAnnotations(true); - self::$metadataParser->setIgnoredAnnotationNames($this->ignoredAnnotationNames); - self::$metadataParser->setImports([ - 'enum' => Enum::class, - 'target' => Target::class, - 'attribute' => Attribute::class, - 'attributes' => Attributes::class, - 'namedargumentconstructor' => NamedArgumentConstructor::class, - ]); - - // Make sure that annotations from metadata are loaded - class_exists(Enum::class); - class_exists(Target::class); - class_exists(Attribute::class); - class_exists(Attributes::class); - class_exists(NamedArgumentConstructor::class); - } - - $class = new ReflectionClass($name); - $docComment = $class->getDocComment(); - - // Sets default values for annotation metadata - $constructor = $class->getConstructor(); - $metadata = [ - 'default_property' => null, - 'has_constructor' => $constructor !== null && $constructor->getNumberOfParameters() > 0, - 'constructor_args' => [], - 'properties' => [], - 'property_types' => [], - 'attribute_types' => [], - 'targets_literal' => null, - 'targets' => Target::TARGET_ALL, - 'is_annotation' => strpos($docComment, '@Annotation') !== false, - ]; - - $metadata['has_named_argument_constructor'] = $metadata['has_constructor'] - && $class->implementsInterface(NamedArgumentConstructorAnnotation::class); - - // verify that the class is really meant to be an annotation - if ($metadata['is_annotation']) { - self::$metadataParser->setTarget(Target::TARGET_CLASS); - - foreach (self::$metadataParser->parse($docComment, 'class @' . $name) as $annotation) { - if ($annotation instanceof Target) { - $metadata['targets'] = $annotation->targets; - $metadata['targets_literal'] = $annotation->literal; - - continue; - } - - if ($annotation instanceof NamedArgumentConstructor) { - $metadata['has_named_argument_constructor'] = $metadata['has_constructor']; - if ($metadata['has_named_argument_constructor']) { - // choose the first argument as the default property - $metadata['default_property'] = $constructor->getParameters()[0]->getName(); - } - } - - if (! ($annotation instanceof Attributes)) { - continue; - } - - foreach ($annotation->value as $attribute) { - $this->collectAttributeTypeMetadata($metadata, $attribute); - } - } - - // if not has a constructor will inject values into public properties - if ($metadata['has_constructor'] === false) { - // collect all public properties - foreach ($class->getProperties(ReflectionProperty::IS_PUBLIC) as $property) { - $metadata['properties'][$property->name] = $property->name; - - $propertyComment = $property->getDocComment(); - if ($propertyComment === false) { - continue; - } - - $attribute = new Attribute(); - - $attribute->required = (strpos($propertyComment, '@Required') !== false); - $attribute->name = $property->name; - $attribute->type = (strpos($propertyComment, '@var') !== false && - preg_match('/@var\s+([^\s]+)/', $propertyComment, $matches)) - ? $matches[1] - : 'mixed'; - - $this->collectAttributeTypeMetadata($metadata, $attribute); - - // checks if the property has @Enum - if (strpos($propertyComment, '@Enum') === false) { - continue; - } - - $context = 'property ' . $class->name . '::$' . $property->name; - - self::$metadataParser->setTarget(Target::TARGET_PROPERTY); - - foreach (self::$metadataParser->parse($propertyComment, $context) as $annotation) { - if (! $annotation instanceof Enum) { - continue; - } - - $metadata['enum'][$property->name]['value'] = $annotation->value; - $metadata['enum'][$property->name]['literal'] = (! empty($annotation->literal)) - ? $annotation->literal - : $annotation->value; - } - } - - // choose the first property as default property - $metadata['default_property'] = reset($metadata['properties']); - } elseif ($metadata['has_named_argument_constructor']) { - foreach ($constructor->getParameters() as $parameter) { - $metadata['constructor_args'][$parameter->getName()] = [ - 'position' => $parameter->getPosition(), - 'default' => $parameter->isOptional() ? $parameter->getDefaultValue() : null, - ]; - } - } - } - - self::$annotationMetadata[$name] = $metadata; - } - - /** - * Collects parsing metadata for a given attribute. - * - * @param mixed[] $metadata - */ - private function collectAttributeTypeMetadata(array &$metadata, Attribute $attribute): void - { - // handle internal type declaration - $type = self::$typeMap[$attribute->type] ?? $attribute->type; - - // handle the case if the property type is mixed - if ($type === 'mixed') { - return; - } - - // Evaluate type - $pos = strpos($type, '<'); - if ($pos !== false) { - // Checks if the property has array - $arrayType = substr($type, $pos + 1, -1); - $type = 'array'; - - if (isset(self::$typeMap[$arrayType])) { - $arrayType = self::$typeMap[$arrayType]; - } - - $metadata['attribute_types'][$attribute->name]['array_type'] = $arrayType; - } else { - // Checks if the property has type[] - $pos = strrpos($type, '['); - if ($pos !== false) { - $arrayType = substr($type, 0, $pos); - $type = 'array'; - - if (isset(self::$typeMap[$arrayType])) { - $arrayType = self::$typeMap[$arrayType]; - } - - $metadata['attribute_types'][$attribute->name]['array_type'] = $arrayType; - } - } - - $metadata['attribute_types'][$attribute->name]['type'] = $type; - $metadata['attribute_types'][$attribute->name]['value'] = $attribute->type; - $metadata['attribute_types'][$attribute->name]['required'] = $attribute->required; - } - - /** - * Annotations ::= Annotation {[ "*" ]* [Annotation]}* - * - * @throws AnnotationException - * @throws ReflectionException - * - * @phpstan-return list - */ - private function Annotations(): array - { - $annotations = []; - - while ($this->lexer->lookahead !== null) { - if ($this->lexer->lookahead['type'] !== DocLexer::T_AT) { - $this->lexer->moveNext(); - continue; - } - - // make sure the @ is preceded by non-catchable pattern - if ( - $this->lexer->token !== null && - $this->lexer->lookahead['position'] === $this->lexer->token['position'] + strlen( - $this->lexer->token['value'] - ) - ) { - $this->lexer->moveNext(); - continue; - } - - // make sure the @ is followed by either a namespace separator, or - // an identifier token - $peek = $this->lexer->glimpse(); - if ( - ($peek === null) - || ($peek['type'] !== DocLexer::T_NAMESPACE_SEPARATOR && ! in_array( - $peek['type'], - self::$classIdentifiers, - true - )) - || $peek['position'] !== $this->lexer->lookahead['position'] + 1 - ) { - $this->lexer->moveNext(); - continue; - } - - $this->isNestedAnnotation = false; - $annot = $this->Annotation(); - if ($annot === false) { - continue; - } - - $annotations[] = $annot; - } - - return $annotations; - } - - /** - * Annotation ::= "@" AnnotationName MethodCall - * AnnotationName ::= QualifiedName | SimpleName - * QualifiedName ::= NameSpacePart "\" {NameSpacePart "\"}* SimpleName - * NameSpacePart ::= identifier | null | false | true - * SimpleName ::= identifier | null | false | true - * - * @return object|false False if it is not a valid annotation. - * - * @throws AnnotationException - * @throws ReflectionException - */ - private function Annotation() - { - $this->match(DocLexer::T_AT); - - // check if we have an annotation - $name = $this->Identifier(); - - if ( - $this->lexer->isNextToken(DocLexer::T_MINUS) - && $this->lexer->nextTokenIsAdjacent() - ) { - // Annotations with dashes, such as "@foo-" or "@foo-bar", are to be discarded - return false; - } - - // only process names which are not fully qualified, yet - // fully qualified names must start with a \ - $originalName = $name; - - if ($name[0] !== '\\') { - $pos = strpos($name, '\\'); - $alias = ($pos === false) ? $name : substr($name, 0, $pos); - $found = false; - $loweredAlias = strtolower($alias); - - if ($this->namespaces) { - foreach ($this->namespaces as $namespace) { - if ($this->classExists($namespace . '\\' . $name)) { - $name = $namespace . '\\' . $name; - $found = true; - break; - } - } - } elseif (isset($this->imports[$loweredAlias])) { - $namespace = ltrim($this->imports[$loweredAlias], '\\'); - $name = ($pos !== false) - ? $namespace . substr($name, $pos) - : $namespace; - $found = $this->classExists($name); - } elseif ( - ! isset($this->ignoredAnnotationNames[$name]) - && isset($this->imports['__NAMESPACE__']) - && $this->classExists($this->imports['__NAMESPACE__'] . '\\' . $name) - ) { - $name = $this->imports['__NAMESPACE__'] . '\\' . $name; - $found = true; - } elseif (! isset($this->ignoredAnnotationNames[$name]) && $this->classExists($name)) { - $found = true; - } - - if (! $found) { - if ($this->isIgnoredAnnotation($name)) { - return false; - } - - throw AnnotationException::semanticalError(sprintf( - <<<'EXCEPTION' -The annotation "@%s" in %s was never imported. Did you maybe forget to add a "use" statement for this annotation? -EXCEPTION - , - $name, - $this->context - )); - } - } - - $name = ltrim($name, '\\'); - - if (! $this->classExists($name)) { - throw AnnotationException::semanticalError(sprintf( - 'The annotation "@%s" in %s does not exist, or could not be auto-loaded.', - $name, - $this->context - )); - } - - // at this point, $name contains the fully qualified class name of the - // annotation, and it is also guaranteed that this class exists, and - // that it is loaded - - // collects the metadata annotation only if there is not yet - if (! isset(self::$annotationMetadata[$name])) { - $this->collectAnnotationMetadata($name); - } - - // verify that the class is really meant to be an annotation and not just any ordinary class - if (self::$annotationMetadata[$name]['is_annotation'] === false) { - if ($this->isIgnoredAnnotation($originalName) || $this->isIgnoredAnnotation($name)) { - return false; - } - - throw AnnotationException::semanticalError(sprintf( - <<<'EXCEPTION' -The class "%s" is not annotated with @Annotation. -Are you sure this class can be used as annotation? -If so, then you need to add @Annotation to the _class_ doc comment of "%s". -If it is indeed no annotation, then you need to add @IgnoreAnnotation("%s") to the _class_ doc comment of %s. -EXCEPTION - , - $name, - $name, - $originalName, - $this->context - )); - } - - //if target is nested annotation - $target = $this->isNestedAnnotation ? Target::TARGET_ANNOTATION : $this->target; - - // Next will be nested - $this->isNestedAnnotation = true; - - //if annotation does not support current target - if ((self::$annotationMetadata[$name]['targets'] & $target) === 0 && $target) { - throw AnnotationException::semanticalError( - sprintf( - <<<'EXCEPTION' -Annotation @%s is not allowed to be declared on %s. You may only use this annotation on these code elements: %s. -EXCEPTION - , - $originalName, - $this->context, - self::$annotationMetadata[$name]['targets_literal'] - ) - ); - } - - $arguments = $this->MethodCall(); - $values = $this->resolvePositionalValues($arguments, $name); - - if (isset(self::$annotationMetadata[$name]['enum'])) { - // checks all declared attributes - foreach (self::$annotationMetadata[$name]['enum'] as $property => $enum) { - // checks if the attribute is a valid enumerator - if (isset($values[$property]) && ! in_array($values[$property], $enum['value'])) { - throw AnnotationException::enumeratorError( - $property, - $name, - $this->context, - $enum['literal'], - $values[$property] - ); - } - } - } - - // checks all declared attributes - foreach (self::$annotationMetadata[$name]['attribute_types'] as $property => $type) { - if ( - $property === self::$annotationMetadata[$name]['default_property'] - && ! isset($values[$property]) && isset($values['value']) - ) { - $property = 'value'; - } - - // handle a not given attribute or null value - if (! isset($values[$property])) { - if ($type['required']) { - throw AnnotationException::requiredError( - $property, - $originalName, - $this->context, - 'a(n) ' . $type['value'] - ); - } - - continue; - } - - if ($type['type'] === 'array') { - // handle the case of a single value - if (! is_array($values[$property])) { - $values[$property] = [$values[$property]]; - } - - // checks if the attribute has array type declaration, such as "array" - if (isset($type['array_type'])) { - foreach ($values[$property] as $item) { - if (gettype($item) !== $type['array_type'] && ! $item instanceof $type['array_type']) { - throw AnnotationException::attributeTypeError( - $property, - $originalName, - $this->context, - 'either a(n) ' . $type['array_type'] . ', or an array of ' . $type['array_type'] . 's', - $item - ); - } - } - } - } elseif (gettype($values[$property]) !== $type['type'] && ! $values[$property] instanceof $type['type']) { - throw AnnotationException::attributeTypeError( - $property, - $originalName, - $this->context, - 'a(n) ' . $type['value'], - $values[$property] - ); - } - } - - if (self::$annotationMetadata[$name]['has_named_argument_constructor']) { - if (PHP_VERSION_ID >= 80000) { - return new $name(...$values); - } - - $positionalValues = []; - foreach (self::$annotationMetadata[$name]['constructor_args'] as $property => $parameter) { - $positionalValues[$parameter['position']] = $parameter['default']; - } - - foreach ($values as $property => $value) { - if (! isset(self::$annotationMetadata[$name]['constructor_args'][$property])) { - throw AnnotationException::creationError(sprintf( - <<<'EXCEPTION' -The annotation @%s declared on %s does not have a property named "%s" -that can be set through its named arguments constructor. -Available named arguments: %s -EXCEPTION - , - $originalName, - $this->context, - $property, - implode(', ', array_keys(self::$annotationMetadata[$name]['constructor_args'])) - )); - } - - $positionalValues[self::$annotationMetadata[$name]['constructor_args'][$property]['position']] = $value; - } - - return new $name(...$positionalValues); - } - - // check if the annotation expects values via the constructor, - // or directly injected into public properties - if (self::$annotationMetadata[$name]['has_constructor'] === true) { - return new $name($values); - } - - $instance = new $name(); - - foreach ($values as $property => $value) { - if (! isset(self::$annotationMetadata[$name]['properties'][$property])) { - if ($property !== 'value') { - throw AnnotationException::creationError(sprintf( - <<<'EXCEPTION' -The annotation @%s declared on %s does not have a property named "%s". -Available properties: %s -EXCEPTION - , - $originalName, - $this->context, - $property, - implode(', ', self::$annotationMetadata[$name]['properties']) - )); - } - - // handle the case if the property has no annotations - $property = self::$annotationMetadata[$name]['default_property']; - if (! $property) { - throw AnnotationException::creationError(sprintf( - 'The annotation @%s declared on %s does not accept any values, but got %s.', - $originalName, - $this->context, - json_encode($values) - )); - } - } - - $instance->{$property} = $value; - } - - return $instance; - } - - /** - * MethodCall ::= ["(" [Values] ")"] - * - * @return mixed[] - * - * @throws AnnotationException - * @throws ReflectionException - */ - private function MethodCall(): array - { - $values = []; - - if (! $this->lexer->isNextToken(DocLexer::T_OPEN_PARENTHESIS)) { - return $values; - } - - $this->match(DocLexer::T_OPEN_PARENTHESIS); - - if (! $this->lexer->isNextToken(DocLexer::T_CLOSE_PARENTHESIS)) { - $values = $this->Values(); - } - - $this->match(DocLexer::T_CLOSE_PARENTHESIS); - - return $values; - } - - /** - * Values ::= Array | Value {"," Value}* [","] - * - * @return mixed[] - * - * @throws AnnotationException - * @throws ReflectionException - */ - private function Values(): array - { - $values = [$this->Value()]; - - while ($this->lexer->isNextToken(DocLexer::T_COMMA)) { - $this->match(DocLexer::T_COMMA); - - if ($this->lexer->isNextToken(DocLexer::T_CLOSE_PARENTHESIS)) { - break; - } - - $token = $this->lexer->lookahead; - $value = $this->Value(); - - $values[] = $value; - } - - $namedArguments = []; - $positionalArguments = []; - foreach ($values as $k => $value) { - if (is_object($value) && $value instanceof stdClass) { - $namedArguments[$value->name] = $value->value; - } else { - $positionalArguments[$k] = $value; - } - } - - return ['named_arguments' => $namedArguments, 'positional_arguments' => $positionalArguments]; - } - - /** - * Constant ::= integer | string | float | boolean - * - * @return mixed - * - * @throws AnnotationException - */ - private function Constant() - { - $identifier = $this->Identifier(); - - if (! defined($identifier) && strpos($identifier, '::') !== false && $identifier[0] !== '\\') { - [$className, $const] = explode('::', $identifier); - - $pos = strpos($className, '\\'); - $alias = ($pos === false) ? $className : substr($className, 0, $pos); - $found = false; - $loweredAlias = strtolower($alias); - - switch (true) { - case ! empty($this->namespaces): - foreach ($this->namespaces as $ns) { - if (class_exists($ns . '\\' . $className) || interface_exists($ns . '\\' . $className)) { - $className = $ns . '\\' . $className; - $found = true; - break; - } - } - - break; - - case isset($this->imports[$loweredAlias]): - $found = true; - $className = ($pos !== false) - ? $this->imports[$loweredAlias] . substr($className, $pos) - : $this->imports[$loweredAlias]; - break; - - default: - if (isset($this->imports['__NAMESPACE__'])) { - $ns = $this->imports['__NAMESPACE__']; - - if (class_exists($ns . '\\' . $className) || interface_exists($ns . '\\' . $className)) { - $className = $ns . '\\' . $className; - $found = true; - } - } - - break; - } - - if ($found) { - $identifier = $className . '::' . $const; - } - } - - /** - * Checks if identifier ends with ::class and remove the leading backslash if it exists. - */ - if ( - $this->identifierEndsWithClassConstant($identifier) && - ! $this->identifierStartsWithBackslash($identifier) - ) { - return substr($identifier, 0, $this->getClassConstantPositionInIdentifier($identifier)); - } - - if ($this->identifierEndsWithClassConstant($identifier) && $this->identifierStartsWithBackslash($identifier)) { - return substr($identifier, 1, $this->getClassConstantPositionInIdentifier($identifier) - 1); - } - - if (! defined($identifier)) { - throw AnnotationException::semanticalErrorConstants($identifier, $this->context); - } - - return constant($identifier); - } - - private function identifierStartsWithBackslash(string $identifier): bool - { - return $identifier[0] === '\\'; - } - - private function identifierEndsWithClassConstant(string $identifier): bool - { - return $this->getClassConstantPositionInIdentifier($identifier) === strlen($identifier) - strlen('::class'); - } - - /** - * @return int|false - */ - private function getClassConstantPositionInIdentifier(string $identifier) - { - return stripos($identifier, '::class'); - } - - /** - * Identifier ::= string - * - * @throws AnnotationException - */ - private function Identifier(): string - { - // check if we have an annotation - if (! $this->lexer->isNextTokenAny(self::$classIdentifiers)) { - throw $this->syntaxError('namespace separator or identifier'); - } - - $this->lexer->moveNext(); - - $className = $this->lexer->token['value']; - - while ( - $this->lexer->lookahead !== null && - $this->lexer->lookahead['position'] === ($this->lexer->token['position'] + - strlen($this->lexer->token['value'])) && - $this->lexer->isNextToken(DocLexer::T_NAMESPACE_SEPARATOR) - ) { - $this->match(DocLexer::T_NAMESPACE_SEPARATOR); - $this->matchAny(self::$classIdentifiers); - - $className .= '\\' . $this->lexer->token['value']; - } - - return $className; - } - - /** - * Value ::= PlainValue | FieldAssignment - * - * @return mixed - * - * @throws AnnotationException - * @throws ReflectionException - */ - private function Value() - { - $peek = $this->lexer->glimpse(); - - if ($peek['type'] === DocLexer::T_EQUALS) { - return $this->FieldAssignment(); - } - - return $this->PlainValue(); - } - - /** - * PlainValue ::= integer | string | float | boolean | Array | Annotation - * - * @return mixed - * - * @throws AnnotationException - * @throws ReflectionException - */ - private function PlainValue() - { - if ($this->lexer->isNextToken(DocLexer::T_OPEN_CURLY_BRACES)) { - return $this->Arrayx(); - } - - if ($this->lexer->isNextToken(DocLexer::T_AT)) { - return $this->Annotation(); - } - - if ($this->lexer->isNextToken(DocLexer::T_IDENTIFIER)) { - return $this->Constant(); - } - - switch ($this->lexer->lookahead['type']) { - case DocLexer::T_STRING: - $this->match(DocLexer::T_STRING); - - return $this->lexer->token['value']; - - case DocLexer::T_INTEGER: - $this->match(DocLexer::T_INTEGER); - - return (int) $this->lexer->token['value']; - - case DocLexer::T_FLOAT: - $this->match(DocLexer::T_FLOAT); - - return (float) $this->lexer->token['value']; - - case DocLexer::T_TRUE: - $this->match(DocLexer::T_TRUE); - - return true; - - case DocLexer::T_FALSE: - $this->match(DocLexer::T_FALSE); - - return false; - - case DocLexer::T_NULL: - $this->match(DocLexer::T_NULL); - - return null; - - default: - throw $this->syntaxError('PlainValue'); - } - } - - /** - * FieldAssignment ::= FieldName "=" PlainValue - * FieldName ::= identifier - * - * @throws AnnotationException - * @throws ReflectionException - */ - private function FieldAssignment(): stdClass - { - $this->match(DocLexer::T_IDENTIFIER); - $fieldName = $this->lexer->token['value']; - - $this->match(DocLexer::T_EQUALS); - - $item = new stdClass(); - $item->name = $fieldName; - $item->value = $this->PlainValue(); - - return $item; - } - - /** - * Array ::= "{" ArrayEntry {"," ArrayEntry}* [","] "}" - * - * @return mixed[] - * - * @throws AnnotationException - * @throws ReflectionException - */ - private function Arrayx(): array - { - $array = $values = []; - - $this->match(DocLexer::T_OPEN_CURLY_BRACES); - - // If the array is empty, stop parsing and return. - if ($this->lexer->isNextToken(DocLexer::T_CLOSE_CURLY_BRACES)) { - $this->match(DocLexer::T_CLOSE_CURLY_BRACES); - - return $array; - } - - $values[] = $this->ArrayEntry(); - - while ($this->lexer->isNextToken(DocLexer::T_COMMA)) { - $this->match(DocLexer::T_COMMA); - - // optional trailing comma - if ($this->lexer->isNextToken(DocLexer::T_CLOSE_CURLY_BRACES)) { - break; - } - - $values[] = $this->ArrayEntry(); - } - - $this->match(DocLexer::T_CLOSE_CURLY_BRACES); - - foreach ($values as $value) { - [$key, $val] = $value; - - if ($key !== null) { - $array[$key] = $val; - } else { - $array[] = $val; - } - } - - return $array; - } - - /** - * ArrayEntry ::= Value | KeyValuePair - * KeyValuePair ::= Key ("=" | ":") PlainValue | Constant - * Key ::= string | integer | Constant - * - * @throws AnnotationException - * @throws ReflectionException - * - * @phpstan-return array{mixed, mixed} - */ - private function ArrayEntry(): array - { - $peek = $this->lexer->glimpse(); - - if ( - $peek['type'] === DocLexer::T_EQUALS - || $peek['type'] === DocLexer::T_COLON - ) { - if ($this->lexer->isNextToken(DocLexer::T_IDENTIFIER)) { - $key = $this->Constant(); - } else { - $this->matchAny([DocLexer::T_INTEGER, DocLexer::T_STRING]); - $key = $this->lexer->token['value']; - } - - $this->matchAny([DocLexer::T_EQUALS, DocLexer::T_COLON]); - - return [$key, $this->PlainValue()]; - } - - return [null, $this->Value()]; - } - - /** - * Checks whether the given $name matches any ignored annotation name or namespace - */ - private function isIgnoredAnnotation(string $name): bool - { - if ($this->ignoreNotImportedAnnotations || isset($this->ignoredAnnotationNames[$name])) { - return true; - } - - foreach (array_keys($this->ignoredAnnotationNamespaces) as $ignoredAnnotationNamespace) { - $ignoredAnnotationNamespace = rtrim($ignoredAnnotationNamespace, '\\') . '\\'; - - if (stripos(rtrim($name, '\\') . '\\', $ignoredAnnotationNamespace) === 0) { - return true; - } - } - - return false; - } - - /** - * Resolve positional arguments (without name) to named ones - * - * @param array $arguments - * - * @return array - */ - private function resolvePositionalValues(array $arguments, string $name): array - { - $positionalArguments = $arguments['positional_arguments'] ?? []; - $values = $arguments['named_arguments'] ?? []; - - if ( - self::$annotationMetadata[$name]['has_named_argument_constructor'] - && self::$annotationMetadata[$name]['default_property'] !== null - ) { - // We must ensure that we don't have positional arguments after named ones - $positions = array_keys($positionalArguments); - $lastPosition = null; - foreach ($positions as $position) { - if ( - ($lastPosition === null && $position !== 0) || - ($lastPosition !== null && $position !== $lastPosition + 1) - ) { - throw $this->syntaxError('Positional arguments after named arguments is not allowed'); - } - - $lastPosition = $position; - } - - foreach (self::$annotationMetadata[$name]['constructor_args'] as $property => $parameter) { - $position = $parameter['position']; - if (isset($values[$property]) || ! isset($positionalArguments[$position])) { - continue; - } - - $values[$property] = $positionalArguments[$position]; - } - } else { - if (count($positionalArguments) > 0 && ! isset($values['value'])) { - if (count($positionalArguments) === 1) { - $value = array_pop($positionalArguments); - } else { - $value = array_values($positionalArguments); - } - - $values['value'] = $value; - } - } - - return $values; - } -} diff --git a/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/FileCacheReader.php b/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/FileCacheReader.php deleted file mode 100644 index 6c6c22c..0000000 --- a/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/FileCacheReader.php +++ /dev/null @@ -1,315 +0,0 @@ -> */ - private $loadedAnnotations = []; - - /** @var array */ - private $classNameHashes = []; - - /** @var int */ - private $umask; - - /** - * @param string $cacheDir - * @param bool $debug - * @param int $umask - * - * @throws InvalidArgumentException - */ - public function __construct(Reader $reader, $cacheDir, $debug = false, $umask = 0002) - { - if (! is_int($umask)) { - throw new InvalidArgumentException(sprintf( - 'The parameter umask must be an integer, was: %s', - gettype($umask) - )); - } - - $this->reader = $reader; - $this->umask = $umask; - - if (! is_dir($cacheDir) && ! @mkdir($cacheDir, 0777 & (~$this->umask), true)) { - throw new InvalidArgumentException(sprintf( - 'The directory "%s" does not exist and could not be created.', - $cacheDir - )); - } - - $this->dir = rtrim($cacheDir, '\\/'); - $this->debug = $debug; - } - - /** - * {@inheritDoc} - */ - public function getClassAnnotations(ReflectionClass $class) - { - if (! isset($this->classNameHashes[$class->name])) { - $this->classNameHashes[$class->name] = sha1($class->name); - } - - $key = $this->classNameHashes[$class->name]; - - if (isset($this->loadedAnnotations[$key])) { - return $this->loadedAnnotations[$key]; - } - - $path = $this->dir . '/' . strtr($key, '\\', '-') . '.cache.php'; - if (! is_file($path)) { - $annot = $this->reader->getClassAnnotations($class); - $this->saveCacheFile($path, $annot); - - return $this->loadedAnnotations[$key] = $annot; - } - - $filename = $class->getFilename(); - if ( - $this->debug - && $filename !== false - && filemtime($path) < filemtime($filename) - ) { - @unlink($path); - - $annot = $this->reader->getClassAnnotations($class); - $this->saveCacheFile($path, $annot); - - return $this->loadedAnnotations[$key] = $annot; - } - - return $this->loadedAnnotations[$key] = include $path; - } - - /** - * {@inheritDoc} - */ - public function getPropertyAnnotations(ReflectionProperty $property) - { - $class = $property->getDeclaringClass(); - if (! isset($this->classNameHashes[$class->name])) { - $this->classNameHashes[$class->name] = sha1($class->name); - } - - $key = $this->classNameHashes[$class->name] . '$' . $property->getName(); - - if (isset($this->loadedAnnotations[$key])) { - return $this->loadedAnnotations[$key]; - } - - $path = $this->dir . '/' . strtr($key, '\\', '-') . '.cache.php'; - if (! is_file($path)) { - $annot = $this->reader->getPropertyAnnotations($property); - $this->saveCacheFile($path, $annot); - - return $this->loadedAnnotations[$key] = $annot; - } - - $filename = $class->getFilename(); - if ( - $this->debug - && $filename !== false - && filemtime($path) < filemtime($filename) - ) { - @unlink($path); - - $annot = $this->reader->getPropertyAnnotations($property); - $this->saveCacheFile($path, $annot); - - return $this->loadedAnnotations[$key] = $annot; - } - - return $this->loadedAnnotations[$key] = include $path; - } - - /** - * {@inheritDoc} - */ - public function getMethodAnnotations(ReflectionMethod $method) - { - $class = $method->getDeclaringClass(); - if (! isset($this->classNameHashes[$class->name])) { - $this->classNameHashes[$class->name] = sha1($class->name); - } - - $key = $this->classNameHashes[$class->name] . '#' . $method->getName(); - - if (isset($this->loadedAnnotations[$key])) { - return $this->loadedAnnotations[$key]; - } - - $path = $this->dir . '/' . strtr($key, '\\', '-') . '.cache.php'; - if (! is_file($path)) { - $annot = $this->reader->getMethodAnnotations($method); - $this->saveCacheFile($path, $annot); - - return $this->loadedAnnotations[$key] = $annot; - } - - $filename = $class->getFilename(); - if ( - $this->debug - && $filename !== false - && filemtime($path) < filemtime($filename) - ) { - @unlink($path); - - $annot = $this->reader->getMethodAnnotations($method); - $this->saveCacheFile($path, $annot); - - return $this->loadedAnnotations[$key] = $annot; - } - - return $this->loadedAnnotations[$key] = include $path; - } - - /** - * Saves the cache file. - * - * @param string $path - * @param mixed $data - * - * @return void - */ - private function saveCacheFile($path, $data) - { - if (! is_writable($this->dir)) { - throw new InvalidArgumentException(sprintf( - <<<'EXCEPTION' -The directory "%s" is not writable. Both the webserver and the console user need access. -You can manage access rights for multiple users with "chmod +a". -If your system does not support this, check out the acl package., -EXCEPTION - , - $this->dir - )); - } - - $tempfile = tempnam($this->dir, uniqid('', true)); - - if ($tempfile === false) { - throw new RuntimeException(sprintf('Unable to create tempfile in directory: %s', $this->dir)); - } - - @chmod($tempfile, 0666 & (~$this->umask)); - - $written = file_put_contents( - $tempfile, - 'umask)); - - if (rename($tempfile, $path) === false) { - @unlink($tempfile); - - throw new RuntimeException(sprintf('Unable to rename %s to %s', $tempfile, $path)); - } - } - - /** - * {@inheritDoc} - */ - public function getClassAnnotation(ReflectionClass $class, $annotationName) - { - $annotations = $this->getClassAnnotations($class); - - foreach ($annotations as $annotation) { - if ($annotation instanceof $annotationName) { - return $annotation; - } - } - - return null; - } - - /** - * {@inheritDoc} - */ - public function getMethodAnnotation(ReflectionMethod $method, $annotationName) - { - $annotations = $this->getMethodAnnotations($method); - - foreach ($annotations as $annotation) { - if ($annotation instanceof $annotationName) { - return $annotation; - } - } - - return null; - } - - /** - * {@inheritDoc} - */ - public function getPropertyAnnotation(ReflectionProperty $property, $annotationName) - { - $annotations = $this->getPropertyAnnotations($property); - - foreach ($annotations as $annotation) { - if ($annotation instanceof $annotationName) { - return $annotation; - } - } - - return null; - } - - /** - * Clears loaded annotations. - * - * @return void - */ - public function clearLoadedAnnotations() - { - $this->loadedAnnotations = []; - } -} diff --git a/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/ImplicitlyIgnoredAnnotationNames.php b/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/ImplicitlyIgnoredAnnotationNames.php deleted file mode 100644 index 2efeb1d..0000000 --- a/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/ImplicitlyIgnoredAnnotationNames.php +++ /dev/null @@ -1,177 +0,0 @@ - true, - 'Attribute' => true, - 'Attributes' => true, - /* Can we enable this? 'Enum' => true, */ - 'Required' => true, - 'Target' => true, - 'NamedArgumentConstructor' => true, - ]; - - private const WidelyUsedNonStandard = [ - 'fix' => true, - 'fixme' => true, - 'override' => true, - ]; - - private const PhpDocumentor1 = [ - 'abstract' => true, - 'access' => true, - 'code' => true, - 'deprec' => true, - 'endcode' => true, - 'exception' => true, - 'final' => true, - 'ingroup' => true, - 'inheritdoc' => true, - 'inheritDoc' => true, - 'magic' => true, - 'name' => true, - 'private' => true, - 'static' => true, - 'staticvar' => true, - 'staticVar' => true, - 'toc' => true, - 'tutorial' => true, - 'throw' => true, - ]; - - private const PhpDocumentor2 = [ - 'api' => true, - 'author' => true, - 'category' => true, - 'copyright' => true, - 'deprecated' => true, - 'example' => true, - 'filesource' => true, - 'global' => true, - 'ignore' => true, - /* Can we enable this? 'index' => true, */ - 'internal' => true, - 'license' => true, - 'link' => true, - 'method' => true, - 'package' => true, - 'param' => true, - 'property' => true, - 'property-read' => true, - 'property-write' => true, - 'return' => true, - 'see' => true, - 'since' => true, - 'source' => true, - 'subpackage' => true, - 'throws' => true, - 'todo' => true, - 'TODO' => true, - 'usedby' => true, - 'uses' => true, - 'var' => true, - 'version' => true, - ]; - - private const PHPUnit = [ - 'author' => true, - 'after' => true, - 'afterClass' => true, - 'backupGlobals' => true, - 'backupStaticAttributes' => true, - 'before' => true, - 'beforeClass' => true, - 'codeCoverageIgnore' => true, - 'codeCoverageIgnoreStart' => true, - 'codeCoverageIgnoreEnd' => true, - 'covers' => true, - 'coversDefaultClass' => true, - 'coversNothing' => true, - 'dataProvider' => true, - 'depends' => true, - 'doesNotPerformAssertions' => true, - 'expectedException' => true, - 'expectedExceptionCode' => true, - 'expectedExceptionMessage' => true, - 'expectedExceptionMessageRegExp' => true, - 'group' => true, - 'large' => true, - 'medium' => true, - 'preserveGlobalState' => true, - 'requires' => true, - 'runTestsInSeparateProcesses' => true, - 'runInSeparateProcess' => true, - 'small' => true, - 'test' => true, - 'testdox' => true, - 'testWith' => true, - 'ticket' => true, - 'uses' => true, - ]; - - private const PhpCheckStyle = ['SuppressWarnings' => true]; - - private const PhpStorm = ['noinspection' => true]; - - private const PEAR = ['package_version' => true]; - - private const PlainUML = [ - 'startuml' => true, - 'enduml' => true, - ]; - - private const Symfony = ['experimental' => true]; - - private const PhpCodeSniffer = [ - 'codingStandardsIgnoreStart' => true, - 'codingStandardsIgnoreEnd' => true, - ]; - - private const SlevomatCodingStandard = ['phpcsSuppress' => true]; - - private const Phan = ['suppress' => true]; - - private const Rector = ['noRector' => true]; - - private const StaticAnalysis = [ - // PHPStan, Psalm - 'extends' => true, - 'implements' => true, - 'template' => true, - 'use' => true, - - // Psalm - 'pure' => true, - 'immutable' => true, - ]; - - public const LIST = self::Reserved - + self::WidelyUsedNonStandard - + self::PhpDocumentor1 - + self::PhpDocumentor2 - + self::PHPUnit - + self::PhpCheckStyle - + self::PhpStorm - + self::PEAR - + self::PlainUML - + self::Symfony - + self::SlevomatCodingStandard - + self::PhpCodeSniffer - + self::Phan - + self::Rector - + self::StaticAnalysis; - - private function __construct() - { - } -} diff --git a/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/IndexedReader.php b/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/IndexedReader.php deleted file mode 100644 index 42e7076..0000000 --- a/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/IndexedReader.php +++ /dev/null @@ -1,100 +0,0 @@ -delegate = $reader; - } - - /** - * {@inheritDoc} - */ - public function getClassAnnotations(ReflectionClass $class) - { - $annotations = []; - foreach ($this->delegate->getClassAnnotations($class) as $annot) { - $annotations[get_class($annot)] = $annot; - } - - return $annotations; - } - - /** - * {@inheritDoc} - */ - public function getClassAnnotation(ReflectionClass $class, $annotation) - { - return $this->delegate->getClassAnnotation($class, $annotation); - } - - /** - * {@inheritDoc} - */ - public function getMethodAnnotations(ReflectionMethod $method) - { - $annotations = []; - foreach ($this->delegate->getMethodAnnotations($method) as $annot) { - $annotations[get_class($annot)] = $annot; - } - - return $annotations; - } - - /** - * {@inheritDoc} - */ - public function getMethodAnnotation(ReflectionMethod $method, $annotation) - { - return $this->delegate->getMethodAnnotation($method, $annotation); - } - - /** - * {@inheritDoc} - */ - public function getPropertyAnnotations(ReflectionProperty $property) - { - $annotations = []; - foreach ($this->delegate->getPropertyAnnotations($property) as $annot) { - $annotations[get_class($annot)] = $annot; - } - - return $annotations; - } - - /** - * {@inheritDoc} - */ - public function getPropertyAnnotation(ReflectionProperty $property, $annotation) - { - return $this->delegate->getPropertyAnnotation($property, $annotation); - } - - /** - * Proxies all methods to the delegate. - * - * @param string $method - * @param mixed[] $args - * - * @return mixed - */ - public function __call($method, $args) - { - return call_user_func_array([$this->delegate, $method], $args); - } -} diff --git a/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/NamedArgumentConstructorAnnotation.php b/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/NamedArgumentConstructorAnnotation.php deleted file mode 100644 index 8af224c..0000000 --- a/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/NamedArgumentConstructorAnnotation.php +++ /dev/null @@ -1,14 +0,0 @@ -ReflectionClass object. - * - * @return array A list with use statements in the form (Alias => FQN). - */ - public function parseClass(ReflectionClass $class) - { - return $this->parseUseStatements($class); - } - - /** - * Parse a class or function for use statements. - * - * @param ReflectionClass|ReflectionFunction $reflection - * - * @psalm-return array a list with use statements in the form (Alias => FQN). - */ - public function parseUseStatements($reflection): array - { - if (method_exists($reflection, 'getUseStatements')) { - return $reflection->getUseStatements(); - } - - $filename = $reflection->getFileName(); - - if ($filename === false) { - return []; - } - - $content = $this->getFileContent($filename, $reflection->getStartLine()); - - if ($content === null) { - return []; - } - - $namespace = preg_quote($reflection->getNamespaceName()); - $content = preg_replace('/^.*?(\bnamespace\s+' . $namespace . '\s*[;{].*)$/s', '\\1', $content); - $tokenizer = new TokenParser('parseUseStatements($reflection->getNamespaceName()); - } - - /** - * Gets the content of the file right up to the given line number. - * - * @param string $filename The name of the file to load. - * @param int $lineNumber The number of lines to read from file. - * - * @return string|null The content of the file or null if the file does not exist. - */ - private function getFileContent($filename, $lineNumber) - { - if (! is_file($filename)) { - return null; - } - - $content = ''; - $lineCnt = 0; - $file = new SplFileObject($filename); - while (! $file->eof()) { - if ($lineCnt++ === $lineNumber) { - break; - } - - $content .= $file->fgets(); - } - - return $content; - } -} diff --git a/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/PsrCachedReader.php b/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/PsrCachedReader.php deleted file mode 100644 index a7099d5..0000000 --- a/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/PsrCachedReader.php +++ /dev/null @@ -1,232 +0,0 @@ -> */ - private $loadedAnnotations = []; - - /** @var int[] */ - private $loadedFilemtimes = []; - - public function __construct(Reader $reader, CacheItemPoolInterface $cache, bool $debug = false) - { - $this->delegate = $reader; - $this->cache = $cache; - $this->debug = (bool) $debug; - } - - /** - * {@inheritDoc} - */ - public function getClassAnnotations(ReflectionClass $class) - { - $cacheKey = $class->getName(); - - if (isset($this->loadedAnnotations[$cacheKey])) { - return $this->loadedAnnotations[$cacheKey]; - } - - $annots = $this->fetchFromCache($cacheKey, $class, 'getClassAnnotations', $class); - - return $this->loadedAnnotations[$cacheKey] = $annots; - } - - /** - * {@inheritDoc} - */ - public function getClassAnnotation(ReflectionClass $class, $annotationName) - { - foreach ($this->getClassAnnotations($class) as $annot) { - if ($annot instanceof $annotationName) { - return $annot; - } - } - - return null; - } - - /** - * {@inheritDoc} - */ - public function getPropertyAnnotations(ReflectionProperty $property) - { - $class = $property->getDeclaringClass(); - $cacheKey = $class->getName() . '$' . $property->getName(); - - if (isset($this->loadedAnnotations[$cacheKey])) { - return $this->loadedAnnotations[$cacheKey]; - } - - $annots = $this->fetchFromCache($cacheKey, $class, 'getPropertyAnnotations', $property); - - return $this->loadedAnnotations[$cacheKey] = $annots; - } - - /** - * {@inheritDoc} - */ - public function getPropertyAnnotation(ReflectionProperty $property, $annotationName) - { - foreach ($this->getPropertyAnnotations($property) as $annot) { - if ($annot instanceof $annotationName) { - return $annot; - } - } - - return null; - } - - /** - * {@inheritDoc} - */ - public function getMethodAnnotations(ReflectionMethod $method) - { - $class = $method->getDeclaringClass(); - $cacheKey = $class->getName() . '#' . $method->getName(); - - if (isset($this->loadedAnnotations[$cacheKey])) { - return $this->loadedAnnotations[$cacheKey]; - } - - $annots = $this->fetchFromCache($cacheKey, $class, 'getMethodAnnotations', $method); - - return $this->loadedAnnotations[$cacheKey] = $annots; - } - - /** - * {@inheritDoc} - */ - public function getMethodAnnotation(ReflectionMethod $method, $annotationName) - { - foreach ($this->getMethodAnnotations($method) as $annot) { - if ($annot instanceof $annotationName) { - return $annot; - } - } - - return null; - } - - public function clearLoadedAnnotations(): void - { - $this->loadedAnnotations = []; - $this->loadedFilemtimes = []; - } - - /** @return mixed[] */ - private function fetchFromCache( - string $cacheKey, - ReflectionClass $class, - string $method, - Reflector $reflector - ): array { - $cacheKey = rawurlencode($cacheKey); - - $item = $this->cache->getItem($cacheKey); - if (($this->debug && ! $this->refresh($cacheKey, $class)) || ! $item->isHit()) { - $this->cache->save($item->set($this->delegate->{$method}($reflector))); - } - - return $item->get(); - } - - /** - * Used in debug mode to check if the cache is fresh. - * - * @return bool Returns true if the cache was fresh, or false if the class - * being read was modified since writing to the cache. - */ - private function refresh(string $cacheKey, ReflectionClass $class): bool - { - $lastModification = $this->getLastModification($class); - if ($lastModification === 0) { - return true; - } - - $item = $this->cache->getItem('[C]' . $cacheKey); - if ($item->isHit() && $item->get() >= $lastModification) { - return true; - } - - $this->cache->save($item->set(time())); - - return false; - } - - /** - * Returns the time the class was last modified, testing traits and parents - */ - private function getLastModification(ReflectionClass $class): int - { - $filename = $class->getFileName(); - - if (isset($this->loadedFilemtimes[$filename])) { - return $this->loadedFilemtimes[$filename]; - } - - $parent = $class->getParentClass(); - - $lastModification = max(array_merge( - [$filename ? filemtime($filename) : 0], - array_map(function (ReflectionClass $reflectionTrait): int { - return $this->getTraitLastModificationTime($reflectionTrait); - }, $class->getTraits()), - array_map(function (ReflectionClass $class): int { - return $this->getLastModification($class); - }, $class->getInterfaces()), - $parent ? [$this->getLastModification($parent)] : [] - )); - - assert($lastModification !== false); - - return $this->loadedFilemtimes[$filename] = $lastModification; - } - - private function getTraitLastModificationTime(ReflectionClass $reflectionTrait): int - { - $fileName = $reflectionTrait->getFileName(); - - if (isset($this->loadedFilemtimes[$fileName])) { - return $this->loadedFilemtimes[$fileName]; - } - - $lastModificationTime = max(array_merge( - [$fileName ? filemtime($fileName) : 0], - array_map(function (ReflectionClass $reflectionTrait): int { - return $this->getTraitLastModificationTime($reflectionTrait); - }, $reflectionTrait->getTraits()) - )); - - assert($lastModificationTime !== false); - - return $this->loadedFilemtimes[$fileName] = $lastModificationTime; - } -} diff --git a/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Reader.php b/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Reader.php deleted file mode 100644 index 0663ffd..0000000 --- a/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Reader.php +++ /dev/null @@ -1,80 +0,0 @@ - An array of Annotations. - */ - public function getClassAnnotations(ReflectionClass $class); - - /** - * Gets a class annotation. - * - * @param ReflectionClass $class The ReflectionClass of the class from which - * the class annotations should be read. - * @param class-string $annotationName The name of the annotation. - * - * @return T|null The Annotation or NULL, if the requested annotation does not exist. - * - * @template T - */ - public function getClassAnnotation(ReflectionClass $class, $annotationName); - - /** - * Gets the annotations applied to a method. - * - * @param ReflectionMethod $method The ReflectionMethod of the method from which - * the annotations should be read. - * - * @return array An array of Annotations. - */ - public function getMethodAnnotations(ReflectionMethod $method); - - /** - * Gets a method annotation. - * - * @param ReflectionMethod $method The ReflectionMethod to read the annotations from. - * @param class-string $annotationName The name of the annotation. - * - * @return T|null The Annotation or NULL, if the requested annotation does not exist. - * - * @template T - */ - public function getMethodAnnotation(ReflectionMethod $method, $annotationName); - - /** - * Gets the annotations applied to a property. - * - * @param ReflectionProperty $property The ReflectionProperty of the property - * from which the annotations should be read. - * - * @return array An array of Annotations. - */ - public function getPropertyAnnotations(ReflectionProperty $property); - - /** - * Gets a property annotation. - * - * @param ReflectionProperty $property The ReflectionProperty to read the annotations from. - * @param class-string $annotationName The name of the annotation. - * - * @return T|null The Annotation or NULL, if the requested annotation does not exist. - * - * @template T - */ - public function getPropertyAnnotation(ReflectionProperty $property, $annotationName); -} diff --git a/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/SimpleAnnotationReader.php b/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/SimpleAnnotationReader.php deleted file mode 100644 index 8a78c11..0000000 --- a/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/SimpleAnnotationReader.php +++ /dev/null @@ -1,114 +0,0 @@ -parser = new DocParser(); - $this->parser->setIgnoreNotImportedAnnotations(true); - } - - /** - * Adds a namespace in which we will look for annotations. - * - * @param string $namespace - * - * @return void - */ - public function addNamespace($namespace) - { - $this->parser->addNamespace($namespace); - } - - /** - * {@inheritDoc} - */ - public function getClassAnnotations(ReflectionClass $class) - { - return $this->parser->parse($class->getDocComment(), 'class ' . $class->getName()); - } - - /** - * {@inheritDoc} - */ - public function getMethodAnnotations(ReflectionMethod $method) - { - return $this->parser->parse( - $method->getDocComment(), - 'method ' . $method->getDeclaringClass()->name . '::' . $method->getName() . '()' - ); - } - - /** - * {@inheritDoc} - */ - public function getPropertyAnnotations(ReflectionProperty $property) - { - return $this->parser->parse( - $property->getDocComment(), - 'property ' . $property->getDeclaringClass()->name . '::$' . $property->getName() - ); - } - - /** - * {@inheritDoc} - */ - public function getClassAnnotation(ReflectionClass $class, $annotationName) - { - foreach ($this->getClassAnnotations($class) as $annot) { - if ($annot instanceof $annotationName) { - return $annot; - } - } - - return null; - } - - /** - * {@inheritDoc} - */ - public function getMethodAnnotation(ReflectionMethod $method, $annotationName) - { - foreach ($this->getMethodAnnotations($method) as $annot) { - if ($annot instanceof $annotationName) { - return $annot; - } - } - - return null; - } - - /** - * {@inheritDoc} - */ - public function getPropertyAnnotation(ReflectionProperty $property, $annotationName) - { - foreach ($this->getPropertyAnnotations($property) as $annot) { - if ($annot instanceof $annotationName) { - return $annot; - } - } - - return null; - } -} diff --git a/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/TokenParser.php b/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/TokenParser.php deleted file mode 100644 index 9605fb8..0000000 --- a/tools/php-cs-fixer/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/TokenParser.php +++ /dev/null @@ -1,208 +0,0 @@ - - */ - private $tokens; - - /** - * The number of tokens. - * - * @var int - */ - private $numTokens; - - /** - * The current array pointer. - * - * @var int - */ - private $pointer = 0; - - /** - * @param string $contents - */ - public function __construct($contents) - { - $this->tokens = token_get_all($contents); - - // The PHP parser sets internal compiler globals for certain things. Annoyingly, the last docblock comment it - // saw gets stored in doc_comment. When it comes to compile the next thing to be include()d this stored - // doc_comment becomes owned by the first thing the compiler sees in the file that it considers might have a - // docblock. If the first thing in the file is a class without a doc block this would cause calls to - // getDocBlock() on said class to return our long lost doc_comment. Argh. - // To workaround, cause the parser to parse an empty docblock. Sure getDocBlock() will return this, but at least - // it's harmless to us. - token_get_all("numTokens = count($this->tokens); - } - - /** - * Gets the next non whitespace and non comment token. - * - * @param bool $docCommentIsComment If TRUE then a doc comment is considered a comment and skipped. - * If FALSE then only whitespace and normal comments are skipped. - * - * @return mixed[]|string|null The token if exists, null otherwise. - */ - public function next($docCommentIsComment = true) - { - for ($i = $this->pointer; $i < $this->numTokens; $i++) { - $this->pointer++; - if ( - $this->tokens[$i][0] === T_WHITESPACE || - $this->tokens[$i][0] === T_COMMENT || - ($docCommentIsComment && $this->tokens[$i][0] === T_DOC_COMMENT) - ) { - continue; - } - - return $this->tokens[$i]; - } - - return null; - } - - /** - * Parses a single use statement. - * - * @return array A list with all found class names for a use statement. - */ - public function parseUseStatement() - { - $groupRoot = ''; - $class = ''; - $alias = ''; - $statements = []; - $explicitAlias = false; - while (($token = $this->next())) { - if (! $explicitAlias && $token[0] === T_STRING) { - $class .= $token[1]; - $alias = $token[1]; - } elseif ($explicitAlias && $token[0] === T_STRING) { - $alias = $token[1]; - } elseif ( - PHP_VERSION_ID >= 80000 && - ($token[0] === T_NAME_QUALIFIED || $token[0] === T_NAME_FULLY_QUALIFIED) - ) { - $class .= $token[1]; - - $classSplit = explode('\\', $token[1]); - $alias = $classSplit[count($classSplit) - 1]; - } elseif ($token[0] === T_NS_SEPARATOR) { - $class .= '\\'; - $alias = ''; - } elseif ($token[0] === T_AS) { - $explicitAlias = true; - $alias = ''; - } elseif ($token === ',') { - $statements[strtolower($alias)] = $groupRoot . $class; - $class = ''; - $alias = ''; - $explicitAlias = false; - } elseif ($token === ';') { - $statements[strtolower($alias)] = $groupRoot . $class; - break; - } elseif ($token === '{') { - $groupRoot = $class; - $class = ''; - } elseif ($token === '}') { - continue; - } else { - break; - } - } - - return $statements; - } - - /** - * Gets all use statements. - * - * @param string $namespaceName The namespace name of the reflected class. - * - * @return array A list with all found use statements. - */ - public function parseUseStatements($namespaceName) - { - $statements = []; - while (($token = $this->next())) { - if ($token[0] === T_USE) { - $statements = array_merge($statements, $this->parseUseStatement()); - continue; - } - - if ($token[0] !== T_NAMESPACE || $this->parseNamespace() !== $namespaceName) { - continue; - } - - // Get fresh array for new namespace. This is to prevent the parser to collect the use statements - // for a previous namespace with the same name. This is the case if a namespace is defined twice - // or if a namespace with the same name is commented out. - $statements = []; - } - - return $statements; - } - - /** - * Gets the namespace. - * - * @return string The found namespace. - */ - public function parseNamespace() - { - $name = ''; - while ( - ($token = $this->next()) && ($token[0] === T_STRING || $token[0] === T_NS_SEPARATOR || ( - PHP_VERSION_ID >= 80000 && - ($token[0] === T_NAME_QUALIFIED || $token[0] === T_NAME_FULLY_QUALIFIED) - )) - ) { - $name .= $token[1]; - } - - return $name; - } - - /** - * Gets the class name. - * - * @return string The found class name. - */ - public function parseClass() - { - // Namespaces and class names are tokenized the same: T_STRINGs - // separated by T_NS_SEPARATOR so we can use one function to provide - // both. - return $this->parseNamespace(); - } -} diff --git a/tools/php-cs-fixer/vendor/doctrine/lexer/LICENSE b/tools/php-cs-fixer/vendor/doctrine/lexer/LICENSE deleted file mode 100644 index e8fdec4..0000000 --- a/tools/php-cs-fixer/vendor/doctrine/lexer/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2006-2018 Doctrine Project - -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/tools/php-cs-fixer/vendor/doctrine/lexer/README.md b/tools/php-cs-fixer/vendor/doctrine/lexer/README.md deleted file mode 100644 index e1b419a..0000000 --- a/tools/php-cs-fixer/vendor/doctrine/lexer/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# Doctrine Lexer - -Build Status: [![Build Status](https://travis-ci.org/doctrine/lexer.svg?branch=master)](https://travis-ci.org/doctrine/lexer) - -Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers. - -This lexer is used in Doctrine Annotations and in Doctrine ORM (DQL). - -https://www.doctrine-project.org/projects/lexer.html diff --git a/tools/php-cs-fixer/vendor/doctrine/lexer/composer.json b/tools/php-cs-fixer/vendor/doctrine/lexer/composer.json deleted file mode 100644 index 3432bae..0000000 --- a/tools/php-cs-fixer/vendor/doctrine/lexer/composer.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "name": "doctrine/lexer", - "type": "library", - "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", - "keywords": [ - "php", - "parser", - "lexer", - "annotations", - "docblock" - ], - "homepage": "https://www.doctrine-project.org/projects/lexer.html", - "license": "MIT", - "authors": [ - {"name": "Guilherme Blanco", "email": "guilhermeblanco@gmail.com"}, - {"name": "Roman Borschel", "email": "roman@code-factory.org"}, - {"name": "Johannes Schmitt", "email": "schmittjoh@gmail.com"} - ], - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^6.0", - "phpstan/phpstan": "^0.11.8", - "phpunit/phpunit": "^8.2" - }, - "autoload": { - "psr-4": { "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" } - }, - "autoload-dev": { - "psr-4": { "Doctrine\\Tests\\": "tests/Doctrine" } - }, - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "config": { - "sort-packages": true - } -} diff --git a/tools/php-cs-fixer/vendor/doctrine/lexer/lib/Doctrine/Common/Lexer/AbstractLexer.php b/tools/php-cs-fixer/vendor/doctrine/lexer/lib/Doctrine/Common/Lexer/AbstractLexer.php deleted file mode 100644 index 385643a..0000000 --- a/tools/php-cs-fixer/vendor/doctrine/lexer/lib/Doctrine/Common/Lexer/AbstractLexer.php +++ /dev/null @@ -1,328 +0,0 @@ -input = $input; - $this->tokens = []; - - $this->reset(); - $this->scan($input); - } - - /** - * Resets the lexer. - * - * @return void - */ - public function reset() - { - $this->lookahead = null; - $this->token = null; - $this->peek = 0; - $this->position = 0; - } - - /** - * Resets the peek pointer to 0. - * - * @return void - */ - public function resetPeek() - { - $this->peek = 0; - } - - /** - * Resets the lexer position on the input to the given position. - * - * @param int $position Position to place the lexical scanner. - * - * @return void - */ - public function resetPosition($position = 0) - { - $this->position = $position; - } - - /** - * Retrieve the original lexer's input until a given position. - * - * @param int $position - * - * @return string - */ - public function getInputUntilPosition($position) - { - return substr($this->input, 0, $position); - } - - /** - * Checks whether a given token matches the current lookahead. - * - * @param int|string $token - * - * @return bool - */ - public function isNextToken($token) - { - return $this->lookahead !== null && $this->lookahead['type'] === $token; - } - - /** - * Checks whether any of the given tokens matches the current lookahead. - * - * @param array $tokens - * - * @return bool - */ - public function isNextTokenAny(array $tokens) - { - return $this->lookahead !== null && in_array($this->lookahead['type'], $tokens, true); - } - - /** - * Moves to the next token in the input string. - * - * @return bool - */ - public function moveNext() - { - $this->peek = 0; - $this->token = $this->lookahead; - $this->lookahead = isset($this->tokens[$this->position]) - ? $this->tokens[$this->position++] : null; - - return $this->lookahead !== null; - } - - /** - * Tells the lexer to skip input tokens until it sees a token with the given value. - * - * @param string $type The token type to skip until. - * - * @return void - */ - public function skipUntil($type) - { - while ($this->lookahead !== null && $this->lookahead['type'] !== $type) { - $this->moveNext(); - } - } - - /** - * Checks if given value is identical to the given token. - * - * @param mixed $value - * @param int|string $token - * - * @return bool - */ - public function isA($value, $token) - { - return $this->getType($value) === $token; - } - - /** - * Moves the lookahead token forward. - * - * @return array|null The next token or NULL if there are no more tokens ahead. - */ - public function peek() - { - if (isset($this->tokens[$this->position + $this->peek])) { - return $this->tokens[$this->position + $this->peek++]; - } - - return null; - } - - /** - * Peeks at the next token, returns it and immediately resets the peek. - * - * @return array|null The next token or NULL if there are no more tokens ahead. - */ - public function glimpse() - { - $peek = $this->peek(); - $this->peek = 0; - - return $peek; - } - - /** - * Scans the input string for tokens. - * - * @param string $input A query string. - * - * @return void - */ - protected function scan($input) - { - if (! isset($this->regex)) { - $this->regex = sprintf( - '/(%s)|%s/%s', - implode(')|(', $this->getCatchablePatterns()), - implode('|', $this->getNonCatchablePatterns()), - $this->getModifiers() - ); - } - - $flags = PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_OFFSET_CAPTURE; - $matches = preg_split($this->regex, $input, -1, $flags); - - if ($matches === false) { - // Work around https://bugs.php.net/78122 - $matches = [[$input, 0]]; - } - - foreach ($matches as $match) { - // Must remain before 'value' assignment since it can change content - $type = $this->getType($match[0]); - - $this->tokens[] = [ - 'value' => $match[0], - 'type' => $type, - 'position' => $match[1], - ]; - } - } - - /** - * Gets the literal for a given token. - * - * @param int|string $token - * - * @return int|string - */ - public function getLiteral($token) - { - $className = static::class; - $reflClass = new ReflectionClass($className); - $constants = $reflClass->getConstants(); - - foreach ($constants as $name => $value) { - if ($value === $token) { - return $className . '::' . $name; - } - } - - return $token; - } - - /** - * Regex modifiers - * - * @return string - */ - protected function getModifiers() - { - return 'iu'; - } - - /** - * Lexical catchable patterns. - * - * @return array - */ - abstract protected function getCatchablePatterns(); - - /** - * Lexical non-catchable patterns. - * - * @return array - */ - abstract protected function getNonCatchablePatterns(); - - /** - * Retrieve token type. Also processes the token value if necessary. - * - * @param string $value - * - * @return int|string|null - */ - abstract protected function getType(&$value); -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/CHANGELOG.md b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/CHANGELOG.md deleted file mode 100644 index e6222b2..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/CHANGELOG.md +++ /dev/null @@ -1,4033 +0,0 @@ -CHANGELOG for PHP CS Fixer -========================== - -This file contains changelogs for stable releases only. - -Changelog for v3.1.0 --------------------- - -* feature #5572 PhpdocToCommentFixer - Add `ignored_tags` option (VincentLanglet) -* feature #5588 NoAliasFunctionsFixer - Add more function aliases (danog) -* feature #5704 ClassAttributesSeparationFixer - Introduce `only_if_meta` spacing option (paulbalandan) -* feature #5734 TypesSpacesFixer - Introduction (kubawerlos) -* feature #5745 EmptyLoopBodyFixer - introduction (SpacePossum, keradus) -* feature #5751 Extract DeclareParenthesesFixer from BracesFixer (julienfalque, keradus) -* feature #5877 ClassDefinitionFixer - PSR12 for anonymous class (SpacePossum) -* minor #5875 EmptyLoopBodyFixer - NoTrailingWhitespaceFixer - priority test (SpacePossum) -* minor #5914 Deprecate ClassKeywordRemoveFixer (kubawerlos) - -Changelog for v3.0.3 --------------------- - -* bug #4927 PhpdocAlignFixer - fix for whitespace in type (kubawerlos) -* bug #5720 NoUnusedImportsFixer - Fix undetected unused imports when type mismatch (julienfalque, SpacePossum) -* bug #5806 DoctrineAnnotationFixer - Add template to ignored_tags (akalineskou) -* bug #5849 PhpdocTagTypeFixer - must not remove inlined tags within other tags (boesing) -* bug #5853 BracesFixer - handle alternative short foreach with if (SpacePossum) -* bug #5855 GlobalNamespaceImportFixer - fix for attributes imported as constants (kubawerlos) -* bug #5881 SelfUpdateCommand - fix link to UPGRADE docs (keradus) -* bug #5884 CurlyBraceTransformer - fix handling dynamic property with string with variable (kubawerlos, keradus) -* bug #5912 TypeAlternationTransformer - fix for "callable" type (kubawerlos) -* bug #5913 SingleSpaceAfterConstructFixer - improve comma handling (keradus) -* minor #5829 DX: Fix SCA with PHPMD (paulbalandan) -* minor #5838 PHP7 - use spaceship (SpacePossum, keradus) -* minor #5848 Docs: update PhpStorm integration link (keradus) -* minor #5856 Add AttributeAnalyzer (kubawerlos) -* minor #5857 DX: PHPMD - exclude fixtures (keradus) -* minor #5859 Various fixes (kubawerlos) -* minor #5864 DX: update dev tools (kubawerlos) -* minor #5876 AttributeTransformerTest - add more tests (SpacePossum) -* minor #5879 Update UPGRADE-v3.md adding relative links (shakaran, keradus) -* minor #5882 Docs: don't use v2 for installation example (keradus) -* minor #5883 Docs: typo (brianteeman, keradus) -* minor #5890 DX: use PHP 8.1 polyfill (keradus) -* minor #5902 Remove references to PHP 7.0 in tests (only removing lines) (kubawerlos) -* minor #5905 DX: Use "yield from" in tests (kubawerlos, keradus) -* minor #5917 Use `@PHP71Migration` rules (kubawerlos, keradus) - -Changelog for v3.0.2 --------------------- - -* bug #5816 FullyQualifiedStrictTypesFixer - fix for union types (kubawerlos, keradus) -* bug #5835 PhpdocTypesOrderFixer: fix for array shapes (kubawerlos) -* bug #5837 SingleImportPerStatementFixer - fix const and function imports (SpacePossum) -* bug #5844 PhpdocTypesOrderFixer: handle callable() type (Slamdunk) -* minor #5839 DX: automate checking 7.0 types on project itself (keradus) -* minor #5840 DX: drop v2 compatible config in project itself (keradus) - -Changelog for v3.0.1 --------------------- - -* bug #5395 PhpdocTagTypeFixer: Do not modify array shapes (localheinz, julienfalque) -* bug #5678 UseArrowFunctionsFixer - fix for return without value (kubawerlos) -* bug #5679 PhpUnitNamespacedFixer - do not try to fix constant usage (kubawerlos) -* bug #5681 RegularCallableCallFixer - fix for function name with escaped slash (kubawerlos) -* bug #5687 FinalInternalClassFixer - fix for annotation with space after "@" (kubawerlos) -* bug #5688 ArrayIndentationFixer - fix for really long arrays (kubawerlos) -* bug #5690 PhpUnitNoExpectationAnnotationFixer - fix "expectedException" annotation with message below (kubawerlos) -* bug #5693 YodaStyleFixer - fix for assignment operators (kubawerlos) -* bug #5697 StrictParamFixer - fix for method definition (kubawerlos) -* bug #5702 CommentToPhpdocFixer - fix for single line comments starting with more than 2 slashes (kubawerlos) -* bug #5703 DateTimeImmutableFixer - fix for method definition (kubawerlos) -* bug #5718 VoidReturnFixer - do not break syntax with magic methods (kubawerlos) -* bug #5727 SingleSpaceAfterConstructFixer - Add support for `namespace` (julienfalque) -* bug #5730 Fix transforming deprecations into exceptions (julienfalque) -* bug #5738 TokensAnalyzer - fix for union types (kubawerlos) -* bug #5741 Fix constant invocation detection cases (kubawerlos) -* bug #5769 Fix priority between `phpdoc_to_property_type` and `no_superfluous_phpdoc_tags` (julienfalque) -* bug #5774 FunctionsAnalyzer::isTheSameClassCall - fix for $this with double colon following (kubawerlos) -* bug #5779 SingleLineThrowFixer - fix for throw in match (kubawerlos) -* bug #5781 ClassDefinition - fix for anonymous class with trailing comma (kubawerlos) -* bug #5783 StaticLambdaFixer - consider parent:: as a possible reference to $this (fancyweb) -* bug #5791 NoBlankLinesAfterPhpdoc - Add T_NAMESPACE in array of forbidden successors (paulbalandan) -* bug #5799 TypeAlternationTransformer - fix for multiple function parameters (kubawerlos) -* bug #5804 NoBreakCommentFixer - fix for "default" in "match" (kubawerlos) -* bug #5805 SingleLineCommentStyleFixer - run after HeaderCommentFixer (kubawerlos) -* bug #5817 NativeFunctionTypeDeclarationCasingFixer - fix for union types (kubawerlos) -* bug #5823 YodaStyleFixer - yield support (SpacePossum) -* minor #4914 Improve PHPDoc types support (julienfalque, keradus) -* minor #5592 Fix checking for default config used in rule sets (kubawerlos) -* minor #5675 Docs: extend Upgrade Guide (keradus) -* minor #5680 DX: benchmark.sh - ensure deps are updated to enable script working across less-similar branches (keradus) -* minor #5689 Calculate code coverage on PHP 8 (kubawerlos) -* minor #5694 DX: fail on risky tests (kubawerlos) -* minor #5695 Utils - save only unique deprecations to avoid memory issues (PetrHeinz) -* minor #5710 [typo] add correct backquotes (PhilETaylor) -* minor #5711 Fix doc, "run-in" show-progress option is no longer present (mvorisek) -* minor #5713 Upgrade-Guide: fix typo (staabm) -* minor #5717 Run migration rules on PHP 8 (kubawerlos, keradus) -* minor #5721 Fix reStructuredText markup (julienfalque) -* minor #5725 Update LICENSE (exussum12) -* minor #5731 CI - Fix checkbashisms installation (julienfalque) -* minor #5736 Remove references to PHP 5.6 (kubawerlos, keradus) -* minor #5739 DX: more typehinting (keradus) -* minor #5740 DX: more type-related docblocks (keradus) -* minor #5746 Config - Improve deprecation message with details (SpacePossum) -* minor #5747 RandomApiMigrationFixer - better docs and better "random_int" support (SpacePossum) -* minor #5748 Updated the link to netbeans plugins page (cyberguroo) -* minor #5750 Test all const are in uppercase (SpacePossum) -* minor #5752 NoNullPropertyInitializationFixer - fix static properties as well (HypeMC) -* minor #5756 Fix rule sets descriptions (kubawerlos) -* minor #5761 Fix links in custom rules documentation (julienfalque) -* minor #5771 doc(config): change set's name (Kocal) -* minor #5777 DX: update PHPStan (kubawerlos) -* minor #5789 DX: update PHPStan (kubawerlos) -* minor #5808 Update PHPStan to 0.12.92 (kubawerlos) -* minor #5813 Docs: point to v3 in installation description (Jimbolino) -* minor #5824 Deprecate v2 (keradus) -* minor #5825 DX: update checkbashisms to v2.21.3 (keradus) -* minor #5826 SCA: check both composer files (keradus) -* minor #5827 ClassAttributesSeparationFixer - Add `trait_import` support (SpacePossum) -* minor #5831 DX: fix SCA violations (keradus) - -Changelog for v3.0.0 --------------------- - -* bug #5164 Differ - surround file name with double quotes if it contains spacing. (SpacePossum) -* bug #5560 PSR2: require visibility only for properties and methods (kubawerlos) -* bug #5576 ClassAttributesSeparationFixer: do not allow using v2 config (kubawerlos) -* feature #4979 Pass file to differ (paulhenri-l, SpacePossum) -* minor #3374 show-progress option: drop run-in and estimating, rename estimating-max to dots (keradus) -* minor #3375 Fixers - stop exposing extra properties/consts (keradus) -* minor #3376 Tokenizer - remove deprecations and legacy mode (keradus) -* minor #3377 rules - change default options (keradus) -* minor #3378 SKIP_LINT_TEST_CASES - drop env (keradus) -* minor #3379 MethodArgumentSpaceFixer - fixSpace is now private (keradus) -* minor #3380 rules - drop rootless configurations (keradus) -* minor #3381 rules - drop deprecated configurations (keradus) -* minor #3382 DefinedFixerInterface - incorporate into FixerInterface (keradus) -* minor #3383 FixerDefinitionInterface - drop getConfigurationDescription and getDefaultConfiguration (keradus) -* minor #3384 diff-format option: drop sbd diff, use udiffer by default, drop SebastianBergmannDiffer and SebastianBergmannShortDiffer classes (keradus) -* minor #3385 ConfigurableFixerInterface::configure - param is now not nullable and not optional (keradus) -* minor #3386 ConfigurationDefinitionFixerInterface - incorporate into ConfigurableFixerInterface (keradus) -* minor #3387 FixCommand - forbid passing 'config' and 'rules' options together (keradus) -* minor #3388 Remove Helpers (keradus) -* minor #3389 AccessibleObject - drop class (keradus) -* minor #3390 Drop deprecated rules: blank_line_before_return, hash_to_slash_comment, method_separation, no_extra_consecutive_blank_lines, no_multiline_whitespace_before_semicolons and pre_increment (keradus) -* minor #3456 AutoReview - drop references to removed rule (keradus) -* minor #3659 use php-cs-fixer/diff ^2.0 (SpacePossum) -* minor #3681 CiIntegrationTest - fix incompatibility from 2.x line (keradus) -* minor #3740 NoUnusedImportsFixer - remove SF exception (SpacePossum) -* minor #3771 UX: always set error_reporting in entry file, not Application (keradus) -* minor #3922 Make some more classes final (ntzm, SpacePossum) -* minor #3995 Change default config of native_function_invocation (dunglas, SpacePossum) -* minor #4432 DX: remove empty sets from RuleSet (kubawerlos) -* minor #4489 Fix ruleset @PHPUnit50Migration:risky (kubawerlos) -* minor #4620 DX: cleanup additional, not used parameters (keradus) -* minor #4666 Remove deprecated rules: lowercase_constants, php_unit_ordered_covers, silenced_deprecation_error (keradus) -* minor #4697 Remove deprecated no_short_echo_tag rule (julienfalque) -* minor #4851 fix phpstan on 3.0 (SpacePossum) -* minor #4901 Fix SCA (SpacePossum) -* minor #5069 Fixed failing tests on 3.0 due to unused import after merge (GrahamCampbell) -* minor #5096 NativeFunctionInvocationFixer - BacktickToShellExecFixer - fix integration test (SpacePossum) -* minor #5171 Fix test (SpacePossum) -* minor #5245 Fix CI for 3.0 line (keradus) -* minor #5351 clean ups (SpacePossum) -* minor #5364 DX: Do not display runtime twice on 3.0 line (keradus) -* minor #5412 3.0 - cleanup (SpacePossum, keradus) -* minor #5417 Further BC cleanup for 3.0 (keradus) -* minor #5418 Drop src/Test namespace (keradus) -* minor #5436 Drop mapping of strings to boolean option other than yes/no (keradus) -* minor #5440 Change default ruleset to PSR-12 (keradus) -* minor #5477 Drop diff-format (keradus) -* minor #5478 Docs: Cleanup UPGRADE markdown files (keradus) -* minor #5479 ArraySyntaxFixer, ListSyntaxFixer - change default syntax to short (keradus) -* minor #5480 Tokens::findBlockEnd - drop deprecated argument (keradus) -* minor #5485 ClassAttributesSeparationFixer - drop deprecated flat list configuration (keradus) -* minor #5486 CI: drop unused env variables (keradus) -* minor #5488 Do not distribute documentation (szepeviktor) -* minor #5513 DX: Tokens::warnPhp8SplFixerArrayChange - drop unused method (keradus) -* minor #5520 DX: Drop IsIdenticalConstraint (keradus) -* minor #5521 DX: apply rules configuration cleanups for PHP 7.1+ (keradus) -* minor #5524 DX: drop support of very old deps (keradus) -* minor #5525 Drop phpunit-legacy-adapter (keradus) -* minor #5527 Bump required PHP to 7.1 (keradus) -* minor #5529 DX: bump required PHPUnit to v7+ (keradus) -* minor #5532 Apply PHP 7.1 typing (keradus) -* minor #5541 RuleSet - disallow null usage to disable the rule (keradus) -* minor #5555 DX: further typing improvements (keradus) -* minor #5562 Fix table row rendering for default values of array_syntax and list_syntax (derrabus) -* minor #5608 DX: new cache filename (keradus) -* minor #5609 Forbid old config filename usage (keradus) -* minor #5638 DX: remove Utils::calculateBitmask (keradus) -* minor #5641 DX: use constants for PHPUnit version on 3.0 line (keradus) -* minor #5643 FixCommand - simplify help (keradus) -* minor #5644 Token::toJson() - remove parameter (keradus) -* minor #5645 DX: YodaStyleFixerTest - fix CI (keradus) -* minor #5649 DX: YodaStyleFixerTest - fix 8.0 compat (keradus) -* minor #5650 DX: FixCommand - drop outdated/duplicated docs (keradus) -* minor #5656 DX: mark some constants as internal or private (keradus) -* minor #5657 DX: convert some properties to constants (keradus) -* minor #5669 Remove TrailingCommaInMultilineArrayFixer (kubawerlos, keradus) - -Changelog for v2.19.2 ---------------------- - -* bug #5881 SelfUpdateCommand - fix link to UPGRADE docs (keradus) - -Changelog for v2.19.1 ---------------------- - -* bug #5395 PhpdocTagTypeFixer: Do not modify array shapes (localheinz, julienfalque) -* bug #5678 UseArrowFunctionsFixer - fix for return without value (kubawerlos) -* bug #5679 PhpUnitNamespacedFixer - do not try to fix constant usage (kubawerlos) -* bug #5681 RegularCallableCallFixer - fix for function name with escaped slash (kubawerlos) -* bug #5687 FinalInternalClassFixer - fix for annotation with space after "@" (kubawerlos) -* bug #5688 ArrayIndentationFixer - fix for really long arrays (kubawerlos) -* bug #5690 PhpUnitNoExpectationAnnotationFixer - fix "expectedException" annotation with message below (kubawerlos) -* bug #5693 YodaStyleFixer - fix for assignment operators (kubawerlos) -* bug #5697 StrictParamFixer - fix for method definition (kubawerlos) -* bug #5702 CommentToPhpdocFixer - fix for single line comments starting with more than 2 slashes (kubawerlos) -* bug #5703 DateTimeImmutableFixer - fix for method definition (kubawerlos) -* bug #5718 VoidReturnFixer - do not break syntax with magic methods (kubawerlos) -* bug #5727 SingleSpaceAfterConstructFixer - Add support for `namespace` (julienfalque) -* bug #5730 Fix transforming deprecations into exceptions (julienfalque) -* bug #5738 TokensAnalyzer - fix for union types (kubawerlos) -* bug #5741 Fix constant invocation detection cases (kubawerlos) -* bug #5769 Fix priority between `phpdoc_to_property_type` and `no_superfluous_phpdoc_tags` (julienfalque) -* bug #5774 FunctionsAnalyzer::isTheSameClassCall - fix for $this with double colon following (kubawerlos) -* bug #5779 SingleLineThrowFixer - fix for throw in match (kubawerlos) -* bug #5781 ClassDefinition - fix for anonymous class with trailing comma (kubawerlos) -* bug #5783 StaticLambdaFixer - consider parent:: as a possible reference to $this (fancyweb) -* bug #5791 NoBlankLinesAfterPhpdoc - Add T_NAMESPACE in array of forbidden successors (paulbalandan) -* bug #5799 TypeAlternationTransformer - fix for multiple function parameters (kubawerlos) -* bug #5804 NoBreakCommentFixer - fix for "default" in "match" (kubawerlos) -* bug #5805 SingleLineCommentStyleFixer - run after HeaderCommentFixer (kubawerlos) -* bug #5817 NativeFunctionTypeDeclarationCasingFixer - fix for union types (kubawerlos) -* bug #5823 YodaStyleFixer - yield support (SpacePossum) -* minor #4914 Improve PHPDoc types support (julienfalque, keradus) -* minor #5680 DX: benchmark.sh - ensure deps are updated to enable script working across less-similar branches (keradus) -* minor #5689 Calculate code coverage on PHP 8 (kubawerlos) -* minor #5694 DX: fail on risky tests (kubawerlos) -* minor #5695 Utils - save only unique deprecations to avoid memory issues (PetrHeinz) -* minor #5710 [typo] add correct backquotes (PhilETaylor) -* minor #5717 Run migration rules on PHP 8 (kubawerlos, keradus) -* minor #5721 Fix reStructuredText markup (julienfalque) -* minor #5725 Update LICENSE (exussum12) -* minor #5731 CI - Fix checkbashisms installation (julienfalque) -* minor #5740 DX: more type-related docblocks (keradus) -* minor #5746 Config - Improve deprecation message with details (SpacePossum) -* minor #5747 RandomApiMigrationFixer - better docs and better "random_int" support (SpacePossum) -* minor #5748 Updated the link to netbeans plugins page (cyberguroo) -* minor #5750 Test all const are in uppercase (SpacePossum) -* minor #5752 NoNullPropertyInitializationFixer - fix static properties as well (HypeMC) -* minor #5756 Fix rule sets descriptions (kubawerlos) -* minor #5761 Fix links in custom rules documentation (julienfalque) -* minor #5777 DX: update PHPStan (kubawerlos) -* minor #5789 DX: update PHPStan (kubawerlos) -* minor #5808 Update PHPStan to 0.12.92 (kubawerlos) -* minor #5824 Deprecate v2 (keradus) -* minor #5825 DX: update checkbashisms to v2.21.3 (keradus) -* minor #5826 SCA: check both composer files (keradus) -* minor #5827 ClassAttributesSeparationFixer - Add `trait_import` support (SpacePossum) - -Changelog for v2.19.0 ---------------------- - -* feature #4238 TrailingCommaInMultilineFixer - introduction (kubawerlos) -* feature #4592 PhpdocToPropertyTypeFixer - introduction (julienfalque) -* feature #5390 feature #4024 added a `list-files` command (clxmstaab, keradus) -* feature #5635 Add list-sets command (keradus) -* feature #5674 UX: Display deprecations to end-user (keradus) -* minor #5601 Always stop when "PHP_CS_FIXER_FUTURE_MODE" is used (kubawerlos) -* minor #5607 DX: new config filename (keradus) -* minor #5613 DX: UtilsTest - add missing teardown (keradus) -* minor #5631 DX: config deduplication (keradus) -* minor #5633 fix typos (staabm) -* minor #5642 Deprecate parameter of Token::toJson() (keradus) -* minor #5672 DX: do not test deprecated fixer (kubawerlos) - -Changelog for v2.18.7 ---------------------- - -* bug #5593 SingleLineThrowFixer - fix handling anonymous classes (kubawerlos) -* bug #5654 SingleLineThrowFixer - fix for match expression (kubawerlos) -* bug #5660 TypeAlternationTransformer - fix for "array" type in type alternation (kubawerlos) -* bug #5665 NullableTypeDeclarationForDefaultNullValueFixer - fix for nullable with attribute (kubawerlos) -* bug #5670 PhpUnitNamespacedFixer - do not try to fix constant (kubawerlos) -* bug #5671 PhpdocToParamTypeFixer - do not change function call (kubawerlos) -* bug #5673 GroupImportFixer - Fix failing case (julienfalque) -* minor #4591 Refactor conversion of PHPDoc to type declarations (julienfalque, keradus) -* minor #5611 DX: use method expectDeprecation from Symfony Bridge instead of annotation (kubawerlos) -* minor #5658 DX: use constants in tests for Fixer configuration (keradus) -* minor #5661 DX: remove PHPStan exceptions for "tests" from phpstan.neon (kubawerlos) -* minor #5662 Change wording from "merge" to "intersect" (jschaedl) -* minor #5663 DX: do not abuse "inheritdoc" tag (kubawerlos) -* minor #5664 DX: code grooming (keradus) - -Changelog for v2.18.6 ---------------------- - -* bug #5586 Add support for nullsafe object operator ("?->") (kubawerlos) -* bug #5597 Tokens - fix for checking block edges (kubawerlos) -* bug #5604 Custom annotations @type changed into @var (Leprechaunz) -* bug #5606 DoctrineAnnotationBracesFixer false positive (Leprechaunz) -* bug #5610 BracesFixer - fix braces of match expression (Leprechaunz) -* bug #5615 GroupImportFixer severely broken (Leprechaunz) -* bug #5617 ClassAttributesSeparationFixer - fix for using visibility for class elements (kubawerlos) -* bug #5618 GroupImportFixer - fix removal of import type when mixing multiple types (Leprechaunz) -* bug #5622 Exclude Doctrine documents from final fixer (ossinkine) -* bug #5630 PhpdocTypesOrderFixer - handle complex keys (Leprechaunz) -* minor #5554 DX: use tmp file in sys_temp_dir for integration tests (keradus) -* minor #5564 DX: make integration tests matching entries in FixerFactoryTest (kubawerlos) -* minor #5603 DX: DocumentationGenerator - no need to re-configure Differ (keradus) -* minor #5612 DX: use ::class whenever possible (kubawerlos) -* minor #5619 DX: allow XDebugHandler v2 (keradus) -* minor #5623 DX: when displaying app version, don't put extra space if there is no CODENAME available (keradus) -* minor #5626 DX: update PHPStan and way of ignoring flickering PHPStan exception (keradus) -* minor #5629 DX: fix CiIntegrationTest (keradus) -* minor #5636 DX: remove 'create' method in internal classes (keradus) -* minor #5637 DX: do not calculate bitmap via helper anymore (keradus) -* minor #5639 Move fix reports (classes and schemas) (keradus) -* minor #5640 DX: use constants for PHPUnit version (keradus) -* minor #5646 Cleanup YodaStyleFixerTest (kubawerlos) - -Changelog for v2.18.5 ---------------------- - -* bug #5561 NoMixedEchoPrintFixer: fix for conditions without curly brackets (kubawerlos) -* bug #5563 Priority fix: SingleSpaceAfterConstructFixer must run before BracesFixer (kubawerlos) -* bug #5567 Fix order of BracesFixer and ClassDefinitionFixer (Daeroni) -* bug #5596 NullableTypeTransformer - fix for attributes (kubawerlos, jrmajor) -* bug #5598 GroupImportFixer - fix breaking code when fixing root classes (Leprechaunz) -* minor #5571 DX: add test to make sure SingleSpaceAfterConstructFixer runs before FunctionDeclarationFixer (kubawerlos) -* minor #5577 Extend priority test for "class_definition" vs "braces" (kubawerlos) -* minor #5585 DX: make doc examples prettier (kubawerlos) -* minor #5590 Docs: HeaderCommentFixer - document example how to remove header comment (keradus) -* minor #5602 DX: regenerate docs (keradus) - -Changelog for v2.18.4 ---------------------- - -* bug #4085 Priority: AlignMultilineComment should run before every PhpdocFixer (dmvdbrugge) -* bug #5421 PsrAutoloadingFixer - Fix PSR autoloading outside configured directory (kelunik, keradus) -* bug #5464 NativeFunctionInvocationFixer - PHP 8 attributes (HypeMC, keradus) -* bug #5548 NullableTypeDeclarationForDefaultNullValueFixer - fix handling promoted properties (jrmajor, keradus) -* bug #5550 TypeAlternationTransformer - fix for typed static properties (kubawerlos) -* bug #5551 ClassAttributesSeparationFixer - fix for properties with type alternation (kubawerlos, keradus) -* bug #5552 DX: test relation between function_declaration and method_argument_space (keradus) -* minor #5540 DX: RuleSet - convert null handling to soft-warning (keradus) -* minor #5545 DX: update checkbashisms (keradus) - -Changelog for v2.18.3 ---------------------- - -* bug #5484 NullableTypeDeclarationForDefaultNullValueFixer - handle mixed pseudotype (keradus) -* minor #5470 Disable CI fail-fast (mvorisek) -* minor #5491 Support php8 static return type for NoSuperfluousPhpdocTagsFixer (tigitz) -* minor #5494 BinaryOperatorSpacesFixer - extend examples (keradus) -* minor #5499 DX: add TODOs for PHP requirements cleanup (keradus) -* minor #5500 DX: Test that Transformers are adding only CustomTokens that they define and nothing else (keradus) -* minor #5507 Fix quoting in exception message (gquemener) -* minor #5514 DX: PHP 7.0 integration test - solve TODO for random_api_migration usage (keradus) -* minor #5515 DX: do not override getConfigurationDefinition (keradus) -* minor #5516 DX: AbstractDoctrineAnnotationFixer - no need for import aliases (keradus) -* minor #5518 DX: minor typing and validation fixes (keradus) -* minor #5522 Token - add handling json_encode crash (keradus) -* minor #5523 DX: EregToPregFixer - fix sorting (keradus) -* minor #5528 DX: code cleanup (keradus) - -Changelog for v2.18.2 ---------------------- - -* bug #5466 Fix runtime check of PHP version (keradus) -* minor #4250 POC Tokens::insertSlices (keradus) - -Changelog for v2.18.1 ---------------------- - -* bug #5447 switch_case_semicolon_to_colon should skip match/default statements (derrabus) -* bug #5453 SingleSpaceAfterConstructFixer - better handling of closing parenthesis and brace (keradus) -* bug #5454 NullableTypeDeclarationForDefaultNullValueFixer - support property promotion via constructor (keradus) -* bug #5455 PhpdocToCommentFixer - add support for attributes (keradus) -* bug #5462 NullableTypeDeclarationForDefaultNullValueFixer - support union types (keradus) -* minor #5444 Fix PHP version number in PHP54MigrationSet description (jdreesen, keradus) -* minor #5445 DX: update usage of old TraversableContains in tests (keradus) -* minor #5456 DX: Fix CiIntegrationTest (keradus) -* minor #5457 CI: fix params order (keradus) -* minor #5458 CI: fix migration workflow (keradus) -* minor #5459 DX: cleanup PHP Migration rulesets (keradus) - -Changelog for v2.18.0 ---------------------- - -* feature #4943 Add PSR12 ruleset (julienfalque, keradus) -* feature #5426 Update Symfony ruleset (keradus) -* feature #5428 Add/Change PHP.MigrationSet to update array/list syntax to short one (keradus) -* minor #5441 Allow execution under PHP 8 (keradus) - -Changelog for v2.17.5 ---------------------- - -* bug #5447 switch_case_semicolon_to_colon should skip match/default statements (derrabus) -* bug #5453 SingleSpaceAfterConstructFixer - better handling of closing parenthesis and brace (keradus) -* bug #5454 NullableTypeDeclarationForDefaultNullValueFixer - support property promotion via constructor (keradus) -* bug #5455 PhpdocToCommentFixer - add support for attributes (keradus) -* bug #5462 NullableTypeDeclarationForDefaultNullValueFixer - support union types (keradus) -* minor #5445 DX: update usage of old TraversableContains in tests (keradus) -* minor #5456 DX: Fix CiIntegrationTest (keradus) -* minor #5457 CI: fix params order (keradus) -* minor #5459 DX: cleanup PHP Migration rulesets (keradus) - -Changelog for v2.17.4 ---------------------- - -* bug #5379 PhpUnitMethodCasingFixer - Do not modify class name (localheinz) -* bug #5404 NullableTypeTransformer - constructor property promotion support (Wirone) -* bug #5433 PhpUnitTestCaseStaticMethodCallsFixer - fix for abstract static method (kubawerlos) -* minor #5234 DX: Add Docker dev setup (julienfalque, keradus) -* minor #5391 PhpdocOrderByValueFixer - Add additional annotations to sort (localheinz) -* minor #5392 PhpdocScalarFixer - Fix description (localheinz) -* minor #5397 NoExtraBlankLinesFixer - PHP8 throw support (SpacePossum) -* minor #5399 Add PHP8 integration test (keradus) -* minor #5405 TypeAlternationTransformer - add support for PHP8 (SpacePossum) -* minor #5406 SingleSpaceAfterConstructFixer - Attributes, comments and PHPDoc support (SpacePossum) -* minor #5407 TokensAnalyzer::getClassyElements - return trait imports (SpacePossum) -* minor #5410 minors (SpacePossum) -* minor #5411 bump year in LICENSE file (SpacePossum) -* minor #5414 TypeAlternationTransformer - T_FN support (SpacePossum) -* minor #5415 Forbid execution under PHP 8.0.0 (keradus) -* minor #5416 Drop Travis CI (keradus) -* minor #5419 CI: separate SCA checks to dedicated jobs (keradus) -* minor #5420 DX: unblock PHPUnit 9.5 (keradus) -* minor #5423 DX: PHPUnit - disable verbose by default (keradus) -* minor #5425 Cleanup 3.0 todos (keradus) -* minor #5427 Plan changing defaults for array_syntax and list_syntax in 3.0 release (keradus) -* minor #5429 DX: Drop speedtrap PHPUnit listener (keradus) -* minor #5432 Don't allow unserializing classes with a destructor (jderusse) -* minor #5435 DX: PHPUnit - groom configuration of time limits (keradus) -* minor #5439 VisibilityRequiredFixer - support type alternation for properties (keradus) -* minor #5442 DX: FunctionsAnalyzerTest - add missing 7.0 requirement (keradus) - -Changelog for v2.17.3 ---------------------- - -* bug #5384 PsrAutoloadingFixer - do not remove directory structure from the Class name (kubawerlos, keradus) -* bug #5385 SingleLineCommentStyleFixer- run before NoUselessReturnFixer (kubawerlos) -* bug #5387 SingleSpaceAfterConstructFixer - do not touch multi line implements (SpacePossum) -* minor #5329 DX: collect coverage with Github Actions (kubawerlos) -* minor #5380 PhpdocOrderByValueFixer - Allow sorting of throws annotations by value (localheinz, keradus) -* minor #5383 DX: fail PHPUnit tests on warning (kubawerlos) -* minor #5386 DX: remove incorrect priority relations (kubawerlos) - -Changelog for v2.17.2 ---------------------- - -* bug #5345 CleanNamespaceFixer - preserve traling 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) -* minor #5319 Clean ups (SpacePossum) -* minor #5338 clean ups (SpacePossum) -* minor #5339 NoEmptyStatementFixer - fix more cases (SpacePossum) -* minor #5340 NamedArgumentTransformer - Introduction (SpacePossum) -* minor #5344 Update docs: do not use deprecated create method (SpacePossum) -* minor #5353 Fix typo in issue template (stof) -* minor #5355 OrderedTraitsFixer - mark as risky (SpacePossum) -* minor #5356 RuleSet description fixes (SpacePossum) -* minor #5359 Add application version to "fix" out put when verbosity flag is set (SpacePossum) -* minor #5360 DX: clean up detectIndent methods (kubawerlos) -* minor #5363 Added missing self return type to ConfigInterface::registerCustomFixers() (vudaltsov) -* minor #5366 PhpUnitDedicateAssertInternalTypeFixer - recover target option (keradus) -* minor #5368 DX: PHPUnit 9 compatibility for 2.17 (keradus) -* minor #5370 DX: update PHPUnit usage to use external Prophecy trait and solve warning (keradus) -* minor #5371 Update documentation about PHP_CS_FIXER_IGNORE_ENV (SanderSander, keradus) -* minor #5373 DX: MagicMethodCasingFixerTest - fix test case description (keradus) -* minor #5374 DX: PhpUnitDedicateAssertInternalTypeFixer - add code sample for non-default config (keradus) - -Changelog for v2.17.1 ---------------------- - -* bug #5325 NoBreakCommentFixer - better throw handling (SpacePossum) -* bug #5327 StaticLambdaFixer - fix for arrow function used in class with $this (kubawerlos, SpacePossum) -* bug #5332 Fix file missing for php8 (jderusse) -* bug #5333 Fix file missing for php8 (jderusse) -* minor #5328 Fixed deprecation message version (GrahamCampbell) -* minor #5330 DX: cleanup Github Actions configs (kubawerlos) - -Changelog for v2.17.0 ---------------------- - -* bug #4752 SimpleLambdaCallFixer - bug fixes (SpacePossum) -* bug #4794 TernaryToElvisOperatorFixer - fix open tag with echo (SpacePossum) -* bug #5084 Fix for variables within string interpolation in lambda_not_used_import (GrahamCampbell) -* bug #5094 SwitchContinueToBreakFixer - do not support alternative syntax (SpacePossum) -* feature #2619 PSR-5 @inheritDoc support (julienfalque) -* feature #3253 Add SimplifiedIfReturnFixer (Slamdunk, SpacePossum) -* feature #4005 GroupImportFixer - introduction (greeflas) -* feature #4012 BracesFixer - add "allow_single_line_anonymous_class_with_empty_body" option (kubawerlos) -* feature #4021 OperatorLinebreakFixer - Introduction (kubawerlos, SpacePossum) -* feature #4259 PsrAutoloadingFixer - introduction (kubawerlos) -* feature #4375 extend ruleset "@PHP73Migration" (gharlan) -* feature #4435 SingleSpaceAfterConstructFixer - Introduction (localheinz) -* feature #4493 Add echo_tag_syntax rule (mlocati, kubawerlos) -* feature #4544 SimpleLambdaCallFixer - introduction (keradus) -* feature #4569 PhpdocOrderByValueFixer - Introduction (localheinz) -* feature #4590 SwitchContinueToBreakFixer - Introduction (SpacePossum) -* feature #4679 NativeConstantInvocationFixer - add "strict" flag (kubawerlos) -* feature #4701 OrderedTraitsFixer - introduction (julienfalque) -* feature #4704 LambdaNotUsedImportFixer - introduction (SpacePossum) -* feature #4740 NoAliasLanguageConstructCallFixer - introduction (SpacePossum) -* feature #4741 TernaryToElvisOperatorFixer - introduction (SpacePossum) -* feature #4778 UseArrowFunctionsFixer - introduction (gharlan) -* feature #4790 ArrayPushFixer - introduction (SpacePossum) -* feature #4800 NoUnneededFinalMethodFixer - Add "private_methods" option (SpacePossum) -* feature #4831 BlankLineBeforeStatementFixer - add yield from (SpacePossum) -* feature #4832 NoUnneededControlParenthesesFixer - add yield from (SpacePossum) -* feature #4863 NoTrailingWhitespaceInStringFixer - introduction (gharlan) -* feature #4875 ClassAttributesSeparationFixer - add option for no new lines between properties (adri, ruudk) -* feature #4880 HeredocIndentationFixer - config option for indentation level (gharlan) -* feature #4908 PhpUnitExpectationFixer - update for Phpunit 8.4 (ktomk) -* feature #4942 OrderedClassElementsFixer - added support for abstract method sorting (carlalexander, SpacePossum) -* feature #4947 NativeConstantInvocation - Add "PHP_INT_SIZE" to SF rule set (kubawerlos) -* feature #4953 Add support for custom differ (paulhenri-l, SpacePossum) -* feature #5264 CleanNamespaceFixer - Introduction (SpacePossum) -* feature #5280 NoUselessSprintfFixer - Introduction (SpacePossum) -* minor #4634 Make all options snake_case (kubawerlos) -* minor #4667 PhpUnitOrderedCoversFixer - stop using deprecated fixer (keradus) -* minor #4673 FinalStaticAccessFixer - deprecate (julienfalque) -* minor #4762 Rename simple_lambda_call to regular_callable_call (julienfalque) -* minor #4782 Update RuleSets (SpacePossum) -* minor #4802 Master cleanup (SpacePossum) -* minor #4828 Deprecate Config::create() (DocFX) -* minor #4872 Update RuleSet SF and PHP-CS-Fixer with new config for `no_extra_blan… (SpacePossum) -* minor #4900 Move "no_trailing_whitespace_in_string" to SF ruleset. (SpacePossum) -* minor #4903 Docs: extend regular_callable_call rule docs (keradus, SpacePossum) -* minor #4910 Add use_arrow_functions rule to PHP74Migration:risky set (keradus) -* minor #5025 PhpUnitDedicateAssertInternalTypeFixer - deprecate "target" option (kubawerlos) -* minor #5037 FinalInternalClassFixer- Rename option (SpacePossum) -* minor #5093 LambdaNotUsedImportFixer - add heredoc test (SpacePossum) -* minor #5163 Fix CS (SpacePossum) -* minor #5169 PHP8 care package master (SpacePossum) -* minor #5186 Fix tests (SpacePossum) -* minor #5192 GotoLabelAnalyzer - introduction (SpacePossum) -* minor #5230 Fix: Reference (localheinz) -* minor #5240 PHP8 - Allow trailing comma in parameter list support (SpacePossum) -* minor #5244 Fix 2.17 build (keradus) -* minor #5251 PHP8 - match support (SpacePossum) -* minor #5252 Update RuleSets (SpacePossum) -* minor #5278 PHP8 constructor property promotion support (SpacePossum) -* minor #5284 PHP8 - Attribute support (SpacePossum) -* 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 ----------------------- - -* minor #5314 Enable testing with PHPUnit 9.x (sanmai) -* minor #5338 clean ups (SpacePossum) -* minor #5339 NoEmptyStatementFixer - fix more cases (SpacePossum) -* minor #5340 NamedArgumentTransformer - Introduction (SpacePossum) -* minor #5344 Update docs: do not use deprecated create method (SpacePossum) -* minor #5356 RuleSet description fixes (SpacePossum) -* minor #5360 DX: clean up detectIndent methods (kubawerlos) -* minor #5370 DX: update PHPUnit usage to use external Prophecy trait and solve warning (keradus) -* minor #5373 DX: MagicMethodCasingFixerTest - fix test case description (keradus) -* minor #5374 DX: PhpUnitDedicateAssertInternalTypeFixer - add code sample for non-default config (keradus) - -Changelog for v2.16.9 ---------------------- - -* bug #5095 Annotation - fix for Windows line endings (SpacePossum) -* bug #5221 NoSuperfluousPhpdocTagsFixer - fix for single line PHPDoc (kubawerlos) -* bug #5225 TernaryOperatorSpacesFixer - fix for alternative control structures (kubawerlos) -* bug #5235 ArrayIndentationFixer - fix for nested arrays (kubawerlos) -* bug #5248 NoBreakCommentFixer - fix throw detect (SpacePossum) -* bug #5250 SwitchAnalyzer - fix for semicolon after case/default (kubawerlos) -* bug #5253 IO - fix cache info message (SpacePossum) -* bug #5273 Fix PHPDoc line span fixer when property has array typehint (ossinkine) -* bug #5274 TernaryToNullCoalescingFixer - concat precedence fix (SpacePossum) -* feature #5216 Add RuleSets to docs (SpacePossum) -* minor #5226 Applied CS fixes from 2.17-dev (GrahamCampbell) -* minor #5229 Fixed incorrect phpdoc (GrahamCampbell) -* minor #5231 CS: unify styling with younger branches (keradus) -* minor #5232 PHP8 - throw expression support (SpacePossum) -* minor #5233 DX: simplify check_file_permissions.sh (kubawerlos) -* minor #5236 Improve handling of unavailable code samples (julienfalque, keradus) -* minor #5239 PHP8 - Allow trailing comma in parameter list support (SpacePossum) -* minor #5254 PHP8 - mixed type support (SpacePossum) -* minor #5255 Tests: do not skip documentation test (keradus) -* minor #5256 Docs: phpdoc_to_return_type - add new example in docs (keradus) -* minor #5261 Do not update Composer twice (sanmai) -* minor #5263 PHP8 support (SpacePossum) -* minor #5266 PhpUnitTestCaseStaticMethodCallsFixer - PHPUnit 9.x support (sanmai) -* minor #5267 Improve InstallViaComposerTest (sanmai) -* minor #5268 Add GitHub Workflows CI, including testing on PHP 8 and on macOS/Windows/Ubuntu (sanmai) -* minor #5269 Prep work to migrate to PHPUnit 9.x (sanmai, keradus) -* minor #5275 remove not supported verbose options (SpacePossum) -* minor #5276 PHP8 - add NoUnreachableDefaultArgumentValueFixer to risky set (SpacePossum) -* minor #5277 PHP8 - Constructor Property Promotion support (SpacePossum) -* minor #5292 Disable blank issue template and expose community chat (keradus) -* minor #5293 Add documentation to "yoda_style" sniff to convert Yoda style to non-Yoda style (Luc45) -* minor #5295 Run static code analysis off GitHub Actions (sanmai) -* minor #5298 Add yamllint workflow, validates .yaml files (sanmai) -* minor #5302 SingleLineCommentStyleFixer - do not fix possible attributes (PHP8) (SpacePossum) -* minor #5303 Drop CircleCI and AppVeyor (keradus) -* minor #5304 DX: rename TravisTest, as we no longer test only Travis there (keradus) -* minor #5305 Groom GitHub CI and move some checks from TravisCI to GitHub CI (keradus) -* minor #5308 Only run yamllint when a YAML file is changed (julienfalque, keradus) -* minor #5309 CICD: create yamllint config file (keradus) -* minor #5311 OrderedClassElementsFixer - PHPUnit Bridge support (ktomk) -* minor #5316 PHP8 - Attribute support (SpacePossum) -* minor #5321 DX: little code grooming (keradus) - -Changelog for v2.16.8 ---------------------- - -* bug #5325 NoBreakCommentFixer - better throw handling (SpacePossum) -* bug #5327 StaticLambdaFixer - fix for arrow function used in class with $this (kubawerlos, SpacePossum) -* bug #5333 Fix file missing for php8 (jderusse) -* minor #5328 Fixed deprecation message version (GrahamCampbell) -* minor #5330 DX: cleanup Github Actions configs (kubawerlos) - -Changelog for v2.16.5 ---------------------- - -* bug #4378 PhpUnitNoExpectationAnnotationFixer - annotation in single line doc comment (kubawerlos) -* bug #4936 HeaderCommentFixer - Fix unexpected removal of regular comments (julienfalque) -* bug #5006 PhpdocToParamTypeFixer - fix for breaking PHP syntax for type having reserved name (kubawerlos) -* bug #5016 NoSuperfluousPhpdocTagsFixer - fix for @return with @inheritDoc in description (kubawerlos) -* bug #5017 PhpdocTrimConsecutiveBlankLineSeparationFixer - must run after AlignMultilineCommentFixer (kubawerlos) -* bug #5032 SingleLineAfterImportsFixer - fix for line after import (and before another import) already added using CRLF (kubawerlos) -* bug #5033 VoidReturnFixer - must run after NoSuperfluousPhpdocTagsFixer (kubawerlos) -* bug #5038 HelpCommandTest - toString nested array (SpacePossum) -* bug #5040 LinebreakAfterOpeningTagFixer - do not change code if linebreak already present (kubawerlos) -* bug #5044 StandardizeIncrementFixer - fix handling static properties (kubawerlos) -* bug #5045 BacktickToShellExecFixer - add priority relation to NativeFunctionInvocationFixer and SingleQuoteFixer (kubawerlos) -* bug #5054 PhpdocTypesFixer - fix for multidimensional array (kubawerlos) -* bug #5065 TernaryOperatorSpacesFixer - fix for discovering ":" correctly (kubawerlos) -* bug #5068 Fixed php-cs-fixer crashes on input file syntax error (GrahamCampbell) -* bug #5087 NoAlternativeSyntaxFixer - add support for switch and declare (SpacePossum) -* bug #5092 PhpdocToParamTypeFixer - remove not used option (SpacePossum) -* bug #5105 ClassKeywordRemoveFixer - fix for fully qualified class (kubawerlos) -* bug #5113 TernaryOperatorSpacesFixer - handle goto labels (SpacePossum) -* bug #5124 Fix TernaryToNullCoalescingFixer when dealing with object properties (HypeMC) -* bug #5137 DoctrineAnnotationSpacesFixer - fix for typed properties (kubawerlos) -* bug #5180 Always lint test cases with the stricter process linter (GrahamCampbell) -* bug #5190 PhpUnit*Fixers - Only fix in unit test class scope (SpacePossum) -* bug #5195 YodaStyle - statements in braces should be treated as variables in strict … (SpacePossum) -* bug #5220 NoUnneededFinalMethodFixer - do not fix private constructors (SpacePossum) -* feature #3475 Rework documentation (julienfalque, SpacePossum) -* feature #5166 PHP8 (SpacePossum) -* minor #4878 ArrayIndentationFixer - refactor (julienfalque) -* minor #5031 CI: skip_cleanup: true (keradus) -* minor #5035 PhpdocToParamTypeFixer - Rename attribute (SpacePossum) -* minor #5048 Allow composer/semver ^2.0 and ^3.0 (thomasvargiu) -* minor #5050 DX: moving integration test for braces, indentation_type and no_break_comment into right place (kubawerlos) -* minor #5051 DX: move all tests from AutoReview\FixerTest to Test\AbstractFixerTestCase (kubawerlos) -* minor #5053 DX: cleanup FunctionTypehintSpaceFixer (kubawerlos) -* minor #5056 DX: add missing priority test for indentation_type and phpdoc_indent (kubawerlos) -* minor #5077 DX: add missing priority test between NoUnsetCastFixer and BinaryOperatorSpacesFixer (kubawerlos) -* minor #5083 Update composer.json to prevent issue #5030 (mvorisek) -* minor #5088 NoBreakCommentFixer - NoUselessElseFixer - priority test (SpacePossum) -* minor #5100 Fixed invalid PHP 5.6 syntax (GrahamCampbell) -* minor #5106 Symfony's finder already ignores vcs and dot files by default (GrahamCampbell) -* minor #5112 DX: check file permissions (kubawerlos, SpacePossum) -* minor #5122 Show runtime PHP version (kubawerlos) -* minor #5132 Do not allow assignments in if statements (SpacePossum) -* minor #5133 RuleSetTest - Early return for boolean and detect more defaults (SpacePossum) -* minor #5139 revert some unneeded exclusions (SpacePossum) -* minor #5148 Upgrade Xcode (kubawerlos) -* minor #5149 NoUnsetOnPropertyFixer - risky description tweaks (SpacePossum) -* minor #5161 minors (SpacePossum) -* minor #5170 Fix test on PHP8 (SpacePossum) -* minor #5172 Remove accidentally inserted newlines (GrahamCampbell) -* minor #5173 Fix PHP8 RuleSet inherit (SpacePossum) -* minor #5174 Corrected linting error messages (GrahamCampbell) -* minor #5177 PHP8 (SpacePossum) -* minor #5178 Fix tests (SpacePossum) -* minor #5184 [FinalStaticAccessFixer] Handle new static() in final class (localheinz) -* minor #5188 DX: Update sibling debs to version supporting PHP8/PHPUnit9 (keradus) -* minor #5189 Create temporary linting file in system temp dir (keradus) -* minor #5191 MethodArgumentSpaceFixer - support use/import of anonymous functions. (undefinedor) -* minor #5193 DX: add AbstractPhpUnitFixer (kubawerlos) -* minor #5204 DX: cleanup NullableTypeTransformerTest (kubawerlos) -* minor #5207 Add © for logo (keradus) -* minor #5208 DX: cleanup php-cs-fixer entry file (keradus) -* minor #5210 CICD - temporarily disable problematic test (keradus) -* minor #5211 CICD: fix file permissions (keradus) -* minor #5213 DX: move report schemas to dedicated dir (keradus) -* minor #5214 CICD: fix file permissions (keradus) -* minor #5215 CICD: update checkbashisms (keradus) -* minor #5217 CICD: use Composer v2 and drop hirak/prestissimo plugin (keradus) -* minor #5218 DX: .gitignore - add .phpunit.result.cache (keradus) -* minor #5222 Upgrade Xcode (kubawerlos) -* minor #5223 Docs: regenerate docs on 2.16 line (keradus) - -Changelog for v2.16.4 ---------------------- - -* bug #3893 Fix handling /** and */ on the same line as the first and/or last annotation (dmvdbrugge) -* bug #4919 PhpUnitTestAnnotationFixer - fix function starting with "test" and having lowercase letter after (kubawerlos) -* bug #4929 YodaStyleFixer - handling equals empty array (kubawerlos) -* bug #4934 YodaStyleFixer - fix for conditions weird are (kubawerlos) -* bug #4958 OrderedImportsFixer - fix for trailing comma in group (kubawerlos) -* bug #4959 BlankLineBeforeStatementFixer - handle comment case (SpacePossum) -* bug #4962 MethodArgumentSpaceFixer - must run after MethodChainingIndentationFixer (kubawerlos) -* bug #4963 PhpdocToReturnTypeFixer - fix for breaking PHP syntax for type having reserved name (kubawerlos, Slamdunk) -* bug #4978 ArrayIndentationFixer - must run after MethodArgumentSpaceFixer (kubawerlos) -* bug #4994 FinalInternalClassFixer - must run before ProtectedToPrivateFixer (kubawerlos) -* bug #4996 NoEmptyCommentFixer - handle multiline comments (kubawerlos) -* bug #4999 BlankLineBeforeStatementFixer - better comment handling (SpacePossum) -* bug #5009 NoEmptyCommentFixer - better handle comments sequence (kubawerlos) -* bug #5010 SimplifiedNullReturnFixer - must run before VoidReturnFixer (kubawerlos) -* bug #5011 SingleClassElementPerStatementFixer - must run before ClassAttributesSeparationFixer (kubawerlos) -* bug #5012 StrictParamFixer - must run before NativeFunctionInvocationFixer (kubawerlos) -* bug #5014 PhpdocToParamTypeFixer - fix for void as param (kubawerlos) -* bug #5018 PhpdocScalarFixer - fix for comment with Windows line endings (kubawerlos) -* bug #5029 SingleLineAfterImportsFixer - fix for line after import already added using CRLF (kubawerlos) -* minor #4904 Increase PHPStan level to 8 with strict rules (julienfalque) -* minor #4920 Enhancement: Use DocBlock itself to make it multi-line (localheinz) -* minor #4930 DX: ensure PhpUnitNamespacedFixer handles all classes (kubawerlos) -* minor #4931 DX: add test to ensure each target version in PhpUnitTargetVersion has its set in RuleSet (kubawerlos) -* minor #4932 DX: Travis CI config - fix warnings and infos (kubawerlos) -* minor #4940 Reject empty path (julienfalque) -* minor #4944 Fix grammar (julienfalque) -* minor #4946 Allow "const" option on PHP <7.1 (julienfalque) -* minor #4948 Added describe command to readme (david, 8ctopus) -* minor #4949 Fixed build readme on Windows fails if using Git Bash (Mintty) (8ctopus) -* minor #4954 Config - Trim path (julienfalque) -* minor #4957 DX: Check trailing spaces in project files only (ktomk) -* minor #4961 Assert all project source files are monolithic. (SpacePossum) -* minor #4964 Fix PHPStan baseline (julienfalque) -* minor #4965 Fix PHPStan baseline (julienfalque) -* minor #4973 DX: test "isRisky" method in fixer tests, not as auto review (kubawerlos) -* minor #4974 Minor: Fix typo (ktomk) -* minor #4975 Revert PHPStan level to 5 (julienfalque) -* minor #4976 Add instructions for PHPStan (julienfalque) -* minor #4980 Introduce new issue templates (julienfalque) -* minor #4981 Prevent error in CTTest::testConstants (for PHP8) (guilliamxavier) -* minor #4982 Remove PHIVE (kubawerlos) -* minor #4985 Fix tests with Symfony 5.1 (julienfalque) -* minor #4987 PhpdocAnnotationWithoutDotFixer - handle unicode characters using mb_* (SpacePossum) -* minor #5008 Enhancement: Social justification applied (gbyrka-fingo) -* minor #5023 Fix issue templates (kubawerlos) -* minor #5024 DX: add missing non-default code samples (kubawerlos) - -Changelog for v2.16.3 ---------------------- - -* bug #4915 Fix handling property PHPDocs with unsupported type (julienfalque) -* minor #4916 Fix AppVeyor build (julienfalque) -* minor #4917 CircleCI - Bump xcode to 11.4 (GrahamCampbell) -* minor #4918 DX: do not fix ".phpt" files by default (kubawerlos) - -Changelog for v2.16.2 ---------------------- - -* bug #3820 Braces - (re)indenting comment issues (SpacePossum) -* bug #3911 PhpdocVarWithoutNameFixer - fix for properties only (dmvdbrugge) -* bug #4601 ClassKeywordRemoveFixer - Fix for namespace (yassine-ah, kubawerlos) -* bug #4630 FullyQualifiedStrictTypesFixer - Ignore partial class names which look like FQCNs (localheinz, SpacePossum) -* bug #4661 ExplicitStringVariableFixer - variables pair if one is already explicit (kubawerlos) -* bug #4675 NonPrintableCharacterFixer - fix for backslash and quotes when changing to escape sequences (kubawerlos) -* bug #4678 TokensAnalyzer::isConstantInvocation - fix for importing multiple classes with single "use" (kubawerlos) -* bug #4682 Fix handling array type declaration in properties (julienfalque) -* bug #4685 Improve Symfony 5 compatibility (keradus) -* bug #4688 TokensAnalyzer::isConstantInvocation - Fix detection for fully qualified return type (julienfalque) -* bug #4689 DeclareStrictTypesFixer - fix for "strict_types" set to "0" (kubawerlos) -* bug #4690 PhpdocVarAnnotationCorrectOrderFixer - fix for multiline `@var` without type (kubawerlos) -* bug #4710 SingleTraitInsertPerStatement - fix formatting for multiline "use" (kubawerlos) -* bug #4711 Ensure that files from "tests" directory in release are autoloaded (kubawerlos) -* bug #4749 TokensAnalyze::isUnaryPredecessorOperator fix for CT::T_ARRAY_INDEX_C… (SpacePossum) -* bug #4759 Add more priority cases (SpacePossum) -* bug #4761 NoSuperfluousElseifFixer - handle single line (SpacePossum) -* bug #4783 NoSuperfluousPhpdocTagsFixer - fix for really big PHPDoc (kubawerlos, mvorisek) -* bug #4787 NoUnneededFinalMethodFixer - Mark as risky (SpacePossum) -* bug #4795 OrderedClassElementsFixer - Fix (SpacePossum) -* bug #4801 GlobalNamespaceImportFixer - fix docblock handling (gharlan) -* bug #4804 TokensAnalyzer::isUnarySuccessorOperator fix for array curly braces (SpacePossum) -* bug #4807 IncrementStyleFixer - handle after ")" (SpacePossum) -* bug #4808 Modernize types casting fixer array curly (SpacePossum) -* bug #4809 Fix "braces" and "method_argument_space" priority (julienfalque) -* bug #4813 BracesFixer - fix invalid code generation on alternative syntax (SpacePossum) -* bug #4822 fix 2 bugs in phpdoc_line_span (lmichelin) -* bug #4823 ReturnAssignmentFixer - repeat fix (SpacePossum) -* bug #4824 NoUnusedImportsFixer - SingleLineAfterImportsFixer - fix priority (SpacePossum) -* bug #4825 GlobalNamespaceImportFixer - do not import global into global (SpacePossum) -* bug #4829 YodaStyleFixer - fix precedence for T_MOD_EQUAL and T_COALESCE_EQUAL (SpacePossum) -* bug #4830 TernaryToNullCoalescingFixer - handle yield from (SpacePossum) -* bug #4835 Remove duplicate "function_to_constant" from RuleSet (SpacePossum) -* bug #4840 LineEndingFixer - T_CLOSE_TAG support, StringLineEndingFixer - T_INLI… (SpacePossum) -* bug #4846 FunctionsAnalyzer - better isGlobalFunctionCall detection (SpacePossum) -* bug #4852 Priority issues (SpacePossum) -* bug #4870 HeaderCommentFixer - do not remove class docs (gharlan) -* bug #4871 NoExtraBlankLinesFixer - handle cases on same line (SpacePossum) -* bug #4895 Fix conflict between header_comment and declare_strict_types (BackEndTea, julienfalque) -* bug #4911 PhpdocSeparationFixer - fix regression with lack of next line (keradus) -* feature #4742 FunctionToConstantFixer - get_class($this) support (SpacePossum) -* minor #4377 CommentsAnalyzer - fix for declare before header comment (kubawerlos) -* minor #4636 DX: do not check for PHPDBG when collecting coverage (kubawerlos) -* minor #4644 Docs: add info about "-vv..." (voku) -* minor #4691 Run Travis CI on stable PHP 7.4 (kubawerlos) -* minor #4693 Increase Travis CI Git clone depth (julienfalque) -* minor #4699 LineEndingFixer - handle "\r\r\n" (kubawerlos) -* minor #4703 NoSuperfluousPhpdocTagsFixer,PhpdocAddMissingParamAnnotationFixer - p… (SpacePossum) -* minor #4707 Fix typos (TysonAndre) -* minor #4712 NoBlankLinesAfterPhpdocFixer — Do not strip newline between docblock and use statements (mollierobbert) -* minor #4715 Enhancement: Install ergebnis/composer-normalize via Phive (localheinz) -* minor #4722 Fix Circle CI build (julienfalque) -* minor #4724 DX: Simplify installing PCOV (kubawerlos) -* minor #4736 NoUnusedImportsFixer - do not match variable name as import (SpacePossum) -* minor #4746 NoSuperfluousPhpdocTagsFixer - Remove for typed properties (PHP 7.4) (ruudk) -* minor #4753 Do not apply any text/.git filters to fixtures (mvorisek) -* minor #4757 Test $expected is used before $input (SpacePossum) -* minor #4758 Autoreview the PHPDoc of *Fixer::getPriority based on the priority map (SpacePossum) -* minor #4765 Add test on some return types (SpacePossum) -* minor #4766 Remove false test skip (SpacePossum) -* minor #4767 Remove useless priority comments (kubawerlos) -* minor #4769 DX: add missing priority tests (kubawerlos) -* minor #4772 NoUnneededFinalMethodFixer - update description (kubawerlos) -* minor #4774 DX: simplify Utils::camelCaseToUnderscore (kubawerlos) -* minor #4781 NoUnneededCurlyBracesFixer - handle namespaces (SpacePossum) -* minor #4784 Travis CI - Use multiple keyservers (ktomk) -* minor #4785 Improve static analysis (enumag) -* minor #4788 Configurable fixers code sample (SpacePossum) -* minor #4791 Increase PHPStan level to 3 (julienfalque) -* minor #4797 clean ups (SpacePossum) -* minor #4803 FinalClassFixer - Doctrine\ORM\Mapping as ORM alias should not be required (localheinz) -* minor #4839 2.15 - clean ups (SpacePossum) -* minor #4842 ReturnAssignmentFixer - Support more cases (julienfalque) -* minor #4843 NoSuperfluousPhpdocTagsFixer - fix typo in option description (OndraM) -* minor #4844 Same requirements for descriptions (SpacePossum) -* minor #4849 Increase PHPStan level to 5 (julienfalque) -* minor #4850 Fix phpstan (SpacePossum) -* minor #4857 Fixed the unit tests (GrahamCampbell) -* minor #4865 Use latest xcode image (GrahamCampbell) -* minor #4892 CombineNestedDirnameFixer - Add space after comma (julienfalque) -* minor #4894 DX: PhpdocToParamTypeFixer - improve typing (keradus) -* minor #4898 FixerTest - yield the data in AutoReview (Nyholm) -* minor #4899 Fix exception message format for fabbot.io (SpacePossum) -* minor #4905 Support composer v2 installed.json files (GrahamCampbell) -* minor #4906 CI: use Composer stable release for AppVeyor (kubawerlos) -* minor #4909 DX: HeaderCommentFixer - use non-aliased version of option name in code (keradus) -* minor #4912 CI: Fix AppVeyor integration (keradus) - -Changelog for v2.16.1 ---------------------- - -* bug #4476 FunctionsAnalyzer - add "isTheSameClassCall" for correct verifying of function calls (kubawerlos) -* bug #4605 PhpdocToParamTypeFixer - cover more cases (keradus, julienfalque) -* bug #4626 FinalPublicMethodForAbstractClassFixer - Do not attempt to mark abstract public methods as final (localheinz) -* bug #4632 NullableTypeDeclarationForDefaultNullValueFixer - fix for not lowercase "null" (kubawerlos) -* bug #4638 Ensure compatibility with PHP 7.4 (julienfalque) -* bug #4641 Add typed properties test to VisibilityRequiredFixerTest (GawainLynch, julienfalque) -* bug #4654 ArrayIndentationFixer - Fix array indentation for multiline values (julienfalque) -* bug #4660 TokensAnalyzer::isConstantInvocation - fix for extending multiple interfaces (kubawerlos) -* bug #4668 TokensAnalyzer::isConstantInvocation - fix for interface method return type (kubawerlos) -* minor #4608 Allow Symfony 5 components (l-vo) -* minor #4622 Disallow PHP 7.4 failures on Travis CI (julienfalque) -* minor #4623 README - Mark up as code (localheinz) -* minor #4637 PHP 7.4 integration test (GawainLynch, julienfalque) -* minor #4643 DX: Update .gitattributes and move ci-integration.sh to root of the project (kubawerlos, keradus) -* minor #4645 Check PHP extensions on runtime (kubawerlos) -* minor #4655 Improve docs - README (mvorisek) -* minor #4662 DX: generate headers in README.rst (kubawerlos) -* minor #4669 Enable execution under PHP 7.4 (keradus) -* minor #4670 TravisTest - rewrite tests to allow last supported by tool PHP version to be snapshot (keradus) -* minor #4671 TravisTest - rewrite tests to allow last supported by tool PHP version to be snapshot (keradus) - -Changelog for v2.16.0 ---------------------- - -* feature #3810 PhpdocLineSpanFixer - Introduction (BackEndTea) -* feature #3928 Add FinalPublicMethodForAbstractClassFixer (Slamdunk) -* feature #4000 FinalStaticAccessFixer - Introduction (ntzm) -* feature #4275 Issue #4274: Let lowercase_constants directive to be configurable. (drupol) -* feature #4355 GlobalNamespaceImportFixer - Introduction (gharlan) -* feature #4358 SelfStaticAccessorFixer - Introduction (SpacePossum) -* feature #4385 CommentToPhpdocFixer - allow to ignore tags (kubawerlos) -* feature #4401 Add NullableTypeDeclarationForDefaultNullValueFixer (HypeMC) -* feature #4452 Add SingleLineThrowFixer (kubawerlos) -* feature #4500 NoSuperfluousPhpdocTags - Add remove_inheritdoc option (julienfalque) -* feature #4505 NoSuperfluousPhpdocTagsFixer - allow params that aren't on the signature (azjezz) -* feature #4531 PhpdocAlignFixer - add "property-read" and "property-write" to allowed tags (kubawerlos) -* feature #4583 Phpdoc to param type fixer rebase (jg-development) -* minor #4033 Raise deprecation warnings on usage of deprecated aliases (ntzm) -* minor #4423 DX: update branch alias (keradus) -* minor #4537 SelfStaticAccessor - extend itests (keradus) -* minor #4607 Configure no_superfluous_phpdoc_tags for Symfony (keradus) -* minor #4618 DX: fix usage of deprecated options (0x450x6c) -* minor #4619 Fix PHP 7.3 strict mode warnings (keradus) -* minor #4621 Add single_line_throw to Symfony ruleset (keradus) - -Changelog for v2.15.10 ----------------------- - -* bug #5095 Annotation - fix for Windows line endings (SpacePossum) -* bug #5221 NoSuperfluousPhpdocTagsFixer - fix for single line PHPDoc (kubawerlos) -* bug #5225 TernaryOperatorSpacesFixer - fix for alternative control structures (kubawerlos) -* bug #5235 ArrayIndentationFixer - fix for nested arrays (kubawerlos) -* bug #5248 NoBreakCommentFixer - fix throw detect (SpacePossum) -* bug #5250 SwitchAnalyzer - fix for semicolon after case/default (kubawerlos) -* bug #5253 IO - fix cache info message (SpacePossum) -* bug #5274 TernaryToNullCoalescingFixer - concat precedence fix (SpacePossum) -* feature #5216 Add RuleSets to docs (SpacePossum) -* minor #5226 Applied CS fixes from 2.17-dev (GrahamCampbell) -* minor #5229 Fixed incorrect phpdoc (GrahamCampbell) -* minor #5231 CS: unify styling with younger branches (keradus) -* minor #5232 PHP8 - throw expression support (SpacePossum) -* minor #5233 DX: simplify check_file_permissions.sh (kubawerlos) -* minor #5236 Improve handling of unavailable code samples (julienfalque, keradus) -* minor #5239 PHP8 - Allow trailing comma in parameter list support (SpacePossum) -* minor #5254 PHP8 - mixed type support (SpacePossum) -* minor #5255 Tests: do not skip documentation test (keradus) -* minor #5261 Do not update Composer twice (sanmai) -* minor #5263 PHP8 support (SpacePossum) -* minor #5266 PhpUnitTestCaseStaticMethodCallsFixer - PHPUnit 9.x support (sanmai) -* minor #5267 Improve InstallViaComposerTest (sanmai) -* minor #5276 PHP8 - add NoUnreachableDefaultArgumentValueFixer to risky set (SpacePossum) - -Changelog for v2.15.9 ---------------------- - -* bug #4378 PhpUnitNoExpectationAnnotationFixer - annotation in single line doc comment (kubawerlos) -* bug #4936 HeaderCommentFixer - Fix unexpected removal of regular comments (julienfalque) -* bug #5017 PhpdocTrimConsecutiveBlankLineSeparationFixer - must run after AlignMultilineCommentFixer (kubawerlos) -* bug #5033 VoidReturnFixer - must run after NoSuperfluousPhpdocTagsFixer (kubawerlos) -* bug #5038 HelpCommandTest - toString nested array (SpacePossum) -* bug #5040 LinebreakAfterOpeningTagFixer - do not change code if linebreak already present (kubawerlos) -* bug #5044 StandardizeIncrementFixer - fix handling static properties (kubawerlos) -* bug #5045 BacktickToShellExecFixer - add priority relation to NativeFunctionInvocationFixer and SingleQuoteFixer (kubawerlos) -* bug #5054 PhpdocTypesFixer - fix for multidimensional array (kubawerlos) -* bug #5065 TernaryOperatorSpacesFixer - fix for discovering ":" correctly (kubawerlos) -* bug #5068 Fixed php-cs-fixer crashes on input file syntax error (GrahamCampbell) -* bug #5087 NoAlternativeSyntaxFixer - add support for switch and declare (SpacePossum) -* bug #5105 ClassKeywordRemoveFixer - fix for fully qualified class (kubawerlos) -* bug #5113 TernaryOperatorSpacesFixer - handle goto labels (SpacePossum) -* bug #5124 Fix TernaryToNullCoalescingFixer when dealing with object properties (HypeMC) -* bug #5137 DoctrineAnnotationSpacesFixer - fix for typed properties (kubawerlos) -* bug #5180 Always lint test cases with the stricter process linter (GrahamCampbell) -* bug #5190 PhpUnit*Fixers - Only fix in unit test class scope (SpacePossum) -* bug #5195 YodaStyle - statements in braces should be treated as variables in strict … (SpacePossum) -* bug #5220 NoUnneededFinalMethodFixer - do not fix private constructors (SpacePossum) -* feature #3475 Rework documentation (julienfalque, SpacePossum) -* feature #5166 PHP8 (SpacePossum) -* minor #4878 ArrayIndentationFixer - refactor (julienfalque) -* minor #5031 CI: skip_cleanup: true (keradus) -* minor #5048 Allow composer/semver ^2.0 and ^3.0 (thomasvargiu) -* minor #5050 DX: moving integration test for braces, indentation_type and no_break_comment into right place (kubawerlos) -* minor #5051 DX: move all tests from AutoReview\FixerTest to Test\AbstractFixerTestCase (kubawerlos) -* minor #5053 DX: cleanup FunctionTypehintSpaceFixer (kubawerlos) -* minor #5056 DX: add missing priority test for indentation_type and phpdoc_indent (kubawerlos) -* minor #5077 DX: add missing priority test between NoUnsetCastFixer and BinaryOperatorSpacesFixer (kubawerlos) -* minor #5083 Update composer.json to prevent issue #5030 (mvorisek) -* minor #5088 NoBreakCommentFixer - NoUselessElseFixer - priority test (SpacePossum) -* minor #5100 Fixed invalid PHP 5.6 syntax (GrahamCampbell) -* minor #5106 Symfony's finder already ignores vcs and dot files by default (GrahamCampbell) -* minor #5112 DX: check file permissions (kubawerlos, SpacePossum) -* minor #5122 Show runtime PHP version (kubawerlos) -* minor #5132 Do not allow assignments in if statements (SpacePossum) -* minor #5133 RuleSetTest - Early return for boolean and detect more defaults (SpacePossum) -* minor #5139 revert some unneeded exclusions (SpacePossum) -* minor #5148 Upgrade Xcode (kubawerlos) -* minor #5149 NoUnsetOnPropertyFixer - risky description tweaks (SpacePossum) -* minor #5161 minors (SpacePossum) -* minor #5172 Remove accidentally inserted newlines (GrahamCampbell) -* minor #5173 Fix PHP8 RuleSet inherit (SpacePossum) -* minor #5174 Corrected linting error messages (GrahamCampbell) -* minor #5177 PHP8 (SpacePossum) -* minor #5188 DX: Update sibling debs to version supporting PHP8/PHPUnit9 (keradus) -* minor #5189 Create temporary linting file in system temp dir (keradus) -* minor #5191 MethodArgumentSpaceFixer - support use/import of anonymous functions. (undefinedor) -* minor #5193 DX: add AbstractPhpUnitFixer (kubawerlos) -* minor #5204 DX: cleanup NullableTypeTransformerTest (kubawerlos) -* minor #5207 Add © for logo (keradus) -* minor #5208 DX: cleanup php-cs-fixer entry file (keradus) -* minor #5210 CICD - temporarily disable problematic test (keradus) -* minor #5211 CICD: fix file permissions (keradus) -* minor #5213 DX: move report schemas to dedicated dir (keradus) -* minor #5214 CICD: fix file permissions (keradus) -* minor #5215 CICD: update checkbashisms (keradus) -* minor #5217 CICD: use Composer v2 and drop hirak/prestissimo plugin (keradus) -* minor #5218 DX: .gitignore - add .phpunit.result.cache (keradus) -* minor #5222 Upgrade Xcode (kubawerlos) - -Changelog for v2.15.8 ---------------------- - -* bug #3893 Fix handling /** and */ on the same line as the first and/or last annotation (dmvdbrugge) -* bug #4919 PhpUnitTestAnnotationFixer - fix function starting with "test" and having lowercase letter after (kubawerlos) -* bug #4929 YodaStyleFixer - handling equals empty array (kubawerlos) -* bug #4934 YodaStyleFixer - fix for conditions weird are (kubawerlos) -* bug #4958 OrderedImportsFixer - fix for trailing comma in group (kubawerlos) -* bug #4959 BlankLineBeforeStatementFixer - handle comment case (SpacePossum) -* bug #4962 MethodArgumentSpaceFixer - must run after MethodChainingIndentationFixer (kubawerlos) -* bug #4963 PhpdocToReturnTypeFixer - fix for breaking PHP syntax for type having reserved name (kubawerlos, Slamdunk) -* bug #4978 ArrayIndentationFixer - must run after MethodArgumentSpaceFixer (kubawerlos) -* bug #4994 FinalInternalClassFixer - must run before ProtectedToPrivateFixer (kubawerlos) -* bug #4996 NoEmptyCommentFixer - handle multiline comments (kubawerlos) -* bug #4999 BlankLineBeforeStatementFixer - better comment handling (SpacePossum) -* bug #5009 NoEmptyCommentFixer - better handle comments sequence (kubawerlos) -* bug #5010 SimplifiedNullReturnFixer - must run before VoidReturnFixer (kubawerlos) -* bug #5011 SingleClassElementPerStatementFixer - must run before ClassAttributesSeparationFixer (kubawerlos) -* bug #5012 StrictParamFixer - must run before NativeFunctionInvocationFixer (kubawerlos) -* bug #5029 SingleLineAfterImportsFixer - fix for line after import already added using CRLF (kubawerlos) -* minor #4904 Increase PHPStan level to 8 with strict rules (julienfalque) -* minor #4930 DX: ensure PhpUnitNamespacedFixer handles all classes (kubawerlos) -* minor #4931 DX: add test to ensure each target version in PhpUnitTargetVersion has its set in RuleSet (kubawerlos) -* minor #4932 DX: Travis CI config - fix warnings and infos (kubawerlos) -* minor #4940 Reject empty path (julienfalque) -* minor #4944 Fix grammar (julienfalque) -* minor #4946 Allow "const" option on PHP <7.1 (julienfalque) -* minor #4948 Added describe command to readme (david, 8ctopus) -* minor #4949 Fixed build readme on Windows fails if using Git Bash (Mintty) (8ctopus) -* minor #4954 Config - Trim path (julienfalque) -* minor #4957 DX: Check trailing spaces in project files only (ktomk) -* minor #4961 Assert all project source files are monolithic. (SpacePossum) -* minor #4964 Fix PHPStan baseline (julienfalque) -* minor #4973 DX: test "isRisky" method in fixer tests, not as auto review (kubawerlos) -* minor #4974 Minor: Fix typo (ktomk) -* minor #4975 Revert PHPStan level to 5 (julienfalque) -* minor #4976 Add instructions for PHPStan (julienfalque) -* minor #4980 Introduce new issue templates (julienfalque) -* minor #4981 Prevent error in CTTest::testConstants (for PHP8) (guilliamxavier) -* minor #4982 Remove PHIVE (kubawerlos) -* minor #4985 Fix tests with Symfony 5.1 (julienfalque) -* minor #4987 PhpdocAnnotationWithoutDotFixer - handle unicode characters using mb_* (SpacePossum) -* minor #5008 Enhancement: Social justification applied (gbyrka-fingo) -* minor #5023 Fix issue templates (kubawerlos) -* minor #5024 DX: add missing non-default code samples (kubawerlos) - -Changelog for v2.15.7 ---------------------- - -* bug #4915 Fix handling property PHPDocs with unsupported type (julienfalque) -* minor #4916 Fix AppVeyor build (julienfalque) -* minor #4917 CircleCI - Bump xcode to 11.4 (GrahamCampbell) -* minor #4918 DX: do not fix ".phpt" files by default (kubawerlos) - -Changelog for v2.15.6 ---------------------- - -* bug #3820 Braces - (re)indenting comment issues (SpacePossum) -* bug #3911 PhpdocVarWithoutNameFixer - fix for properties only (dmvdbrugge) -* bug #4601 ClassKeywordRemoveFixer - Fix for namespace (yassine-ah, kubawerlos) -* bug #4630 FullyQualifiedStrictTypesFixer - Ignore partial class names which look like FQCNs (localheinz, SpacePossum) -* bug #4661 ExplicitStringVariableFixer - variables pair if one is already explicit (kubawerlos) -* bug #4675 NonPrintableCharacterFixer - fix for backslash and quotes when changing to escape sequences (kubawerlos) -* bug #4678 TokensAnalyzer::isConstantInvocation - fix for importing multiple classes with single "use" (kubawerlos) -* bug #4682 Fix handling array type declaration in properties (julienfalque) -* bug #4685 Improve Symfony 5 compatibility (keradus) -* bug #4688 TokensAnalyzer::isConstantInvocation - Fix detection for fully qualified return type (julienfalque) -* bug #4689 DeclareStrictTypesFixer - fix for "strict_types" set to "0" (kubawerlos) -* bug #4690 PhpdocVarAnnotationCorrectOrderFixer - fix for multiline `@var` without type (kubawerlos) -* bug #4710 SingleTraitInsertPerStatement - fix formatting for multiline "use" (kubawerlos) -* bug #4711 Ensure that files from "tests" directory in release are autoloaded (kubawerlos) -* bug #4749 TokensAnalyze::isUnaryPredecessorOperator fix for CT::T_ARRAY_INDEX_C… (SpacePossum) -* bug #4759 Add more priority cases (SpacePossum) -* bug #4761 NoSuperfluousElseifFixer - handle single line (SpacePossum) -* bug #4783 NoSuperfluousPhpdocTagsFixer - fix for really big PHPDoc (kubawerlos, mvorisek) -* bug #4787 NoUnneededFinalMethodFixer - Mark as risky (SpacePossum) -* bug #4795 OrderedClassElementsFixer - Fix (SpacePossum) -* bug #4804 TokensAnalyzer::isUnarySuccessorOperator fix for array curly braces (SpacePossum) -* bug #4807 IncrementStyleFixer - handle after ")" (SpacePossum) -* bug #4808 Modernize types casting fixer array curly (SpacePossum) -* bug #4809 Fix "braces" and "method_argument_space" priority (julienfalque) -* bug #4813 BracesFixer - fix invalid code generation on alternative syntax (SpacePossum) -* bug #4823 ReturnAssignmentFixer - repeat fix (SpacePossum) -* bug #4824 NoUnusedImportsFixer - SingleLineAfterImportsFixer - fix priority (SpacePossum) -* bug #4829 YodaStyleFixer - fix precedence for T_MOD_EQUAL and T_COALESCE_EQUAL (SpacePossum) -* bug #4830 TernaryToNullCoalescingFixer - handle yield from (SpacePossum) -* bug #4835 Remove duplicate "function_to_constant" from RuleSet (SpacePossum) -* bug #4840 LineEndingFixer - T_CLOSE_TAG support, StringLineEndingFixer - T_INLI… (SpacePossum) -* bug #4846 FunctionsAnalyzer - better isGlobalFunctionCall detection (SpacePossum) -* bug #4852 Priority issues (SpacePossum) -* bug #4870 HeaderCommentFixer - do not remove class docs (gharlan) -* bug #4871 NoExtraBlankLinesFixer - handle cases on same line (SpacePossum) -* bug #4895 Fix conflict between header_comment and declare_strict_types (BackEndTea, julienfalque) -* bug #4911 PhpdocSeparationFixer - fix regression with lack of next line (keradus) -* feature #4742 FunctionToConstantFixer - get_class($this) support (SpacePossum) -* minor #4377 CommentsAnalyzer - fix for declare before header comment (kubawerlos) -* minor #4636 DX: do not check for PHPDBG when collecting coverage (kubawerlos) -* minor #4644 Docs: add info about "-vv..." (voku) -* minor #4691 Run Travis CI on stable PHP 7.4 (kubawerlos) -* minor #4693 Increase Travis CI Git clone depth (julienfalque) -* minor #4699 LineEndingFixer - handle "\r\r\n" (kubawerlos) -* minor #4703 NoSuperfluousPhpdocTagsFixer,PhpdocAddMissingParamAnnotationFixer - p… (SpacePossum) -* minor #4707 Fix typos (TysonAndre) -* minor #4712 NoBlankLinesAfterPhpdocFixer — Do not strip newline between docblock and use statements (mollierobbert) -* minor #4715 Enhancement: Install ergebnis/composer-normalize via Phive (localheinz) -* minor #4722 Fix Circle CI build (julienfalque) -* minor #4724 DX: Simplify installing PCOV (kubawerlos) -* minor #4736 NoUnusedImportsFixer - do not match variable name as import (SpacePossum) -* minor #4746 NoSuperfluousPhpdocTagsFixer - Remove for typed properties (PHP 7.4) (ruudk) -* minor #4753 Do not apply any text/.git filters to fixtures (mvorisek) -* minor #4757 Test $expected is used before $input (SpacePossum) -* minor #4758 Autoreview the PHPDoc of *Fixer::getPriority based on the priority map (SpacePossum) -* minor #4765 Add test on some return types (SpacePossum) -* minor #4766 Remove false test skip (SpacePossum) -* minor #4767 Remove useless priority comments (kubawerlos) -* minor #4769 DX: add missing priority tests (kubawerlos) -* minor #4772 NoUnneededFinalMethodFixer - update description (kubawerlos) -* minor #4774 DX: simplify Utils::camelCaseToUnderscore (kubawerlos) -* minor #4781 NoUnneededCurlyBracesFixer - handle namespaces (SpacePossum) -* minor #4784 Travis CI - Use multiple keyservers (ktomk) -* minor #4785 Improve static analysis (enumag) -* minor #4788 Configurable fixers code sample (SpacePossum) -* minor #4791 Increase PHPStan level to 3 (julienfalque) -* minor #4797 clean ups (SpacePossum) -* minor #4803 FinalClassFixer - Doctrine\ORM\Mapping as ORM alias should not be required (localheinz) -* minor #4839 2.15 - clean ups (SpacePossum) -* minor #4842 ReturnAssignmentFixer - Support more cases (julienfalque) -* minor #4844 Same requirements for descriptions (SpacePossum) -* minor #4849 Increase PHPStan level to 5 (julienfalque) -* minor #4857 Fixed the unit tests (GrahamCampbell) -* minor #4865 Use latest xcode image (GrahamCampbell) -* minor #4892 CombineNestedDirnameFixer - Add space after comma (julienfalque) -* minor #4898 FixerTest - yield the data in AutoReview (Nyholm) -* minor #4899 Fix exception message format for fabbot.io (SpacePossum) -* minor #4905 Support composer v2 installed.json files (GrahamCampbell) -* minor #4906 CI: use Composer stable release for AppVeyor (kubawerlos) -* minor #4909 DX: HeaderCommentFixer - use non-aliased version of option name in code (keradus) -* minor #4912 CI: Fix AppVeyor integration (keradus) - -Changelog for v2.15.5 ---------------------- - -* bug #4476 FunctionsAnalyzer - add "isTheSameClassCall" for correct verifying of function calls (kubawerlos) -* bug #4641 Add typed properties test to VisibilityRequiredFixerTest (GawainLynch, julienfalque) -* bug #4654 ArrayIndentationFixer - Fix array indentation for multiline values (julienfalque) -* bug #4660 TokensAnalyzer::isConstantInvocation - fix for extending multiple interfaces (kubawerlos) -* bug #4668 TokensAnalyzer::isConstantInvocation - fix for interface method return type (kubawerlos) -* minor #4608 Allow Symfony 5 components (l-vo) -* minor #4622 Disallow PHP 7.4 failures on Travis CI (julienfalque) -* minor #4637 PHP 7.4 integration test (GawainLynch, julienfalque) -* minor #4643 DX: Update .gitattributes and move ci-integration.sh to root of the project (kubawerlos, keradus) -* minor #4645 Check PHP extensions on runtime (kubawerlos) -* minor #4655 Improve docs - README (mvorisek) -* minor #4662 DX: generate headers in README.rst (kubawerlos) -* minor #4669 Enable execution under PHP 7.4 (keradus) -* minor #4671 TravisTest - rewrite tests to allow last supported by tool PHP version to be snapshot (keradus) - -Changelog for v2.15.4 ---------------------- - -* bug #4183 IndentationTypeFixer - fix handling 2 spaces indent (kubawerlos) -* bug #4406 NoSuperfluousElseifFixer - fix invalid escape sequence in character class (remicollet, SpacePossum) -* bug #4416 NoUnusedImports - Fix imports detected as used in namespaces (julienfalque, SpacePossum) -* bug #4518 PhpUnitNoExpectationAnnotationFixer - fix handling expect empty exception message (ktomk) -* bug #4548 HeredocIndentationFixer - remove whitespace in empty lines (gharlan) -* bug #4556 ClassKeywordRemoveFixer - fix for self,static and parent keywords (kubawerlos) -* bug #4572 TokensAnalyzer - handle nested anonymous classes (SpacePossum) -* bug #4573 CombineConsecutiveIssetsFixer - fix stop based on precedence (SpacePossum) -* bug #4577 Fix command exit code on lint error after fixing fix. (SpacePossum) -* bug #4581 FunctionsAnalyzer: fix for comment in type (kubawerlos) -* bug #4586 BracesFixer - handle dynamic static method call (SpacePossum) -* bug #4594 Braces - fix both single line comment styles (SpacePossum) -* bug #4609 PhpdocTypesOrderFixer - Prevent unexpected default value change (laurent35240) -* minor #4458 Add PHPStan (julienfalque) -* minor #4479 IncludeFixer - remove braces when the statement is wrapped in block (kubawerlos) -* minor #4490 Allow running if installed as project specific (ticktackk) -* minor #4517 Verify PCRE pattern before use (ktomk) -* minor #4521 Remove superfluous leading backslash, closes 4520 (ktomk) -* minor #4532 DX: ensure data providers are used (kubawerlos) -* minor #4534 Redo PHP7.4 - Add "str_split" => "mb_str_split" mapping (keradus, Slamdunk) -* minor #4536 DX: use PHIVE for dev tools (keradus) -* minor #4538 Docs: update Cookbook (keradus) -* minor #4541 Enhancement: Use default name property to configure command names (localheinz) -* minor #4546 DX: removing unnecessary variable initialization (kubawerlos) -* minor #4549 DX: use ::class whenever possible (keradus, kubawerlos) -* minor #4550 DX: travis_retry for dev-tools install (ktomk, keradus) -* minor #4559 Allow 7.4snapshot to fail due to a bug on it (kubawerlos) -* minor #4563 GitlabReporter - fix report output (mjanser) -* 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 #4584 Increase PHPStan level to 1 (julienfalque) -* minor #4585 Fix deprecation notices (julienfalque) -* minor #4587 Output details - Explain why a file was skipped (SpacePossum) -* minor #4588 Fix STDIN test when path is one level deep (julienfalque) -* minor #4589 PhpdocToReturnType - Add support for Foo[][] (SpacePossum) -* minor #4593 Ensure compatibility with PHP 7.4 typed properties (julienfalque) -* minor #4595 Import cannot be used after `::` so can be removed (SpacePossum) -* minor #4596 Ensure compatibility with PHP 7.4 numeric literal separator (julienfalque) -* minor #4597 Fix PHP 7.4 deprecation notices (julienfalque) -* minor #4600 Ensure compatibility with PHP 7.4 arrow functions (julienfalque) -* minor #4602 Ensure compatibility with PHP 7.4 spread operator in array expression (julienfalque) -* minor #4603 Ensure compatibility with PHP 7.4 null coalescing assignment operator (julienfalque) -* minor #4606 Configure no_superfluous_phpdoc_tags for Symfony (keradus) -* minor #4610 Travis CI - Update known files list (julienfalque) -* minor #4615 Remove workaround for dev-tools install reg. Phive (ktomk) - -Changelog for v2.15.3 ---------------------- - -* bug #4533 Revert PHP7.4 - Add "str_split" => "mb_str_split" mapping (keradus) -* minor #4264 DX: AutoReview - ensure Travis handle all needed PHP versions (keradus) -* minor #4524 MethodArgumentSpaceFixerTest - make explicit configuration to prevent fail on configuration change (keradus) - -Changelog for v2.15.2 ---------------------- - -* bug #4132 BlankLineAfterNamespaceFixer - do not remove indent, handle comments (kubawerlos) -* bug #4384 MethodArgumentSpaceFixer - fix for on_multiline:ensure_fully_multiline with trailing comma in function call (kubawerlos) -* bug #4404 FileLintingIterator - fix current value on end/invalid (SpacePossum) -* bug #4421 FunctionTypehintSpaceFixer - Ensure single space between type declaration and parameter (localheinz) -* bug #4436 MethodArgumentSpaceFixer - handle misplaced ) (keradus) -* bug #4439 NoLeadingImportSlashFixer - Add space if needed (SpacePossum) -* bug #4440 SimpleToComplexStringVariableFixer - Fix $ bug (dmvdbrugge) -* bug #4453 Fix preg_match error on 7.4snapshot (kubawerlos) -* bug #4461 IsNullFixer - fix null coalescing operator handling (linniksa) -* bug #4467 ToolInfo - fix access to reference without checking existence (black-silence) -* bug #4472 Fix non-static closure unbinding this on PHP 7.4 (kelunik) -* minor #3726 Use Box 3 to build the PHAR (theofidry, keradus) -* minor #4412 PHP 7.4 - Tests for support (SpacePossum) -* minor #4431 DX: test that default config is not passed in RuleSet (kubawerlos) -* minor #4433 DX: test to ensure @PHPUnitMigration rule sets are correctly defined (kubawerlos) -* minor #4445 DX: static call of markTestSkippedOrFail (kubawerlos) -* minor #4463 Add apostrophe to possessive "team's" (ChandlerSwift) -* minor #4471 ReadmeCommandTest - use CommandTester (kubawerlos) -* minor #4477 DX: control names of public methods in test's classes (kubawerlos) -* minor #4483 NewWithBracesFixer - Fix object operator and curly brace open cases (SpacePossum) -* minor #4484 fix typos in README (Sven Ludwig) -* minor #4494 DX: Fix shell script syntax in order to fix Travis builds (drupol) -* minor #4516 DX: Lock binary SCA tools versions (keradus) - -Changelog for v2.15.1 ---------------------- - -* bug #4418 PhpUnitNamespacedFixer - properly translate classes which do not follow translation pattern (ktomk) -* bug #4419 PhpUnitTestCaseStaticMethodCallsFixer - skip anonymous classes and lambda (SpacePossum) -* bug #4420 MethodArgumentSpaceFixer - PHP7.3 trailing commas in function calls (SpacePossum) -* minor #4345 Travis: PHP 7.4 isn't allowed to fail anymore (Slamdunk) -* minor #4403 LowercaseStaticReferenceFixer - Fix invalid PHP version in example (HypeMC) -* minor #4424 DX: cleanup of composer.json - no need for branch-alias (keradus) -* minor #4425 DX: assertions are static, adjust custom assertions (keradus) -* minor #4426 DX: handle deprecations of symfony/event-dispatcher:4.3 (keradus) -* minor #4427 DX: stop using reserved T_FN in code samples (keradus) -* minor #4428 DX: update dev-tools (keradus) -* minor #4429 DX: MethodArgumentSpaceFixerTest - fix hidden merge conflict (keradus) - -Changelog for v2.15.0 ---------------------- - -* feature #3927 Add FinalClassFixer (Slamdunk) -* feature #3939 Add PhpUnitSizeClassFixer (Jefersson Nathan) -* feature #3942 SimpleToComplexStringVariableFixer - Introduction (dmvdbrugge, SpacePossum) -* feature #4113 OrderedInterfacesFixer - Introduction (dmvdbrugge) -* feature #4121 SingleTraitInsertPerStatementFixer - Introduction (SpacePossum) -* feature #4126 NativeFunctionTypeDeclarationCasingFixer - Introduction (SpacePossum) -* feature #4167 PhpUnitMockShortWillReturnFixer - Introduction (michadam-pearson) -* feature #4191 [7.3] NoWhitespaceBeforeCommaInArrayFixer - fix comma after heredoc-end (gharlan) -* feature #4288 Add Gitlab Reporter (hco) -* feature #4328 Add PhpUnitDedicateAssertInternalTypeFixer (Slamdunk) -* feature #4341 [7.3] TrailingCommaInMultilineArrayFixer - fix comma after heredoc-end (gharlan) -* feature #4342 [7.3] MethodArgumentSpaceFixer - fix comma after heredoc-end (gharlan) -* minor #4112 NoSuperfluousPhpdocTagsFixer - Add missing code sample, groom tests (keradus, SpacePossum) -* minor #4360 Add gitlab as output format in the README/help doc. (SpacePossum) -* minor #4386 Add PhpUnitMockShortWillReturnFixer to @Symfony:risky rule set (kubawerlos) -* minor #4398 New ruleset "@PHP73Migration" (gharlan) -* minor #4399 Fix 2.15 line (keradus) - -Changelog for v2.14.6 ---------------------- - -* bug #4533 Revert PHP7.4 - Add "str_split" => "mb_str_split" mapping (keradus) -* minor #4264 DX: AutoReview - ensure Travis handle all needed PHP versions (keradus) -* minor #4524 MethodArgumentSpaceFixerTest - make explicit configuration to prevent fail on configuration change (keradus) - -Changelog for v2.14.5 ---------------------- - -* bug #4132 BlankLineAfterNamespaceFixer - do not remove indent, handle comments (kubawerlos) -* bug #4384 MethodArgumentSpaceFixer - fix for on_multiline:ensure_fully_multiline with trailing comma in function call (kubawerlos) -* bug #4404 FileLintingIterator - fix current value on end/invalid (SpacePossum) -* bug #4421 FunctionTypehintSpaceFixer - Ensure single space between type declaration and parameter (localheinz) -* bug #4436 MethodArgumentSpaceFixer - handle misplaced ) (keradus) -* bug #4439 NoLeadingImportSlashFixer - Add space if needed (SpacePossum) -* bug #4453 Fix preg_match error on 7.4snapshot (kubawerlos) -* bug #4461 IsNullFixer - fix null coalescing operator handling (linniksa) -* bug #4467 ToolInfo - fix access to reference without checking existence (black-silence) -* bug #4472 Fix non-static closure unbinding this on PHP 7.4 (kelunik) -* minor #3726 Use Box 3 to build the PHAR (theofidry, keradus) -* minor #4412 PHP 7.4 - Tests for support (SpacePossum) -* minor #4431 DX: test that default config is not passed in RuleSet (kubawerlos) -* minor #4433 DX: test to ensure @PHPUnitMigration rule sets are correctly defined (kubawerlos) -* minor #4445 DX: static call of markTestSkippedOrFail (kubawerlos) -* minor #4463 Add apostrophe to possessive "team's" (ChandlerSwift) -* minor #4471 ReadmeCommandTest - use CommandTester (kubawerlos) -* minor #4477 DX: control names of public methods in test's classes (kubawerlos) -* minor #4483 NewWithBracesFixer - Fix object operator and curly brace open cases (SpacePossum) -* minor #4484 fix typos in README (Sven Ludwig) -* minor #4494 DX: Fix shell script syntax in order to fix Travis builds (drupol) -* minor #4516 DX: Lock binary SCA tools versions (keradus) - -Changelog for v2.14.4 ---------------------- - -* bug #4418 PhpUnitNamespacedFixer - properly translate classes which do not follow translation pattern (ktomk) -* bug #4419 PhpUnitTestCaseStaticMethodCallsFixer - skip anonymous classes and lambda (SpacePossum) -* bug #4420 MethodArgumentSpaceFixer - PHP7.3 trailing commas in function calls (SpacePossum) -* minor #4345 Travis: PHP 7.4 isn't allowed to fail anymore (Slamdunk) -* minor #4403 LowercaseStaticReferenceFixer - Fix invalid PHP version in example (HypeMC) -* minor #4425 DX: assertions are static, adjust custom assertions (keradus) -* minor #4426 DX: handle deprecations of symfony/event-dispatcher:4.3 (keradus) -* minor #4427 DX: stop using reserved T_FN in code samples (keradus) -* minor #4428 DX: update dev-tools (keradus) - -Changelog for v2.14.3 ---------------------- - -* bug #4298 NoTrailingWhitespaceInCommentFixer - fix for non-Unix line separators (kubawerlos) -* bug #4303 FullyQualifiedStrictTypesFixer - Fix the short type detection when a question mark (nullable) is prefixing it. (drupol) -* bug #4313 SelfAccessorFixer - fix for part qualified class name (kubawerlos, SpacePossum) -* bug #4314 PhpUnitTestCaseStaticMethodCallsFixer - fix for having property with name as method to update (kubawerlos, SpacePossum) -* bug #4316 NoUnsetCastFixer - Test for higher-precedence operators (SpacePossum) -* bug #4327 TokensAnalyzer - add concat operator to list of binary operators (SpacePossum) -* bug #4335 Cache - add indent and line ending to cache signature (dmvdbrugge) -* bug #4344 VoidReturnFixer - handle yield from (SpacePossum) -* bug #4346 BracesFixer - Do not pull close tag onto same line as a comment (SpacePossum) -* bug #4350 StrictParamFixer - Don't detect functions in use statements (bolmstedt) -* bug #4357 Fix short list syntax detection. (SpacePossum) -* bug #4365 Fix output escaping of diff for text format when line is not changed (SpacePossum) -* bug #4370 PhpUnitConstructFixer - Fix handle different casing (SpacePossum) -* bug #4379 ExplicitStringVariableFixer - add test case for variable as an array key (kubawerlos, Slamdunk) -* feature #4337 PhpUnitTestCaseStaticMethodCallsFixer - prepare for PHPUnit 8 (kubawerlos) -* minor #3799 DX: php_unit_test_case_static_method_calls - use default config (keradus) -* minor #4103 NoExtraBlankLinesFixer - fix candidate detection (SpacePossum) -* minor #4245 LineEndingFixer - BracesFixer - Priority (dmvdbrugge) -* minor #4325 Use lowercase mikey179/vfsStream in composer.json (lolli42) -* minor #4336 Collect coverage with PCOV (kubawerlos) -* minor #4338 Fix wording (kmvan, kubawerlos) -* minor #4339 Change BracesFixer to avoid indenting PHP inline braces (alecgeatches) -* 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 #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) -* minor #4393 DX: add missing explicit return types (kubawerlos) - -Changelog for v2.14.2 ---------------------- - -* minor #4306 DX: Drop HHVM conflict on Composer level to help Composer with HHVM compatibility, we still prevent HHVM on runtime (keradus) - -Changelog for v2.14.1 ---------------------- - -* bug #4240 ModernizeTypesCastingFixer - fix for operators with higher precedence (kubawerlos) -* bug #4254 PhpUnitDedicateAssertFixer - fix for count with additional operations (kubawerlos) -* bug #4260 Psr0Fixer and Psr4Fixer - fix for multiple classes in file with anonymous class (kubawerlos) -* bug #4262 FixCommand - fix help (keradus) -* bug #4276 MethodChainingIndentationFixer, ArrayIndentationFixer - Fix priority issue (dmvdbrugge) -* bug #4280 MethodArgumentSpaceFixer - Fix method argument alignment (Billz95) -* bug #4286 IncrementStyleFixer - fix for static statement (kubawerlos) -* bug #4291 ArrayIndentationFixer - Fix indentation after trailing spaces (julienfalque, keradus) -* bug #4292 NoSuperfluousPhpdocTagsFixer - Make null only type not considered superfluous (julienfalque) -* minor #4204 DX: Tokens - do not unregister/register found tokens when collection is not changing (kubawerlos) -* minor #4235 DX: more specific @param types (kubawerlos) -* minor #4263 DX: AppVeyor - bump PHP version (keradus) -* minor #4293 Add official support for PHP 7.3 (keradus) -* minor #4295 DX: MethodArgumentSpaceFixerTest - fix edge case for handling different line ending when only expected code is provided (keradus) -* minor #4296 DX: cleanup testing with fixer config (keradus) -* minor #4299 NativeFunctionInvocationFixer - add array_key_exists (deguif, keradus) -* minor #4300 DX: cleanup testing with fixer config (keradus) - -Changelog for v2.14.0 ---------------------- - -* bug #4220 NativeFunctionInvocationFixer - namespaced strict to remove backslash (kubawerlos) -* feature #3881 Add PhpdocVarAnnotationCorrectOrderFixer (kubawerlos) -* feature #3915 Add HeredocIndentationFixer (gharlan) -* feature #4002 NoSuperfluousPhpdocTagsFixer - Allow `mixed` in superfluous PHPDoc by configuration (MortalFlesh) -* feature #4030 Add get_required_files and user_error aliases (ntzm) -* feature #4043 NativeFunctionInvocationFixer - add option to remove redundant backslashes (kubawerlos) -* feature #4102 Add NoUnsetCastFixer (SpacePossum) -* minor #4025 Add phpdoc_types_order rule to Symfony's ruleset (carusogabriel) -* minor #4213 [7.3] PHP7.3 integration tests (SpacePossum) -* minor #4233 Add official support for PHP 7.3 (keradus) - -Changelog for v2.13.3 ---------------------- - -* bug #4216 Psr4Fixer - fix for multiple classy elements in file (keradus, kubawerlos) -* bug #4217 Psr0Fixer - class with anonymous class (kubawerlos) -* bug #4219 NativeFunctionCasingFixer - handle T_RETURN_REF (kubawerlos) -* bug #4224 FunctionToConstantFixer - handle T_RETURN_REF (SpacePossum) -* bug #4229 IsNullFixer - fix parenthesis not closed (guilliamxavier) -* minor #4193 [7.3] CombineNestedDirnameFixer - support PHP 7.3 (kubawerlos) -* minor #4198 [7.3] PowToExponentiationFixer - adding to PHP7.3 integration test (kubawerlos) -* minor #4199 [7.3] MethodChainingIndentationFixer - add tests for PHP 7.3 (kubawerlos) -* minor #4200 [7.3] ModernizeTypesCastingFixer - support PHP 7.3 (kubawerlos) -* minor #4201 [7.3] MultilineWhitespaceBeforeSemicolonsFixer - add tests for PHP 7.3 (kubawerlos) -* minor #4202 [7.3] ErrorSuppressionFixer - support PHP 7.3 (kubawerlos) -* minor #4205 DX: PhpdocAlignFixer - refactor to use DocBlock (kubawerlos) -* minor #4206 DX: enable multiline_whitespace_before_semicolons (keradus) -* minor #4207 [7.3] RandomApiMigrationFixerTest - tests for 7.3 (SpacePossum) -* minor #4208 [7.3] NativeFunctionCasingFixerTest - tests for 7.3 (SpacePossum) -* minor #4209 [7.3] PhpUnitStrictFixerTest - tests for 7.3 (SpacePossum) -* minor #4210 [7.3] PhpUnitConstructFixer - add test for PHP 7.3 (kubawerlos) -* minor #4211 [7.3] PhpUnitDedicateAssertFixer - support PHP 7.3 (kubawerlos) -* minor #4214 [7.3] NoUnsetOnPropertyFixerTest - tests for 7.3 (SpacePossum) -* minor #4222 [7.3] PhpUnitExpectationFixer - support PHP 7.3 (kubawerlos) -* minor #4223 [7.3] PhpUnitMockFixer - add tests for PHP 7.3 (kubawerlos) -* minor #4230 [7.3] IsNullFixer - fix trailing comma (guilliamxavier) -* minor #4232 DX: remove Utils::splitLines (kubawerlos) -* minor #4234 [7.3] Test that "LITERAL instanceof X" is valid (guilliamxavier) - -Changelog for v2.13.2 ---------------------- - -* bug #3968 SelfAccessorFixer - support FQCN (kubawerlos) -* bug #3974 Psr4Fixer - class with anonymous class (kubawerlos) -* bug #3987 Run HeaderCommentFixer after NoBlankLinesAfterPhpdocFixer (StanAngeloff) -* bug #4009 TypeAlternationTransformer - Fix pipes in function call with constants being classified incorrectly (ntzm, SpacePossum) -* bug #4022 NoUnsetOnPropertyFixer - refactor and bugfixes (kubawerlos) -* bug #4036 ExplicitStringVariableFixer - fixes for backticks and for 2 variables next to each other (kubawerlos, Slamdunk) -* bug #4038 CommentToPhpdocFixer - handling nested PHPDoc (kubawerlos) -* bug #4064 Ignore invalid mode strings, add option to remove the "b" flag. (SpacePossum) -* bug #4071 DX: do not insert Token when calling removeLeadingWhitespace/removeTrailingWhitespace from Tokens (kubawerlos) -* bug #4073 IsNullFixer - fix function detection (kubawerlos) -* bug #4074 FileFilterIterator - do not filter out files that need fixing (SpacePossum) -* bug #4076 EregToPregFixer - fix function detection (kubawerlos) -* bug #4084 MethodChainingIndentation - fix priority with Braces (dmvdbrugge) -* bug #4099 HeaderCommentFixer - throw exception on invalid header configuration (SpacePossum) -* bug #4100 PhpdocAddMissingParamAnnotationFixer - Handle variable number of arguments and pass by reference cases (SpacePossum) -* bug #4101 ReturnAssignmentFixer - do not touch invalid code (SpacePossum) -* bug #4104 Change transformers order, fixing untransformed T_USE (dmvdbrugge) -* bug #4107 Preg::split - fix for non-UTF8 subject (ostrolucky, kubawerlos) -* bug #4109 NoBlankLines*: fix removing lines consisting only of spaces (kubawerlos, keradus) -* bug #4114 VisibilityRequiredFixer - don't remove comments (kubawerlos) -* bug #4116 OrderedImportsFixer - fix sorting without any grouping (SpacePossum) -* bug #4119 PhpUnitNoExpectationAnnotationFixer - fix extracting content from annotation (kubawerlos) -* bug #4127 LowercaseConstantsFixer - Fix case with properties using constants as their name (srathbone) -* bug #4134 [7.3] SquareBraceTransformer - nested array destructuring not handled correctly (SpacePossum) -* bug #4153 PhpUnitFqcnAnnotationFixer - handle only PhpUnit classes (kubawerlos) -* bug #4169 DirConstantFixer - Fixes for PHP7.3 syntax (SpacePossum) -* bug #4181 MultilineCommentOpeningClosingFixer - fix handling empty comment (kubawerlos) -* bug #4186 Tokens - fix removal of leading/trailing whitespace with empty token in collection (kubawerlos) -* minor #3436 Add a handful of integration tests (BackEndTea) -* minor #3774 PhpUnitTestClassRequiresCoversFixer - Remove unneeded loop and use phpunit indicator class (BackEndTea, SpacePossum) -* minor #3778 DX: Throw an exception if FileReader::read fails (ntzm) -* minor #3916 New ruleset "@PhpCsFixer" (gharlan) -* minor #4007 Fixes cookbook for fixers (greeflas) -* minor #4031 Correct FixerOptionBuilder::getOption return type (ntzm) -* minor #4046 Token - Added fast isset() path to token->equals() (staabm) -* minor #4047 Token - inline $other->getPrototype() to speedup equals() (staabm, keradus) -* minor #4048 Tokens - inlined extractTokenKind() call on the hot path (staabm) -* minor #4069 DX: Add dev-tools directory to gitattributes as export-ignore (alexmanno) -* minor #4070 Docs: Add link to a VS Code extension in readme (jakebathman) -* minor #4077 DX: cleanup - NoAliasFunctionsFixer - use FunctionsAnalyzer (kubawerlos) -* minor #4088 Add Travis test with strict types (kubawerlos) -* minor #4091 Adjust misleading sentence in CONTRIBUTING.md (ostrolucky) -* minor #4092 UseTransformer - simplify/optimize (SpacePossum) -* minor #4095 DX: Use ::class (keradus) -* minor #4096 DX: fixing typo (kubawerlos) -* minor #4097 DX: namespace casing (kubawerlos) -* minor #4110 Enhancement: Update localheinz/composer-normalize (localheinz) -* minor #4115 Changes for upcoming Travis' infra migration (sergeyklay) -* minor #4122 DX: AppVeyor - Update Composer download link (SpacePossum) -* minor #4128 DX: cleanup - AbstractFunctionReferenceFixer - use FunctionsAnalyzer (SpacePossum, kubawerlos) -* minor #4129 Fix: Symfony 4.2 deprecations (kubawerlos) -* minor #4139 DX: Fix CircleCI (kubawerlos) -* minor #4142 [7.3] NoAliasFunctionsFixer - mbregex_encoding' => 'mb_regex_encoding (SpacePossum) -* minor #4143 PhpUnitTestCaseStaticMethodCallsFixer - Add PHPUnit 7.5 new assertions (Slamdunk) -* minor #4149 [7.3] ArgumentsAnalyzer - PHP7.3 support (SpacePossum) -* minor #4161 DX: CI - show packages installed via Composer (keradus) -* minor #4162 DX: Drop symfony/lts (keradus) -* minor #4166 DX: do not use AbstractFunctionReferenceFixer when no need to (kubawerlos) -* minor #4168 DX: FopenFlagsFixer - remove useless proxy method (SpacePossum) -* minor #4171 Fix CircleCI cache (kubawerlos) -* minor #4173 [7.3] PowToExponentiationFixer - add support for PHP7.3 (SpacePossum) -* minor #4175 Fixing typo (kubawerlos) -* minor #4177 CI: Check that tag is matching version of PHP CS Fixer during deployment (keradus) -* minor #4180 Fixing typo (kubawerlos) -* minor #4182 DX: update php-cs-fixer file style (kubawerlos) -* minor #4185 [7.3] ImplodeCallFixer - add tests for PHP7.3 (kubawerlos) -* minor #4187 [7.3] IsNullFixer - support PHP 7.3 (kubawerlos) -* minor #4188 DX: cleanup (keradus) -* minor #4189 Travis - add PHP 7.3 job (keradus) -* minor #4190 Travis CI - fix config (kubawerlos) -* minor #4192 [7.3] MagicMethodCasingFixer - add tests for PHP 7.3 (kubawerlos) -* minor #4194 [7.3] NativeFunctionInvocationFixer - add tests for PHP 7.3 (kubawerlos) -* minor #4195 [7.3] SetTypeToCastFixer - support PHP 7.3 (kubawerlos) -* minor #4196 Update website (keradus) -* minor #4197 [7.3] StrictParamFixer - support PHP 7.3 (kubawerlos) - -Changelog for v2.13.1 ---------------------- - -* bug #3977 NoSuperfluousPhpdocTagsFixer - Fix handling of description with variable (julienfalque) -* bug #4027 PhpdocAnnotationWithoutDotFixer - add failing cases (keradus) -* bug #4028 PhpdocNoEmptyReturnFixer - handle single line PHPDoc (kubawerlos) -* bug #4034 PhpUnitTestCaseIndicator - handle anonymous class (kubawerlos) -* bug #4037 NativeFunctionInvocationFixer - fix function detection (kubawerlos) -* feature #4019 PhpdocTypesFixer - allow for configuration (keradus) -* minor #3980 Clarifies allow-risky usage (josephzidell) -* minor #4016 Bump console component due to it's bug (keradus) -* minor #4023 Enhancement: Update localheinz/composer-normalize (localheinz) -* minor #4049 use parent::offset*() methods when moving items around in insertAt() (staabm) - -Changelog for v2.13.0 ---------------------- - -* feature #3739 Add MagicMethodCasingFixer (SpacePossum) -* 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 #3876 NativeConstantInvocationFixer - add the scope option (stof, keradus) -* feature #3886 Add PhpUnitMethodCasingFixer (Slamdunk) -* feature #3907 Add ImplodeCallFixer (kubawerlos) -* feature #3914 NoUnreachableDefaultArgumentValueFixer - remove `null` for nullable typehints (gharlan, keradus) -* minor #3813 PhpUnitDedicateAssertFixer - fix "sizeOf" same as "count". (SpacePossum) -* minor #3873 Add the native_function_invocation fixer in the Symfony:risky ruleset (stof) -* minor #3979 DX: enable php_unit_method_casing (keradus) - -Changelog for v2.12.12 ----------------------- - -* bug #4533 Revert PHP7.4 - Add "str_split" => "mb_str_split" mapping (keradus) -* minor #4264 DX: AutoReview - ensure Travis handle all needed PHP versions (keradus) -* minor #4524 MethodArgumentSpaceFixerTest - make explicit configuration to prevent fail on configuration change (keradus) - -Changelog for v2.12.11 ----------------------- - -* bug #4132 BlankLineAfterNamespaceFixer - do not remove indent, handle comments (kubawerlos) -* bug #4384 MethodArgumentSpaceFixer - fix for on_multiline:ensure_fully_multiline with trailing comma in function call (kubawerlos) -* bug #4404 FileLintingIterator - fix current value on end/invalid (SpacePossum) -* bug #4421 FunctionTypehintSpaceFixer - Ensure single space between type declaration and parameter (localheinz) -* bug #4436 MethodArgumentSpaceFixer - handle misplaced ) (keradus) -* bug #4439 NoLeadingImportSlashFixer - Add space if needed (SpacePossum) -* bug #4453 Fix preg_match error on 7.4snapshot (kubawerlos) -* bug #4461 IsNullFixer - fix null coalescing operator handling (linniksa) -* bug #4467 ToolInfo - fix access to reference without checking existence (black-silence) -* bug #4472 Fix non-static closure unbinding this on PHP 7.4 (kelunik) -* minor #3726 Use Box 3 to build the PHAR (theofidry, keradus) -* minor #4412 PHP 7.4 - Tests for support (SpacePossum) -* minor #4431 DX: test that default config is not passed in RuleSet (kubawerlos) -* minor #4433 DX: test to ensure @PHPUnitMigration rule sets are correctly defined (kubawerlos) -* minor #4445 DX: static call of markTestSkippedOrFail (kubawerlos) -* minor #4463 Add apostrophe to possessive "team's" (ChandlerSwift) -* minor #4471 ReadmeCommandTest - use CommandTester (kubawerlos) -* minor #4477 DX: control names of public methods in test's classes (kubawerlos) -* minor #4483 NewWithBracesFixer - Fix object operator and curly brace open cases (SpacePossum) -* minor #4484 fix typos in README (Sven Ludwig) -* minor #4494 DX: Fix shell script syntax in order to fix Travis builds (drupol) -* minor #4516 DX: Lock binary SCA tools versions (keradus) - -Changelog for v2.12.10 ----------------------- - -* bug #4418 PhpUnitNamespacedFixer - properly translate classes which do not follow translation pattern (ktomk) -* bug #4419 PhpUnitTestCaseStaticMethodCallsFixer - skip anonymous classes and lambda (SpacePossum) -* bug #4420 MethodArgumentSpaceFixer - PHP7.3 trailing commas in function calls (SpacePossum) -* minor #4345 Travis: PHP 7.4 isn't allowed to fail anymore (Slamdunk) -* minor #4403 LowercaseStaticReferenceFixer - Fix invalid PHP version in example (HypeMC) -* minor #4425 DX: assertions are static, adjust custom assertions (keradus) -* minor #4426 DX: handle deprecations of symfony/event-dispatcher:4.3 (keradus) -* minor #4427 DX: stop using reserved T_FN in code samples (keradus) - -Changelog for v2.12.9 ---------------------- - -* bug #4298 NoTrailingWhitespaceInCommentFixer - fix for non-Unix line separators (kubawerlos) -* bug #4303 FullyQualifiedStrictTypesFixer - Fix the short type detection when a question mark (nullable) is prefixing it. (drupol) -* bug #4313 SelfAccessorFixer - fix for part qualified class name (kubawerlos, SpacePossum) -* bug #4314 PhpUnitTestCaseStaticMethodCallsFixer - fix for having property with name as method to update (kubawerlos, SpacePossum) -* bug #4327 TokensAnalyzer - add concat operator to list of binary operators (SpacePossum) -* bug #4335 Cache - add indent and line ending to cache signature (dmvdbrugge) -* bug #4344 VoidReturnFixer - handle yield from (SpacePossum) -* bug #4346 BracesFixer - Do not pull close tag onto same line as a comment (SpacePossum) -* bug #4350 StrictParamFixer - Don't detect functions in use statements (bolmstedt) -* bug #4357 Fix short list syntax detection. (SpacePossum) -* bug #4365 Fix output escaping of diff for text format when line is not changed (SpacePossum) -* bug #4370 PhpUnitConstructFixer - Fix handle different casing (SpacePossum) -* bug #4379 ExplicitStringVariableFixer - add test case for variable as an array key (kubawerlos, Slamdunk) -* feature #4337 PhpUnitTestCaseStaticMethodCallsFixer - prepare for PHPUnit 8 (kubawerlos) -* minor #3799 DX: php_unit_test_case_static_method_calls - use default config (keradus) -* minor #4103 NoExtraBlankLinesFixer - fix candidate detection (SpacePossum) -* minor #4245 LineEndingFixer - BracesFixer - Priority (dmvdbrugge) -* minor #4325 Use lowercase mikey179/vfsStream in composer.json (lolli42) -* minor #4336 Collect coverage with PCOV (kubawerlos) -* minor #4338 Fix wording (kmvan, kubawerlos) -* minor #4339 Change BracesFixer to avoid indenting PHP inline braces (alecgeatches) -* 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 #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) - -Changelog for v2.12.8 ---------------------- - -* minor #4306 DX: Drop HHVM conflict on Composer level to help Composer with HHVM compatibility, we still prevent HHVM on runtime (keradus) - -Changelog for v2.12.7 ---------------------- - -* bug #4240 ModernizeTypesCastingFixer - fix for operators with higher precedence (kubawerlos) -* bug #4254 PhpUnitDedicateAssertFixer - fix for count with additional operations (kubawerlos) -* bug #4260 Psr0Fixer and Psr4Fixer - fix for multiple classes in file with anonymous class (kubawerlos) -* bug #4262 FixCommand - fix help (keradus) -* bug #4276 MethodChainingIndentationFixer, ArrayIndentationFixer - Fix priority issue (dmvdbrugge) -* bug #4280 MethodArgumentSpaceFixer - Fix method argument alignment (Billz95) -* bug #4286 IncrementStyleFixer - fix for static statement (kubawerlos) -* bug #4291 ArrayIndentationFixer - Fix indentation after trailing spaces (julienfalque, keradus) -* bug #4292 NoSuperfluousPhpdocTagsFixer - Make null only type not considered superfluous (julienfalque) -* minor #4204 DX: Tokens - do not unregister/register found tokens when collection is not changing (kubawerlos) -* minor #4235 DX: more specific @param types (kubawerlos) -* minor #4263 DX: AppVeyor - bump PHP version (keradus) -* minor #4293 Add official support for PHP 7.3 (keradus) -* minor #4295 DX: MethodArgumentSpaceFixerTest - fix edge case for handling different line ending when only expected code is provided (keradus) -* minor #4296 DX: cleanup testing with fixer config (keradus) -* minor #4299 NativeFunctionInvocationFixer - add array_key_exists (deguif, keradus) - -Changelog for v2.12.6 ---------------------- - -* bug #4216 Psr4Fixer - fix for multiple classy elements in file (keradus, kubawerlos) -* bug #4217 Psr0Fixer - class with anonymous class (kubawerlos) -* bug #4219 NativeFunctionCasingFixer - handle T_RETURN_REF (kubawerlos) -* bug #4224 FunctionToConstantFixer - handle T_RETURN_REF (SpacePossum) -* bug #4229 IsNullFixer - fix parenthesis not closed (guilliamxavier) -* minor #4198 [7.3] PowToExponentiationFixer - adding to PHP7.3 integration test (kubawerlos) -* minor #4199 [7.3] MethodChainingIndentationFixer - add tests for PHP 7.3 (kubawerlos) -* minor #4200 [7.3] ModernizeTypesCastingFixer - support PHP 7.3 (kubawerlos) -* minor #4201 [7.3] MultilineWhitespaceBeforeSemicolonsFixer - add tests for PHP 7.3 (kubawerlos) -* minor #4202 [7.3] ErrorSuppressionFixer - support PHP 7.3 (kubawerlos) -* minor #4205 DX: PhpdocAlignFixer - refactor to use DocBlock (kubawerlos) -* minor #4206 DX: enable multiline_whitespace_before_semicolons (keradus) -* minor #4207 [7.3] RandomApiMigrationFixerTest - tests for 7.3 (SpacePossum) -* minor #4208 [7.3] NativeFunctionCasingFixerTest - tests for 7.3 (SpacePossum) -* minor #4209 [7.3] PhpUnitStrictFixerTest - tests for 7.3 (SpacePossum) -* minor #4210 [7.3] PhpUnitConstructFixer - add test for PHP 7.3 (kubawerlos) -* minor #4211 [7.3] PhpUnitDedicateAssertFixer - support PHP 7.3 (kubawerlos) -* minor #4214 [7.3] NoUnsetOnPropertyFixerTest - tests for 7.3 (SpacePossum) -* minor #4222 [7.3] PhpUnitExpectationFixer - support PHP 7.3 (kubawerlos) -* minor #4223 [7.3] PhpUnitMockFixer - add tests for PHP 7.3 (kubawerlos) -* minor #4230 [7.3] IsNullFixer - fix trailing comma (guilliamxavier) -* minor #4232 DX: remove Utils::splitLines (kubawerlos) -* minor #4234 [7.3] Test that "LITERAL instanceof X" is valid (guilliamxavier) - -Changelog for v2.12.5 ---------------------- - -* bug #3968 SelfAccessorFixer - support FQCN (kubawerlos) -* bug #3974 Psr4Fixer - class with anonymous class (kubawerlos) -* bug #3987 Run HeaderCommentFixer after NoBlankLinesAfterPhpdocFixer (StanAngeloff) -* bug #4009 TypeAlternationTransformer - Fix pipes in function call with constants being classified incorrectly (ntzm, SpacePossum) -* bug #4022 NoUnsetOnPropertyFixer - refactor and bugfixes (kubawerlos) -* bug #4036 ExplicitStringVariableFixer - fixes for backticks and for 2 variables next to each other (kubawerlos, Slamdunk) -* bug #4038 CommentToPhpdocFixer - handling nested PHPDoc (kubawerlos) -* bug #4071 DX: do not insert Token when calling removeLeadingWhitespace/removeTrailingWhitespace from Tokens (kubawerlos) -* bug #4073 IsNullFixer - fix function detection (kubawerlos) -* bug #4074 FileFilterIterator - do not filter out files that need fixing (SpacePossum) -* bug #4076 EregToPregFixer - fix function detection (kubawerlos) -* bug #4084 MethodChainingIndentation - fix priority with Braces (dmvdbrugge) -* bug #4099 HeaderCommentFixer - throw exception on invalid header configuration (SpacePossum) -* bug #4100 PhpdocAddMissingParamAnnotationFixer - Handle variable number of arguments and pass by reference cases (SpacePossum) -* bug #4101 ReturnAssignmentFixer - do not touch invalid code (SpacePossum) -* bug #4104 Change transformers order, fixing untransformed T_USE (dmvdbrugge) -* bug #4107 Preg::split - fix for non-UTF8 subject (ostrolucky, kubawerlos) -* bug #4109 NoBlankLines*: fix removing lines consisting only of spaces (kubawerlos, keradus) -* bug #4114 VisibilityRequiredFixer - don't remove comments (kubawerlos) -* bug #4116 OrderedImportsFixer - fix sorting without any grouping (SpacePossum) -* bug #4119 PhpUnitNoExpectationAnnotationFixer - fix extracting content from annotation (kubawerlos) -* bug #4127 LowercaseConstantsFixer - Fix case with properties using constants as their name (srathbone) -* bug #4134 [7.3] SquareBraceTransformer - nested array destructuring not handled correctly (SpacePossum) -* bug #4153 PhpUnitFqcnAnnotationFixer - handle only PhpUnit classes (kubawerlos) -* bug #4169 DirConstantFixer - Fixes for PHP7.3 syntax (SpacePossum) -* bug #4181 MultilineCommentOpeningClosingFixer - fix handling empty comment (kubawerlos) -* bug #4186 Tokens - fix removal of leading/trailing whitespace with empty token in collection (kubawerlos) -* minor #3436 Add a handful of integration tests (BackEndTea) -* minor #3774 PhpUnitTestClassRequiresCoversFixer - Remove unneeded loop and use phpunit indicator class (BackEndTea, SpacePossum) -* minor #3778 DX: Throw an exception if FileReader::read fails (ntzm) -* minor #3916 New ruleset "@PhpCsFixer" (gharlan) -* minor #4007 Fixes cookbook for fixers (greeflas) -* minor #4031 Correct FixerOptionBuilder::getOption return type (ntzm) -* minor #4046 Token - Added fast isset() path to token->equals() (staabm) -* minor #4047 Token - inline $other->getPrototype() to speedup equals() (staabm, keradus) -* minor #4048 Tokens - inlined extractTokenKind() call on the hot path (staabm) -* minor #4069 DX: Add dev-tools directory to gitattributes as export-ignore (alexmanno) -* minor #4070 Docs: Add link to a VS Code extension in readme (jakebathman) -* minor #4077 DX: cleanup - NoAliasFunctionsFixer - use FunctionsAnalyzer (kubawerlos) -* minor #4088 Add Travis test with strict types (kubawerlos) -* minor #4091 Adjust misleading sentence in CONTRIBUTING.md (ostrolucky) -* minor #4092 UseTransformer - simplify/optimize (SpacePossum) -* minor #4095 DX: Use ::class (keradus) -* minor #4097 DX: namespace casing (kubawerlos) -* minor #4110 Enhancement: Update localheinz/composer-normalize (localheinz) -* minor #4115 Changes for upcoming Travis' infra migration (sergeyklay) -* minor #4122 DX: AppVeyor - Update Composer download link (SpacePossum) -* minor #4128 DX: cleanup - AbstractFunctionReferenceFixer - use FunctionsAnalyzer (SpacePossum, kubawerlos) -* minor #4129 Fix: Symfony 4.2 deprecations (kubawerlos) -* minor #4139 DX: Fix CircleCI (kubawerlos) -* minor #4143 PhpUnitTestCaseStaticMethodCallsFixer - Add PHPUnit 7.5 new assertions (Slamdunk) -* minor #4149 [7.3] ArgumentsAnalyzer - PHP7.3 support (SpacePossum) -* minor #4161 DX: CI - show packages installed via Composer (keradus) -* minor #4162 DX: Drop symfony/lts (keradus) -* minor #4166 DX: do not use AbstractFunctionReferenceFixer when no need to (kubawerlos) -* minor #4171 Fix CircleCI cache (kubawerlos) -* minor #4173 [7.3] PowToExponentiationFixer - add support for PHP7.3 (SpacePossum) -* minor #4175 Fixing typo (kubawerlos) -* minor #4177 CI: Check that tag is matching version of PHP CS Fixer during deployment (keradus) -* minor #4182 DX: update php-cs-fixer file style (kubawerlos) -* minor #4187 [7.3] IsNullFixer - support PHP 7.3 (kubawerlos) -* minor #4188 DX: cleanup (keradus) -* minor #4189 Travis - add PHP 7.3 job (keradus) -* minor #4190 Travis CI - fix config (kubawerlos) -* minor #4194 [7.3] NativeFunctionInvocationFixer - add tests for PHP 7.3 (kubawerlos) -* minor #4195 [7.3] SetTypeToCastFixer - support PHP 7.3 (kubawerlos) -* minor #4196 Update website (keradus) -* minor #4197 [7.3] StrictParamFixer - support PHP 7.3 (kubawerlos) - -Changelog for v2.12.4 ---------------------- - -* bug #3977 NoSuperfluousPhpdocTagsFixer - Fix handling of description with variable (julienfalque) -* bug #4027 PhpdocAnnotationWithoutDotFixer - add failing cases (keradus) -* bug #4028 PhpdocNoEmptyReturnFixer - handle single line PHPDoc (kubawerlos) -* bug #4034 PhpUnitTestCaseIndicator - handle anonymous class (kubawerlos) -* bug #4037 NativeFunctionInvocationFixer - fix function detection (kubawerlos) -* feature #4019 PhpdocTypesFixer - allow for configuration (keradus) -* minor #3980 Clarifies allow-risky usage (josephzidell) -* minor #4016 Bump console component due to it's bug (keradus) -* minor #4023 Enhancement: Update localheinz/composer-normalize (localheinz) -* minor #4049 use parent::offset*() methods when moving items around in insertAt() (staabm) - -Changelog for v2.12.3 ---------------------- - -* bug #3867 PhpdocAnnotationWithoutDotFixer - Handle trailing whitespaces (kubawerlos) -* bug #3884 NoSuperfluousPhpdocTagsFixer - handle null in every position (dmvdbrugge, julienfalque) -* bug #3885 AlignMultilineCommentFixer - ArrayIndentationFixer - Priority (dmvdbrugge) -* bug #3887 ArrayIndentFixer - Don't indent empty lines (dmvdbrugge) -* bug #3888 NoExtraBlankLinesFixer - remove blank lines after open tag (kubawerlos) -* bug #3890 StrictParamFixer - make it case-insensitive (kubawerlos) -* bug #3895 FunctionsAnalyzer - false positive for constant and function definition (kubawerlos) -* bug #3908 StrictParamFixer - fix edge case (kubawerlos) -* bug #3910 FunctionsAnalyzer - fix isGlobalFunctionCall (gharlan) -* bug #3912 FullyQualifiedStrictTypesFixer - NoSuperfluousPhpdocTagsFixer - adjust priority (dmvdbrugge) -* bug #3913 TokensAnalyzer - fix isConstantInvocation (gharlan, keradus) -* bug #3921 TypeAnalysis - Fix iterable not being detected as a reserved type (ntzm) -* bug #3924 FullyQualifiedStrictTypesFixer - space bug (dmvdbrugge) -* bug #3937 LowercaseStaticReferenceFixer - Fix "Parent" word in namespace (kubawerlos) -* bug #3944 ExplicitStringVariableFixer - fix array handling (gharlan) -* bug #3951 NoSuperfluousPhpdocTagsFixer - do not call strtolower with null (SpacePossum) -* bug #3954 NoSuperfluousPhpdocTagsFixer - Index invalid or out of range (kubawerlos) -* bug #3957 NoTrailingWhitespaceFixer - trim space after opening tag (kubawerlos) -* minor #3798 DX: enable native_function_invocation (keradus) -* minor #3882 PhpdocAnnotationWithoutDotFixer - Handle empty line in comment (kubawerlos) -* minor #3889 DX: Cleanup - remove unused variables (kubawerlos, SpacePossum) -* minor #3891 PhpdocNoEmptyReturnFixer - account for null[] (dmvdbrugge) -* minor #3892 PhpdocNoEmptyReturnFixer - fix docs (keradus) -* minor #3897 DX: FunctionsAnalyzer - simplifying return expression (kubawerlos) -* minor #3903 DX: cleanup - remove special treatment for PHP <5.6 (kubawerlos) -* minor #3905 DX: Upgrade composer-require-checker to stable version (keradus) -* minor #3919 Simplify single uses of Token::isGivenKind (ntzm) -* minor #3920 Docs: Fix typo (ntzm) -* minor #3940 DX: fix phpdoc parameter type (malukenho) -* minor #3948 DX: cleanup - remove redundant @param annotations (kubawerlos) -* minor #3950 Circle CI v2 yml (siad007) -* minor #3952 DX: AbstractFixerTestCase - drop testing method already provided by trait (keradus) -* minor #3973 Bump xdebug-handler (keradus) - -Changelog for v2.12.2 ---------------------- - -* bug #3823 NativeConstantInvocationFixer - better constant detection (gharlan, SpacePossum, keradus) -* bug #3832 "yield from" as keyword (SpacePossum) -* bug #3835 Fix priority between PHPDoc return type fixers (julienfalque, keradus) -* bug #3839 MethodArgumentSpaceFixer - add empty line incorrectly (SpacePossum) -* bug #3866 SpaceAfterSemicolonFixer - loop over all tokens (SpacePossum) -* minor #3817 Update integrations tests (SpacePossum) -* minor #3829 Fix typos in changelog (mnabialek) -* minor #3848 Add install/update instructions for PHIVE to the README (SpacePossum) -* minor #3877 NamespacesAnalyzer - Optimize performance (stof) -* minor #3878 NativeFunctionInvocationFixer - use the NamespacesAnalyzer to remove duplicated code (stof) - -Changelog for v2.12.1 ---------------------- - -* bug #3808 LowercaseStaticReferenceFixer - Fix constants handling (kubawerlos, keradus) -* bug #3815 NoSuperfluousPhpdocTagsFixer - support array/callable type hints (gharlan) -* minor #3824 DX: Support PHPUnit 7.2 (keradus) -* minor #3825 UX: Provide full diff for code samples (keradus) - -Changelog for v2.12.0 ---------------------- - -* feature #2577 Add LogicalOperatorsFixer (hkdobrev, keradus) -* feature #3060 Add ErrorSuppressionFixer (kubawerlos) -* feature #3127 Add NativeConstantInvocationFixer (Slamdunk, keradus) -* feature #3223 NativeFunctionInvocationFixer - add namespace scope and include sets (SpacePossum) -* feature #3453 PhpdocAlignFixer - add align option (robert.ahmerov) -* feature #3476 Add PhpUnitTestCaseStaticMethodCallsFixer (Slamdunk, keradus) -* feature #3524 MethodArgumentSpaceFixer - Add ensure_single_line option (julienfalque, keradus) -* feature #3534 MultilineWhitespaceBeforeSemicolonsFixer - support static calls (ntzm) -* feature #3585 Add ReturnAssignmentFixer (SpacePossum, keradus) -* feature #3640 Add PhpdocToReturnTypeFixer (Slamdunk, keradus) -* feature #3691 Add PhpdocTrimAfterDescriptionFixer (nobuf, keradus) -* feature #3698 YodaStyleFixer - Add always_move_variable option (julienfalque, SpacePossum) -* feature #3709 Add SetTypeToCastFixer (SpacePossum) -* feature #3724 BlankLineBeforeStatementFixer - Add case and default as options (dmvdbrugge) -* feature #3734 Add NoSuperfluousPhpdocTagsFixer (julienfalque) -* feature #3735 Add LowercaseStaticReferenceFixer (kubawerlos, SpacePossum) -* feature #3737 Add NoUnsetOnPropertyFixer (BackEndTea, SpacePossum) -* feature #3745 Add PhpUnitInternalClassFixer (BackEndTea, SpacePossum, keradus) -* feature #3766 Add NoBinaryStringFixer (ntzm, SpacePossum, keradus) -* feature #3780 ShortScalarCastFixer - Change binary cast to string cast as well (ntzm) -* feature #3785 PhpUnitDedicateAssertFixer - fix to assertCount too (SpacePossum) -* feature #3802 Convert PhpdocTrimAfterDescriptionFixer into PhpdocTrimConsecutiveBlankLineSeparationFixer (keradus) -* minor #3738 ReturnAssignmentFixer description update (kubawerlos) -* minor #3761 Application: when run with FUTURE_MODE, error_reporting(-1) is done in entry file instead (keradus) -* minor #3772 DX: use PhpUnitTestCaseIndicator->isPhpUnitClass to discover PHPUnit classes (keradus) -* minor #3783 CI: Split COLLECT_COVERAGE job (keradus) -* minor #3789 DX: ProjectCodeTest.testThatDataProvidersAreCorrectlyNamed - performance optimization (keradus) -* minor #3791 DX: Fix collecting code coverage (keradus) -* minor #3792 DX: Upgrade DX deps (keradus) -* minor #3797 DX: ProjectCodeTest - shall not depends on xdebug/phpdbg anymore (keradus, SpacePossum) -* minor #3800 Symfony:risky ruleset: include set_type_to_cast rule (keradus) -* minor #3801 NativeFunctionInvocationFixer - fix buggy config validation (keradus, SpacePossum) - -Changelog for v2.11.2 ---------------------- - -* bug #3233 PhpdocAlignFixer - Fix linebreak inconsistency (SpacePossum, keradus) -* bug #3445 Rewrite NoUnusedImportsFixer (kubawerlos, julienfalque) -* bug #3528 MethodChainingIndentationFixer - nested params bugfix (Slamdunk) -* bug #3547 MultilineWhitespaceBeforeSemicolonsFixer - chained call for a return fix (egircys, keradus) -* bug #3597 DeclareStrictTypesFixer - fix bug of removing line (kubawerlos, keradus) -* bug #3605 DoctrineAnnotationIndentationFixer - Fix indentation with mixed lines (julienfalque) -* bug #3606 PhpdocToCommentFixer - allow multiple ( (SpacePossum) -* bug #3614 Refactor PhpdocToCommentFixer - extract checking to CommentsAnalyzer (kubawerlos) -* bug #3668 Rewrite NoUnusedImportsFixer (kubawerlos, julienfalque) -* bug #3670 PhpdocTypesOrderFixer - Fix ordering of nested generics (julienfalque) -* bug #3671 ArrayIndentationFixer - Fix indentation in HTML (julienfalque) -* 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 #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) -* bug #3765 Fix binary-prefixed double-quoted strings to single quotes (ntzm) -* bug #3770 Handle binary flags in heredoc_to_nowdoc (ntzm) -* bug #3776 ExplicitStringVariableFixer - handle binary strings (ntzm) -* bug #3777 EscapeImplicitBackslashesFixer - handle binary strings (ntzm) -* bug #3790 ProcessLinter - don't execute external process without timeout! It can freeze! (keradus) -* minor #3188 AppVeyor - add PHP 7.x (keradus, julienfalque) -* minor #3451 Update findPHPUnit functions (BackEndTea, SpacePossum, keradus) -* minor #3548 Make shell scripts POSIX-compatible (EvgenyOrekhov, keradus) -* minor #3568 New Autoreview: Correct option casing (ntzm) -* minor #3578 Add interface for deprecated options (julienfalque, keradus) -* minor #3590 Use XdebugHandler to avoid perormance penalty (AJenbo, keradus) -* minor #3607 PhpdocVarWithoutNameFixer - update sample with @ type (SpacePossum) -* minor #3617 Tests stability patches (Tom Klingenberg, keradus) -* minor #3622 Docs: Update descriptions (localheinz) -* minor #3627 Fix tests execution under phpdbg (keradus) -* minor #3629 ProjectFixerConfigurationTest - test rules are sorted (SpacePossum) -* minor #3639 DX: use benefits of symfony/force-lowest (keradus) -* minor #3641 Update check_trailing_spaces script with upstream (keradus) -* minor #3646 Extract SameStringsConstraint and XmlMatchesXsdConstraint (keradus) -* minor #3647 DX: Add CachingLinter for tests (keradus) -* minor #3649 Update check_trailing_spaces script with upstream (keradus) -* minor #3652 CiIntegrationTest - run tests with POSIX sh, not Bash (keradus) -* minor #3656 DX: Clean ups (SpacePossum) -* minor #3657 update phpunitgoodpractices/traits (SpacePossum, keradus) -* minor #3658 DX: Clean ups (SpacePossum) -* minor #3660 Fix do not rely on order of fixing in CiIntegrationTest (kubawerlos) -* minor #3661 Fix: covers annotation for NoAlternativeSyntaxFixerTest (kubawerlos) -* minor #3662 DX: Add Smoke/InstallViaComposerTest (keradus) -* minor #3663 DX: During deployment, run all smoke tests and don't allow to skip phar-related ones (keradus) -* minor #3665 CircleCI fix (kubawerlos) -* minor #3666 Use "set -eu" in shell scripts (EvgenyOrekhov) -* minor #3669 Document possible values for subset options (julienfalque, keradus) -* minor #3672 Remove SameStringsConstraint and XmlMatchesXsdConstraint (keradus) -* minor #3676 RunnerTest - workaround for failing Symfony v2.8.37 (kubawerlos) -* minor #3680 DX: Tokens - removeLeadingWhitespace and removeTrailingWhitespace must act in same way (SpacePossum) -* minor #3686 README.rst - Format all code-like strings in fixer descriptions (ntzm, keradus) -* minor #3692 DX: Optimize tests (julienfalque) -* minor #3700 README.rst - Format all code-like strings in fixer description (ntzm) -* minor #3701 Use correct casing for "PHPDoc" (ntzm) -* minor #3703 DX: InstallViaComposerTest - groom naming (keradus) -* minor #3704 DX: Tokens - fix naming (keradus) -* minor #3706 Update homebrew installation instructions (ntzm) -* minor #3713 Use HTTPS whenever possible (fabpot) -* minor #3723 Extend tests coverage (ntzm) -* minor #3733 Disable Composer optimized autoloader by default (julienfalque) -* minor #3748 PhpUnitStrictFixer - extend risky note (jnvsor) -* minor #3749 Make sure PHPUnit is cased correctly in fixers descriptions (kubawerlos) -* minor #3768 Improve deprecation messages (julienfalque, SpacePossum) -* minor #3773 AbstractFixerWithAliasedOptionsTestCase - don't export (keradus) -* minor #3775 Add tests for binary strings in string_line_ending (ntzm) -* minor #3779 Misc fixes (ntzm, keradus) -* minor #3796 DX: StdinTest - do not assume name of folder, into which project was cloned (keradus) -* minor #3803 NoEmptyPhpdocFixer/PhpdocAddMissingParamAnnotationFixer - missing priority test (SpacePossum, keradus) -* minor #3804 Cleanup: remove useless constructor comment (kubawerlos) -* minor #3805 Cleanup: add missing @param type (kubawerlos, keradus) - -Changelog for v2.11.1 ---------------------- - -* bug #3626 ArrayIndentationFixer: priority bug with BinaryOperatorSpacesFixer and MethodChainingIndentationFixer (Slamdunk) -* bug #3632 DateTimeImmutableFixer bug with adding tokens while iterating over them (kubawerlos) -* minor #3478 PhpUnitDedicateAssertFixer: handle static calls (Slamdunk) -* minor #3618 DateTimeImmutableFixer - grooming (keradus) - -Changelog for v2.11.0 ---------------------- - -* feature #3135 Add ArrayIndentationFixer (julienfalque) -* feature #3235 Implement StandardizeIncrementFixer (ntzm, SpacePossum) -* feature #3260 Add DateTimeImmutableFixer (kubawerlos) -* feature #3276 Transform Fully Qualified parameters and return types to short version (veewee, keradus) -* feature #3299 SingleQuoteFixer - fix single quote char (Slamdunk) -* feature #3340 Verbose LintingException after fixing (Slamdunk) -* feature #3423 FunctionToConstantFixer - add fix "get_called_class" option (SpacePossum) -* feature #3434 Add PhpUnitSetUpTearDownVisibilityFixer (BackEndTea, SpacePossum) -* feature #3442 Add CommentToPhpdocFixer (kubawerlos, keradus) -* feature #3448 OrderedClassElementsFixer - added sortAlgorithm option (meridius) -* feature #3454 Add StringLineEndingFixer (iluuu1994, SpacePossum, keradus, julienfalque) -* feature #3477 PhpUnitStrictFixer: handle static calls (Slamdunk) -* feature #3479 PhpUnitConstructFixer: handle static calls (Slamdunk) -* feature #3507 Add PhpUnitOrderedCoversFixer (Slamdunk) -* feature #3545 Add the 'none' sort algorithm to OrderedImportsFixer (EvgenyOrekhov) -* feature #3588 Add NoAlternativeSyntaxFixer (eddmash, keradus) -* minor #3414 DescribeCommand: add fixer class when verbose (Slamdunk) -* minor #3432 ConfigurationDefinitionFixerInterface - fix deprecation notice (keradus) -* minor #3527 Deprecate last param of Tokens::findBlockEnd (ntzm, keradus) -* minor #3539 Update UnifiedDiffOutputBuilder from gecko-packages/gecko-diff-output-builder usage after it was incorporated into sebastian/diff (keradus) -* minor #3549 DescribeCommand - use our Differ wrapper class, not external one directly (keradus) -* minor #3592 Support PHPUnit 7 (keradus) -* minor #3619 Travis - extend additional files list (keradus) - -Changelog for v2.10.5 ---------------------- - -* bug #3344 Fix method chaining indentation in HTML (julienfalque) -* bug #3594 ElseifFixer - Bug with alternative syntax (kubawerlos) -* bug #3600 StrictParamFixer - Fix issue when functions are imported (ntzm, keradus) -* minor #3589 FixerFactoryTest - add missing test (SpacePossum, keradus) -* minor #3610 make phar extension optional (Tom Klingenberg, keradus) -* minor #3612 Travis - allow for hhvm failures (keradus) -* minor #3615 Detect fabbot.io (julienfalque, keradus) -* minor #3616 FixerFactoryTest - Don't rely on autovivification (keradus) -* minor #3621 FixerFactoryTest - apply CS (keradus) - -Changelog for v2.10.4 ---------------------- - -* bug #3446 Add PregWrapper (kubawerlos) -* bug #3464 IncludeFixer - fix incorrect order of fixing (kubawerlos, SpacePossum) -* bug #3496 Bug in Tokens::removeLeadingWhitespace (kubawerlos, SpacePossum, keradus) -* bug #3557 AbstractDoctrineAnnotationFixer: edge case bugfix (Slamdunk) -* bug #3574 GeneralPhpdocAnnotationRemoveFixer - remove PHPDoc if no content is left (SpacePossum) -* minor #3563 DX add missing covers annotations (keradus) -* minor #3564 Use ::class keyword when possible (keradus) -* minor #3565 Use EventDispatcherInterface instead of EventDispatcher when possible (keradus) -* minor #3566 Update PHPUnitGoodPractices\Traits (keradus) -* minor #3572 DX: allow for more phpunit-speedtrap versions to support more PHPUnit versions (keradus) -* minor #3576 Fix Doctrine Annotation test cases merging (julienfalque) -* minor #3577 DoctrineAnnotationArrayAssignmentFixer - Add test case (julienfalque) - -Changelog for v2.10.3 ---------------------- - -* bug #3504 NoBlankLinesAfterPhpdocFixer - allow blank line before declare statement (julienfalque) -* bug #3522 Remove LOCK_EX (SpacePossum) -* bug #3560 SelfAccessorFixer is risky (Slamdunk) -* minor #3435 Add tests for general_phpdoc_annotation_remove (BackEndTea) -* 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 #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) -* minor #3521 Use HTTPS (carusogabriel) -* minor #3526 Remove gecko dependency (SpacePossum, keradus, julienfalque) -* minor #3531 Backport PHPMD to LTS version to ease maintainability (keradus) -* minor #3532 Implement Tokens::findOppositeBlockEdge (ntzm) -* minor #3533 DX: SCA - drop src/Resources exclusion (keradus) -* minor #3538 Don't use third parameter of Tokens::findBlockStart (ntzm) -* minor #3542 Enhancement: Run composer-normalize on Travis CI (localheinz, keradus) -* minor #3550 AutoReview\FixerFactoryTest - fix missing priority test, mark not fully valid test as incomplete (keradus) -* minor #3555 DX: composer.json - drop branch-alias, branch is already following the version (keradus) -* minor #3556 DX: Add AutoReview/ComposerTest (keradus) -* minor #3559 Don't expose new files under Test namespace (keradus) -* minor #3561 PHPUnit5 - add in place missing compat layer for PHPUnit6 (keradus) - -Changelog for v2.10.2 ---------------------- - -* bug #3502 Fix missing file in export (keradus) - -Changelog for v2.10.1 ---------------------- - -* bug #3265 YodaFixer - fix problems of block statements followed by ternary statements (weareoutman, keradus, SpacePossum) -* bug #3367 NoUnusedImportsFixer - fix comment handling (SpacePossum, keradus) -* bug #3438 PhpUnitTestAnnotationFixer: Do not prepend with test if method is test() (localheinz, SpacePossum) -* bug #3455 NoEmptyCommentFixer - comment block detection for line ending different than LF (kubawerlos, SpacePossum) -* bug #3458 SilencedDeprecationErrorFixer - fix edge cases (kubawerlos) -* bug #3466 no_whitespace_in_blank_line and no_blank_lines_after_phpdoc fixers bug (kubawerlos, keradus) -* bug #3472 YodaStyleFixer - do not un-Yoda if right side is assignment (SpacePossum, keradus) -* bug #3492 PhpdocScalarFixer - Add callback pesudo-type to callable type (carusogabriel) -* minor #3354 Added missing types to the PhpdocTypesFixer (GrahamCampbell) -* minor #3406 Fix for escaping in README (kubawerlos) -* minor #3430 Fix integration test (SpacePossum) -* minor #3431 Add missing tests (SpacePossum) -* minor #3440 Add a handful of integration tests (BackEndTea) -* minor #3443 ConfigurableFixerInterface - not deprecated but TODO (SpacePossum) -* minor #3444 IntegrationTest - ensure tests in priority dir are priority tests indeed (keradus) -* minor #3494 Add missing PHPDoc param type (ntzm) -* minor #3495 Swap @var type and element (ntzm) -* minor #3498 NoUnusedImportsFixer - fix deprecation (keradus) - -Changelog for v2.10.0 ---------------------- - -* feature #3290 Add PhpdocOpeningClosingFixer (Slamdunk, keradus) -* feature #3327 Add MultilineWhitespaceBeforeSemicolonsFixer (egircys, keradus) -* feature #3351 PhuUnit: migrate getMock to createPartialMock when arguments count is 2 (Slamdunk) -* feature #3362 Add BacktickToShellExecFixer (Slamdunk) -* minor #3285 PHPUnit - use protective traits (keradus) -* minor #3329 ConfigurationResolver - detect deprecated fixers (keradus, SpacePossum) -* minor #3343 Tokens - improve block end lookup (keradus) -* minor #3360 Adjust Symfony ruleset (keradus) -* minor #3361 no_extra_consecutive_blank_lines - rename to no_extra_blank_lines (with BC layer) (keradus) -* minor #3363 progress-type - name main option value 'dots' (keradus) -* minor #3404 Deprecate "use_yoda_style" in IsNullFixer (kubawerlos, keradus) -* minor #3418 ConfigurableFixerInterface, ConfigurationDefinitionFixerInterface - update deprecations (keradus) -* minor #3419 Dont use deprecated fixer in itest (keradus) - -Changelog for v2.9.3 --------------------- - -* bug #3502 Fix missing file in export (keradus) - -Changelog for v2.9.2 --------------------- - -* bug #3265 YodaFixer - fix problems of block statements followed by ternary statements (weareoutman, keradus, SpacePossum) -* bug #3367 NoUnusedImportsFixer - fix comment handling (SpacePossum, keradus) -* bug #3438 PhpUnitTestAnnotationFixer: Do not prepend with test if method is test() (localheinz, SpacePossum) -* bug #3455 NoEmptyCommentFixer - comment block detection for line ending different than LF (kubawerlos, SpacePossum) -* bug #3458 SilencedDeprecationErrorFixer - fix edge cases (kubawerlos) -* bug #3466 no_whitespace_in_blank_line and no_blank_lines_after_phpdoc fixers bug (kubawerlos, keradus) -* bug #3472 YodaStyleFixer - do not un-Yoda if right side is assignment (SpacePossum, keradus) -* minor #3354 Added missing types to the PhpdocTypesFixer (GrahamCampbell) -* minor #3406 Fix for escaping in README (kubawerlos) -* minor #3430 Fix integration test (SpacePossum) -* minor #3431 Add missing tests (SpacePossum) -* minor #3440 Add a handful of integration tests (BackEndTea) -* minor #3444 IntegrationTest - ensure tests in priority dir are priority tests indeed (keradus) -* minor #3494 Add missing PHPDoc param type (ntzm) -* minor #3495 Swap @var type and element (ntzm) -* minor #3498 NoUnusedImportsFixer - fix deprecation (keradus) - -Changelog for v2.9.1 --------------------- - -* bug #3298 DiffConsoleFormatter - fix output escaping. (SpacePossum) -* bug #3312 PhpUnitTestAnnotationFixer: Only remove prefix if it really is a prefix (localheinz) -* bug #3318 SingleLineCommentStyleFixer - fix closing tag inside comment causes an error (kubawerlos) -* bug #3334 ExplicitStringVariableFixer: handle parsed array and object (Slamdunk) -* bug #3337 BracesFixer: nowdoc bug on template files (Slamdunk) -* bug #3349 Fix stdin handling and add tests for it (keradus) -* bug #3350 PhpUnitNoExpectationAnnotationFixer - fix handling of multiline expectedExceptionMessage annotation (Slamdunk) -* bug #3352 FunctionToConstantFixer - bugfix for get_class with leading backslash (kubawerlos) -* bug #3359 BracesFixer - handle comment for content outside of given block (keradus) -* bug #3371 IsNullFixer must be run before YodaStyleFixer (kubawerlos) -* bug #3373 PhpdocAlignFixer - Fix removing of everything after @ when there is a space after the @ (ntzm) -* bug #3415 FileFilterIterator - input checks and utests (SpacePossum, keradus) -* bug #3420 SingleLineCommentStyleFixer - fix 'strpos() expects parameter 1 to be string, boolean given' (keradus, SpacePossum) -* bug #3428 Fix archive analysing (keradus) -* bug #3429 Fix archive analysing (keradus) -* minor #3137 PHPUnit - use common base class (keradus) -* minor #3311 FinalInternalClassFixer - fix typo (localheinz) -* minor #3328 Remove duplicated space in exceptions (keradus) -* minor #3342 PhpUnitDedicateAssertFixer - Remove unexistent method is_boolean (carusogabriel) -* minor #3345 StdinFileInfo - fix __toString (keradus) -* minor #3346 StdinFileInfo - drop getContents (keradus) -* minor #3347 DX: reapply newest CS (keradus) -* minor #3365 COOKBOOK-FIXERS.md - update to provide definition instead of description (keradus) -* minor #3370 AbstractFixer - FQCN in in exceptions (Slamdunk) -* minor #3372 ProjectCodeTest - fix comment (keradus) -* minor #3393 Method call typos (Slamdunk, keradus) -* minor #3402 Always provide delimiter to `preg_quote` calls (ntzm) -* minor #3403 Remove unused import (ntzm) -* minor #3405 Fix `fopen` mode (ntzm) -* minor #3407 CombineConsecutiveIssetsFixer - Improve description (kubawerlos) -* minor #3408 Improving fixers descriptions (kubawerlos) -* minor #3409 move itests from misc to priority (keradus) -* minor #3411 Better type hinting for AbstractFixerTestCase::$fixer (kubawerlos) -* minor #3412 Convert `strtolower` inside `strpos` to just `stripos` (ntzm) -* minor #3421 DX: Use ::class (keradus) -* minor #3424 AbstractFixerTest: fix expectException arguments (Slamdunk, keradus) -* minor #3425 FixerFactoryTest - test that priority pair fixers have itest (keradus, SpacePossum) -* minor #3427 ConfigurationResolver: fix @return annotation (Slamdunk) - -Changelog for v2.9.0 --------------------- - -* feature #3063 Method chaining indentation fixer (boliev, julienfalque) -* feature #3076 Add ExplicitStringVariableFixer (Slamdunk, keradus) -* feature #3098 MethodSeparationFixer - add class elements separation options (SpacePossum, keradus) -* feature #3155 Add EscapeImplicitBackslashesFixer (Slamdunk) -* feature #3164 Add ExplicitIndirectVariableFixer (Slamdunk, keradus) -* feature #3183 FinalInternalClassFixer introduction (keradus, SpacePossum) -* feature #3187 StaticLambdaFixer - introduction (SpacePossum, keradus) -* feature #3209 PhpdocAlignFixer - Make @method alignable (ntzm) -* feature #3275 Add PhpUnitTestAnnotationFixer (BackEndTea, keradus) - -Changelog for v2.8.4 --------------------- - -* bug #3281 SelfAccessorFixer - stop modifying traits (kubawerlos) -* minor #3195 Add self-update command test (julienfalque) -* minor #3287 FileCacheManagerTest - drop duplicated line (keradus) -* minor #3292 PHPUnit - set memory limit (veewee) -* minor #3306 Token - better input validation (keradus) -* minor #3310 Upgrade PHP Coveralls (keradus) - -Changelog for v2.8.3 --------------------- - -* bug #3173 SimplifiedNullReturnFixer - handle nullable return types (Slamdunk) -* bug #3268 PhpUnitNoExpectationAnnotationFixer - add case with backslashes (keradus, Slamdunk) -* bug #3272 PhpdocTrimFixer - unicode support (SpacePossum) - -Changelog for v2.8.2 --------------------- - -* bug #3225 PhpdocTrimFixer - Fix handling of lines without leading asterisk (julienfalque) -* bug #3241 NoExtraConsecutiveBlankLinesFixer - do not crash on ^M LF only (SpacePossum) -* bug #3242 PhpUnitNoExpectationAnnotationFixer - fix ' handling (keradus) -* bug #3243 PhpUnitExpectationFixer - don't create ->expectExceptionMessage(null) (keradus) -* bug #3244 PhpUnitNoExpectationAnnotationFixer - expectation extracted from annotation shall be separated from rest of code with one blank line (keradus) -* bug #3259 PhpUnitNamespacedFixer - fix isCandidate to not rely on class declaration (keradus) -* bug #3261 PhpUnitNamespacedFixer - properly fix next usage of already fixed class (keradus) -* bug #3262 ToolInfo - support installation by branch as well (keradus) -* bug #3263 NoBreakCommentFixer - Fix handling comment text with PCRE characters (julienfalque) -* bug #3266 PhpUnitConstructFixer - multiple asserts bug (kubawerlos) -* minor #3239 Improve contributing guide and issue template (julienfalque) -* minor #3246 Make ToolInfo methods non-static (julienfalque) -* minor #3249 PhpUnitNoExpectationAnnotationFixerTest - fix hidden conflict (keradus) -* minor #3250 Travis: fail early, spare resources, save the Earth (Slamdunk, keradus) -* minor #3251 Create Title for config file docs section (IanEdington) -* minor #3254 AutoReview/FixerFactoryTest::testFixersPriority: verbose assertion message (Slamdunk) -* minor #3255 IntegrationTest: output exception stack trace (Slamdunk) -* minor #3257 README.rst - Fixed bullet list formatting (moebrowne) - -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 #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) -* minor #3211 Use udiff format in CI (julienfalque) -* minor #3212 Handle rulesets unknown to fabbot.io (julienfalque) -* minor #3219 Normalise references to GitHub in docs (ntzm) -* minor #3226 Remove unused imports (ntzm) -* minor #3231 Fix typos (ntzm) -* minor #3234 Simplify Cache\Signature::equals (ntzm) -* minor #3237 UnconfigurableFixer - use only LF (keradus) -* minor #3238 AbstractFixerTest - fix @cover annotation (keradus) - -Changelog for v2.8.0 --------------------- - -* feature #3065 Add IncrementStyleFixer (kubawerlos) -* feature #3119 Feature checkstyle reporter (K-Phoen) -* feature #3162 Add udiff as diff format (SpacePossum, keradus) -* feature #3170 Add CompactNullableTypehintFixer (jfcherng) -* feature #3189 Add PHP_CS_FIXER_FUTURE_MODE env (keradus) -* feature #3201 Add PHPUnit Migration rulesets and fixers (keradus) -* minor #3149 AbstractProxyFixer - Support multiple proxied fixers (julienfalque) -* minor #3160 Add DeprecatedFixerInterface (kubawerlos) -* minor #3185 IndentationTypeFixerTest - clean up (SpacePossum, keradus) -* minor #3198 Cleanup: add test that there is no deprecated fixer in rule set (kubawerlos) - -Changelog for v2.7.5 --------------------- - -* bug #3225 PhpdocTrimFixer - Fix handling of lines without leading asterisk (julienfalque) -* bug #3241 NoExtraConsecutiveBlankLinesFixer - do not crash on ^M LF only (SpacePossum) -* bug #3262 ToolInfo - support installation by branch as well (keradus) -* bug #3263 NoBreakCommentFixer - Fix handling comment text with PCRE characters (julienfalque) -* bug #3266 PhpUnitConstructFixer - multiple asserts bug (kubawerlos) -* minor #3239 Improve contributing guide and issue template (julienfalque) -* minor #3246 Make ToolInfo methods non-static (julienfalque) -* minor #3250 Travis: fail early, spare resources, save the Earth (Slamdunk, keradus) -* minor #3251 Create Title for config file docs section (IanEdington) -* minor #3254 AutoReview/FixerFactoryTest::testFixersPriority: verbose assertion message (Slamdunk) -* minor #3255 IntegrationTest: output exception stack trace (Slamdunk) - -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 #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) -* minor #3219 Normalise references to GitHub in docs (ntzm) -* minor #3226 Remove unused imports (ntzm) -* minor #3231 Fix typos (ntzm) -* minor #3234 Simplify Cache\Signature::equals (ntzm) -* minor #3237 UnconfigurableFixer - use only LF (keradus) -* minor #3238 AbstractFixerTest - fix @cover annotation (keradus) - -Changelog for v2.7.3 --------------------- - -* bug #3114 SelfAccessorFixer - Fix type declarations replacement (julienfalque) - -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 #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) -* bug #3176 NoMultilineWhitespaceBeforeSemicolonsFixer - SpaceAfterSemicolonFixer - priority fix (SpacePossum) -* bug #3193 TokensAnalyzer::getClassyElements - sort result before returning (SpacePossum) -* bug #3196 SelfUpdateCommand - fix exit status when can't determine newest version (julienfalque) -* minor #3107 ConfigurationResolver - improve error message when rule is not found (SpacePossum) -* minor #3113 Add WordMatcher (keradus) -* minor #3128 README: remove deprecated rule from CLI examples (chteuchteu) -* minor #3133 Unify Reporter tests (keradus) -* minor #3134 Allow Symfony 4 (keradus, garak) -* minor #3136 PHPUnit - call hooks from parent class as well (keradus) -* minor #3141 Unify description of deprecated fixer (kubawerlos) -* minor #3144 PhpUnitDedicateAssertFixer - Sort map and array by function name (localheinz) -* minor #3145 misc - Typo (localheinz) -* minor #3150 Fix CircleCI (julienfalque) -* minor #3151 Update gitattributes to ignore next file (keradus) -* minor #3156 Update php-coveralls (keradus) -* minor #3166 README - add link to new gitter channel. (SpacePossum) -* minor #3174 Update UPGRADE.md (vitek-rostislav) -* minor #3180 Fix usage of static variables (kubawerlos) -* minor #3182 Add support for PHPUnit 6, drop PHPUnit 4 (keradus) -* minor #3184 Code grooming - sort content of arrays (keradus) -* minor #3191 Travis - add nightly build to allow_failures due to Travis issues (keradus) -* minor #3197 DX groom CS (keradus) - -Changelog for v2.7.1 --------------------- - -* bug #3115 NoUnneededFinalMethodFixer - fix edge case (Slamdunk) - -Changelog for v2.7.0 --------------------- - -* feature #2573 BinaryOperatorSpaces reworked (SpacePossum, keradus) -* feature #3073 SpaceAfterSemicolonFixer - Add option to remove space in empty for expressions (julienfalque) -* feature #3089 NoAliasFunctionsFixer - add imap aliases (Slamdunk) -* feature #3093 NoUnneededFinalMethodFixer - Remove final keyword from private methods (localheinz, keradus) -* minor #3068 Symfony:risky ruleset - add no_homoglyph_names (keradus) -* minor #3074 [IO] Replace Diff with fork version (SpacePossum) - -Changelog for v2.6.1 --------------------- - -* bug #3052 Fix false positive warning about paths overridden by provided as command arguments (kubawerlos) -* bug #3053 CombineConsecutiveIssetsFixer - fix priority (SpacePossum) -* bug #3058 IsNullFixer - fix whitespace handling (roukmoute) -* bug #3069 MethodArgumentSpaceFixer - new test case (keradus) -* bug #3072 IsNullFixer - fix non_yoda_style edge case (keradus) -* bug #3088 Drop dedicated Phar stub (keradus) -* bug #3100 NativeFunctionInvocationFixer - Fix test if previous token is already namespace separator (SpacePossum) -* bug #3104 DoctrineAnnotationIndentationFixer - Fix str_repeat() error (julienfalque) -* minor #3038 Support PHP 7.2 (SpacePossum, keradus) -* minor #3064 Fix couple of typos (KKSzymanowski) -* minor #3070 YodaStyleFixer - Clarify configuration parameters (SteveJobzniak) -* minor #3078 ConfigurationResolver - hide context while including config file (keradus) -* minor #3080 Direct function call instead of by string (kubawerlos) -* minor #3085 CiIntegrationTest - skip when no git is available (keradus) -* minor #3087 phar-stub.php - allow PHP 7.2 (keradus) -* minor #3092 .travis.yml - fix matrix for PHP 7.1 (keradus) -* minor #3094 NoUnneededFinalMethodFixer - Add test cases (julienfalque) -* minor #3111 DoctrineAnnotationIndentationFixer - Restore test case (julienfalque) - -Changelog for v2.6.0 --------------------- - -* bug #3039 YodaStyleFixer - Fix echo case (SpacePossum, keradus) -* feature #2446 Add YodaStyleFixer (SpacePossum) -* feature #2940 Add NoHomoglyphNamesFixer (mcfedr, keradus) -* feature #3012 Add CombineConsecutiveIssetsFixer (SpacePossum) -* minor #3037 Update SF rule set (SpacePossum) - -Changelog for v2.5.1 --------------------- - -* bug #3002 Bugfix braces (mnabialek) -* bug #3010 Fix handling of Github releases (julienfalque, keradus) -* bug #3015 Fix exception arguments (julienfalque) -* bug #3016 Verify phar file (keradus) -* bug #3021 Risky rules cleanup (kubawerlos) -* bug #3023 RandomApiMigrationFixer - "rand();" to "random_int(0, getrandmax());" fixing (SpacePossum) -* bug #3024 ConfigurationResolver - Handle empty "rules" value (SpacePossum, keradus) -* bug #3031 IndentationTypeFixer - fix handling tabs in indented comments (keradus) -* minor #2999 Notice when paths from config file are overridden by command arguments (julienfalque, keradus) -* minor #3007 Add PHP 7.2 to Travis build matrix (Jean85) -* minor #3009 CiIntegrationTest - run local (SpacePossum) -* minor #3013 Adjust phpunit configuration (localheinz) -* minor #3017 Fix: Risky tests (localheinz) -* minor #3018 Fix: Make sure that data providers are named correctly (localheinz, keradus) -* minor #3032 .php_cs.dist - handling UnexpectedValueException (keradus) -* minor #3033 Use ::class (keradus) -* minor #3034 Follow newest CS (keradus) -* minor #3036 Drop not existing Standalone group from PHPUnit configuration and duplicated internal tags (keradus) -* minor #3042 Update gitter address (keradus) - -Changelog for v2.5.0 --------------------- - -* feature #2770 DoctrineAnnotationSpaces - split assignments options (julienfalque) -* feature #2843 Add estimating-max progress output type (julienfalque) -* feature #2885 Add NoSuperfluousElseifFixer (julienfalque) -* feature #2929 Add NoUnneededCurlyBracesFixer (SpacePossum) -* feature #2944 FunctionToConstantFixer - handle get_class() -> __CLASS__ as well (SpacePossum) -* feature #2953 BlankLineBeforeStatementFixer - Add more statements (localheinz, keradus) -* feature #2972 Add NoUnneededFinalMethodFixer (Slamdunk, keradus) -* feature #2992 Add Doctrine Annotation ruleset (julienfalque) -* minor #2926 Token::getNameForId (SpacePossum) - -Changelog for v2.4.2 --------------------- - -* bug #3002 Bugfix braces (mnabialek) -* bug #3010 Fix handling of Github releases (julienfalque, keradus) -* bug #3015 Fix exception arguments (julienfalque) -* bug #3016 Verify phar file (keradus) -* bug #3021 Risky rules cleanup (kubawerlos) -* bug #3023 RandomApiMigrationFixer - "rand();" to "random_int(0, getrandmax());" fixing (SpacePossum) -* bug #3024 ConfigurationResolver - Handle empty "rules" value (SpacePossum, keradus) -* bug #3031 IndentationTypeFixer - fix handling tabs in indented comments (keradus) -* minor #2999 Notice when paths from config file are overridden by command arguments (julienfalque, keradus) -* minor #3007 Add PHP 7.2 to Travis build matrix (Jean85) -* minor #3009 CiIntegrationTest - run local (SpacePossum) -* minor #3013 Adjust phpunit configuration (localheinz) -* minor #3017 Fix: Risky tests (localheinz) -* minor #3018 Fix: Make sure that data providers are named correctly (localheinz, keradus) -* minor #3032 .php_cs.dist - handling UnexpectedValueException (keradus) -* minor #3033 Use ::class (keradus) -* minor #3034 Follow newest CS (keradus) -* minor #3036 Drop not existing Standalone group from PHPUnit configuration and duplicated internal tags (keradus) -* minor #3042 Update gitter address (keradus) - -Changelog for v2.4.1 --------------------- - -* bug #2925 Improve CI integration suggestion (julienfalque) -* bug #2928 TokensAnalyzer::getClassyElements - Anonymous class support (SpacePossum) -* bug #2931 Psr0Fixer, Psr4Fixer - ignore "new class" syntax (dg, keradus) -* bug #2934 Config - fix handling rule without value (keradus, SpacePossum) -* bug #2939 NoUnusedImportsFixer - Fix extra blank line (julienfalque) -* bug #2941 PHP 7.2 - Group imports with trailing comma support (SpacePossum, julienfalque) -* bug #2954 NoBreakCommentFixer - Disable case sensitivity (julienfalque) -* bug #2959 MethodArgumentSpaceFixer - Skip body of fixed function (greg0ire) -* bug #2984 AlignMultilineCommentFixer - handle uni code (SpacePossum) -* bug #2987 Fix incorrect indentation of comments in `braces` fixer (rob006) -* minor #2924 Add missing Token deprecations (julienfalque) -* minor #2927 WhiteSpaceConfig - update message copy and more strict tests (SpacePossum, keradus) -* minor #2930 Trigger website build (keradus) -* minor #2932 Integrate CircleCI (keradus, aidantwoods) -* minor #2933 ProcessLinterTest - Ensure Windows test only runs on Windows, add a Mac test execution (aidantwoods) -* minor #2935 special handling of fabbot.io service if it's using too old PHP CS Fixer version (keradus) -* minor #2937 Travis: execute 5.3 job on precise (keradus) -* minor #2938 Tests fix configuration of project (SpacePossum, keradus) -* minor #2943 FunctionToConstantFixer - test with diff. arguments than fixable (SpacePossum) -* minor #2945 BlankLineBeforeStatementFixerTest - Fix covered class (julienfalque) -* minor #2946 Detect extra old installations (keradus) -* minor #2947 Test suggested CI integration (keradus) -* minor #2951 AccessibleObject - remove most of usage (keradus) -* minor #2952 BlankLineBeforeStatementFixer - Reference fixer instead of test class (localheinz) -* minor #2955 Travis - stop using old TASK_SCA residue (keradus) -* minor #2968 AssertTokensTrait - don't use AccessibleObject (keradus) -* minor #2969 Shrink down AccessibleObject usage (keradus) -* minor #2982 TrailingCommaInMultilineArrayFixer - simplify isMultilineArray condition (TomasVotruba) -* minor #2989 CiIntegrationTest - fix min supported PHP versions (keradus) - -Changelog for v2.4.0 --------------------- - -* bug #2880 NoBreakCommentFixer - fix edge case (julienfalque) -* bug #2900 VoidReturnFixer - handle functions containing anonymous functions/classes (bendavies, keradus) -* bug #2902 Fix test classes constructor (julienfalque) -* feature #2384 Add BlankLineBeforeStatementFixer (localheinz, keradus, SpacePossum) -* feature #2440 MethodArgumentSpaceFixer - add ensure_fully_multiline option (greg0ire) -* feature #2649 PhpdocAlignFixer - make fixer configurable (ntzm) -* feature #2664 Add DoctrineAnnotationArrayAssignmentFixer (julienfalque) -* feature #2667 Add NoBreakCommentFixer (julienfalque) -* feature #2684 BracesFixer - new options for braces position after control structures and anonymous constructs (aidantwoods, keradus) -* feature #2701 NoExtraConsecutiveBlankLinesFixer - Add more configuration options related to switch statements (SpacePossum) -* feature #2740 Add VoidReturnFixer (mrmark) -* feature #2765 DoctrineAnnotationIndentationFixer - add option to indent mixed lines (julienfalque) -* feature #2815 NonPrintableCharacterFixer - Add option to replace with escape sequences (julienfalque, keradus) -* feature #2822 Add NoNullPropertyInitializationFixer (ntzm, julienfalque, SpacePossum) -* feature #2825 Add PhpdocTypesOrderFixer (julienfalque, keradus) -* feature #2856 CastSpacesFixer - add space option (kubawerlos, keradus) -* feature #2857 Add AlignMultilineCommentFixer (Slamdunk, keradus) -* feature #2866 Add SingleLineCommentStyleFixer, deprecate HashToSlashCommentFixer (Slamdunk, keradus) -* minor #2773 Travis - use stages (keradus) -* minor #2794 Drop HHVM support (keradus, julienfalque) -* minor #2801 ProjectCodeTest - Fix typo in deprecation message (SpacePossum) -* minor #2818 Token become immutable, performance optimizations (keradus) -* minor #2877 Fix PHPMD report (julienfalque) -* minor #2894 NonPrintableCharacterFixer - fix handling required PHP version on PHPUnit 4.x (keradus) -* minor #2921 InvalidForEnvFixerConfigurationException - fix handling in tests on 2.4 line (keradus) - -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 #2848 PhpdocIndentFixer - fix edge case with inline phpdoc (keradus) -* bug #2849 BracesFixer - Fix indentation issues with comments (julienfalque) -* bug #2851 Tokens - ensureWhitespaceAtIndex (GrahamCampbell, SpacePossum) -* bug #2854 NoLeadingImportSlashFixer - Removing leading slash from import even when in global space (kubawerlos) -* bug #2858 Support generic types (keradus) -* bug #2869 Fix handling required configuration (keradus) -* bug #2881 NoUnusedImportsFixer - Bug when trying to insert empty token (GrahamCampbell, keradus) -* bug #2882 DocBlock\Annotation - Fix parsing of collections with multiple key types (julienfalque) -* bug #2886 NoSpacesInsideParenthesisFixer - Do not remove whitespace if next token is comment (SpacePossum) -* bug #2888 SingleImportPerStatementFixer - Add support for function and const (SpacePossum) -* bug #2901 Add missing files to archive files (keradus) -* bug #2914 HeredocToNowdocFixer - works with CRLF line ending (dg) -* bug #2920 RuleSet - Update deprecated configuration of fixers (SpacePossum, keradus) -* minor #1531 Update docs for few generic types (keradus) -* minor #2793 COOKBOOK-FIXERS.md - update to current version, fix links (keradus) -* minor #2812 ProcessLinter - compatibility with Symfony 3.3 (keradus) -* minor #2816 Tokenizer - better docs and validation (keradus) -* minor #2817 Tokenizer - use future-compatible interface (keradus) -* minor #2819 Fix benchmark (keradus) -* minor #2820 MagicConstantCasingFixer - Remove defined check (SpacePossum) -* minor #2823 Tokenizer - use future-compatible interface (keradus) -* minor #2824 code grooming (keradus) -* minor #2826 Exceptions - provide utests (localheinz) -* minor #2828 Enhancement: Reference phpunit.xsd from phpunit.xml.dist (localheinz) -* minor #2830 Differs - add tests (localheinz) -* minor #2832 Fix: Use all the columns (localheinz) -* minor #2833 Doctrine\Annotation\Token - provide utests (localheinz) -* minor #2839 Use PHP 7.2 polyfill instead of xml one (keradus) -* minor #2842 Move null to first position in PHPDoc types (julienfalque) -* minor #2850 ReadmeCommandTest - Prevent diff output (julienfalque) -* minor #2859 Fixed typo and dead code removal (GrahamCampbell) -* minor #2863 FileSpecificCodeSample - add tests (localheinz) -* minor #2864 WhitespacesAwareFixerInterface clean up (Slamdunk) -* minor #2865 AutoReview\FixerTest - test configuration samples (SpacePossum, keradus) -* minor #2867 VersionSpecification - Fix copy-paste typo (SpacePossum) -* minor #2870 Tokens - ensureWhitespaceAtIndex - Clear tokens before compare. (SpacePossum) -* minor #2874 LineTest - fix typo (keradus) -* minor #2875 HelpCommand - recursive layout fix (SpacePossum) -* minor #2883 DescribeCommand - Show which sample uses the default configuration (SpacePossum) -* minor #2887 Housekeeping - Strict whitespace checks (SpacePossum) -* minor #2895 ProjectCodeTest - check that classes in no-tests exception exist (keradus) -* minor #2896 Move testing related classes from src to tests (keradus) -* minor #2904 Reapply CS (keradus) -* minor #2910 PhpdocAnnotationWithoutDotFixer - Restrict lowercasing (oschwald) -* minor #2913 Tests - tweaks (SpacePossum, keradus) -* minor #2916 FixerFactory - drop return in sortFixers(), never used (TomasVotruba) - -Changelog for v2.3.2 --------------------- - -* bug #2682 DoctrineAnnotationIndentationFixer - fix handling nested annotations (edhgoose, julienfalque) -* bug #2700 Fix Doctrine Annotation end detection (julienfalque) -* bug #2715 OrderedImportsFixer - handle indented groups (pilgerone) -* bug #2732 HeaderCommentFixer - fix handling blank lines (s7b4) -* bug #2745 Fix Doctrine Annotation newlines (julienfalque) -* bug #2752 FixCommand - fix typo in warning message (mnapoli) -* bug #2757 GeckoPHPUnit is not dev dependency (keradus) -* bug #2759 Update gitattributes (SpacePossum) -* bug #2763 Fix describe command with PSR-0 fixer (julienfalque) -* bug #2768 Tokens::ensureWhitespaceAtIndex - clean up comment check, add check for T_OPEN (SpacePossum) -* bug #2783 Tokens::ensureWhitespaceAtIndex - Fix handling line endings (SpacePossum) -* minor #2304 DX: use PHPMD (keradus) -* minor #2663 Use colors for keywords in commands output (julienfalque, keradus) -* minor #2706 Update README (SpacePossum) -* minor #2714 README.rst - fix wrong value in example (mleko) -* minor #2718 Remove old Symfony exception message expectation (julienfalque) -* minor #2721 Update phpstorm article link to a fresh blog post (valeryan) -* minor #2725 Use method chaining for configuration definitions (julienfalque) -* minor #2727 PHPUnit - use speedtrap (keradus) -* minor #2728 SelfUpdateCommand - verify that it's possible to replace current file (keradus) -* minor #2729 DescribeCommand - add decorated output test (julienfalque) -* minor #2731 BracesFixer - properly pass config in utest dataProvider (keradus) -* minor #2738 Upgrade tests to use new, namespaced PHPUnit TestCase class (keradus) -* minor #2742 Code cleanup (GrahamCampbell, keradus) -* minor #2743 Fixing example and description for GeneralPhpdocAnnotationRemoveFixer (kubawerlos) -* minor #2744 AbstractDoctrineAnnotationFixerTestCase - split fixers test cases (julienfalque) -* minor #2755 Fix compatibility with PHPUnit 5.4.x (keradus) -* minor #2758 Readme - improve CI integration guidelines (keradus) -* minor #2769 Psr0Fixer - remove duplicated example (julienfalque) -* minor #2774 AssertTokens Trait (keradus) -* minor #2775 NoExtraConsecutiveBlankLinesFixer - remove duplicate code sample. (SpacePossum) -* minor #2778 AutoReview - watch that code samples are unique (keradus) -* minor #2787 Add warnings about missing dom ext and require json ext (keradus) -* minor #2792 Use composer-require-checker (keradus) -* minor #2796 Update .gitattributes (SpacePossum) -* minor #2797 Update .gitattributes (SpacePossum) -* minor #2800 PhpdocTypesFixerTest - Fix typo in covers annotation (SpacePossum) - -Changelog for v2.3.1 --------------------- - -Port of v2.2.3. - -* bug #2724 Revert #2554 Add short diff. output format (keradus) - -Changelog for v2.3.0 --------------------- - -* feature #2450 Add ListSyntaxFixer (SpacePossum) -* feature #2708 Add PhpUnitTestClassRequiresCoversFixer (keradus) -* minor #2568 Require PHP 5.6+ (keradus) -* minor #2672 Bump symfony/* deps (keradus) - -Changelog for v2.2.20 ---------------------- - -* bug #3233 PhpdocAlignFixer - Fix linebreak inconsistency (SpacePossum, keradus) -* bug #3445 Rewrite NoUnusedImportsFixer (kubawerlos, julienfalque) -* bug #3597 DeclareStrictTypesFixer - fix bug of removing line (kubawerlos, keradus) -* bug #3605 DoctrineAnnotationIndentationFixer - Fix indentation with mixed lines (julienfalque) -* bug #3606 PhpdocToCommentFixer - allow multiple ( (SpacePossum) -* bug #3684 PhpUnitStrictFixer - Do not fix if not correct # of arguments are used (SpacePossum) -* bug #3715 SingleImportPerStatementFixer - Fix handling whitespace before opening brace (julienfalque) -* bug #3731 PhpdocIndentFixer - crash fix (SpacePossum) -* bug #3765 Fix binary-prefixed double-quoted strings to single quotes (ntzm) -* bug #3770 Handle binary flags in heredoc_to_nowdoc (ntzm) -* bug #3790 ProcessLinter - don't execute external process without timeout! It can freeze! (keradus) -* minor #3548 Make shell scripts POSIX-compatible (EvgenyOrekhov, keradus) -* minor #3568 New Autoreview: Correct option casing (ntzm) -* minor #3590 Use XdebugHandler to avoid performance penalty (AJenbo, keradus) -* minor #3607 PhpdocVarWithoutNameFixer - update sample with @ type (SpacePossum) -* minor #3617 Tests stability patches (Tom Klingenberg, keradus) -* minor #3627 Fix tests execution under phpdbg (keradus) -* minor #3629 ProjectFixerConfigurationTest - test rules are sorted (SpacePossum) -* minor #3639 DX: use benefits of symfony/force-lowest (keradus) -* minor #3641 Update check_trailing_spaces script with upstream (keradus) -* minor #3646 Extract SameStringsConstraint and XmlMatchesXsdConstraint (keradus) -* minor #3647 DX: Add CachingLinter for tests (keradus) -* minor #3649 Update check_trailing_spaces script with upstream (keradus) -* minor #3652 CiIntegrationTest - run tests with POSIX sh, not Bash (keradus) -* minor #3656 DX: Clean ups (SpacePossum) -* minor #3660 Fix do not rely on order of fixing in CiIntegrationTest (kubawerlos) -* minor #3662 DX: Add Smoke/InstallViaComposerTest (keradus) -* minor #3663 DX: During deployment, run all smoke tests and don't allow to skip phar-related ones (keradus) -* minor #3665 CircleCI fix (kubawerlos) -* minor #3666 Use "set -eu" in shell scripts (EvgenyOrekhov) -* minor #3669 Document possible values for subset options (julienfalque, keradus) -* minor #3676 RunnerTest - workaround for failing Symfony v2.8.37 (kubawerlos) -* minor #3680 DX: Tokens - removeLeadingWhitespace and removeTrailingWhitespace must act in same way (SpacePossum) -* minor #3686 README.rst - Format all code-like strings in fixer descriptions (ntzm, keradus) -* minor #3692 DX: Optimize tests (julienfalque) -* minor #3701 Use correct casing for "PHPDoc" (ntzm) -* minor #3703 DX: InstallViaComposerTets - groom naming (keradus) -* minor #3704 DX: Tokens - fix naming (keradus) -* minor #3706 Update homebrew installation instructions (ntzm) -* minor #3713 Use HTTPS whenever possible (fabpot) -* minor #3723 Extend tests coverage (ntzm) -* minor #3733 Disable Composer optimized autoloader by default (julienfalque) -* minor #3748 PhpUnitStrictFixer - extend risky note (jnvsor) -* minor #3749 Make sure PHPUnit is cased correctly in fixers descriptions (kubawerlos) -* minor #3773 AbstractFixerWithAliasedOptionsTestCase - don't export (keradus) -* minor #3796 DX: StdinTest - do not assume name of folder, into which project was cloned (keradus) -* minor #3803 NoEmptyPhpdocFixer/PhpdocAddMissingParamAnnotationFixer - missing priority test (SpacePossum, keradus) -* minor #3804 Cleanup: remove useless constructor comment (kubawerlos) - -Changelog for v2.2.19 ---------------------- - -* bug #3594 ElseifFixer - Bug with alternative syntax (kubawerlos) -* bug #3600 StrictParamFixer - Fix issue when functions are imported (ntzm, keradus) -* minor #3589 FixerFactoryTest - add missing test (SpacePossum, keradus) -* minor #3610 make phar extension optional (Tom Klingenberg, keradus) -* minor #3612 Travis - allow for hhvm failures (keradus) -* minor #3615 Detect fabbot.io (julienfalque, keradus) -* minor #3616 FixerFactoryTest - Don't rely on autovivification (keradus) - -Changelog for v2.2.18 ---------------------- - -* bug #3446 Add PregWrapper (kubawerlos) -* bug #3464 IncludeFixer - fix incorrect order of fixing (kubawerlos, SpacePossum) -* bug #3496 Bug in Tokens::removeLeadingWhitespace (kubawerlos, SpacePossum, keradus) -* bug #3557 AbstractDoctrineAnnotationFixer: edge case bugfix (Slamdunk) -* bug #3574 GeneralPhpdocAnnotationRemoveFixer - remove PHPDoc if no content is left (SpacePossum) -* minor #3563 DX add missing covers annotations (keradus) -* minor #3565 Use EventDispatcherInterface instead of EventDispatcher when possible (keradus) -* minor #3572 DX: allow for more phpunit-speedtrap versions to support more PHPUnit versions (keradus) -* minor #3576 Fix Doctrine Annotation test cases merging (julienfalque) - -Changelog for v2.2.17 ---------------------- - -* bug #3504 NoBlankLinesAfterPhpdocFixer - allow blank line before declare statement (julienfalque) -* bug #3522 Remove LOCK_EX (SpacePossum) -* bug #3560 SelfAccessorFixer is risky (Slamdunk) -* 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 #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) -* minor #3526 Remove gecko dependency (SpacePossum, keradus, julienfalque) -* minor #3531 Backport PHPMD to LTS version to ease maintainability (keradus) -* minor #3532 Implement Tokens::findOppositeBlockEdge (ntzm) -* minor #3533 DX: SCA - drop src/Resources exclusion (keradus) -* minor #3538 Don't use third parameter of Tokens::findBlockStart (ntzm) -* minor #3542 Enhancement: Run composer-normalize on Travis CI (localheinz, keradus) -* minor #3555 DX: composer.json - drop branch-alias, branch is already following the version (keradus) -* minor #3556 DX: Add AutoReview/ComposerTest (keradus) -* minor #3559 Don't expose new files under Test namespace (keradus) - -Changelog for v2.2.16 ---------------------- - -* bug #3502 Fix missing file in export (keradus) - -Changelog for v2.2.15 ---------------------- - -* bug #3367 NoUnusedImportsFixer - fix comment handling (SpacePossum, keradus) -* bug #3455 NoEmptyCommentFixer - comment block detection for line ending different than LF (kubawerlos, SpacePossum) -* bug #3458 SilencedDeprecationErrorFixer - fix edge cases (kubawerlos) -* bug #3466 no_whitespace_in_blank_line and no_blank_lines_after_phpdoc fixers bug (kubawerlos, keradus) -* minor #3354 Added missing types to the PhpdocTypesFixer (GrahamCampbell) -* minor #3406 Fix for escaping in README (kubawerlos) -* minor #3431 Add missing tests (SpacePossum) -* minor #3440 Add a handful of integration tests (BackEndTea) -* minor #3444 IntegrationTest - ensure tests in priority dir are priority tests indeed (keradus) -* minor #3494 Add missing PHPDoc param type (ntzm) -* minor #3495 Swap @var type and element (ntzm) -* minor #3498 NoUnusedImportsFixer - fix deprecation (keradus) - -Changelog for v2.2.14 ---------------------- - -* bug #3298 DiffConsoleFormatter - fix output escaping. (SpacePossum) -* bug #3337 BracesFixer: nowdoc bug on template files (Slamdunk) -* bug #3349 Fix stdin handling and add tests for it (keradus) -* bug #3359 BracesFixer - handle comment for content outside of given block (keradus) -* bug #3415 FileFilterIterator - input checks and utests (SpacePossum, keradus) -* bug #3429 Fix archive analysing (keradus) -* minor #3137 PHPUnit - use common base class (keradus) -* minor #3342 PhpUnitDedicateAssertFixer - Remove unexistent method is_boolean (carusogabriel) -* minor #3345 StdinFileInfo - fix `__toString` (keradus) -* minor #3346 StdinFileInfo - drop getContents (keradus) -* minor #3347 DX: reapply newest CS (keradus) -* minor #3365 COOKBOOK-FIXERS.md - update to provide definition instead of description (keradus) -* minor #3370 AbstractFixer - FQCN in in exceptions (Slamdunk) -* minor #3372 ProjectCodeTest - fix comment (keradus) -* minor #3402 Always provide delimiter to `preg_quote` calls (ntzm) -* minor #3403 Remove unused import (ntzm) -* minor #3405 Fix `fopen` mode (ntzm) -* minor #3408 Improving fixers descriptions (kubawerlos) -* minor #3409 move itests from misc to priority (keradus) -* minor #3411 Better type hinting for AbstractFixerTestCase::$fixer (kubawerlos) -* minor #3412 Convert `strtolower` inside `strpos` to just `stripos` (ntzm) -* minor #3425 FixerFactoryTest - test that priority pair fixers have itest (keradus, SpacePossum) -* minor #3427 ConfigurationResolver: fix @return annotation (Slamdunk) - -Changelog for v2.2.13 ---------------------- - -* bug #3281 SelfAccessorFixer - stop modifying traits (kubawerlos) -* minor #3195 Add self-update command test (julienfalque) -* minor #3292 PHPUnit - set memory limit (veewee) -* minor #3306 Token - better input validation (keradus) - -Changelog for v2.2.12 ---------------------- - -* bug #3173 SimplifiedNullReturnFixer - handle nullable return types (Slamdunk) -* bug #3272 PhpdocTrimFixer - unicode support (SpacePossum) - -Changelog for v2.2.11 ---------------------- - -* bug #3225 PhpdocTrimFixer - Fix handling of lines without leading asterisk (julienfalque) -* bug #3262 ToolInfo - support installation by branch as well (keradus) -* bug #3266 PhpUnitConstructFixer - multiple asserts bug (kubawerlos) -* minor #3239 Improve contributing guide and issue template (julienfalque) -* minor #3246 Make ToolInfo methods non-static (julienfalque) -* minor #3250 Travis: fail early, spare resources, save the Earth (Slamdunk, keradus) -* minor #3251 Create Title for config file docs section (IanEdington) -* minor #3254 AutoReview/FixerFactoryTest::testFixersPriority: verbose assertion message (Slamdunk) - -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 #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) -* minor #3219 Normalise references to GitHub in docs (ntzm) -* minor #3226 Remove unused imports (ntzm) -* minor #3231 Fix typos (ntzm) -* minor #3234 Simplify Cache\Signature::equals (ntzm) -* minor #3237 UnconfigurableFixer - use only LF (keradus) -* minor #3238 AbstractFixerTest - fix @cover annotation (keradus) - -Changelog for v2.2.9 --------------------- - -* 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 #3123 Cache - File permissions (SpacePossum) -* bug #3172 IndentationTypeFixer - do not touch whitespace that is not indentation (SpacePossum) -* bug #3176 NoMultilineWhitespaceBeforeSemicolonsFixer - SpaceAfterSemicolonFixer - priority fix (SpacePossum) -* bug #3193 TokensAnalyzer::getClassyElements - sort result before returning (SpacePossum) -* bug #3196 SelfUpdateCommand - fix exit status when can't determine newest version (julienfalque) -* minor #3107 ConfigurationResolver - improve error message when rule is not found (SpacePossum) -* minor #3113 Add WordMatcher (keradus) -* minor #3133 Unify Reporter tests (keradus) -* minor #3134 Allow Symfony 4 (keradus, garak) -* minor #3136 PHPUnit - call hooks from parent class as well (keradus) -* minor #3145 misc - Typo (localheinz) -* minor #3150 Fix CircleCI (julienfalque) -* minor #3151 Update gitattributes to ignore next file (keradus) -* minor #3156 Update php-coveralls (keradus) -* minor #3166 README - add link to new gitter channel. (SpacePossum) -* minor #3174 Update UPGRADE.md (vitek-rostislav) -* minor #3180 Fix usage of static variables (kubawerlos) -* minor #3184 Code grooming - sort content of arrays (keradus) -* minor #3191 Travis - add nightly build to allow_failures due to Travis issues (keradus) -* minor #3197 DX groom CS (keradus) - -Changelog for v2.2.8 --------------------- - -* bug #3052 Fix false positive warning about paths overridden by provided as command arguments (kubawerlos) -* bug #3058 IsNullFixer - fix whitespace handling (roukmoute) -* bug #3072 IsNullFixer - fix non_yoda_style edge case (keradus) -* bug #3088 Drop dedicated Phar stub (keradus) -* bug #3100 NativeFunctionInvocationFixer - Fix test if previous token is already namespace separator (SpacePossum) -* bug #3104 DoctrineAnnotationIndentationFixer - Fix str_repeat() error (julienfalque) -* minor #3038 Support PHP 7.2 (SpacePossum, keradus) -* minor #3064 Fix couple of typos (KKSzymanowski) -* minor #3078 ConfigurationResolver - hide context while including config file (keradus) -* minor #3080 Direct function call instead of by string (kubawerlos) -* minor #3085 CiIntegrationTest - skip when no git is available (keradus) -* minor #3087 phar-stub.php - allow PHP 7.2 (keradus) - -Changelog for v2.2.7 --------------------- - -* bug #3002 Bugfix braces (mnabialek) -* bug #3010 Fix handling of Github releases (julienfalque, keradus) -* bug #3015 Fix exception arguments (julienfalque) -* bug #3016 Verify phar file (keradus) -* bug #3021 Risky rules cleanup (kubawerlos) -* bug #3023 RandomApiMigrationFixer - "rand();" to "random_int(0, getrandmax());" fixing (SpacePossum) -* bug #3024 ConfigurationResolver - Handle empty "rules" value (SpacePossum, keradus) -* bug #3031 IndentationTypeFixer - fix handling tabs in indented comments (keradus) -* minor #2999 Notice when paths from config file are overridden by command arguments (julienfalque, keradus) -* minor #3007 Add PHP 7.2 to Travis build matrix (Jean85) -* minor #3009 CiIntegrationTest - run local (SpacePossum) -* minor #3013 Adjust phpunit configuration (localheinz) -* minor #3017 Fix: Risky tests (localheinz) -* minor #3018 Fix: Make sure that data providers are named correctly (localheinz, keradus) -* minor #3032 .php_cs.dist - handling UnexpectedValueException (keradus) -* minor #3034 Follow newest CS (keradus) -* minor #3036 Drop not existing Standalone group from PHPUnit configuration and duplicated internal tags (keradus) -* minor #3042 Update gitter address (keradus) - -Changelog for v2.2.6 --------------------- - -* bug #2925 Improve CI integration suggestion (julienfalque) -* bug #2928 TokensAnalyzer::getClassyElements - Anonymous class support (SpacePossum) -* bug #2931 Psr0Fixer, Psr4Fixer - ignore "new class" syntax (dg, keradus) -* bug #2934 Config - fix handling rule without value (keradus, SpacePossum) -* bug #2939 NoUnusedImportsFixer - Fix extra blank line (julienfalque) -* bug #2941 PHP 7.2 - Group imports with trailing comma support (SpacePossum, julienfalque) -* bug #2987 Fix incorrect indentation of comments in `braces` fixer (rob006) -* minor #2927 WhiteSpaceConfig - update message copy and more strict tests (SpacePossum, keradus) -* minor #2930 Trigger website build (keradus) -* minor #2932 Integrate CircleCI (keradus, aidantwoods) -* minor #2933 ProcessLinterTest - Ensure Windows test only runs on Windows, add a Mac test execution (aidantwoods) -* minor #2935 special handling of fabbot.io service if it's using too old PHP CS Fixer version (keradus) -* minor #2937 Travis: execute 5.3 job on precise (keradus) -* minor #2938 Tests fix configuration of project (SpacePossum, keradus) -* minor #2943 FunctionToConstantFixer - test with diff. arguments than fixable (SpacePossum) -* minor #2946 Detect extra old installations (keradus) -* minor #2947 Test suggested CI integration (keradus) -* minor #2951 AccessibleObject - remove most of usage (keradus) -* minor #2969 Shrink down AccessibleObject usage (keradus) -* minor #2982 TrailingCommaInMultilineArrayFixer - simplify isMultilineArray condition (TomasVotruba) - -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 #2848 PhpdocIndentFixer - fix edge case with inline phpdoc (keradus) -* bug #2849 BracesFixer - Fix indentation issues with comments (julienfalque) -* bug #2851 Tokens - ensureWhitespaceAtIndex (GrahamCampbell, SpacePossum) -* bug #2854 NoLeadingImportSlashFixer - Removing leading slash from import even when in global space (kubawerlos) -* bug #2858 Support generic types (keradus) -* bug #2869 Fix handling required configuration (keradus) -* bug #2881 NoUnusedImportsFixer - Bug when trying to insert empty token (GrahamCampbell, keradus) -* bug #2882 DocBlock\Annotation - Fix parsing of collections with multiple key types (julienfalque) -* bug #2886 NoSpacesInsideParenthesisFixer - Do not remove whitespace if next token is comment (SpacePossum) -* bug #2888 SingleImportPerStatementFixer - Add support for function and const (SpacePossum) -* bug #2901 Add missing files to archive files (keradus) -* bug #2914 HeredocToNowdocFixer - works with CRLF line ending (dg) -* bug #2920 RuleSet - Update deprecated configuration of fixers (SpacePossum, keradus) -* minor #1531 Update docs for few generic types (keradus) -* minor #2793 COOKBOOK-FIXERS.md - update to current version, fix links (keradus) -* minor #2812 ProcessLinter - compatibility with Symfony 3.3 (keradus) -* minor #2816 Tokenizer - better docs and validation (keradus) -* minor #2817 Tokenizer - use future-compatible interface (keradus) -* minor #2819 Fix benchmark (keradus) -* minor #2824 code grooming (keradus) -* minor #2826 Exceptions - provide utests (localheinz) -* minor #2828 Enhancement: Reference phpunit.xsd from phpunit.xml.dist (localheinz) -* minor #2830 Differs - add tests (localheinz) -* minor #2832 Fix: Use all the columns (localheinz) -* minor #2833 Doctrine\Annotation\Token - provide utests (localheinz) -* minor #2839 Use PHP 7.2 polyfill instead of xml one (keradus) -* minor #2842 Move null to first position in PHPDoc types (julienfalque) -* minor #2850 ReadmeCommandTest - Prevent diff output (julienfalque) -* minor #2859 Fixed typo and dead code removal (GrahamCampbell) -* minor #2863 FileSpecificCodeSample - add tests (localheinz) -* minor #2864 WhitespacesAwareFixerInterface clean up (Slamdunk) -* minor #2865 AutoReview\FixerTest - test configuration samples (SpacePossum, keradus) -* minor #2867 VersionSpecification - Fix copy-paste typo (SpacePossum) -* minor #2874 LineTest - fix typo (keradus) -* minor #2875 HelpCommand - recursive layout fix (SpacePossum) -* minor #2883 DescribeCommand - Show which sample uses the default configuration (SpacePossum) -* minor #2887 Housekeeping - Strict whitespace checks (SpacePossum) -* minor #2895 ProjectCodeTest - check that classes in no-tests exception exist (keradus) -* minor #2896 Move testing related classes from src to tests (keradus) -* minor #2904 Reapply CS (keradus) -* minor #2910 PhpdocAnnotationWithoutDotFixer - Restrict lowercasing (oschwald) -* minor #2913 Tests - tweaks (SpacePossum, keradus) -* minor #2916 FixerFactory - drop return in sortFixers(), never used (TomasVotruba) - -Changelog for v2.2.4 --------------------- - -* bug #2682 DoctrineAnnotationIndentationFixer - fix handling nested annotations (edhgoose, julienfalque) -* bug #2700 Fix Doctrine Annotation end detection (julienfalque) -* bug #2715 OrderedImportsFixer - handle indented groups (pilgerone) -* bug #2732 HeaderCommentFixer - fix handling blank lines (s7b4) -* bug #2745 Fix Doctrine Annotation newlines (julienfalque) -* bug #2752 FixCommand - fix typo in warning message (mnapoli) -* bug #2757 GeckoPHPUnit is not dev dependency (keradus) -* bug #2759 Update gitattributes (SpacePossum) -* bug #2763 Fix describe command with PSR-0 fixer (julienfalque) -* bug #2768 Tokens::ensureWhitespaceAtIndex - clean up comment check, add check for T_OPEN (SpacePossum) -* bug #2783 Tokens::ensureWhitespaceAtIndex - Fix handling line endings (SpacePossum) -* minor #2663 Use colors for keywords in commands output (julienfalque, keradus) -* minor #2706 Update README (SpacePossum) -* minor #2714 README.rst - fix wrong value in example (mleko) -* minor #2721 Update phpstorm article link to a fresh blog post (valeryan) -* minor #2727 PHPUnit - use speedtrap (keradus) -* minor #2728 SelfUpdateCommand - verify that it's possible to replace current file (keradus) -* minor #2729 DescribeCommand - add decorated output test (julienfalque) -* minor #2731 BracesFixer - properly pass config in utest dataProvider (keradus) -* minor #2738 Upgrade tests to use new, namespaced PHPUnit TestCase class (keradus) -* minor #2743 Fixing example and description for GeneralPhpdocAnnotationRemoveFixer (kubawerlos) -* minor #2744 AbstractDoctrineAnnotationFixerTestCase - split fixers test cases (julienfalque) -* minor #2755 Fix compatibility with PHPUnit 5.4.x (keradus) -* minor #2758 Readme - improve CI integration guidelines (keradus) -* minor #2769 Psr0Fixer - remove duplicated example (julienfalque) -* minor #2775 NoExtraConsecutiveBlankLinesFixer - remove duplicate code sample. (SpacePossum) -* minor #2778 AutoReview - watch that code samples are unique (keradus) -* minor #2787 Add warnings about missing dom ext and require json ext (keradus) -* minor #2792 Use composer-require-checker (keradus) -* minor #2796 Update .gitattributes (SpacePossum) -* minor #2800 PhpdocTypesFixerTest - Fix typo in covers annotation (SpacePossum) - -Changelog for v2.2.3 --------------------- - -* bug #2724 Revert #2554 Add short diff. output format (keradus) - -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) -* bug #2686 Commands readme and describe - fix rare casing when not displaying some possible options of configuration (keradus) -* bug #2711 FixCommand - fix diff optional value handling (keradus) -* minor #2688 AppVeyor - Remove github oauth (keradus) -* minor #2703 Clean ups - No mixed annotations (SpacePossum) -* minor #2704 Create PHP70Migration:risky ruleset (keradus) -* minor #2707 Deprecate other than "yes" or "no" for input options (SpacePossum) -* minor #2709 code grooming (keradus) -* minor #2710 Travis - run more rules on TASK_SCA (keradus) - -Changelog for v2.2.1 --------------------- - -* bug #2621 Tokenizer - fix edge cases with empty code, registered found tokens and code hash (SpacePossum, keradus) -* bug #2674 SemicolonAfterInstructionFixer - Fix case where block ends with an opening curly brace (ntzm) -* bug #2675 ProcessOutputTest - update tests to pass on newest Symfony components under Windows (keradus) -* minor #2651 Fix UPGRADE.md table syntax so it works in GitHub (ntzm, keradus) -* minor #2665 Travis - Improve trailing spaces detection (julienfalque) -* minor #2666 TransformersTest - move test to auto-review group (keradus) -* minor #2668 add covers annotation (keradus) -* minor #2669 TokensTest - grooming (SpacePossum) -* minor #2670 AbstractFixer: use applyFix instead of fix (Slamdunk) -* minor #2677 README: Correct progressbar option support (Laurens St�tzel) - -Changelog for v2.2.0 --------------------- - -* bug #2640 NoExtraConsecutiveBlankLinesFixer - Fix single indent characters not working (ntzm) -* feature #2220 Doctrine annotation fixers (julienfalque) -* feature #2431 MethodArgumentSpaceFixer: allow to retain multiple spaces after comma (Slamdunk) -* feature #2459 BracesFixer - Add option for keeping opening brackets on the same line (jtojnar, SpacePossum) -* feature #2486 Add FunctionToConstantFixer (SpacePossum, keradus) -* feature #2505 FunctionDeclarationFixer - Make space after anonymous function configurable (jtojnar, keradus) -* feature #2509 FullOpeningTagFixer - Ensure opening PHP tag is lowercase (jtojnar) -* feature #2532 FixCommand - add stop-on-violation option (keradus) -* feature #2591 Improve process output (julienfalque) -* feature #2603 Add InvisibleSymbols Fixer (ivan1986, keradus) -* feature #2642 Add MagicConstantCasingFixer (ntzm) -* feature #2657 PhpdocToCommentFixer - Allow phpdoc for language constructs (ceeram, SpacePossum) -* minor #2500 Configuration resolver (julienfalque, SpacePossum, keradus) -* minor #2566 Show more details on errors and exceptions. (SpacePossum, julienfalque) -* minor #2597 HHVM - bump required version to 3.18 (keradus) -* minor #2606 FixCommand - fix missing comment close tag (keradus) -* minor #2623 OrderedClassElementsFixer - remove dead code (SpacePossum) -* minor #2625 Update Symfony and Symfony:risky rulesets (keradus) -* minor #2626 TernaryToNullCoalescingFixer - adjust ruleset membership and description (keradus) -* minor #2635 ProjectCodeTest - watch that all classes have dedicated tests (keradus) -* minor #2647 DescribeCommandTest - remove deprecated code usage (julienfalque) -* minor #2648 Move non-code covering tests to AutoReview subnamespace (keradus) -* minor #2652 NoSpacesAroundOffsetFixerTest - fix deprecation (keradus) -* minor #2656 Code grooming (keradus) -* minor #2659 Travis - speed up preparation for phar building (keradus) -* minor #2660 Fixed typo in suggest for ext-mbstring (pascal-hofmann) -* minor #2661 NonPrintableCharacterFixer - include into Symfony:risky ruleset (keradus) - -Changelog for v2.1.3 --------------------- - -* bug #2358 Cache - Deal with signature encoding (keradus, GrahamCampbell) -* bug #2475 Add shorthand array destructing support (SpacePossum, keradus) -* bug #2595 NoUnusedImportsFixer - Fix import usage detection with properties (julienfalque) -* bug #2605 PhpdocAddMissingParamAnnotationFixer, PhpdocOrderFixer - fix priority issue (SpacePossum) -* bug #2607 Fixers - better comments handling (SpacePossum) -* bug #2612 BracesFixer - Fix early bracket close for do-while loop inside an if without brackets (felixgomez) -* bug #2614 Ensure that '*Fixer::fix()' won't crash when running on non-candidate collection (keradus) -* bug #2630 HeaderCommentFixer - Fix trailing whitespace not removed after AliasFunctionsFixer (kalessil) -* feature #1275 Added PhpdocInlineTagFixer (SpacePossum, keradus) -* feature #1292 Added MethodSeparationFixer (SpacePossum) -* feature #1383 Introduce rules and sets (keradus) -* feature #1416 Mark fixers as risky (keradus) -* feature #1440 Made AbstractFixerTestCase and AbstractIntegrationTestCase public (keradus) -* feature #1489 Added Psr4Fixer (GrahamCampbell) -* feature #1497 ExtraEmptyLinesFixer - allow to remove empty blank lines after configured tags (SpacePossum) -* feature #1529 Added PhpdocPropertyFixer, refactored Tag and Annotation (GrahamCampbell) -* 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 #1819 Added DirConstantFixer, ModernizeTypesCastingFixer, RandomApiMigrationFixer (kalessil, SpacePossum, keradus) -* feature #1825 Added junit format (ekho) -* feature #1862 FixerFactory - Do not allow conflicting fixers (SpacePossum) -* feature #1888 Cache refactoring, better cache handling in dry-run mode (localheinz) -* feature #1889 Added SingleClassElementPerStatementFixer (phansys, SpacePossum) -* feature #1903 FixCommand - allow to pass multiple path argument (keradus) -* feature #1913 Introduce path-mode CLI option (keradus) -* feature #1949 Added DeclareStrictTypesFixer, introduce options for HeaderCommentFixer (Seldaek, SpacePossum, keradus) -* feature #1955 Introduce CT_ARRAY_INDEX_CURLY_BRACE_OPEN and CT_ARRAY_INDEX_CURLY_BRACE_CLOSE (keradus) -* feature #1958 Added NormalizeIndexBraceFixer (keradus) -* feature #2069 Add semicolon after instruction fixer (SpacePossum) -* feature #2089 Add `no_spaces_around_offset` fixer (phansys) -* feature #2179 BinaryOperatorSpacesFixer - add (un)align configuration options (SpacePossum) -* feature #2192 Add PowToExponentiationFixer (SpacePossum, keradus) -* feature #2207 Added ReturnTypeDeclarationFixer (keradus) -* feature #2213 VisibilityRequiredFixer - Add support for class const visibility added in PHP7.1. (SpacePossum) -* feature #2221 Add support for user-defined whitespaces (keradus) -* feature #2244 Config cleanup (keradus, SpacePossum) -* feature #2247 PhpdocAnnotationWithoutDotFixer - support more cases (keradus) -* feature #2289 Add PhpdocAddMissingParamAnnotationFixer (keradus) -* feature #2331 Add DescribeCommand (keradus, SpacePossum) -* feature #2332 New colours of diff on console (keradus) -* feature #829 add support for .php_cs.dist file (keradus) -* feature #998 MethodArgumentSpaceFixer - enhance, now only one space after comma (trilopin, keradus) -* minor #1007 Simplify Transformers (keradus) -* minor #1050 Make Config's setDir() fluent like the rest of methods (gonzaloserrano) -* minor #1062 Added NamespaceOperatorTransformer (gharlan) -* minor #1078 Exit status should be 0 if there are no errors (gharlan) -* minor #1101 CS: fix project itself (localheinz) -* minor #1102 Enhancement: List errors occurred before, during and after fixing (localheinz) -* minor #1105 Token::isStructureAlternativeEnd - remove unused method (keradus) -* minor #1106 readme grooming (SpacePossum, keradus) -* minor #1115 Fixer - simplify flow (keradus) -* minor #1118 Process output refactor (SpacePossum) -* minor #1132 Linter - public methods should be first (keradus) -* minor #1134 Token::isWhitespace - simplify interface (keradus) -* minor #1140 FixerInterface - check if fixer should be applied by isCandidate method (keradus) -* minor #1146 Linter - detect executable (keradus) -* minor #1156 deleted old ConfigurationResolver class (keradus) -* minor #1160 Grammar fix to README (Falkirks) -* minor #1174 DefaultFinder - boost performance by not filtering when files array is empty (keradus) -* minor #1179 Exit with non-zero if invalid files were detected prior to fixing (localheinz) -* minor #1186 Finder - do not search for .xml and .yml files (keradus) -* minor #1206 BracesFixer::getClassyTokens - remove duplicated method (keradus) -* minor #1222 Made fixers final (GrahamCampbell) -* minor #1229 Tokens - Fix PHPDoc (SpacePossum) -* minor #1241 More details on exceptions. (SpacePossum) -* minor #1263 Made internal classes final (GrahamCampbell) -* minor #1272 Readme - Add spaces around PHP-CS-Fixer headers (Soullivaneuh) -* minor #1283 Error - Fixed type phpdoc (GrahamCampbell) -* minor #1284 Token - Fix PHPDoc (SpacePossum) -* minor #1314 Added missing internal annotations (keradus) -* minor #1329 Psr0Fixer - move to contrib level (gharlan) -* minor #1340 Clean ups (SpacePossum) -* minor #1341 Linter - throw exception when write fails (SpacePossum) -* minor #1348 Linter - Prefer error output when throwing a linting exception (GrahamCampbell) -* minor #1350 Add "phpt" as a valid extension (henriquemoody) -* minor #1376 Add time and memory to XML report (junichi11) -* minor #1387 Made all test classes final (keradus) -* minor #1388 Made all tests internal (keradus) -* minor #1390 Added ProjectCodeTest that tests if all classes inside tests are internal and final or abstract (keradus) -* minor #1391 Fixer::getLevelAsString is no longer static (keradus) -* minor #1392 Add report to XML report as the root node (junichi11) -* minor #1394 Stop mixing level from config file and fixers from CLI arg when one of fixers has dash (keradus) -* minor #1426 MethodSeparationFixer - Fix spacing around comments (SpacePossum, keradus) -* minor #1432 Fixer check on factory (Soullivaneuh) -* minor #1434 Add Test\AccessibleObject class (keradus) -* minor #1442 FixerFactory - disallow to register multiple fixers with same name (keradus) -* minor #1477 rename PhpdocShortDescriptionFixer into PhpdocSummaryFixer (keradus) -* minor #1481 Fix running the tests (keradus) -* minor #1482 move AbstractTransformerTestBase class outside Tests dir (keradus) -* minor #1530 Added missing internal annotation (GrahamCampbell) -* minor #1534 Clean ups (SpacePossum) -* minor #1536 Typo fix (fabpot) -* minor #1555 Fixed indentation in composer.json (GrahamCampbell) -* minor #1558 [2.0] Cleanup the tags property in the abstract phpdoc types fixer (GrahamCampbell) -* minor #1567 PrintToEchoFixer - add to symfony rule set (gharlan) -* minor #1607 performance improvement (gharlan) -* minor #1621 Switch to PSR-4 (keradus) -* minor #1631 Configuration exceptions exception cases on master. (SpacePossum) -* minor #1646 Remove non-default Config/Finder classes (keradus) -* minor #1648 Fixer - avoid extra calls to getFileRelativePathname (GrahamCampbell) -* minor #1649 Consider the php version when caching (GrahamCampbell) -* minor #1652 Rename namespace "Symfony\CS" to "PhpCsFixer" (gharlan) -* minor #1666 new Runner, ProcessOutputInterface, DifferInterface and ResultInterface (keradus) -* minor #1674 Config - add addCustomFixers method (PedroTroller) -* minor #1677 Enhance tests (keradus) -* minor #1695 Rename Fixers (keradus) -* minor #1702 Upgrade guide (keradus) -* minor #1707 ExtraEmptyLinesFixer - fix configure docs (keradus) -* minor #1712 NoExtraConsecutiveBlankLinesFixer - Remove blankline after curly brace open (SpacePossum) -* minor #1718 CLI: rename --config-file argument (keradus) -* minor #1722 Renamed not_operators_with_space to not_operator_with_space (GrahamCampbell) -* minor #1728 PhpdocNoSimplifiedNullReturnFixer - rename back to PhpdocNoEmptyReturnFixer (keradus) -* minor #1729 Renamed whitespacy_lines to no_whitespace_in_blank_lines (GrahamCampbell) -* minor #1731 FixCommand - value for config option is required (keradus) -* minor #1732 move fixer classes from level subdirs to thematic subdirs (gharlan, keradus) -* minor #1733 ConfigurationResolver - look for .php_cs file in cwd as well (keradus) -* minor #1737 RuleSet/FixerFactory - sort arrays content (keradus) -* minor #1751 FixerInterface::configure - method should always override configuration, not patch it (keradus) -* minor #1752 Remove unused code (keradus) -* minor #1756 Finder - clean up code (keradus) -* minor #1757 Psr0Fixer - change way of configuring the fixer (keradus) -* minor #1762 Remove ConfigInterface::getDir, ConfigInterface::setDir, Finder::setDir and whole FinderInterface (keradus) -* minor #1764 Remove ConfigAwareInterface (keradus) -* minor #1780 AbstractFixer - throw error on configuring non-configurable Fixer (keradus) -* minor #1782 rename fixers (gharlan) -* minor #1815 NoSpacesInsideParenthesisFixer - simplify implementation (keradus) -* minor #1821 Ensure that PhpUnitDedicateAssertFixer runs after NoAliasFunctionsFixer, clean up NoEmptyCommentFixer (SpacePossum) -* minor #1824 Reporting extracted to separate classes (ekho, keradus, SpacePossum) -* minor #1826 Fixer - remove measuring fixing time per file (keradus) -* minor #1843 FileFilterIterator - add missing import (GrahamCampbell) -* minor #1845 FileCacheManager - Allow linting to determine the cache state too (GrahamCampbell) -* 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 #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) -* minor #1882 Runner - Handle throwables too (GrahamCampbell) -* minor #1886 PhpdocScalarFixer - Fix lowercase str to string too (GrahamCampbell) -* minor #1940 README.rst - update CI example (keradus) -* minor #1947 SCA, CS, add more tests (SpacePossum, keradus) -* minor #1954 tests - stop using deprecated method (sebastianbergmann) -* minor #1962 TextDiffTest - tests should not produce cache file (keradus) -* minor #1973 Introduce fast PHP7 based linter (keradus) -* minor #1999 Runner - No need to determine relative file name twice (localheinz) -* minor #2002 FileCacheManagerTest - Adjust name of test and variable (localheinz) -* minor #2010 NoExtraConsecutiveBlankLinesFixer - SF rule set, add 'extra' (SpacePossum) -* minor #2013 no_whitespace_in_blank_lines -> no_whitespace_in_blank_line (SpacePossum) -* minor #2024 AbstractFixerTestCase - check if there is no duplicated Token instance inside Tokens collection (keradus) -* minor #2031 COOKBOOK-FIXERS.md - update calling doTest method (keradus) -* minor #2032 code grooming (keradus) -* minor #2068 Code grooming (keradus) -* minor #2073 DeclareStrictTypesFixer - Remove fix CS fix logic from fixer. (SpacePossum) -* minor #2088 TokenizerLintingResult - expose line number of parsing error (keradus) -* minor #2093 Tokens - add block type BLOCK_TYPE_ARRAY_INDEX_CURLY_BRACE (SpacePossum) -* minor #2095 Transformers - add required PHP version (keradus) -* minor #2096 Introduce CT for PHP7 (keradus) -* minor #2119 Create @Symfony:risky ruleset (keradus) -* minor #2163 ClassKeywordRemoveFixerTest - Fix tests (SpacePossum) -* minor #2180 FixCommand - don't refer to renamed rules (keradus) -* minor #2181 Disallow to disable linter (keradus) -* minor #2194 semicolon_after_instruction,no_unneeded_control_parentheses prio issue (SpacePossum) -* minor #2199 make fixers less risky (SpacePossum) -* minor #2206 Add PHP70Migration ruleset (keradus) -* minor #2217 SelfUpdateCommand - Print version of update fixer (SpacePossum) -* minor #2223 update integration test format (keradus) -* minor #2227 Stop polluting global namespace with CT (keradus) -* minor #2237 DX: extend integration tests for PSR2 and Symfony rulesets (keradus) -* minor #2240 Make some objects immutable (keradus) -* minor #2251 ProtectedToPrivateFixer - fix priority, fix comments with new fixer names (SpacePossum) -* minor #2252 ClassDefinitionFixer - Set configuration of the fixer in the RuleSet of SF. (SpacePossum) -* minor #2257 extend Symfony_whitespaces itest (keradus) -* minor #2258 README.rst - indicate configurable rules (keradus) -* minor #2267 RuleSet - validate set (keradus) -* minor #2268 Use strict parameters for PHP functions (keradus) -* minor #2273 fixed typo (fabpot) -* minor #2274 ShortArraySyntaxFixer/LongArraySyntaxFixer - Merge conflicting fixers (SpacePossum) -* minor #2275 Clean ups (SpacePossum) -* minor #2278 Concat*Fixer - unify concat fixers (SpacePossum, keradus) -* minor #2279 Use Prophecy (keradus) -* minor #2284 Code grooming (SpacePossum) -* minor #2285 IntegrationCase is now aware about RuleSet but not Fixers (keradus, SpacePossum) -* minor #2286 Phpdoc*Fixer - unify rename fixers (SpacePossum, keradus) -* minor #2288 FixerInterface::configure(null) reset fixer to use default configuration (keradus) -* minor #2291 Make fixers ready to use directly after creation (keradus) -* minor #2295 Code grooming (keradus) -* minor #2296 ProjectCodeTest - make test part of regular testsuite, not standalone one (keradus) -* minor #2298 ConfigurationResolver - grooming (SpacePossum) -* minor #2300 Simplify rule set (SpacePossum, keradus) -* minor #2306 DeclareStrictTypesFixer - do not move tokens (SpacePossum) -* minor #2312 RuleSet - sort rules (localheinz) -* minor #2313 DX: provide doctyping for tests (keradus) -* minor #2317 Add utests (keradus) -* 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 #2337 Normalize rule naming (keradus) -* minor #2338 Drop hacks for unsupported HHVM (keradus) -* minor #2339 Add some Fixer descriptions (SpacePossum, keradus) -* minor #2343 PowToExponentiationFixer - allow to run on 5.6.0 as well (keradus) -* minor #767 Add @internal tag (keradus) -* minor #807 Tokens::isMethodNameIsMagic - remove unused method (keradus) -* minor #809 Split Tokens into Tokens and TokensAnalyzer (keradus) -* minor #844 Renamed phpdoc_params to phpdoc_align (GrahamCampbell) -* minor #854 Change default level to PSR2 (keradus) -* minor #873 Config - using cache by default (keradus) -* minor #902 change FixerInterface (keradus) -* minor #911 remove Token::$line (keradus) -* minor #914 All Transformer classes should be named with Transformer as suffix (keradus) -* minor #915 add UseTransformer (keradus) -* minor #916 add ArraySquareBraceTransformer (keradus) -* minor #917 clean up Transformer tests (keradus) -* minor #919 CurlyBraceTransformer - one transformer to handle all curly braces transformations (keradus) -* minor #928 remove Token::getLine (keradus) -* minor #929 add WhitespacyCommentTransformer (keradus) -* minor #937 fix docs/typehinting in few classes (keradus) -* minor #958 FileCacheManager - remove code for BC support (keradus) -* minor #979 Improve Tokens::clearEmptyTokens performance (keradus) -* minor #981 Tokens - code grooming (keradus) -* minor #988 Fixers - no need to search for tokens of given kind in extra loop (keradus) -* minor #989 No need for loop in Token::equals (keradus) - -Changelog for v1.13.3 ---------------------- - -* minor #3042 Update gitter address (keradus) - -Changelog for v1.13.2 ---------------------- - -* minor #2946 Detect extra old installations (keradus) - -Changelog for v1.13.1 ---------------------- - -* minor #2342 Application - adjust test to not depend on symfony/console version (keradus) -* minor #2344 AppVeyor: enforce PHP version (keradus) - -Changelog for v1.13.0 ---------------------- - -* bug #2303 ClassDefinitionFixer - Anonymous classes fixing (SpacePossum) -* feature #2208 Added fixer for PHPUnit's @expectedException annotation (ro0NL) -* feature #2249 Added ProtectedToPrivateFixer (Slamdunk, SpacePossum) -* feature #2264 SelfUpdateCommand - Do not update to next major version by default (SpacePossum) -* feature #2328 ClassDefinitionFixer - Anonymous classes format by PSR12 (SpacePossum) -* feature #2333 PhpUnitFqcnAnnotationFixer - support more annotations (keradus) -* minor #2256 EmptyReturnFixer - it's now risky fixer due to null vs void (keradus) -* minor #2281 Add issue template (SpacePossum) -* minor #2307 Update .editorconfig (SpacePossum) -* minor #2310 CI: update AppVeyor to use newest PHP, silence the composer (keradus) -* minor #2315 Token - Deprecate getLine() (SpacePossum) -* minor #2320 Clear up status code on 1.x (SpacePossum) - -Changelog for v1.12.4 ---------------------- - -* bug #2235 OrderedImportsFixer - PHP 7 group imports support (SpacePossum) -* minor #2276 Tokens cleanup (keradus) -* minor #2277 Remove trailing spaces (keradus) -* minor #2294 Improve Travis configuration (keradus) -* minor #2297 Use phpdbg instead of xdebug (keradus) -* minor #2299 Travis: proper xdebug disabling (keradus) -* minor #2301 Travis: update platform adjusting (keradus) - -Changelog for v1.12.3 ---------------------- - -* bug #2155 ClassDefinitionFixer - overhaul (SpacePossum) -* bug #2187 MultipleUseFixer - Fix handling comments (SpacePossum) -* 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 #2246 Fix itest requirements (keradus) -* minor #2238 .gitattributes - specified line endings (keradus) -* minor #2239 IntegrationCase - no longer internal (keradus) - -Changelog for v1.12.2 ---------------------- - -* bug #2191 PhpdocToCommentFixer - fix false positive for docblock of variable (keradus) -* bug #2193 UnneededControlParenthesesFixer - Fix more return cases. (SpacePossum) -* bug #2198 FileCacheManager - fix exception message and undefined property (j0k3r) -* minor #2170 Add dollar sign prefix for consistency (bcremer) -* minor #2190 .travis.yml - improve Travis speed for tags (keradus) -* minor #2196 PhpdocTypesFixer - support iterable type (GrahamCampbell) -* minor #2197 Update cookbook and readme (g105b, SpacePossum) -* minor #2203 README.rst - change formatting (ro0NL) -* minor #2204 FixCommand - clean unused var (keradus) -* minor #2205 Add integration test for iterable type (keradus) - -Changelog for v1.12.1 ---------------------- - -* bug #2144 Remove temporary files not deleted by destructor on failure (adawolfa) -* bug #2150 SelfUpdateCommand: resolve symlink (julienfalque) -* bug #2162 Fix issue where an exception is thrown if the cache file exists but is empty. (ikari7789) -* bug #2164 OperatorsSpacesFixer - Do not unalign double arrow and equals operators (SpacePossum) -* bug #2167 Rewrite file removal (keradus) -* minor #2152 Code cleanup (keradus) -* minor #2154 ShutdownFileRemoval - Fixed file header (GrahamCampbell) - -Changelog for v1.12.0 ---------------------- - -* feature #1493 Added MethodArgumentDefaultValueFixer (lmanzke) -* feature #1495 BracesFixer - added support for declare (EspadaV8) -* feature #1518 Added ClassDefinitionFixer (SpacePossum) -* feature #1543 [PSR-2] Switch case space fixer (Soullivaneuh) -* feature #1577 Added SpacesAfterSemicolonFixer (SpacePossum) -* feature #1580 Added HeredocToNowdocFixer (gharlan) -* feature #1581 UnneededControlParenthesesFixer - add "break" and "continue" support (gharlan) -* feature #1610 HashToSlashCommentFixer - Add (SpacePossum) -* feature #1613 ScalarCastFixer - LowerCaseCastFixer - Add (SpacePossum) -* feature #1659 NativeFunctionCasingFixer - Add (SpacePossum) -* feature #1661 SwitchCaseSemicolonToColonFixer - Add (SpacePossum) -* feature #1662 Added CombineConsecutiveUnsetsFixer (SpacePossum) -* feature #1671 Added NoEmptyStatementFixer (SpacePossum) -* feature #1705 Added NoUselessReturnFixer (SpacePossum, keradus) -* feature #1735 Added NoTrailingWhitespaceInCommentFixer (keradus) -* feature #1750 Add PhpdocSingleLineVarSpacingFixer (SpacePossum) -* feature #1765 Added NoEmptyPhpdocFixer (SpacePossum) -* feature #1773 Add NoUselessElseFixer (gharlan, SpacePossum) -* feature #1786 Added NoEmptyCommentFixer (SpacePossum) -* feature #1792 Add PhpUnitDedicateAssertFixer. (SpacePossum) -* feature #1894 BracesFixer - correctly fix indents of anonymous functions/classes (gharlan) -* feature #1985 Added ClassKeywordRemoveFixer (Soullivaneuh) -* feature #2020 Added PhpdocAnnotationWithoutDotFixer (keradus) -* feature #2067 Added DeclareEqualNormalizeFixer (keradus) -* feature #2078 Added SilencedDeprecationErrorFixer (HeahDude) -* feature #2082 Added MbStrFunctionsFixer (Slamdunk) -* bug #1657 SwitchCaseSpaceFixer - Fix spacing between 'case' and semicolon (SpacePossum) -* bug #1684 SpacesAfterSemicolonFixer - fix loops handling (SpacePossum, keradus) -* bug #1700 Fixer - resolve import conflict (keradus) -* bug #1836 NoUselessReturnFixer - Do not remove return if last statement in short if statement (SpacePossum) -* bug #1879 HeredocToNowdocFixer - Handle space in heredoc token (SpacePossum) -* bug #1896 FixCommand - Fix escaping of diff output (SpacePossum) -* bug #2034 IncludeFixer - fix support for close tag (SpacePossum) -* bug #2040 PhpdocAnnotationWithoutDotFixer - fix crash on odd character (keradus) -* bug #2041 DefaultFinder should implement FinderInterface (keradus) -* bug #2050 PhpdocAnnotationWithoutDotFixer - handle ellipsis (keradus) -* bug #2051 NativeFunctionCasingFixer - call to constructor with default NS of class with name matching native function name fix (SpacePossum) -* minor #1538 Added possibility to lint tests (gharlan) -* minor #1569 Add sample to get a specific version of the fixer (Soullivaneuh) -* minor #1571 Enhance integration tests (keradus) -* minor #1578 Code grooming (keradus) -* minor #1583 Travis - update matrix (keradus) -* minor #1585 Code grooming - Improve utests code coverage (SpacePossum) -* minor #1586 Add configuration exception classes and exit codes (SpacePossum) -* minor #1594 Fix invalid PHP code samples in utests (SpacePossum) -* minor #1597 MethodArgumentDefaultValueFixer - refactoring and fix closures with "use" clause (gharlan) -* minor #1600 Added more integration tests (SpacePossum, keradus) -* minor #1605 integration tests - swap EXPECT and INPUT (optional INPUT) (gharlan) -* minor #1608 Travis - change matrix order for faster results (gharlan) -* minor #1609 CONTRIBUTING.md - Don't rebase always on master (SpacePossum) -* minor #1616 IncludeFixer - fix and test more cases (SpacePossum) -* minor #1622 AbstractIntegratationTest - fix linting test cases (gharlan) -* minor #1624 fix invalid code in test cases (gharlan) -* minor #1625 Travis - switch to trusty (keradus) -* minor #1627 FixCommand - fix output (keradus) -* minor #1630 Pass along the exception code. (SpacePossum) -* minor #1632 Php Inspections (EA Extended): SCA for 1.12 (kalessil) -* minor #1633 Fix CS for project itself (keradus) -* minor #1634 Backport some minor changes from 2.x line (keradus) -* minor #1637 update PHP Coveralls (keradus) -* minor #1639 Revert "Travis - set dist to trusty" (keradus) -* minor #1641 AppVeyor/Travis - use GITHUB_OAUTH_TOKEN (keradus) -* minor #1642 AppVeyor - install dev deps as well (keradus) -* minor #1647 Deprecate non-default Configs and Finders (keradus) -* minor #1654 Split output to stderr and stdout (SpacePossum) -* minor #1660 update phpunit version (gharlan) -* minor #1663 DuplicateSemicolonFixer - Remove duplicate semicolons even if there are comments between those (SpacePossum) -* minor #1664 IncludeFixer - Add missing test case (SpacePossum) -* minor #1668 Code grooming (keradus) -* minor #1669 NativeFunctionCasingFixer - move to Symfony level (keradus) -* minor #1670 Backport Finder and Config classes from 2.x line (keradus) -* minor #1682 ElseifFixer - handle comments (SpacePossum) -* minor #1689 AbstractIntegrationTest - no need for single-char group and docs grooming (keradus) -* minor #1690 Integration tests - allow to not check priority, introduce IntegrationCase (keradus) -* minor #1701 Fixer - Renamed import alias (GrahamCampbell) -* minor #1708 Update composer.json requirements (keradus) -* minor #1734 Travis: Turn on linting (keradus) -* minor #1736 Integration tests - don't check priority for tests using short_tag fixer (keradus) -* minor #1739 NoTrailingWhitespaceInCommentFixer - move to PSR2 level (keradus) -* minor #1763 Deprecate ConfigInterface::getDir, ConfigInterface::setDir, Finder::setDir (keradus) -* minor #1777 NoTrailingWhitespaceInCommentFixer - fix parent class (keradus) -* minor #1816 PhpUnitDedicateAssertFixer - configuration is not required anymore (keradus) -* minor #1849 DocBlock - The category tag should be together with package (GrahamCampbell) -* minor #1870 Update README.rst (glensc) -* minor #1880 FixCommand - fix stdErr detection (SpacePossum) -* minor #1881 NoEmptyStatementFixer - handle anonymous classes correctly (gharlan) -* minor #1906 .php_cs - use no_useless_else rule (keradus) -* minor #1915 NoEmptyComment - move to Symfony level (SpacePossum) -* minor #1917 BracesFixer - fixed comment handling (gharlan) -* minor #1919 EmptyReturnFixer - move fixer outside of Symfony level (keradus) -* minor #2036 OrderedUseFixer - adjust tests (keradus) -* minor #2056 Travis - run nightly PHP (keradus) -* minor #2061 UnusedUseFixer and LineAfterNamespace - add new integration test (keradus) -* minor #2097 Add lambda tests for 7.0 and 7.1 (SpacePossum) -* minor #2111 .travis.yml - rename PHP 7.1 env (keradus) -* minor #2112 Fix 1.12 line (keradus) -* minor #2118 SilencedDeprecationErrorFixer - adjust level (keradus) -* minor #2132 composer.json - rename package name (keradus) -* minor #2133 Apply ordered_class_elements rule (keradus) -* minor #2138 composer.json - disallow to run on PHP 7.2+ (keradus) - -Changelog for v1.11.8 ---------------------- - -* bug #2143 ReadmeCommand - fix running command on phar file (keradus) -* minor #2129 Add .gitattributes to remove unneeded files (Slamdunk) -* minor #2141 Move phar building to PHP 5.6 job as newest box.phar is no longer working on 5.3 (keradus) - -Changelog for v1.11.7 ---------------------- - -* bug #2108 ShortArraySyntaxFixer, TernarySpacesFixer, UnalignEqualsFixer - fix priority bug (SpacePossum) -* bug #2092 ConcatWithoutSpacesFixer, OperatorsSpacesFixer - fix too many spaces, fix incorrect fixing of lines with comments (SpacePossum) - -Changelog for v1.11.6 ---------------------- - -* bug #2086 Braces - fix bug with comment in method prototype (keradus) -* bug #2077 SingleLineAfterImportsFixer - Do not remove lines between use cases (SpacePossum) -* bug #2079 TernarySpacesFixer - Remove multiple spaces (SpacePossum) -* bug #2087 Fixer - handle PHP7 Errors as well (keradus) -* bug #2072 LowercaseKeywordsFixer - handle CT_CLASS_CONSTANT (tgabi333) -* bug #2066 LineAfterNamespaceFixer - Handle close tag (SpacePossum) -* bug #2057 LineAfterNamespaceFixer - adding too much extra lines where namespace is last statement (keradus) -* bug #2059 OperatorsSpacesFixer - handle declare statement (keradus) -* bug #2060 UnusedUseFixer - fix handling whitespaces around removed import (keradus) -* minor #2071 ShortEchoTagFixer - allow to run tests on PHP 5.3 (keradus) - -Changelog for v1.11.5 ---------------------- - -* bug #2012 Properly build phar file for lowest supported PHP version (keradus) -* bug #2037 BracesFixer - add support for anonymous classes (keradus) -* bug #1989 Add support for PHP 7 namespaces (SpacePossum) -* bug #2019 Fixing newlines added after curly brace string index access (jaydiablo) -* bug #1840 [Bug] BracesFixer - Do add a line before close tag (SpacePossum) -* bug #1994 EchoToPrintFixer - Fix T_OPEN_TAG_WITH_ECHO on hhvm (keradus) -* bug #1970 Tokens - handle semi-reserved PHP 7 keywords (keradus) -* minor #2017 PHP7 integration tests (keradus) -* minor #1465 Bump supported HHVM version, improve ShortEchoTagFixer on HHVM (keradus) -* minor #1995 Rely on own phpunit, not one from CI service (keradus) - -Changelog for v1.11.4 ---------------------- - -* bug #1956 SelfUpdateCommand - don't update to non-stable version (keradus) -* bug #1963 Fix not wanted unneeded_control_parentheses fixer for clone (Soullivaneuh) -* bug #1960 Fix invalid test cases (keradus) -* bug #1939 BracesFixer - fix handling comment around control token (keradus) -* minor #1927 NewWithBracesFixer - remove invalid testcase (keradus) - -Changelog for v1.11.3 ---------------------- - -* bug #1868 NewWithBracesFixer - fix handling more neighbor tokens (keradus) -* bug #1893 BracesFixer - handle comments inside lambda function prototype (keradus) -* bug #1806 SelfAccessorFixer - skip anonymous classes (gharlan) -* bug #1813 BlanklineAfterOpenTagFixer, NoBlankLinesBeforeNamespaceFixer - fix priority (SpacePossum) -* minor #1807 Tokens - simplify isLambda() (gharlan) - -Changelog for v1.11.2 ---------------------- - -* bug #1776 EofEndingFixer - new line on end line comment is allowed (Slamdunk) -* bug #1775 FileCacheManager - ignore corrupted serialized data (keradus) -* bug #1769 FunctionDeclarationFixer - fix more cases (keradus) -* bug #1747 Fixer - Fix ordering of fixer when both level and custom fixers are used (SpacePossum) -* bug #1744 Fixer - fix rare situation when file was visited twice (keradus) -* bug #1710 LowercaseConstantFixer - Fix comment cases. (SpacePossum) -* bug #1711 FunctioncallSpaceFixer - do not touch function declarations. (SpacePossum) -* minor #1798 LintManager - meaningful tempnam (Slamdunk) -* minor #1759 UniqueFileIterator - performance improvement (GrahamCampbell) -* minor #1745 appveyor - fix build (keradus) - -Changelog for v1.11.1 ---------------------- - -* bug #1680 NewWithBracesFixer - End tags (SpacePossum) -* bug #1685 EmptyReturnFixer - Make independent of LowercaseConstantsFixer (SpacePossum) -* bug #1640 IntegrationTest - fix directory separator (keradus) -* bug #1595 ShortTagFixer - fix priority (keradus) -* bug #1576 SpacesBeforeSemicolonFixer - do not remove space before semicolon if that space is after a semicolon (SpacePossum) -* bug #1570 UnneededControlParenthesesFixer - fix test samples (keradus) -* minor #1653 Update license year (gharlan) - -Changelog for v1.11 -------------------- - -* feature #1550 Added UnneededControlParenthesesFixer (Soullivaneuh, keradus) -* feature #1532 Added ShortBoolCastFixer (SpacePossum) -* feature #1523 Added EchoToPrintFixer and PrintToEchoFixer (Soullivaneuh) -* feature #1552 Warn when running with xdebug extension (SpacePossum) -* feature #1484 Added ArrayElementNoSpaceBeforeCommaFixer and ArrayElementWhiteSpaceAfterCommaFixer (amarczuk) -* feature #1449 PhpUnitConstructFixer - Fix more use cases (SpacePossum) -* feature #1382 Added PhpdocTypesFixer (GrahamCampbell) -* feature #1384 Add integration tests (SpacePossum) -* feature #1349 Added FunctionTypehintSpaceFixer (keradus) -* minor #1562 Fix invalid PHP code samples in utests (SpacePossum) -* minor #1560 Fixed project name in xdebug warning (gharlan) -* minor #1545 Fix invalid PHP code samples in utests (SpacePossum) -* minor #1554 Alphabetically sort entries in .gitignore (GrahamCampbell) -* minor #1527 Refactor the way types work on annotations (GrahamCampbell) -* minor #1546 Update coding guide in cookbook (keradus) -* minor #1526 Support more annotations when fixing types in phpdoc (GrahamCampbell) -* minor #1535 clean ups (SpacePossum) -* minor #1510 Added Symfony 3.0 support (Ener-Getick) -* minor #1520 Code grooming (keradus) -* minor #1515 Support property, property-read and property-write tags (GrahamCampbell) -* minor #1488 Added more inline phpdoc tests (GrahamCampbell) -* minor #1496 Add docblock to AbstractFixerTestBase::makeTest (lmanzke) -* minor #1467 PhpdocShortDescriptionFixer - add support for Japanese sentence-ending characters (fritz-c) -* minor #1453 remove calling array_keys in foreach loops (keradus) -* minor #1448 Code grooming (keradus) -* minor #1437 Added import fixers integration test (GrahamCampbell) -* minor #1433 phpunit.xml.dist - disable gc (keradus) -* minor #1427 Change arounded to surrounded in README.rst (36degrees) -* minor #1420 AlignDoubleArrowFixer, AlignEqualsFixer - add integration tests (keradus) -* minor #1423 appveyor.yml - do not cache C:\tools, its internal forAppVeyor (keradus) -* minor #1400 appveyor.yml - add file (keradus) -* minor #1396 AbstractPhpdocTypesFixer - instance method should be called on instance (keradus) -* minor #1395 code grooming (keradus) -* minor #1393 boost .travis.yml file (keradus) -* minor #1372 Don't allow PHP 7 to fail (GrahamCampbell) -* minor #1332 PhpUnitConstructFixer - fix more functions (keradus) -* minor #1339 CONTRIBUTING.md - add link to PSR-5 (keradus) -* minor #1346 Core grooming (SpacePossum) -* minor #1328 Tokens: added typehint for Iterator elements (gharlan) - -Changelog for v1.10.3 ---------------------- - -* bug #1559 WhitespacyLinesFixer - fix bug cases (SpacePossum, keradus) -* bug #1541 Psr0Fixer - Ignore filenames that are a reserved keyword or predefined constant (SpacePossum) -* bug #1537 Psr0Fixer - ignore file without name or with name started by digit (keradus) -* bug #1516 FixCommand - fix wrong message for dry-run (SpacePossum) -* bug #1486 ExtraEmptyLinesFixer - Remove extra lines after comment lines too (SpacePossum) -* bug #1503 Psr0Fixer - fix case with comments lying around (GrahamCampbell) -* bug #1474 PhpdocToCommentFixer - fix not properly fixing for block right after namespace (GrahamCampbell) -* bug #1478 BracesFixer - do not remove empty lines after class opening (keradus) -* bug #1468 Add missing ConfigInterface::getHideProgress() (Eugene Leonovich, rybakit) -* bug #1466 Fix bad indent on align double arrow fixer (Soullivaneuh, keradus) -* bug #1479 Tokens - fix detection of short array (keradus) - -Changelog for v1.10.2 ---------------------- - -* bug #1461 PhpUnitConstructFixer - fix case when first argument is an expression (keradus) -* bug #1460 AlignDoubleArrowFixer - fix handling of nested arrays (Soullivaneuh, keradus) - -Changelog for v1.10.1 ---------------------- - -* bug #1424 Fixed the import fixer priorities (GrahamCampbell) -* 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 #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) -* bug #1401 PhpdocVarWithoutNameFixer - Fixed the var without name fixer for inline docs (keradus, GrahamCampbell) -* bug #1369 Fix not well-formed XML output (junichi11) -* bug #1356 Psr0Fixer - disallow run on StdinFileInfo (keradus) - -Changelog for v1.10 -------------------- - -* feature #1306 Added LogicalNotOperatorsWithSuccessorSpaceFixer (phansys) -* feature #1286 Added PhpUnitConstructFixer (keradus) -* feature #1316 Added PhpdocInlineTagFixer (SpacePossum, keradus) -* feature #1303 Added LogicalNotOperatorsWithSpacesFixer (phansys) -* feature #1279 Added PhpUnitStrictFixer (keradus) -* feature #1267 SingleQuoteFixer fix more use cases (SpacePossum) -* minor #1319 PhpUnitConstructFixer - fix performance and add to local .php_cs (keradus) -* minor #1280 Fix non-utf characters in docs (keradus) -* minor #1274 Cookbook - No change auto-test note (Soullivaneuh) - -Changelog for v1.9.3 --------------------- - -* bug #1327 DocBlock\Tag - keep the case of tags (GrahamCampbell) - -Changelog for v1.9.2 --------------------- - -* bug #1313 AlignDoubleArrowFixer - fix aligning after UTF8 chars (keradus) -* bug #1296 PhpdocScalarFixer - fix property annotation too (GrahamCampbell) -* bug #1299 WhitespacyLinesFixer - spaces on next valid line must not be fixed (Slamdunk) - -Changelog for v1.9.1 --------------------- - -* bug #1288 TrimArraySpacesFixer - fix moving first comment (keradus) -* bug #1287 PhpdocParamsFixer - now works on any indentation level (keradus) -* bug #1278 Travis - fix PHP7 build (keradus) -* bug #1277 WhitespacyLinesFixer - stop changing non-whitespacy tokens (SpacePossum, SamBurns-awin, keradus) -* bug #1224 TrailingSpacesFixer - stop changing non-whitespacy tokens (SpacePossum, SamBurns-awin, keradus) -* bug #1266 FunctionCallSpaceFixer - better detection of function call (funivan) -* bug #1255 make sure some phpdoc fixers are run in right order (SpacePossum) - -Changelog for v1.9 ------------------- - -* feature #1097 Added ShortEchoTagFixer (vinkla) -* minor #1238 Fixed error handler to respect current error_reporting (JanJakes) -* minor #1234 Add class to exception message, use sprintf for exceptions (SpacePossum) -* minor #1210 set custom error handler for application run (keradus) -* minor #1214 Tokens::isMonolithicPhp - enhance performance (keradus) -* minor #1207 Update code documentation (keradus) -* minor #1202 Update IDE tool urls (keradus) -* minor #1195 PreIncrementFixer - move to Symfony level (gharlan) - -Changelog for v1.8.1 --------------------- - -* bug #1193 EofEndingFixer - do not add an empty line at EOF if the PHP tags have been closed (SpacePossum) -* bug #1209 PhpdocParamsFixer - fix corrupting following custom annotation (keradus) -* bug #1205 BracesFixer - fix missing indentation fixes for class level (keradus) -* bug #1204 Tag - fix treating complex tag as simple PhpDoc tag (keradus) -* bug #1198 Tokens - fixed unary/binary operator check for type-hinted reference arguments (gharlan) -* bug #1201 Php4ConstructorFixer - fix invalid handling of subnamespaces (gharlan) -* minor #1221 Add more tests (SpacePossum) -* minor #1216 Tokens - Add unit test for array detection (SpacePossum) - -Changelog for v1.8 ------------------- - -* feature #1168 Added UnalignEqualsFixer (keradus) -* feature #1167 Added UnalignDoubleArrowFixer (keradus) -* bug #1169 ToolInfo - Fix way to find script dir (sp-ian-monge) -* minor #1181 composer.json - Update description (SpacePossum) -* minor #1180 create Tokens::overrideAt method (keradus) - -Changelog for v1.7.1 --------------------- - -* bug #1165 BracesFixer - fix bug when comment is a first statement in control structure without braces (keradus) - -Changelog for v1.7 ------------------- - -* feature #1113 Added PreIncrementFixer (gharlan) -* feature #1144 Added PhpdocNoAccessFixer (GrahamCampbell) -* feature #1116 Added SelfAccessorFixer (gharlan) -* feature #1064 OperatorsSpacesFixer enhancements (gharlan) -* bug #1151 Prevent token collection corruption by fixers (stof, keradus) -* bug #1152 LintManager - fix handling of temporary file (keradus) -* bug #1139 NamespaceNoLeadingWhitespaceFixer - remove need for ctype extension (keradus) -* bug #1117 Tokens - fix iterator used with foreach by reference (keradus) -* minor #1148 code grooming (keradus) -* minor #1142 We are actually PSR-4, not PSR-0 (GrahamCampbell) -* minor #1131 Phpdocs and typos (SpacePossum) -* minor #1069 state min HHVM version (keradus) -* minor #1129 [DX] Help developers choose the right branch (SpacePossum) -* minor #1138 PhpClosingTagFixer - simplify flow, no need for loop (keradus) -* minor #1123 Reference mismatches fixed, SCA (kalessil) -* minor #1109 SingleQuoteFixer - made fixer more accurate (gharlan) -* minor #1110 code grooming (kalessil) - -Changelog for v1.6.2 --------------------- - -* bug #1149 UnusedUseFixer - must be run before LineAfterNamespaceFixer, fix token collection corruption (keradus) -* minor #1145 AbstractLinesBeforeNamespaceFixer - fix docs for fixLinesBeforeNamespace (GrahamCampbell) - -Changelog for v1.6.1 --------------------- - -* bug #1108 UnusedUseFixer - fix false positive when name is used as part of another namespace (gharlan) -* bug #1114 Fixed PhpdocParamsFixer with malformed doc block (gharlan) -* minor #1135 PhpdocTrimFixer - fix doc typo (localheinz) -* minor #1093 Travis - test lowest dependencies (boekkooi) - -Changelog for v1.6 ------------------- - -* feature #1089 Added NewlineAfterOpenTagFixer and BlanklineAfterOpenTagFixer (ceeram, keradus) -* feature #1090 Added TrimArraySpacesFixer (jaredh159, keradus) -* feature #1058 Added SingleQuoteFixer (gharlan) -* feature #1059 Added LongArraySyntaxFixer (gharlan) -* feature #1037 Added PhpdocScalarFixer (GrahamCampbell, keradus) -* feature #1028 Add ListCommasFixer (keradus) -* bug #1047 Utils::camelCaseToUnderscore - fix regexp (odin-delrio) -* minor #1073 ShortTagFixer enhancement (gharlan) -* minor #1079 Use LongArraySyntaxFixer for this repo (gharlan) -* minor #1070 Tokens::isMonolithicPhp - remove unused T_CLOSE_TAG search (keradus) -* minor #1049 OrderedUseFixer - grooming (keradus) - -Changelog for v1.5.2 --------------------- - -* bug #1025 Fixer - ignore symlinks (kix) -* bug #1071 Psr0Fixer - fix bug for fixing file with long extension like .class.php (keradus) -* bug #1080 ShortTagFixer - fix false positive (gharlan) -* bug #1066 Php4ConstructorFixer - fix causing infinite recursion (mbeccati) -* bug #1056 VisibilityFixer - fix T_VAR with multiple props (localheinz, keradus) -* bug #1065 Php4ConstructorFixer - fix detection of a PHP4 parent constructor variant (mbeccati) -* bug #1060 Tokens::isShortArray: tests and bugfixes (gharlan) -* bug #1057 unused_use: fix false positive when name is only used as variable name (gharlan) - -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 #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) -* bug #1020 BracesFixer - fix missing braces for nested if elseif else (malengrin) -* minor #1036 Added php7 to travis build (fonsecas72) -* minor #1026 Fix typo in ShortArraySyntaxFixer (tommygnr) -* minor #1024 code grooming (keradus) - -Changelog for v1.5 ------------------- - -* feature #887 Added More Phpdoc Fixers (GrahamCampbell, keradus) -* feature #1002 Add HeaderCommentFixer (ajgarlag) -* feature #974 Add EregToPregFixer (mbeccati) -* feature #970 Added Php4ConstructorFixer (mbeccati) -* feature #997 Add PhpdocToCommentFixer (ceeram, keradus) -* feature #932 Add NoBlankLinesAfterClassOpeningFixer (ceeram) -* feature #879 Add SingleBlankLineBeforeNamespaceFixer and NoBlankLinesBeforeNamespaceFixer (GrahamCampbell) -* feature #860 Add single_line_after_imports fixer (ceeram) -* minor #1014 Fixed a few file headers (GrahamCampbell) -* minor #1011 Fix HHVM as it works different than PHP (keradus) -* minor #1010 Fix invalid UTF-8 char in docs (ajgarlag) -* minor #1003 Fix header comment in php files (ajgarlag) -* minor #1005 Add Utils::calculateBitmask method (keradus) -* minor #973 Add Tokens::findSequence (mbeccati) -* minor #991 Longer explanation of how to use blacklist (bmitch, networkscraper) -* minor #972 Add case sensitive option to the tokenizer (mbeccati) -* minor #986 Add benchmark script (dericofilho) -* minor #985 Fix typo in COOKBOOK-FIXERS.md (mattleff) -* minor #978 Token - fix docs (keradus) -* 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 #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) -* minor #927 Exclude the resources folder from coverage reports (GrahamCampbell) -* minor #926 Update Token::isGivenKind phpdoc (GrahamCampbell) -* minor #925 Improved AbstractFixerTestBase (GrahamCampbell) -* minor #922 AbstractFixerTestBase::makeTest - test if input is different than expected (keradus) -* minor #904 Refactoring Utils (GrahamCampbell) -* minor #901 Improved Readme Formatting (GrahamCampbell) -* minor #898 Tokens::getImportUseIndexes - simplify function (keradus) -* minor #897 phpunit.xml.dist - split testsuite (keradus) - -Changelog for v1.4.2 --------------------- - -* bug #994 Fix detecting of short arrays (keradus) -* bug #995 DuplicateSemicolonFixer - ignore duplicated semicolons inside T_FOR (keradus) - -Changelog for v1.4.1 --------------------- - -* bug #990 MultilineArrayTrailingCommaFixer - fix case with short array on return (keradus) -* bug #975 NoEmptyLinesAfterPhpdocsFixer - fix only when documentation documents sth (keradus) -* bug #976 PhpdocIndentFixer - fix error when there is a comment between docblock and next meaningful token (keradus, ceeram) - -Changelog for v1.4 ------------------- - -* feature #841 PhpdocParamsFixer: added aligning var/type annotations (GrahamCampbell) -* bug #965 Fix detection of lambda function that returns a reference (keradus) -* bug #962 PhpdocIndentFixer - fix bug when documentation is on the end of braces block (keradus) -* bug #961 Fixer - fix handling of empty file (keradus) -* bug #960 IncludeFixer - fix bug when include is part of condition statement (keradus) -* bug #954 AlignDoubleArrowFixer - fix new buggy case (keradus) -* bug #955 ParenthesisFixer - fix case with list call with trailing comma (keradus) -* bug #950 Tokens::isLambda - fix detection near comments (keradus) -* bug #951 Tokens::getImportUseIndexes - fix detection near comments (keradus) -* bug #949 Tokens::isShortArray - fix detection near comments (keradus) -* bug #948 NewWithBracesFixer - fix case with multidimensional array (keradus) -* 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 #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) -* bug #874 BracesFixer - fix bug of removing empty lines after class' opening { (ceeram) -* bug #868 BracesFixer - fix missing braces when statement is not followed by ; (keradus) -* bug #861 Updated PhpdocParamsFixer not to change line endings (keradus, GrahamCampbell) -* bug #837 FixCommand - stop corrupting xml/json format (keradus) -* bug #846 Made phpdoc_params run after phpdoc_indent (GrahamCampbell) -* bug #834 Correctly handle tab indentation (ceeram) -* bug #822 PhpdocIndentFixer - Ignore inline docblocks (ceeram) -* bug #813 MultilineArrayTrailingCommaFixer - do not move array end to new line (keradus) -* bug #817 LowercaseConstantsFixer - ignore class' constants TRUE/FALSE/NULL (keradus) -* bug #821 JoinFunctionFixer - stop changing declaration method name (ceeram) -* minor #963 State the minimum version of PHPUnit in CONTRIBUTING.md (SpacePossum) -* minor #943 Improve the cookbook to use relative links (stof) -* minor #921 Add changelog file (keradus) -* minor #909 BracesFixerTest - no \n line in \r\n test (keradus) -* minor #864 Added NoEmptyLinesAfterPhpdocsFixer (GrahamCampbell) -* minor #871 Added missing author (GrahamCampbell) -* minor #852 Fixed the coveralls version constraint (GrahamCampbell) -* minor #863 Tweaked testRetainsNewLineCharacters (GrahamCampbell) -* minor #849 Removed old alias (GrahamCampbell) -* minor #843 integer should be int (GrahamCampbell) -* minor #830 Remove whitespace before opening tag (ceeram) -* minor #835 code grooming (keradus) -* minor #828 PhpdocIndentFixerTest - code grooming (keradus) -* minor #827 UnusedUseFixer - code grooming (keradus) -* minor #825 improve code coverage (keradus) -* minor #810 improve code coverage (keradus) -* minor #811 ShortArraySyntaxFixer - remove not needed if statement (keradus) - -Changelog for v1.3 ------------------- - -* feature #790 Add docblock indent fixer (ceeram) -* feature #771 Add JoinFunctionFixer (keradus) -* bug #798 Add DynamicVarBrace Transformer for properly handling ${$foo} syntax (keradus) -* bug #796 LowercaseConstantsFixer - rewrite to handle new test cases (keradus) -* bug #789 T_CASE is not succeeded by parentheses (dericofilho) -* minor #814 Minor improvements to the phpdoc_params fixer (GrahamCampbell) -* minor #815 Minor fixes (GrahamCampbell) -* minor #782 Cookbook on how to make a new fixer (dericofilho) -* minor #806 Fix Tokens::detectBlockType call (keradus) -* minor #758 travis - disable sudo (keradus) -* minor #808 Tokens - remove commented code (keradus) -* minor #802 Address Sensiolabs Insight's warning of code cloning. (dericofilho) -* minor #803 README.rst - fix \` into \`\` (keradus) - -Changelog for v1.2 ------------------- - -* feature #706 Remove lead slash (dericofilho) -* feature #740 Add EmptyReturnFixer (GrahamCampbell) -* bug #775 PhpClosingTagFixer - fix case with T_OPEN_TAG_WITH_ECHO (keradus) -* bug #756 Fix broken cases for AlignDoubleArrowFixer (dericofilho) -* bug #763 MethodArgumentSpaceFixer - fix receiving data in list context with omitted values (keradus) -* bug #759 Fix Tokens::isArrayMultiLine (stof, keradus) -* bug #754 LowercaseKeywordsFixer - __HALT_COMPILER must not be lowercased (keradus) -* bug #753 Fix for double arrow misalignment in deeply nested arrays. (dericofilho) -* bug #752 OrderedUseFixer should be case-insensitive (rusitschka) -* 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 #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) - -Changelog for v1.1 ------------------- - -* feature #749 remove the --no-progress option (replaced by the standard -v) (fabpot, keradus) -* feature #728 AlignDoubleArrowFixer - standardize whitespace after => (keradus) -* feature #647 Add DoubleArrowMultilineWhitespacesFixer (dericofilho, keradus) -* bug #746 SpacesBeforeSemicolonFixerTest - fix bug with semicolon after comment (keradus) -* bug #741 Fix caching when composer is installed in custom path (cmodijk) -* bug #725 DuplicateSemicolonFixer - fix clearing whitespace after duplicated semicolon (keradus) -* bug #730 Cache busting when fixers list changes (Seldaek) -* bug #722 Fix lint for STDIN-files (ossinkine) -* bug #715 TrailingSpacesFixer - fix bug with french UTF-8 chars (keradus) -* bug #718 Fix package name for composer cache (Seldaek) -* bug #711 correct vendor name (keradus) -* minor #745 Show progress by default and allow to disable it (keradus) -* minor #731 Add a way to disable all default filters and really provide a whitelist (Seldaek) -* minor #737 Extract tool info into new class, self-update command works now only for PHAR version (keradus) -* minor #739 fix fabbot issues (keradus) -* minor #726 update CONTRIBUTING.md for installing dependencies (keradus) -* minor #736 Fix fabbot issues (GrahamCampbell) -* minor #727 Fixed typos (pborreli) -* minor #719 Add update instructions for composer and caching docs (Seldaek) - -Changelog for v1.0 ------------------- - -First stable release. diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/CONTRIBUTING.md b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/CONTRIBUTING.md deleted file mode 100644 index a3eb381..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/CONTRIBUTING.md +++ /dev/null @@ -1,104 +0,0 @@ -# Contributions Are Welcome! - -If you need any help, don't hesitate to ask the community on [Gitter](https://gitter.im/PHP-CS-Fixer/Lobby). - -## Quick Guide - -### Fixer - -A *fixer* is a class that tries to fix one code style issue (a ``Fixer`` class -must implement ``FixerInterface``). - -### Config - -A *config* knows about the code style rules and the files and directories that -must be scanned by the tool when run in the directory of your project. It is -useful for projects that follow a well-known directory structures (like for -Symfony projects for instance). - -### How-To - -* [Fork](https://help.github.com/articles/fork-a-repo/) the repo. -* [Checkout](https://git-scm.com/docs/git-checkout) the branch you want to make changes on: - * If you are fixing a bug or typo, improving tests or for any small tweak: the lowest branch where the changes can be applied. Once your Pull Request is accepted, the changes will get merged up to highest branches. - * `master` in other cases (new feature, deprecation, or backwards compatibility breaking changes). Note that most of the time, `master` represents the next minor release of PHP CS Fixer, so Pull Requests that break backwards compatibility might be postponed. -* Install dependencies: `composer install`. -* Create a new branch, e.g. `feature-foo` or `bugfix-bar`. -* Make changes. -* If you are adding functionality or fixing a bug - add a test! Prefer adding new test cases over modifying existing ones. -* Make sure there is no wrong file permissions in the repository: `./dev-tools/check_file_permissions.sh`. -* Make sure there is no trailing spaces in the code: `./dev-tools/check_trailing_spaces.sh`. -* Update documentation: `php dev-tools/doc.php`. 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 run -it --rm --user="$(id -u):$(id -g)" -w="/app" --volume="$(pwd):/app" php:7.4-cli php dev-tools/doc.php`. -* Install dev tools: `dev-tools/install.sh` -* Run static analysis using PHPStan: `php -d memory_limit=256M dev-tools/vendor/bin/phpstan analyse` -* Check if tests pass: `vendor/bin/phpunit`. -* Fix project itself: `php php-cs-fixer fix`. - -## Working With Docker - -This project provides a Docker setup that allows working on it using any of the supported PHP versions. - -To use it, you first need to install: - - * [Docker](https://docs.docker.com/get-docker/) - * [Docker Compose](https://docs.docker.com/compose/install/) - -Make sure the versions installed support [Compose file format 3.8](https://docs.docker.com/compose/compose-file/). - -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. - -You can then build the images: - -```console -$ 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: - -```console -$ docker-compose run php-7.4 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 -``` - -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 -``` - -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. - -All images use port 9003 for debug connections. - -## Opening a [Pull Request](https://help.github.com/articles/about-pull-requests/) - -You can do some things to increase the chance that your Pull Request is accepted the first time: - -* Submit one Pull Request per fix or feature. -* If your changes are not up to date, [rebase](https://git-scm.com/docs/git-rebase) your branch onto the parent branch. -* Follow the conventions used in the project. -* Remember about tests and documentation. -* Don't bump version. - -## Making New Fixers - -There is a [cookbook](doc/cookbook_fixers.rst) with basic instructions on how to build a new fixer. Consider reading it -before opening a PR. - -## Project's Standards - -* [PSR-1: Basic Coding Standard](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-1-basic-coding-standard.md) -* [PSR-2: Coding Style Guide](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md) -* [PSR-4: Autoloading Standard](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader.md) -* [PSR-5: PHPDoc (draft)](https://github.com/phpDocumentor/fig-standards/blob/master/proposed/phpdoc.md) -* [Symfony Coding Standards](https://symfony.com/doc/current/contributing/code/standards.html) diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/LICENSE b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/LICENSE deleted file mode 100644 index 40c3bc3..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2012-2021 Fabien Potencier, Dariusz Rumiński - -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/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/README.md b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/README.md deleted file mode 100644 index 20c55af..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/README.md +++ /dev/null @@ -1,75 +0,0 @@ -

- - PHP CS Fixer logo - -

- -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., -or other community driven ones like the Symfony one. -You can **also** define your (team's) style through configuration. - -It can modernize your code (like converting the ``pow`` function to the ``**`` operator on PHP 5.6) -and (micro) optimize it. - -If you are already using a linter to identify coding standards problems in your -code, you know that fixing them by hand is tedious, especially on large -projects. This tool does not only detect them, but also fixes them for you. - -## Documentation - -### 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: - -```console -$ mkdir --parents tools/php-cs-fixer -$ composer require --working-dir=tools/php-cs-fixer friendsofphp/php-cs-fixer -``` - -For more details and other installation methods, 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: - -```console -$ tools/php-cs-fixer/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) -and [configuration file](./doc/config.rst) documentation for more details. - -If you need to apply code styles that are not supported by the tool, you can -[create custom rules](./doc/custom_rules.rst). - -## Editor Integration - -Dedicated plugins exist for: - -* [Atom](https://github.com/Glavin001/atom-beautify) -* [NetBeans](https://plugins.netbeans.apache.org/catalogue/?id=36) -* [PhpStorm](https://www.jetbrains.com/help/phpstorm/using-php-cs-fixer.html) -* [Sublime Text](https://github.com/benmatselby/sublime-phpcs) -* [Vim](https://github.com/stephpy/vim-php-cs-fixer) -* [VS Code](https://github.com/junstyle/vscode-php-cs-fixer) - -## Community - -The PHP CS Fixer is maintained on GitHub at https://github.com/FriendsOfPHP/PHP-CS-Fixer. -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! - -## Contribute - -The tool comes with quite a few built-in fixers, but everyone is more than -welcome to [contribute](CONTRIBUTING.md) more of them. diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/UPGRADE-v3.md b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/UPGRADE-v3.md deleted file mode 100644 index dd27c88..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/UPGRADE-v3.md +++ /dev/null @@ -1,166 +0,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/FriendsOfPHP/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 ---------------- - -| 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 ------------ - -| 2.x | 3.0 | Description | Note | -| ---------------- | --------------- | ----------------------------------------------- | -------------------------------------- | -| --diff-format | | Type of differ | Option was removed, all diffs are now | -| | | | `udiff` | -| --show-progress | --show-progress | Type of progress indicator | Allowed values were modified: | -| | | | `run-in` and `estimating` was removed, | -| | | | `estimating-max` was renamed to `dots` | -| --rules | --rules | Default value changed from @PSR2 to @PSR12 | | -| --config --rules | | | No longer allowed to pass both | - -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']]` - -### 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` - -### 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 - -### 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']` - -### Removed rule sets - -Rule set | Note --------- | ---- -`@PHP56Migration` | was empty - -### Rule behavior changes - -- `no_unused_imports` now runs all files defined in the configuration (used to exclude some hardcoded directories) - -### Various - -- `udiff` output now includes the file name in the output (if applicable) - -Code BC changes -=============== - -### Removed; various - -- class `AbstractAlignFixerHelper` has been removed -- class `AccessibleObject` has been removed -- class `AlignDoubleArrowFixerHelper` has been removed -- class `AlignEqualsFixerHelper` has been removed -- class `FixerConfigurationResolverRootless` has been removed -- `HeaderCommentFixer` deprecated properties have been removed -- `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()` -- 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 - -- `ConfigurableFixerInterface` has been updated -- `ConfigurationDefinitionFixerInterface` has been removed in favor of the updated `ConfigurableFixerInterface` -- `DefinedFixerInterface` has been removed, related methods are now part of the updated `FixerInterface` interface -- `DifferInterface` has been updated -- `FixerInterface` interface has been updated -- `PhpCsFixer\RuleSetInterface` has been removed in favor of `\PhpCsFixer\RuleSet\RuleSetInterface` - -### BC breaks; various - -- class `Token` is now `final` -- class `Tokens` is now `final` -- method `create` of class `Config` has been removed, [use the constructor](./doc/config.rst) -- method `create` of class `RuleSet` has been removed, [use the constructor](./doc/custom_rules.rst) - -### BC breaks; common internal classes - -- method `getClassyElements` of class `TokensAnalyzer` parameter `$returnTraitsImports` has been removed; now always returns trait import information -- method `getSetDefinitionNames` of class `RuleSet` has been removed, use `RuleSets::getSetDefinitionNames()` diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/ci-integration.sh b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/ci-integration.sh deleted file mode 100644 index 2521e24..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/ci-integration.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh -set -eu - -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 fix --config=.php-cs-fixer.dist.php -v --dry-run --stop-on-violation --using-cache=no ${EXTRA_ARGS} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/composer.json b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/composer.json deleted file mode 100644 index c665a72..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/composer.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "name": "friendsofphp/php-cs-fixer", - "type": "application", - "description": "A tool to automatically fix PHP code style", - "license": "MIT", - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Dariusz Rumiński", - "email": "dariusz.ruminski@gmail.com" - } - ], - "require": { - "php": "^7.1.3 || ^8.0", - "ext-json": "*", - "ext-tokenizer": "*", - "composer/semver": "^3.2", - "composer/xdebug-handler": "^2.0", - "doctrine/annotations": "^1.12", - "php-cs-fixer/diff": "^2.0", - "symfony/console": "^4.4.20 || ^5.1.3", - "symfony/event-dispatcher": "^4.4.20 || ^5.0", - "symfony/filesystem": "^4.4.20 || ^5.0", - "symfony/finder": "^4.4.20 || ^5.0", - "symfony/options-resolver": "^4.4.20 || ^5.0", - "symfony/polyfill-php72": "^1.23", - "symfony/polyfill-php81": "^1.23", - "symfony/process": "^4.4.20 || ^5.0", - "symfony/stopwatch": "^4.4.20 || ^5.0" - }, - "require-dev": { - "justinrainbow/json-schema": "^5.2", - "keradus/cli-executor": "^1.4", - "mikey179/vfsstream": "^1.6.8", - "php-coveralls/php-coveralls": "^2.4.3", - "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.10.3", - "phpspec/prophecy-phpunit": "^1.1 || ^2.0", - "phpunit/phpunit": "^7.5.20 || ^8.5.14 || ^9.5", - "phpunitgoodpractices/polyfill": "^1.5", - "phpunitgoodpractices/traits": "^1.9.1", - "symfony/phpunit-bridge": "^5.2.4", - "symfony/yaml": "^4.4.20 || ^5.0" - }, - "suggest": { - "ext-dom": "For handling output formats in XML", - "ext-mbstring": "For handling non-UTF8 characters.", - "symfony/polyfill-mbstring": "When enabling `ext-mbstring` is not possible." - }, - "config": { - "sort-packages": true - }, - "autoload": { - "psr-4": { - "PhpCsFixer\\": "src/" - } - }, - "autoload-dev": { - "psr-4": { - "PhpCsFixer\\Tests\\": "tests/" - } - }, - "bin": [ - "php-cs-fixer" - ] -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/logo.md b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/logo.md deleted file mode 100644 index b08e6a8..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/logo.md +++ /dev/null @@ -1,3 +0,0 @@ -The logo is © 2010-2014 Sensio Labs. - -Original resolution can be found at https://github.com/PHP-CS-Fixer/logo . diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/logo.png b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/logo.png deleted file mode 100644 index 0ee90a821322b4bbb293cb466fd717f8a2ef44df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18627 zcmd2?Wm6nouwL99f(Ccj;6XxQae}+E$l~skRYcl|VKHeu@7}zUH(r=(s$e4`mis>?>l*JtWlg|q8rxL|1a-~43?h~9mQ35W$ zR1aixbI^FMr(a70K|>7l1>oS|qU;=x{r(GAyU*QzHP-E()a@ML*D1vgf*CoW`Dx$kL#23QNT^SAThYVxV&W@sBfQq<@Zd^90ufw3XMAVQm&I{uQxbP zJojO#C*f{8ZF2;%0$+w)miBlj;KE*oxQq)_uKTcz^ZpJv64&SFVJl)u;i>)h_8Tw@ zx&CAh(KQ?Qy21~2TprjP<=xXD+PQEO9{cmfoZmhYn3+apGO zqW4DG9*)e@AXdapK1lBzvHi69B+U_1}PU zFBEYF0LTH-5@M?E%cmV~nbaB{tS{{cnPtbT!ZV2)_55HwETBIC3l%<$$+517mWbFo zXp5*AocVa_6^+%%u?ahXe;OH{5?#S8inLcT?f{~jym2mbUO$gLRuVQUHg{EDUMrRA znx9ZzP<7Loo0;@lN0bQ1q!15A#G?Fvbz|nAuYzd=xj?b=>VU%j3~NpMht~gUEY^`KOh;vk@Fya^5#B|lotFtwFcVaJWO&slac7)(BvI%K$o_k5kKaq|`_p?S#J5V- zxlKZoe`?(@KKB>YjWnfaXA-A0bvU9S2ms)crF>&2Xo7C`sm$TRTKj^f?tA|iBC&lU zL&(M}$3;^}O^F;|Db|h-@O#X5Yj2_BWT2AJgkQhhUx+W=W;32vME+FGjk@#BXhtyB zD#^Y^PTc)hJ19-eAGEJ%IiB-YTy1bJiHuJnPF$n4(t!Sf=1qSZOX zXD1iEDaUN)R&GYbQV6(je~sqwf95s{Chs&S8emH1{8yDUnuDvnT7pUi4`QFBA?;mg z-J>-bkRN-Be!qd7m{WyBVj7{ZzczyL{0*QY6tSt$?VD7Q$#qRr2RuPl%#vT=n|yzB z1$DF0{8j9D{%ltiZjVJ7ya2ZI6h=z0^UvLg9^BE$05L0&>rtux41VyS2u9~96Kjm) ziQw<-5p- z#Xx2;CJ=;b-_x^eQI`mg#DwZT_uf3yA-GX2vb@bGLINoS9p0j@mO}2pADPQ^EvX{0 zGS7k{qC6v&XIh%_sV0e&42$(o`rw)0Ew}~W`rk{2>gp<1WIv`mMOx}(mP}cgw}Ik< zi8V?Bi?uqXM1#O(VAqO7@UPAT8xdKoEy@b5)vGiEp43A(N2C+HHiS0BS!$$i7@1OD zi?fYC6(^Frfg=M>xU3C*<>%&{JLYMqc>jH`uX5p4ARbplOyXQaeRXjvLsB<_$O8bP z#q83P@lXW|FH;+rn*<+Jtzc?*L5yLzB0uanPaR&X<^T00aimqQ2G>Z+t-VN7Yyc5V z9e(IDMqqA>re?)eZ70I+>Nt)_{%I1n#mxpXI?Ls46-3Pa1{*fr+d zRJsshr;-YE{#H7Vf%Tt!J<)!b6qNaH*bxg1ObW2MbY|NTdC;kZ z_;)lE;opXbP-o@EvWdNR`o{)6kOwzAh?ZkNLPWlYv+}e5gRoh@$*r}YEPR32gFDn? zLBM)aK#IFgB;N3~-+oKuzL3{6ynPUw$cLXHL4seOr(nasvJ`03C1E+Pa6NI->P`;g ze1kjv7u|~~y2hlX(F8aAsgc;@$HZFySd-7|$wsu?2qGA!$!~ulA^;rGSFXmafLJ*b z*e-A15n7!o&4%X3TDCS>z){_yk3L zC~8x(a^U+dpwBKrRVUaIIz3~5J9G24XoBF%Ap!hHwdQk)Mh(Xa{3R?_D>kxXEG`GApMPki-e2qEB=XPaLX^t7n9$xCvn^5<)>Orx;lvc|d|vimT|zhq{IEby zOhVTiLBJ6Ub>H`qD4xXlZ)r46Su|VwqL#9oG{h?I&dq^LRh^h#7@4A_O5);J)KD_8 z7|_3Wp-5ryhJi$)0{{sssg{()(jQY}@zR7_LOf>NPZ1X!W;Cdn0T7I_AN8N=co-oW zyIimr`6$m0J*})lSFp$azo=1H~M(8@WUEgsl+GCLEnNm2ec#k$%$cryVo_-mQiOSiwQQPD6~DkwI@*WTW$?ZA%g~hKq5Fh zOOV6C8&RP&Ds*ai+(&yEjz#rh+z@`_&t{kD#Yxv)Z4M9RpYMFtJJ?V*76bUXVqc1Tdh#dRAhj%E&==_RD(9^WGFHTy%0 zxsH;HA4LMx`A-p%iG=r8-|3jpbFYQAxoJNxux)x$OTP2pdwAKSOsiG5e`+$TTppoJoDnl{#EVym^3CZltiQ-*(gE! z+iD#h3Xq%P3P{kCwn9_uTgJYrFm5i^s0(G<`JcaBUR!OpT&7CzE9qe>VN7U$Osy<^ zv40}73mTqDe%RzI)&wPXMo4aTL2K(5tBrU3Nr>G+4Ov%}MS2EDL)`gquV>fhs>lc` zDecd!6fV|3c*pYwYI}^h=g^mcm&O30?@=-m9~i+{OI4v3H9R%C=;~8$X}HT&thtjs z@TBFSt4>HWDw-a;xixti;^5m;j&#EzQU9Ke^L^7EW3-=LBKW`HQH=WS9oIhuyN}QL zaGsP#aA)&etqJ}$wXB{8;m4%vvSb1xqMohkWX!D*ssC*y6&JNo3*$e5qc?m%0H(MHFvFBPm9bWz=TzCJUSB_Znq;L4Rl`Fw)#BQw3ndQFS7_*NWT z=j2YRdvO(=3v)^0BB91*>v!P7`$0GC-$d(uVNvPqtpWZifcH$*`R9iDu72&9e;*YlIU zv&gV9p%7O(?de7U&StEvnSPnx0a@zOw^47~P)uk&ou*zVy(m(lzo>+>xN-}m^4N{( z@mr#N-21dFV9;B_ffvqypqXjjt0$w9et=`x74*Gv>!Jgs8*PZpGxuAj1|h+}N5mat zKEJ`}#{Qa<8`Z3WiLm~pLiM|3OpaGhS~AfBjYk5kKoiCUudS?3l<5`NW8ibY;cf7r z*%ZEEdxjtKj!8VJNHRhk97igl-Q#?6de6@J>`hIfp1zI07*u#Lp5~3&Eh7UXcD#ZX zb%g&F^`a;8hm?teGeYf!73fFU$HvGWTTW~V^vf6MDOVr!Z5Mo!U@yL4J4V(S2N}L) zb;`fOce~Zz1>wzQsv{Gvev>$#OD8i0k)Z--#2ftpu7y7@wNK?wlxlRYUtkYI!yy97 zM1;(Jh8GlQucYJuFuGp0a_ZjRUaPVGGe_Go{0P@nSd_cW{O+DSwtM{Di#0u{Bg{W0!uMb)^;^Bp{k1k+b9!G+=}Jg0XRb zPCayh^v9)$;p%_iP2Qdoyvi(J-f24``s~L#-uxRPQl^D~9<%%nOm_O*)1~cJ2Z9+p zT&}|dm{`2~S_~p>+bxI96ZLRFUsTd|&IxBT z+n&~Lm-`VJat&zmx%+Ji?b86Rd&w@Orc6KR7^y1_HI~tRAcD5C#qQ$+6bafEV6DS(3=Ldt?~RX%&7%{ zE@F{t<<#&F^zMI{w*5)G#YtH!rFE&~SPQSo1n80uZIylQ1kL}s7P6QOyAyu!RkHe4 z(NhtByasQkO(4t>JUvU@a1exu8Q3jHPKk&-Bw4wS1)~aQkGQFm>Jc7ZWqjc!Is~Ic z&Rx$!DB=n^_zz3-{w*Eb$z-qBIYhn=+rOt9wk4p)d|9ws=79mXo)oInPS(?>y>7zp z*(hf%f8`7}DtTBbc6n{!xpw*jU}{E_{WT>p#YGVVF<}v*prA$nqRIzD`+tM|Dk+NG zoe^G=2o-7dv~W=j+ohiN5OM!@CQtG~YqX@xRC?I(zd&u%NHX&mcbQTt$&an}1H320 z&Rf~J^cKD6z;UOCe`YT@PTzab$hRowrl8ui`!52hfOpogND}kc8}el>c13WYzCg;2Ld-A z*6AEhG`@z7^l{Kb1F?Z%QA7Z6p0si%BLQ>T}t%P#$6H8x1NbQ1ni zy&a_7O@9{6cpmp+=W0p*qei_;YdP@ua7eA|wM9!HNa;&g-8KNC@5+E@e1s}A`JHoR zhFnJ!_~%Iv|69MZ7%+FLtldK{dcH0Tv|(XxtG29ZIs&4ntOBVoyg~~iQ<`lRj1O_AiiBk& zAdQ|p-ZENRFd6$JvTW{ zhpUJ-_QrE8AQ#j|{pAa9C*fD_fw0h;`!L?$+KgKXzdDGhsk1u|&`H|QL2)mPwM}^WkgA|(%g+X z0r73=#RJKMgX4&P5-eACS58oJ)j)xmW0Z|h6TkIh!jkx1d?E2Wj7d)`p(yajgjS7p z|82HR99}xmba4+GBpOXX1|~K6J5Kg6UHK7u;%yS(Fr`torb1ks^-Ec*FgDv=`NrA2 z@uSRDK0pA_KiEGGSpru6t0v|Zag#r+kt>L(KLUxKp+}s1Kpsni>Oo#2H}oeYvzQzP zPE0UNn*dNUxE=U=O(Wwq`h)1C$TrMSte4KawI>bpd%Wb{tX(}9SZYb&Qe&AYWL%}F zYvESRwxsane?X?=XVMUcEdWf$g@a>1Vur|&p`rvX_!bSCrEI5glcTS$%d>-!1s)Y& z0AA71Rw5Abx17TpmA6^&ur+Z9N!wd;(hSOsBMeJ}(_?)UBCjw%2MPf(n~TH)mN`^~ zLNoXpd|~2(jC<0?&YRnB+9!6k^Q)XfzxS~!+;Hf|wB+V6 zlvG$KsOvgl3@d-6W(Mmq@|gY%{}2Be5G6^ zQiJSa+d!n73bvQ}32DY3{GMISV8?n+&)`&xwze@T1lbB48MFP9WqR&~#}wrM)MxQm zFOtihP10Xze!*B&_K`tT{z8Td1={MaL9bkCOg!*SfdB<+=fgj>4xz+@X(V)zjx6A0 zqyUG1^>}r+lg&kXx|>oVwgU7Xd4=lXh!(hU(7~FGFw^Xt{Ax*{qMlCM2TC2dC~Xp& zo-b46YHP#F7=%g|pQZcA18I%aP-nC+UaEK?IN%8Da=EI#ic5X-GUw~2+VII8p9mK1Z~Op45OJ>xgV#yt z?r|`w(|2hQGGh^Y zpNK(vP#$P2~5kOw8tj!k84VECEf1*n^+JoE;9><_no$J&2Tc~}d z42%bgrE@%V#yT3oXP?dEBC(W(z&q@hYXuqRU5J^mNWqG_OKhjyv{s&b-y(eFs2yW# zzfN(sLW{5b3|-}{(IiaWTU-EThqO*wjMh(T7wIge;Va-1auu}wFSMMh!6CGL3XqWd(WLj`a}u^^0v^s(YE zJISkptA@fvvESr?O^qLO3j*e9v-XrGfstOXf7`hj<6yZ@EXNViGKEm0nzvtZw-nmD{S&9X++<3pHXS4OGe3;Vwr!&)!mc4zAtBAq#6G!BolOAuf?&`wj z4z0;<==94v0jA(wLvCHYcD|uJIpi$SAa*I(P5*Hk2gSS5 z713QkK_RQyR8a4V*)3;}alKA$vVN2SlT|ro$_&3_upnvjpmhZHi>dsGGmGZuiWT4j za1a(Tw9Z(m2o991%G~X=+Re{N2M$)e6$^AUCGKU|X$9BkBZ9Wic?BLLuszC#HBqI5MQ~LYqr5yo5a2L8r)W27f#4 zbhmG+qdHsY=7Cu2#0G#Z#vCI`KFT_=4@III4Acy?ZcnY>)1}S&IdoT%n#Dw+I~rYN zjFdqx1nN-pzqilYRwiarN_1fjO4Q2;goh`6+xBThP+ z?#}b3|I9`z+|D*XHDmA|x zPoReV5myD5ZD1^^DPDZ%(A=>?vw@_M`2)9zFGKkUM$jwFb>+yT@DmW_K-dtgA`SlL0 z(W74Iyw6RV|M`|FibM-TOjuQs9sP^!T?beiNF#R*kDbrXw$v;}9>^(=$N&XeOm=kI zG&cEbtWp|i!y`T%XWU5rWg$X}JmLD9MNE7p*-hAWFnW!thB?LTIERUmZsJEBjTUdu?rw1FQJ3xF!{+OK=YmsaWU}SgH4*!saSh$a zd<3?(7Y~(TRT-1y>CS2%g|(7KjNvV3E_ zt!tlO;uLOOeBz>uM^m9*zP(TU?zHwzr1N~OzMjj@$+}Gk%wj#*V*Jjf*zvg8Ssc6J z-s{%saLZHO{Fbiq(kDGy=N^(hI`D-mz6#k4T{h42;Oz623?~pvGw*9d*`2rW=qQjH z04+2bG*6oA!Y5yzLi~xEU*+$5RlnDg^Yg;V37;m@m*o>45i53jwXcasTJI~9e!Xpe zsbrexCXbIvvS#_2PT8^oQi%7~i8kwBKt+S39(+DC(Y!CSW3#)}kDXmp_d;5ws<|%g zN!c#!Hc4qd6ua@!I*qS$VPCIKHsp)BzNX|vDEsL}k$LCW3w>?q6mq?>gSwe}{^96u ztYG4a7D%|!gKoIJ%*-q4yP{w^Un%7PLXKT?VH&_74RC$cK37lYB2CRO3H%1B+=9*q zIpul0s#;s7Zk%o0zH|*$udugXkARV>C1e-I{&p4D+f4aQs{bjyjE!_sD+O z@A9*m!HE^Vq6<88iQ@;IPt6-@7Cc+Jo|BNyG87~Mf)CF#b^!Q;SN>}AW_0B1 zXV36iZCawzZxGp`U{yV~%J0D#38nmNSLnx<3d?Cf_sjBr3g|s)G`I;%^KNn@DuZX{ z()4XC%M=(Lp10LBEL2;SeMN)ncI)zZg~ND#SZAYCDLv~vhqUuD&sLaVp>lCWZ~%L2VzFMfbaUk|>Q=b33*%J8|=si%3I4;Mvip# z3W&q^s-rY&RI4)b!-Zob-_L*7N8dz7>HObb0B7^IUsujql*RI20M3(oZtYV)`y1IL zeoB@@q4Stk%F}0(kok2TwBSE>F8B=EG+DpSD8AlRqkk451#@x#T?FA5DYx{n++#ko z@$4KWQqOg$o`@|>S5<9M;5xO3iD|`f2i_f4nFMKtt^3gr%)8^~A4N!jWkXto6-u-M z(r2r#>rcIY!DN=4t*8(X#~2ZI=%hHDEw?D<*K{+cC5-aW{UUCF2TW_LK$KhTefgb- zEh%;XGl)9krVoOPlDiA&yy9m9fAYd&1SqW~!IgbmrYc^HYIp^uZtb3}WdC zqiG~0GXls070`@)Wh%tF6GfS!w^SWlvo(iKJ;2|&aqwUQFA>`&ov>Wy3xNBJfK~fu z8UDsEU{N(O88OR4XPA9gz!Uuje%GNfB6g)pV_LFaW&6;5JBy2kWY3{CGVI^Ebuw(8bNqDX zQapeh;W6R9(XUlu%f#Sk>6X*DlKg&%;HGPTecyGDq0@Apy54TKa{dW9q?mE9ZY8xG z4R#AKPH;GhQ1zHTn2=^NX3YWflOQ9JNV?zMI^ns?<(2pCVl&`1jb>aMBxZY*?oMki zuxD&w^sqT-lJ)ABHM9>ZFtV)}jp4Sk)Nu-&y>$LG!Vbki#0tORLJ=$~umIKD5IFBq z%U74>!4Bq|8_BGnIR!Jo_B1dTIAsBgW-dtZvrouVfD|ipK@tLMs?VaA5ovSS2Yxh2 zNCyR$3=^Dnm3@|VB-bWOzl-m_-u9{Yva@|A`}`PW1$m0^xh4KLWLo!by>d6xX!A=8 z43C9QLi8tlP3L&tRJO}ch27IQiX)?@nqKKvtZ@7Ey7NiV?_F}RcCVC#&ee$Xx85_| zP8zzhI;yL~e%(mla1Qs3UXH@PKx8N$N|~KEhB{}oCMOPNwJ!mvK(Nh7^Kuzz_|cr| zX}6=;YC}&*BT-Hx(OnTMRJHP?Ju#(%DnzALwlr;Pjh8duQe~q5^^?7l!10l_V49Gg zBIB|rg%D`TmJO|08-HSXo|TOnqMTfm9%-ajU>e%SePgmr|2=qq z0p#@g+miJ^FY(e9pGm2`*h>>-M*TfwHL~?eMG?*#7!{_B}1 z3*4{0jVsEZdcrsOzyHWMH!q8>{ld!9Ha&V7&H%@1Z* z#8%{OB^6b<9~RjebXt(aAg0~6*-=rPgEq{?pi8ak00rh@7(Up4++~O^?FN(y>6YTd z;;{Gr;GQ}nDHDYk)xt`@g=)tJFUhnS4tpJ6%QlNp^d6m6^;$NvU-~6T=u=i z{4!{MTRDl|4nSqJ{&`^^<)M+xsFv}wkns!ZT_Y_NClxJ$pfZtH9jPO2FPPb>!DTmK z#n;Trl)g6gx(`@zX8N8Yfre{)@*=xg+1u3zN z=WDa(XLra!R4d8P6Q@oezA1$w<*5##Ea|rWu&G=)ek}-Lg8gG9rOI9L&{fs-V%9Y^ zC1O#%iDFL!zG$5N*P_brfL^lVh-X`hGCLpAIQqTieZtOazhsv(la zQgYsuo`Y=^daS#rw|5cZWU^xj&jF7UCF@9}mB?X)LXwJS@0{4K0I7M-%jj}~OYNsT z;ivY54>NuY*w6^&foFe7U!o5l!wZe|UcJ{UH~r@%PW1cIIfm=e@GaxKl?TH_zE%^a z;sC3VVT%H6zs_rVGC6xCu_J8&yfrQIn~{2QGr08VhN&+yONdg~Nza+fgK~%|S&`{F zTc%kSDinO``{rSMPD3rB{=AM7oa8YYH>5)($VueoNOYn?ltoMRo4^4nHGy47C^Vqc zmU{aWqNtl3RTV*)Ec7#2f>_R?01Z6{_4*>n&D+BGLBcVx5w^05F; zAwq#{-bGM(d4+IZ%>wsI=sZ<+o`q}xFb)Iz4Fdy71Fg-HtJU2Oy4IQ-AL(O&LRH9+ zysDOK$4Ku_7!7|PWK+|&ux6)+xVp;`ipSy$Hf6wAs2)b@=hrT(B%(%aX;H3Jo?z8F zK7P+yooo+3mRN_n5c*Bbd|G@U zriQ<<E;ed&JBye+?4BwQFlXfm={r8g1%Y_l@AGnMM+?dN6D-+Y zTFSUg_$@VK;)jwVV9nv(zG`w-#A*!2yfqTyw^) z@7G=<8CPj;Q3qXnSg}{@^JC7^WBw2uFm|Km%xY?#liAqaDt_z!U>0Knk}|@bTXnyD zSkq3NIl893I5;mT7o68K1NfhrZ(b4#g(tuB1PBby+R${($N(2PntiODH(t#^S(YEY zArmnGJ2eHElT-N{80`#PGq0pV$6^0??LcYt$IWIo%eBE?1>he{Jn6dOGzDINa#JYG zHy(DDMN+hU*aSmVS}50f9_}yyp`ZhM9aUa4?n>Q{aSHQ%x?l%=lanWC$4rTAAyHNi z@U^C)Nk(7vtG|AhTEL4DpK;Z;l}DBz*NVgY8lRa`bZcU!jUY6*E+qK%MyJAsj++Tk zrMe%BaHspIlfmlIbHSh*`b#OlFdQ;_9vSa!!>|h7cx{EzqZwrw8E-9?VB5U=NHw{7 zXNR#^xCE{+4c-6sZJGr8%a63I03(8MH)ms4(-KKO{mn1NhWnHax)zFbn}cS)gNl9`K6Y0(EqhF9<) zQPe)Goj(N8**;m3MhSx`8A{BUafxWv50AyTdaKnp)tQEF(F{R{?(#~|bBGWcLo*t5 zH=EVh+wGghs$##3A;F%C#I)6e{mwztjeW8S5>IC`|E!BlFw<`-1FbB+%MuxoZIqcO zsp5@I>&BR?hzhCjlS-%F8=>)&S@lMp`Y_JKLs9-tl{zX zVxVS5HIL9j$a!lj>DK_&PMoR}I2f*Q@l!t!zCpNGi6| z#cF5?3iOX)^>R4ot>=nUdalZ&WpRU9YHvPNdI`j}F!O^~o3-UryQg?}`ItVZlkvt% z0iob}hwlnT!-0>3tMMUcld^lZs$@!m(iZX3JrBtsl$K?mBYzYbnWXQGWNM4=Y3CD! zUO~}tL+>5wPH&^8!lcRuV{vciS6+&=qPV)N?(2*J-^(HlzFd~j@^u1l*ZI2kP8K=( zLfabv=~5^8a;FP*vV&xkPZU12t=spP>+5I(cp(&2gNPsPNFUGd-8IK0`6;Rr4%QU2 zMM5=hnvWjsI+uNnW1i$bbEN3cVJ${&_4Sy*#NR+*<`|mwQzDANoyt8TMQtG4X#WsI zQ?MhsY}ILB=!bb)>lXK%4L@i%|CtyRMPZt(rL*kT#8+54K1M&Na>POY9Ce^B-=s}w zxN%|(f-$`EA!A$$(P%&CjXyda_}e*Hd*5@u!*l*fKY!j#p#2=DygjV*7Oh*{Du$SV z+sd=uvX0c&3gI1q46m#=G z2`uB)sKS4TYrex8U-TX4pv+P|BU~08|G_kr%E(rp*?%cnU1|>n4^m9CmM;Hj1tm9e z@~uyKfgOxZ*;7XD$~1Mc=u06Ab*{YrOUa>I>=AY6EgYa2%gU*GOS-GqAaY7n>$T`_ zv1>89ihfF1tZ4S-K{Y{`=)ETiF=(ay0KLk|N5J$DG?MU z&g`C2GXF0!&8hQXPbqSHPI?qp9`ifRT!4GkvxsM-uDjRdfDKix=`w%x!-6AHOX>(j zw)5HxZ2{DFr4oPYJZr<>C*j~Y<|rEyFoDwOvr_rVE6ec`nW106C{>IN8-z0k;(8Xb z_{Hn;f(a@fhzFW;_--RE)?fCm@fxp~Ep)TuUmn`LBQcoSJjpAy;^?~C$dP(IRaUrE zxYo^Xh50@_mHR%OVWieJV*td71Uh^dM8-%x>NMJt-Bbr-Is$@)Bu5t6q870zw*tKr zee8t6eqJ3p&=6|FIlP#3VLE)w7Rk>f2ogJnmIqirv>05*WK8|yh!>ruHukf^u$N*u zkxC1dTgNlp3wtc|2Y$H=p0uPKNYM8%BH9x=sW1=Re z=s24}Kp1v0*t94pWO{|z&9pF5STE?m<1H{-abjl@t>R@n)O$&sCSluY6N7caFpB%0 z@RG@dPGyCGJY0_XVZw@TcFVp6zwK&pxx4$)yf?WU*>11vr-klXI2l&7ny^w9s*UGD z%|8P6vTR}XW%j=7rAMNQ356Vn9S6yHzLKKMbBBb&NQ-tg%}7q3G{_K5T2xAr4E3nj z$vQ5NT!MaQ2bXThZEf}K*{|8W_n)jC_zMg)VZ@EK>rB6a3#hpB{1Ywf&FOSV#VaZM z0l|gzkTk_^FuMtY<}+cn_6z2moGfU~Gfk{Jf$8gUi|gQG zyiYaB(z|H_Vked&$*^m+m$%`)Sr|@Q4C6j;i!jy3icQt9!k&{f+te?+b_}yw`2SaXM=4JOw4JLFEW~5jL1>nfB2tOty)EH6u)3-yocAxu@d1 zzk48|HhZQOVUZ<8_PDX@uEb~uW`QSU48e9_$ZECZlVnpYsbG>$lgonX!}W4~V%Eg$ zVWGCyXK^C9gg>+iW|glEtoTove;(lH*Wu?q>3B5z4eyA3$CPHU5%Xn=+%9BKTy-76 zt@U2ZGSoH{1z$r-2P{OwU#&|%v*i1q4IE5>+4ii$peFvdQEQgQeA9OUDM*hntb58f z;`cE8%1aWbOe|l!5X*TFtuELKGkCDQ)NR{2#KExB|B%T!HG&#;&})8!33Ucb*#pqM zjKAz+oUJ$V8sb7DeouN-t;K7+PB9wJ> z>__d_GtfJ1Z9dgt{0|!1k5MHy<>-`8<$g&EpO$YYSTJaRw=4{1UqlmV$^CT0=Fv4C zLFv_q#z2F;WWCcmFYQ+LZ7xxu04qnq#dW+PlbAAfSl5O)QG=y8EA7%o-)x`p%uAXYGnV1)MWFZ8B_ivZ6=C2#|@3YXNy%ouVxQXX7oCWJDF1PJ6<|f z-~xXsPSaC6u3=QK_-+k}=kzx*MO^Jh;6Ef!Ujs|DENODSR6JBF zr`40^K@JKUbk1(e_wX$?d^mb1YwrS0aC*Yf_dR5JY-s9Y3$8jaTq{>DoCP+x3gt%O z0B6q^!itDA9W=PMG<}+-_ui#RHG2gCSvd-cc?%hc{SjLS7@t=cHkJhKa~+gGi(ES= zr+*&Q{zPQ~@9f?X%xHd67l<6_Wy03vK>T94xE#K@xIXMuypF?GO&+sq50AZ${KN>* znux(LP$S@fW5kOjJJRpEjaipp!O*%afa&i2Gb5vM{6jaQtg^^tk3Yl{eQ5UIUGnbt zZ1rxzc01;@E4JsQd%xr1m1;jPm)$_{7Z%w*GR+9=eUc9~r+Lu?#2Pwffl`+{Jq#9rC6k}cp zHJK>jqMBXKX{tS64L)Wc7=NEhs)Z_|kcg?(vBSTizhl>Ow3~Le>2Q`}u8`%v>Gx>= zbM7)-8K(A_Sa2{;vM+A&6-=~RfTxJ~B69wnYB=UaL@|r+s>4Ka-D~c2m`cPX-71mW z!~t>Y5Q2Hf8oJE-d;L^O1}P7>S=&J5XuoQf9DX~3n;`vEnPV`WKV{-8O|r$2d*ODe z7F9e$@V359<*#5)I?ZR+pyUMX#&hCOyz5|9RR0jwYSHy3tO%~-=4gc{CrhJl;#jBxW})6>E0Fk*S>bxs zDFgJmk`ih~t>%C^;L#cxrQ*|(!b0TIV&nb43^xLfYq)F`d0a_!gNXQEJZxj?nW@`? zQ-k-#37ivbl>weiK1t@so}1l zA-s)<_g!XeG`TZ2IX&_~L(?z>Rw(PHQtd}u1ddb!9qDV&;72`F;>;5W%9^gqa4aum z@dS;TRF*6MZICllc#07|T2A(z&y46-Y1pePH%z77K0*aCnNf4`pT1rS|JA1Ivc;LV zS%T_~+B)QlHQDZ?sJY9NlQs96kG5I$ahUtr??$Y?oh^6Yy@)J-lH$-oorF+Xj*3=D zo$52=W)q_MM>v_YYTEPISuI-qA>CX)x!Xysc@7<}Vzxlnk!%AJy*2220E*(nNEL|_uhcQnF&CTqoSGk9=JErPSu;Bat6{3y^9yBP#Z zaE5G;;ob>5voVH9(=$!11qq(LMeEQSM@S%xVu0lVBox|=)+u=wl`FwYtU=`!Fn`3n z9E!E;u#aMp)kTy#R&STnJYVZsC33UP@+(crJih?dKe)~)XlpUij$pC-E3_Dp*XOh?I~{J9&ttnR*R(K2MZpD=PtnbGg2IY^O4or^)?{Q z!FfZ4fd2tiG-|>nqt_tM8k{1-N7smed7C zkmTYfl}zSmzBSzOQ% z8d)WgK-d$}77`c}Aa+x=5#`(nBOceIO)M9E%=1Y(x=6sQlP!6x$>{S1_KFs824)xu zB$7G~WENidqM@ayjt#%5CP1p52s9s2dDI=)vcMZ^Rz4UCoJ3*ZpK5yS8vQNxS@ol? z(7Vczghhu{+7D?&Bp;@H$n_XL6PLZ5yoI1MPAa(c*LA~$N#moXa2C-iAmL7ZJ| ztnPdvJ*?JJLuOd*>CeuWA#t03ZUQHrdvVA7!+iWJobo9dosjfFxbVa7-g~!bA&*J0 zSL46s1>WXMM4$mJ?7T`zNiC0RVW>>q88-MUFwS_%s9 zNsd~9C4yO6tYsvuOogWfE0X*6586r^zOGQ-4)0xDMvE?dRj$r>`==Bqtco#;#BJu0 zbd84{cxg)Hl;{?LSSx`HlhO3sZ|BQHHp)V+(XYsol%F+BG<`VI?BIv&h34Jp-{IPw zzFeWjXuSfg!4>L}Gi**H{l$UpxK;dG#`d62q}KcRZY!Lt4#!1g0SmxsMsqAlv{+R zTNL^dEP*sS=P1TN8VXZrb)gtJbBzn#F{ve1IC*22`ZP8Bek5%~#7Z$`^)dHjqcbnU zVr}1mxcvO>;k15%80KHr0L`?e#0nl5R7;?d2FMX|*D$I_$1?a>J58`?#lV&$&)X;v zi6miu2>C?XT*b4bLg%NQuC9%Q)O-A`stv#Mpy&SMe}sUKf~_i34U-u?4VGe|QEKhu zy)QjgnpO}5!QdHF+dsDlH;NJ-1ra2#9G!7FJEH)p3xX`L6foXcFJC|2w&mRaWmxBh zY-L$%2@h);)WLlzfWyTD!z+{H)A$8H@_EA6KS?T`uNv z>U`JLG9{@E$H{7vZaJZWHJ54fY^mreQ^vGgjRBlmw7Cz5?j>&j`Y`+OeK#0{NI{}A zYX%EcA;hHXR5uckkjf~gI{W@>!zEXJ&-Wa2a_CTh*WlLSC7dKnnUpOzl(G_4keFtz zJCzd9o}JfPIT#m-000KNNklXKxPlV>jp$)4Hg0nhSoafyUu`AMk$uc-QBl!_kS3M3}`h?ww03SyeFM{ zj)`z4y^za$4+Lhfy1__w{18HZ+pm;*wNu>#qMamU2N9WI$VH}KFQ9()R4^Z&=YTc9 zqB&550LO?YpGtRhKP;pnhxb1EPVGAb%CN=;c3l3CJ?pm~TZC+M3N!AMz4S>)HshU7 zxaF~z3W6YbDZ4Ziv*Ky{3^*mu)Y|LWC@MW;#6BCR=RBL9%m$>Dbc|H~HoGwPhssK1 zg)(Nyw2p!C7()|lzk`EDusN_!0g&@mZqAfbFu*=M$7zr;P&$AazH3)6m>D~AWm zDXeN~CJkU@kz+rr=~Qb0XPR()inYaJ-`Jzu%!U(d^jTkqs zT)=`vV~8;|2+>4c)CEyV06}6e9DWau@F*i>KMo)I4Hy5g5HTeHD@5e1H6{=vC2P%)H711E{=t&pw`kc4 zKi22?>$W!@gviD?iqj{L|Gq4aT>HYM@2V4NN;&>ao&UH4u>^#e_il-INgK(RKzs<`OzjvRF}!zhj@}s4CxVZRpk06t0$Tun2SLAq+yZdcw)WNI z(jVoa@>u{KV#L|N&h(XsT@`h>tINy#sdUtQ=78ns&@kuPPa|lww1Y>Ngh};8% z7J3q38Y0JpNCC)@aie!0^nMdyUM5{n+l#M{I0gUZy4Cif7hV|`hr8?XmF(Q`+WUp3 z>~oFThMV^t=t)-{PSZ*q!_^;M-+r3S2AL@olnrcFAgvHi1272BqY$1WI5YGo*Iyhu zH}UYn?j?(szTHtL8I1*yomOnhwXb^i)#=wyc=FBnwk%xR(Rm!e5P)cy_*8(JQr3a< z-MhGSYA`-V&oqD>;djIN4;V)u7w0{?vp9F*{&Ld0oeWQhd3w7HMCktZhN93c5H zj4oJf&Rpf@4lglPLgh`g<&E19oVxS2>B}7)H7_KqJq0Nq46{5m`!5W?MrU39-FAWq+_`MPGD(n zkD}NR+}pN%jn{}MD!4J?=gq5x@N-M0Fd?~BBciC_#*l1dHcPTK3Zv60Bfn@w6cyZ9 z2GyXDByMsXCwqM2`!ym;4V^R@1ESa!qbR!0lWQJ+X0@(SRMg?FAhnyy0f0sTxr0ag z?u(=N$cD{(_Exvo%0emXaLOozCe;|G0ZahU(h%6@hLn9``_BFA-del4h{~#sK>#5t zOQsxZB~X?B9acjyYQYV6xJ)6RNw-WY46OU)s~-l=mxfST*-Z(L$Ev{GFrg`mq9}@@D2k$thCczopJM@zawSXv0000 - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -error_reporting(E_ALL & ~E_DEPRECATED & ~E_USER_DEPRECATED); - -if (defined('HHVM_VERSION_ID')) { - fwrite(STDERR, "HHVM is not supported.\n"); - - if (getenv('PHP_CS_FIXER_IGNORE_ENV')) { - fwrite(STDERR, "Ignoring environment requirements because `PHP_CS_FIXER_IGNORE_ENV` is set. Execution may be unstable.\n"); - } else { - exit(1); - } -} elseif ( - !defined('PHP_VERSION_ID') - || \PHP_VERSION_ID === 80000 - || \PHP_VERSION_ID < 70103 - || \PHP_VERSION_ID >= 80100 -) { - fwrite(STDERR, "PHP needs to be a minimum version of PHP 7.1.3 and maximum version of PHP 8.0.*.\n"); - fwrite(STDERR, 'Current PHP version: '.PHP_VERSION.".\n"); - - if (defined('PHP_VERSION_ID') && \PHP_VERSION_ID === 80000) { - fwrite(STDERR, "PHP CS Fixer is not able run on PHP 8.0.0 due to bug in PHP tokenizer (https://bugs.php.net/bug.php?id=80462).\n"); - fwrite(STDERR, "Update PHP version to unblock execution.\n"); - - exit(1); - } - - if (getenv('PHP_CS_FIXER_IGNORE_ENV')) { - 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"); - fwrite(STDERR, "If you use PHP version higher than supported, you may experience code modified in a wrong way.\n"); - fwrite(STDERR, "Please report such cases at https://github.com/FriendsOfPHP/PHP-CS-Fixer .\n"); - - exit(1); - } -} - -foreach (['json', 'tokenizer'] as $extension) { - 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')) { - fwrite(STDERR, "Ignoring environment requirements because `PHP_CS_FIXER_IGNORE_ENV` is set. Execution may be unstable.\n"); - } else { - exit(1); - } - } -} -unset($extension); - -set_error_handler(static function ($severity, $message, $file, $line) { - if ($severity & error_reporting()) { - throw new ErrorException($message, 0, $severity, $file, $line); - } -}); - -$require = true; -if (class_exists('Phar')) { - // Maybe this file is used as phar-stub? Let's try! - try { - Phar::mapPhar('php-cs-fixer.phar'); - - require_once 'phar://php-cs-fixer.phar/vendor/autoload.php'; - $require = false; - } catch (PharException $e) { - } -} - -if ($require) { - // OK, it's not, let give Composer autoloader a try! - $possibleFiles = [__DIR__.'/../../autoload.php', __DIR__.'/../autoload.php', __DIR__.'/vendor/autoload.php']; - $file = null; - foreach ($possibleFiles as $possibleFile) { - if (file_exists($possibleFile)) { - $file = $possibleFile; - - break; - } - } - - if (null === $file) { - throw new RuntimeException('Unable to locate autoload.php file.'); - } - - require_once $file; - - unset($possibleFiles, $possibleFile, $file); -} -unset($require); - -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', '--ansi'); -$xdebug->check(); -unset($xdebug); - -$application = new Application(); -$application->run(); - -__HALT_COMPILER(); diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/AbstractDoctrineAnnotationFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/AbstractDoctrineAnnotationFixer.php deleted file mode 100644 index 3aa32cf..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/AbstractDoctrineAnnotationFixer.php +++ /dev/null @@ -1,227 +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; - -use PhpCsFixer\Doctrine\Annotation\Tokens as DoctrineAnnotationTokens; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * @internal - */ -abstract class AbstractDoctrineAnnotationFixer extends AbstractFixer implements ConfigurableFixerInterface -{ - /** - * @var array - */ - private $classyElements; - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isTokenKindFound(T_DOC_COMMENT); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - // fetch indexes one time, this is safe as we never add or remove a token during fixing - $analyzer = new TokensAnalyzer($tokens); - $this->classyElements = $analyzer->getClassyElements(); - - /** @var Token $docCommentToken */ - foreach ($tokens->findGivenKind(T_DOC_COMMENT) as $index => $docCommentToken) { - if (!$this->nextElementAcceptsDoctrineAnnotations($tokens, $index)) { - continue; - } - - $doctrineAnnotationTokens = DoctrineAnnotationTokens::createFromDocComment( - $docCommentToken, - $this->configuration['ignored_tags'] - ); - $this->fixAnnotations($doctrineAnnotationTokens); - $tokens[$index] = new Token([T_DOC_COMMENT, $doctrineAnnotationTokens->getCode()]); - } - } - - /** - * Fixes Doctrine annotations from the given PHPDoc style comment. - */ - abstract protected function fixAnnotations(DoctrineAnnotationTokens $doctrineAnnotationTokens): void; - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - 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) { - foreach ($values as $value) { - if (!\is_string($value)) { - return false; - } - } - - return true; - }]) - ->setDefault([ - // PHPDocumentor 1 - 'abstract', - 'access', - 'code', - 'deprec', - 'encode', - 'exception', - 'final', - 'ingroup', - 'inheritdoc', - 'inheritDoc', - 'magic', - 'name', - 'toc', - 'tutorial', - 'private', - 'static', - 'staticvar', - 'staticVar', - 'throw', - - // PHPDocumentor 2 - 'api', - 'author', - 'category', - 'copyright', - 'deprecated', - 'example', - 'filesource', - 'global', - 'ignore', - 'internal', - 'license', - 'link', - 'method', - 'package', - 'param', - 'property', - 'property-read', - 'property-write', - 'return', - 'see', - 'since', - 'source', - 'subpackage', - 'throws', - 'todo', - 'TODO', - 'usedBy', - 'uses', - 'var', - 'version', - - // PHPUnit - 'after', - 'afterClass', - 'backupGlobals', - 'backupStaticAttributes', - 'before', - 'beforeClass', - 'codeCoverageIgnore', - 'codeCoverageIgnoreStart', - 'codeCoverageIgnoreEnd', - 'covers', - 'coversDefaultClass', - 'coversNothing', - 'dataProvider', - 'depends', - 'expectedException', - 'expectedExceptionCode', - 'expectedExceptionMessage', - 'expectedExceptionMessageRegExp', - 'group', - 'large', - 'medium', - 'preserveGlobalState', - 'requires', - 'runTestsInSeparateProcesses', - 'runInSeparateProcess', - 'small', - 'test', - 'testdox', - 'ticket', - 'uses', - - // PHPCheckStyle - 'SuppressWarnings', - - // PHPStorm - 'noinspection', - - // PEAR - 'package_version', - - // PlantUML - 'enduml', - 'startuml', - - // Psalm - 'psalm', - - // PHPStan - 'phpstan', - 'template', - - // other - 'fix', - 'FIXME', - 'fixme', - 'override', - ]) - ->getOption(), - ]); - } - - private function nextElementAcceptsDoctrineAnnotations(Tokens $tokens, int $index): bool - { - do { - $index = $tokens->getNextMeaningfulToken($index); - - if (null === $index) { - return false; - } - } while ($tokens[$index]->isGivenKind([T_ABSTRACT, T_FINAL])); - - if ($tokens[$index]->isClassy()) { - return true; - } - - while ($tokens[$index]->isGivenKind([T_PUBLIC, T_PROTECTED, T_PRIVATE, T_FINAL, T_ABSTRACT, T_NS_SEPARATOR, T_STRING, CT::T_NULLABLE_TYPE])) { - $index = $tokens->getNextMeaningfulToken($index); - } - - return isset($this->classyElements[$index]); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/AbstractFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/AbstractFixer.php deleted file mode 100644 index 3b29809..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/AbstractFixer.php +++ /dev/null @@ -1,203 +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; - -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 - * - * @internal - */ -abstract class AbstractFixer implements FixerInterface -{ - /** - * @var null|array - */ - protected $configuration; - - /** - * @var WhitespacesFixerConfig - */ - protected $whitespacesConfig; - - /** - * @var null|FixerConfigurationResolverInterface - */ - private $configurationDefinition; - - public function __construct() - { - if ($this instanceof ConfigurableFixerInterface) { - try { - $this->configure([]); - } catch (RequiredFixerConfigurationException $e) { - // ignore - } - } - - if ($this instanceof WhitespacesAwareFixerInterface) { - $this->whitespacesConfig = $this->getDefaultWhitespacesFixerConfig(); - } - } - - final public function fix(\SplFileInfo $file, Tokens $tokens): void - { - if ($this instanceof ConfigurableFixerInterface && null === $this->configuration) { - throw new RequiredFixerConfigurationException($this->getName(), 'Configuration is required.'); - } - - if (0 < $tokens->count() && $this->isCandidate($tokens) && $this->supports($file)) { - $this->applyFix($file, $tokens); - } - } - - /** - * {@inheritdoc} - */ - public function isRisky(): bool - { - return false; - } - - /** - * {@inheritdoc} - */ - public function getName(): string - { - $nameParts = explode('\\', static::class); - $name = substr(end($nameParts), 0, -\strlen('Fixer')); - - return Utils::camelCaseToUnderscore($name); - } - - /** - * {@inheritdoc} - */ - public function getPriority(): int - { - return 0; - } - - /** - * {@inheritdoc} - */ - public function supports(\SplFileInfo $file): bool - { - return true; - } - - 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) { - throw new \LogicException('Cannot run method for class not implementing "PhpCsFixer\Fixer\WhitespacesAwareFixerInterface".'); - } - - $this->whitespacesConfig = $config; - } - - 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; - - if (null === $defaultWhitespacesFixerConfig) { - $defaultWhitespacesFixerConfig = new WhitespacesFixerConfig(' ', "\n"); - } - - return $defaultWhitespacesFixerConfig; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/AbstractFopenFlagFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/AbstractFopenFlagFixer.php deleted file mode 100644 index 5010cc8..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/AbstractFopenFlagFixer.php +++ /dev/null @@ -1,124 +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; - -use PhpCsFixer\Tokenizer\Analyzer\ArgumentsAnalyzer; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @internal - * - * @author SpacePossum - */ -abstract class AbstractFopenFlagFixer extends AbstractFunctionReferenceFixer -{ - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isAllTokenKindsFound([T_STRING, T_CONSTANT_ENCAPSED_STRING]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $argumentsAnalyzer = new ArgumentsAnalyzer(); - - $index = 0; - $end = $tokens->count() - 1; - while (true) { - $candidate = $this->find('fopen', $tokens, $index, $end); - - if (null === $candidate) { - break; - } - - $index = $candidate[1]; // proceed to '(' of `fopen` - - // fetch arguments - $arguments = $argumentsAnalyzer->getArguments( - $tokens, - $index, - $candidate[2] - ); - - $argumentsCount = \count($arguments); // argument count sanity check - - if ($argumentsCount < 2 || $argumentsCount > 4) { - continue; - } - - $argumentStartIndex = array_keys($arguments)[1]; // get second argument index - - $this->fixFopenFlagToken( - $tokens, - $argumentStartIndex, - $arguments[$argumentStartIndex] - ); - } - } - - abstract protected function fixFopenFlagToken(Tokens $tokens, int $argumentStartIndex, int $argumentEndIndex): void; - - protected function isValidModeString(string $mode): bool - { - $modeLength = \strlen($mode); - if ($modeLength < 1 || $modeLength > 13) { // 13 === length 'r+w+a+x+c+etb' - return false; - } - - $validFlags = [ - 'a' => true, - 'b' => true, - 'c' => true, - 'e' => true, - 'r' => true, - 't' => true, - 'w' => true, - 'x' => true, - ]; - - if (!isset($validFlags[$mode[0]])) { - return false; - } - - unset($validFlags[$mode[0]]); - - for ($i = 1; $i < $modeLength; ++$i) { - if (isset($validFlags[$mode[$i]])) { - unset($validFlags[$mode[$i]]); - - continue; - } - - if ('+' !== $mode[$i] - || ( - 'a' !== $mode[$i - 1] // 'a+','c+','r+','w+','x+' - && 'c' !== $mode[$i - 1] - && 'r' !== $mode[$i - 1] - && 'w' !== $mode[$i - 1] - && 'x' !== $mode[$i - 1] - ) - ) { - return false; - } - } - - return true; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/AbstractFunctionReferenceFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/AbstractFunctionReferenceFixer.php deleted file mode 100644 index 8b2ded4..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/AbstractFunctionReferenceFixer.php +++ /dev/null @@ -1,65 +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; - -use PhpCsFixer\Tokenizer\Analyzer\FunctionsAnalyzer; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @internal - * - * @author Vladimir Reznichenko - */ -abstract class AbstractFunctionReferenceFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function isRisky(): bool - { - return true; - } - - /** - * 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 - */ - protected function find(string $functionNameToSearch, Tokens $tokens, int $start = 0, ?int $end = null): ?array - { - // make interface consistent with findSequence - $end = null === $end ? $tokens->count() : $end; - - // find raw sequence which we can analyse for context - $candidateSequence = [[T_STRING, $functionNameToSearch], '(']; - $matches = $tokens->findSequence($candidateSequence, $start, $end, false); - if (null === $matches) { - // not found, simply return without further attempts - return null; - } - - // translate results for humans - [$functionName, $openParenthesis] = array_keys($matches); - - $functionsAnalyzer = new FunctionsAnalyzer(); - - if (!$functionsAnalyzer->isGlobalFunctionCall($tokens, $functionName)) { - return $this->find($functionNameToSearch, $tokens, $openParenthesis, $end); - } - - return [$functionName, $openParenthesis, $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $openParenthesis)]; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/AbstractLinesBeforeNamespaceFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/AbstractLinesBeforeNamespaceFixer.php deleted file mode 100644 index 0c6cf6b..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/AbstractLinesBeforeNamespaceFixer.php +++ /dev/null @@ -1,111 +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; - -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * This abstract fixer is responsible for ensuring that a certain number of - * lines prefix a namespace declaration. - * - * @author Graham Campbell - * - * @internal - */ -abstract class AbstractLinesBeforeNamespaceFixer extends AbstractFixer implements WhitespacesAwareFixerInterface -{ - /** - * Make sure # of line breaks prefixing namespace is within given range. - * - * @param int $expectedMin min. # of line breaks - * @param int $expectedMax max. # of line breaks - */ - protected function fixLinesBeforeNamespace(Tokens $tokens, int $index, int $expectedMin, int $expectedMax): void - { - // Let's determine the total numbers of new lines before the namespace - // and the opening token - $openingTokenIndex = null; - $precedingNewlines = 0; - $newlineInOpening = false; - $openingToken = null; - for ($i = 1; $i <= 2; ++$i) { - if (isset($tokens[$index - $i])) { - $token = $tokens[$index - $i]; - if ($token->isGivenKind(T_OPEN_TAG)) { - $openingToken = $token; - $openingTokenIndex = $index - $i; - $newlineInOpening = false !== strpos($token->getContent(), "\n"); - if ($newlineInOpening) { - ++$precedingNewlines; - } - - break; - } - if (false === $token->isGivenKind(T_WHITESPACE)) { - break; - } - $precedingNewlines += substr_count($token->getContent(), "\n"); - } - } - - if ($precedingNewlines >= $expectedMin && $precedingNewlines <= $expectedMax) { - return; - } - - $previousIndex = $index - 1; - $previous = $tokens[$previousIndex]; - - if (0 === $expectedMax) { - // Remove all the previous new lines - if ($previous->isWhitespace()) { - $tokens->clearAt($previousIndex); - } - // Remove new lines in opening token - if ($newlineInOpening) { - $tokens[$openingTokenIndex] = new Token([T_OPEN_TAG, rtrim($openingToken->getContent()).' ']); - } - - return; - } - - $lineEnding = $this->whitespacesConfig->getLineEnding(); - $newlinesForWhitespaceToken = $expectedMax; - if (null !== $openingToken) { - // Use the configured line ending for the PHP opening tag - $content = rtrim($openingToken->getContent()); - $newContent = $content.$lineEnding; - $tokens[$openingTokenIndex] = new Token([T_OPEN_TAG, $newContent]); - --$newlinesForWhitespaceToken; - } - if (0 === $newlinesForWhitespaceToken) { - // We have all the needed new lines in the opening tag - if ($previous->isWhitespace()) { - // Let's remove the previous token containing extra new lines - $tokens->clearAt($previousIndex); - } - - return; - } - if ($previous->isWhitespace()) { - // Fix the previous whitespace token - $tokens[$previousIndex] = new Token([T_WHITESPACE, str_repeat($lineEnding, $newlinesForWhitespaceToken).substr($previous->getContent(), strrpos($previous->getContent(), "\n") + 1)]); - } else { - // Add a new whitespace token - $tokens->insertAt($index, new Token([T_WHITESPACE, str_repeat($lineEnding, $newlinesForWhitespaceToken)])); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/AbstractNoUselessElseFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/AbstractNoUselessElseFixer.php deleted file mode 100644 index 2f6747d..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/AbstractNoUselessElseFixer.php +++ /dev/null @@ -1,210 +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; - -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author SpacePossum - */ -abstract class AbstractNoUselessElseFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getPriority(): int - { - // should be run before NoWhitespaceInBlankLineFixer, NoExtraBlankLinesFixer, BracesFixer and after NoEmptyStatementFixer. - return 39; - } - - protected function isSuperfluousElse(Tokens $tokens, int $index): bool - { - $previousBlockStart = $index; - - do { - // Check if all 'if', 'else if ' and 'elseif' blocks above this 'else' always end, - // if so this 'else' is overcomplete. - [$previousBlockStart, $previousBlockEnd] = $this->getPreviousBlock($tokens, $previousBlockStart); - - // short 'if' detection - $previous = $previousBlockEnd; - if ($tokens[$previous]->equals('}')) { - $previous = $tokens->getPrevMeaningfulToken($previous); - } - - if ( - !$tokens[$previous]->equals(';') // 'if' block doesn't end with semicolon, keep 'else' - || $tokens[$tokens->getPrevMeaningfulToken($previous)]->equals('{') // empty 'if' block, keep 'else' - ) { - return false; - } - - $candidateIndex = $tokens->getPrevTokenOfKind( - $previous, - [ - ';', - [T_BREAK], - [T_CLOSE_TAG], - [T_CONTINUE], - [T_EXIT], - [T_GOTO], - [T_IF], - [T_RETURN], - [T_THROW], - ] - ); - - if (null === $candidateIndex || $tokens[$candidateIndex]->equalsAny([';', [T_CLOSE_TAG], [T_IF]])) { - return false; - } - - if ($tokens[$candidateIndex]->equals([T_THROW])) { - $previousIndex = $tokens->getPrevMeaningfulToken($candidateIndex); - - if (!$tokens[$previousIndex]->equalsAny([';', '{'])) { - return false; - } - } - - if ($this->isInConditional($tokens, $candidateIndex, $previousBlockStart) - || $this->isInConditionWithoutBraces($tokens, $candidateIndex, $previousBlockStart) - ) { - return false; - } - - // implicit continue, i.e. delete candidate - } while (!$tokens[$previousBlockStart]->isGivenKind(T_IF)); - - return true; - } - - /** - * Return the first and last token index of the previous block. - * - * [0] First is either T_IF, T_ELSE or T_ELSEIF - * [1] Last is either '}' or ';' / T_CLOSE_TAG for short notation blocks - * - * @param int $index T_IF, T_ELSE, T_ELSEIF - * - * @return int[] - */ - private function getPreviousBlock(Tokens $tokens, int $index): array - { - $close = $previous = $tokens->getPrevMeaningfulToken($index); - // short 'if' detection - if ($tokens[$close]->equals('}')) { - $previous = $tokens->findBlockStart(Tokens::BLOCK_TYPE_CURLY_BRACE, $close); - } - - $open = $tokens->getPrevTokenOfKind($previous, [[T_IF], [T_ELSE], [T_ELSEIF]]); - if ($tokens[$open]->isGivenKind(T_IF)) { - $elseCandidate = $tokens->getPrevMeaningfulToken($open); - if ($tokens[$elseCandidate]->isGivenKind(T_ELSE)) { - $open = $elseCandidate; - } - } - - return [$open, $close]; - } - - /** - * @param int $index Index of the token to check - * @param int $lowerLimitIndex Lower limit index. Since the token to check will always be in a conditional we must stop checking at this index - */ - private function isInConditional(Tokens $tokens, int $index, int $lowerLimitIndex): bool - { - $candidateIndex = $tokens->getPrevTokenOfKind($index, [')', ';', ':']); - if ($tokens[$candidateIndex]->equals(':')) { - return true; - } - - if (!$tokens[$candidateIndex]->equals(')')) { - return false; // token is ';' or close tag - } - - // token is always ')' here. - // If it is part of the condition the token is always in, return false. - // If it is not it is a nested condition so return true - $open = $tokens->findBlockStart(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $candidateIndex); - - return $tokens->getPrevMeaningfulToken($open) > $lowerLimitIndex; - } - - /** - * For internal use only, as it is not perfect. - * - * Returns if the token at given index is part of a if/elseif/else statement - * without {}. Assumes not passing the last `;`/close tag of the statement, not - * out of range index, etc. - * - * @param int $index Index of the token to check - */ - private function isInConditionWithoutBraces(Tokens $tokens, int $index, int $lowerLimitIndex): bool - { - do { - if ($tokens[$index]->isComment() || $tokens[$index]->isWhitespace()) { - $index = $tokens->getPrevMeaningfulToken($index); - } - - $token = $tokens[$index]; - if ($token->isGivenKind([T_IF, T_ELSEIF, T_ELSE])) { - return true; - } - - if ($token->equals(';')) { - return false; - } - - if ($token->equals('{')) { - $index = $tokens->getPrevMeaningfulToken($index); - - // OK if belongs to: for, do, while, foreach - // Not OK if belongs to: if, else, elseif - if ($tokens[$index]->isGivenKind(T_DO)) { - --$index; - - continue; - } - - if (!$tokens[$index]->equals(')')) { - return false; // like `else {` - } - - $index = $tokens->findBlockStart( - Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, - $index - ); - - $index = $tokens->getPrevMeaningfulToken($index); - if ($tokens[$index]->isGivenKind([T_IF, T_ELSEIF])) { - return false; - } - } elseif ($token->equals(')')) { - $type = Tokens::detectBlockType($token); - $index = $tokens->findBlockStart( - $type['type'], - $index - ); - - $index = $tokens->getPrevMeaningfulToken($index); - } else { - --$index; - } - } while ($index > $lowerLimitIndex); - - return false; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/AbstractPhpdocToTypeDeclarationFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/AbstractPhpdocToTypeDeclarationFixer.php deleted file mode 100644 index 465d526..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/AbstractPhpdocToTypeDeclarationFixer.php +++ /dev/null @@ -1,225 +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; - -use PhpCsFixer\DocBlock\Annotation; -use PhpCsFixer\DocBlock\DocBlock; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\Tokenizer\Analyzer\NamespacesAnalyzer; -use PhpCsFixer\Tokenizer\Analyzer\NamespaceUsesAnalyzer; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @internal - */ -abstract class AbstractPhpdocToTypeDeclarationFixer extends AbstractFixer implements ConfigurableFixerInterface -{ - /** - * @var string - */ - private $classRegex = '/^\\\\?[a-zA-Z_\\x7f-\\xff](?:\\\\?[a-zA-Z0-9_\\x7f-\\xff]+)*$/'; - - /** - * @var array - */ - private $versionSpecificTypes = [ - 'void' => 70100, - 'iterable' => 70100, - 'object' => 70200, - 'mixed' => 80000, - ]; - - /** - * @var array - */ - private $scalarTypes = [ - 'bool' => true, - 'float' => true, - 'int' => true, - 'string' => true, - ]; - - /** - * @var array - */ - private static $syntaxValidationCache = []; - - /** - * {@inheritdoc} - */ - public function isRisky(): bool - { - return true; - } - - abstract protected function isSkippedType(string $type): bool; - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('scalar_types', 'Fix also scalar types; may have unexpected behaviour due to PHP bad type coercion system.')) - ->setAllowedTypes(['bool']) - ->setDefault(true) - ->getOption(), - ]); - } - - /** - * @param int $index The index of the function token - */ - protected function findFunctionDocComment(Tokens $tokens, int $index): ?int - { - do { - $index = $tokens->getPrevNonWhitespace($index); - } while ($tokens[$index]->isGivenKind([ - T_COMMENT, - T_ABSTRACT, - T_FINAL, - T_PRIVATE, - T_PROTECTED, - T_PUBLIC, - T_STATIC, - ])); - - if ($tokens[$index]->isGivenKind(T_DOC_COMMENT)) { - return $index; - } - - return null; - } - - /** - * @return Annotation[] - */ - protected function getAnnotationsFromDocComment(string $name, Tokens $tokens, int $docCommentIndex): array - { - $namespacesAnalyzer = new NamespacesAnalyzer(); - $namespace = $namespacesAnalyzer->getNamespaceAt($tokens, $docCommentIndex); - - $namespaceUsesAnalyzer = new NamespaceUsesAnalyzer(); - $namespaceUses = $namespaceUsesAnalyzer->getDeclarationsInNamespace($tokens, $namespace); - - $doc = new DocBlock( - $tokens[$docCommentIndex]->getContent(), - $namespace, - $namespaceUses - ); - - return $doc->getAnnotationsOfType($name); - } - - /** - * @return Token[] - */ - protected function createTypeDeclarationTokens(string $type, bool $isNullable): array - { - static $specialTypes = [ - 'array' => [CT::T_ARRAY_TYPEHINT, 'array'], - 'callable' => [T_CALLABLE, 'callable'], - 'static' => [T_STATIC, 'static'], - ]; - - $newTokens = []; - - if (true === $isNullable && 'mixed' !== $type) { - $newTokens[] = new Token([CT::T_NULLABLE_TYPE, '?']); - } - - if (isset($specialTypes[$type])) { - $newTokens[] = new Token($specialTypes[$type]); - } else { - $typeUnqualified = ltrim($type, '\\'); - - if (isset($this->scalarTypes[$typeUnqualified]) || isset($this->versionSpecificTypes[$typeUnqualified])) { - // 'scalar's, 'void', 'iterable' and 'object' must be unqualified - $newTokens[] = new Token([T_STRING, $typeUnqualified]); - } else { - foreach (explode('\\', $type) as $nsIndex => $value) { - if (0 === $nsIndex && '' === $value) { - continue; - } - - if (0 < $nsIndex) { - $newTokens[] = new Token([T_NS_SEPARATOR, '\\']); - } - - $newTokens[] = new Token([T_STRING, $value]); - } - } - } - - return $newTokens; - } - - protected function getCommonTypeFromAnnotation(Annotation $annotation, bool $isReturnType): ?array - { - $typesExpression = $annotation->getTypeExpression(); - - $commonType = $typesExpression->getCommonType(); - $isNullable = $typesExpression->allowsNull(); - - if (null === $commonType) { - return null; - } - - if ($isNullable && (\PHP_VERSION_ID < 70100 || 'void' === $commonType)) { - return null; - } - - if ('static' === $commonType && (!$isReturnType || \PHP_VERSION_ID < 80000)) { - $commonType = 'self'; - } - - if ($this->isSkippedType($commonType)) { - return null; - } - - if (isset($this->versionSpecificTypes[$commonType]) && \PHP_VERSION_ID < $this->versionSpecificTypes[$commonType]) { - return null; - } - - if (isset($this->scalarTypes[$commonType])) { - if (false === $this->configuration['scalar_types']) { - return null; - } - } elseif (1 !== Preg::match($this->classRegex, $commonType)) { - return null; - } - - return [$commonType, $isNullable]; - } - - final protected function isValidSyntax(string $code): bool - { - if (!isset(self::$syntaxValidationCache[$code])) { - try { - Tokens::fromCode($code); - self::$syntaxValidationCache[$code] = true; - } catch (\ParseError $e) { - self::$syntaxValidationCache[$code] = false; - } - } - - return self::$syntaxValidationCache[$code]; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/AbstractPhpdocTypesFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/AbstractPhpdocTypesFixer.php deleted file mode 100644 index 46bf4cb..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/AbstractPhpdocTypesFixer.php +++ /dev/null @@ -1,129 +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; - -use PhpCsFixer\DocBlock\Annotation; -use PhpCsFixer\DocBlock\DocBlock; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * This abstract fixer provides a base for fixers to fix types in PHPDoc. - * - * @author Graham Campbell - * - * @internal - */ -abstract class AbstractPhpdocTypesFixer extends AbstractFixer -{ - /** - * The annotation tags search inside. - * - * @var string[] - */ - protected $tags; - - /** - * {@inheritdoc} - */ - public function __construct() - { - parent::__construct(); - - $this->tags = Annotation::getTagsWithTypes(); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isTokenKindFound(T_DOC_COMMENT); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind(T_DOC_COMMENT)) { - continue; - } - - $doc = new DocBlock($token->getContent()); - $annotations = $doc->getAnnotationsOfType($this->tags); - - if (empty($annotations)) { - continue; - } - - foreach ($annotations as $annotation) { - $this->fixTypes($annotation); - } - - $tokens[$index] = new Token([T_DOC_COMMENT, $doc->getContent()]); - } - } - - /** - * Actually normalize the given type. - */ - abstract protected function normalize(string $type): string; - - /** - * Fix the types 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 - { - $types = $annotation->getTypes(); - - $new = $this->normalizeTypes($types); - - if ($types !== $new) { - $annotation->setTypes($new); - } - } - - /** - * @param string[] $types - * - * @return string[] - */ - private function normalizeTypes(array $types): array - { - foreach ($types as $index => $type) { - $types[$index] = $this->normalizeType($type); - } - - return $types; - } - - /** - * Prepare the type and normalize it. - */ - private function normalizeType(string $type): string - { - if ('[]' === substr($type, -2)) { - return $this->normalizeType(substr($type, 0, -2)).'[]'; - } - - return $this->normalize($type); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/AbstractProxyFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/AbstractProxyFixer.php deleted file mode 100644 index cdf5dac..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/AbstractProxyFixer.php +++ /dev/null @@ -1,124 +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; - -use PhpCsFixer\Fixer\FixerInterface; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -abstract class AbstractProxyFixer extends AbstractFixer -{ - /** - * @var array - */ - protected $proxyFixers; - - public function __construct() - { - foreach (Utils::sortFixers($this->createProxyFixers()) as $proxyFixer) { - $this->proxyFixers[$proxyFixer->getName()] = $proxyFixer; - } - - parent::__construct(); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - foreach ($this->proxyFixers as $fixer) { - if ($fixer->isCandidate($tokens)) { - return true; - } - } - - return false; - } - - /** - * {@inheritdoc} - */ - public function isRisky(): bool - { - foreach ($this->proxyFixers as $fixer) { - if ($fixer->isRisky()) { - return true; - } - } - - return false; - } - - /** - * {@inheritdoc} - */ - public function getPriority(): int - { - if (\count($this->proxyFixers) > 1) { - throw new \LogicException('You need to override this method to provide the priority of combined fixers.'); - } - - return reset($this->proxyFixers)->getPriority(); - } - - /** - * {@inheritdoc} - */ - public function supports(\SplFileInfo $file): bool - { - foreach ($this->proxyFixers as $fixer) { - if ($fixer->supports($file)) { - return true; - } - } - - return false; - } - - /** - * {@inheritdoc} - */ - public function setWhitespacesConfig(WhitespacesFixerConfig $config): void - { - parent::setWhitespacesConfig($config); - - foreach ($this->proxyFixers as $fixer) { - if ($fixer instanceof WhitespacesAwareFixerInterface) { - $fixer->setWhitespacesConfig($config); - } - } - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - foreach ($this->proxyFixers as $fixer) { - $fixer->fix($file, $tokens); - } - } - - /** - * @return FixerInterface[] - */ - abstract protected function createProxyFixers(): array; -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Cache/Cache.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Cache/Cache.php deleted file mode 100644 index 2332cfd..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Cache/Cache.php +++ /dev/null @@ -1,138 +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\Cache; - -/** - * @author Andreas Möller - * - * @internal - */ -final class Cache implements CacheInterface -{ - /** - * @var SignatureInterface - */ - private $signature; - - /** - * @var array - */ - private $hashes = []; - - public function __construct(SignatureInterface $signature) - { - $this->signature = $signature; - } - - public function getSignature(): SignatureInterface - { - return $this->signature; - } - - public function has(string $file): bool - { - return \array_key_exists($file, $this->hashes); - } - - public function get(string $file): ?int - { - if (!$this->has($file)) { - return null; - } - - return $this->hashes[$file]; - } - - public function set(string $file, int $hash): void - { - $this->hashes[$file] = $hash; - } - - public function clear(string $file): void - { - unset($this->hashes[$file]); - } - - public function toJson(): string - { - $json = json_encode([ - 'php' => $this->getSignature()->getPhpVersion(), - 'version' => $this->getSignature()->getFixerVersion(), - 'indent' => $this->getSignature()->getIndent(), - 'lineEnding' => $this->getSignature()->getLineEnding(), - 'rules' => $this->getSignature()->getRules(), - 'hashes' => $this->hashes, - ]); - - if (JSON_ERROR_NONE !== json_last_error()) { - throw new \UnexpectedValueException(sprintf( - 'Can not 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() - )); - } - - return $json; - } - - /** - * @throws \InvalidArgumentException - * - * @return Cache - */ - 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( - 'Value needs to be a valid JSON string, got "%s", error: "%s".', - $json, - json_last_error_msg() - )); - } - - $requiredKeys = [ - 'php', - 'version', - 'indent', - 'lineEnding', - 'rules', - 'hashes', - ]; - - $missingKeys = array_diff_key(array_flip($requiredKeys), $data); - - if (\count($missingKeys)) { - throw new \InvalidArgumentException(sprintf( - 'JSON data is missing keys "%s"', - implode('", "', $missingKeys) - )); - } - - $signature = new Signature( - $data['php'], - $data['version'], - $data['indent'], - $data['lineEnding'], - $data['rules'] - ); - - $cache = new self($signature); - - $cache->hashes = $data['hashes']; - - return $cache; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Cache/CacheInterface.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Cache/CacheInterface.php deleted file mode 100644 index 6b5f4bd..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Cache/CacheInterface.php +++ /dev/null @@ -1,35 +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\Cache; - -/** - * @author Andreas Möller - * - * @internal - */ -interface CacheInterface -{ - public function getSignature(): SignatureInterface; - - public function has(string $file): bool; - - public function get(string $file): ?int; - - public function set(string $file, int $hash): void; - - public function clear(string $file): void; - - public function toJson(): string; -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Cache/CacheManagerInterface.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Cache/CacheManagerInterface.php deleted file mode 100644 index 4e82d0c..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Cache/CacheManagerInterface.php +++ /dev/null @@ -1,27 +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\Cache; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -interface CacheManagerInterface -{ - public function needFixing(string $file, string $fileContent): bool; - - public function setFile(string $file, string $fileContent): void; -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Cache/Directory.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Cache/Directory.php deleted file mode 100644 index cc9423e..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Cache/Directory.php +++ /dev/null @@ -1,55 +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\Cache; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -final class Directory implements DirectoryInterface -{ - /** - * @var string - */ - private $directoryName; - - public function __construct(string $directoryName) - { - $this->directoryName = $directoryName; - } - - /** - * {@inheritdoc} - */ - public function getRelativePathTo(string $file): string - { - $file = $this->normalizePath($file); - - if ( - '' === $this->directoryName - || 0 !== stripos($file, $this->directoryName.\DIRECTORY_SEPARATOR) - ) { - return $file; - } - - return substr($file, \strlen($this->directoryName) + 1); - } - - private function normalizePath(string $path): string - { - return str_replace(['\\', '/'], \DIRECTORY_SEPARATOR, $path); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Cache/DirectoryInterface.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Cache/DirectoryInterface.php deleted file mode 100644 index 2fdce86..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Cache/DirectoryInterface.php +++ /dev/null @@ -1,23 +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\Cache; - -/** - * @author Dariusz Rumiński - */ -interface DirectoryInterface -{ - public function getRelativePathTo(string $file): string; -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Cache/FileCacheManager.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Cache/FileCacheManager.php deleted file mode 100644 index 0d77e8d..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Cache/FileCacheManager.php +++ /dev/null @@ -1,141 +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\Cache; - -/** - * Class supports caching information about state of fixing files. - * - * Cache is supported only for phar version and version installed via composer. - * - * File will be processed by PHP CS Fixer only if any of the following conditions is fulfilled: - * - cache is corrupt - * - fixer version changed - * - rules changed - * - file is new - * - file changed - * - * @author Dariusz Rumiński - * - * @internal - */ -final class FileCacheManager implements CacheManagerInterface -{ - /** - * @var FileHandlerInterface - */ - private $handler; - - /** - * @var SignatureInterface - */ - private $signature; - - /** - * @var CacheInterface - */ - private $cache; - - /** - * @var bool - */ - private $isDryRun; - - /** - * @var DirectoryInterface - */ - private $cacheDirectory; - - public function __construct( - FileHandlerInterface $handler, - SignatureInterface $signature, - bool $isDryRun = false, - ?DirectoryInterface $cacheDirectory = null - ) { - $this->handler = $handler; - $this->signature = $signature; - $this->isDryRun = $isDryRun; - $this->cacheDirectory = $cacheDirectory ?: new Directory(''); - - $this->readCache(); - } - - public function __destruct() - { - $this->writeCache(); - } - - /** - * This class is not intended to be serialized, - * and cannot be deserialized (see __wakeup method). - */ - public function __sleep(): array - { - throw new \BadMethodCallException('Cannot serialize '.__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 '.__CLASS__); - } - - public function needFixing(string $file, string $fileContent): bool - { - $file = $this->cacheDirectory->getRelativePathTo($file); - - return !$this->cache->has($file) || $this->cache->get($file) !== $this->calcHash($fileContent); - } - - public function setFile(string $file, string $fileContent): void - { - $file = $this->cacheDirectory->getRelativePathTo($file); - - $hash = $this->calcHash($fileContent); - - if ($this->isDryRun && $this->cache->has($file) && $this->cache->get($file) !== $hash) { - $this->cache->clear($file); - - return; - } - - $this->cache->set($file, $hash); - } - - private function readCache(): void - { - $cache = $this->handler->read(); - - if (!$cache || !$this->signature->equals($cache->getSignature())) { - $cache = new Cache($this->signature); - } - - $this->cache = $cache; - } - - private function writeCache(): void - { - $this->handler->write($this->cache); - } - - private function calcHash(string $content): int - { - return crc32($content); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Cache/FileHandler.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Cache/FileHandler.php deleted file mode 100644 index 1a4727e..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Cache/FileHandler.php +++ /dev/null @@ -1,109 +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\Cache; - -use Symfony\Component\Filesystem\Exception\IOException; - -/** - * @author Andreas Möller - * - * @internal - */ -final class FileHandler implements FileHandlerInterface -{ - /** - * @var string - */ - private $file; - - public function __construct(string $file) - { - $this->file = $file; - } - - public function getFile(): string - { - return $this->file; - } - - public function read(): ?CacheInterface - { - if (!file_exists($this->file)) { - return null; - } - - $content = file_get_contents($this->file); - - try { - $cache = Cache::fromJson($content); - } catch (\InvalidArgumentException $exception) { - return null; - } - - return $cache; - } - - public function write(CacheInterface $cache): void - { - $content = $cache->toJson(); - - if (file_exists($this->file)) { - if (is_dir($this->file)) { - throw new IOException( - sprintf('Cannot write cache file "%s" as the location exists as directory.', realpath($this->file)), - 0, - null, - $this->file - ); - } - - if (!is_writable($this->file)) { - throw new IOException( - sprintf('Cannot write to file "%s" as it is not writable.', realpath($this->file)), - 0, - null, - $this->file - ); - } - } else { - $dir = \dirname($this->file); - - if (!is_dir($dir)) { - throw new IOException( - sprintf('Directory of cache file "%s" does not exists.', $this->file), - 0, - null, - $this->file - ); - } - - @touch($this->file); - @chmod($this->file, 0666); - } - - $bytesWritten = @file_put_contents($this->file, $content); - - if (false === $bytesWritten) { - $error = error_get_last(); - - throw new IOException( - sprintf('Failed to write file "%s", "%s".', $this->file, $error['message'] ?? 'no reason available'), - 0, - null, - $this->file - ); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Cache/FileHandlerInterface.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Cache/FileHandlerInterface.php deleted file mode 100644 index 464b04c..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Cache/FileHandlerInterface.php +++ /dev/null @@ -1,29 +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\Cache; - -/** - * @author Andreas Möller - * - * @internal - */ -interface FileHandlerInterface -{ - public function getFile(): string; - - public function read(): ?CacheInterface; - - public function write(CacheInterface $cache): void; -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Cache/NullCacheManager.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Cache/NullCacheManager.php deleted file mode 100644 index 6309480..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Cache/NullCacheManager.php +++ /dev/null @@ -1,32 +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\Cache; - -/** - * @author Andreas Möller - * - * @internal - */ -final class NullCacheManager implements CacheManagerInterface -{ - public function needFixing(string $file, string $fileContent): bool - { - return true; - } - - public function setFile(string $file, string $fileContent): void - { - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Cache/Signature.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Cache/Signature.php deleted file mode 100644 index 333c4fe..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Cache/Signature.php +++ /dev/null @@ -1,106 +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\Cache; - -/** - * @author Andreas Möller - * - * @internal - */ -final class Signature implements SignatureInterface -{ - /** - * @var string - */ - private $phpVersion; - - /** - * @var string - */ - private $fixerVersion; - - /** - * @var string - */ - private $indent; - - /** - * @var string - */ - private $lineEnding; - - /** - * @var array - */ - private $rules; - - public function __construct(string $phpVersion, string $fixerVersion, string $indent, string $lineEnding, array $rules) - { - $this->phpVersion = $phpVersion; - $this->fixerVersion = $fixerVersion; - $this->indent = $indent; - $this->lineEnding = $lineEnding; - $this->rules = self::utf8Encode($rules); - } - - public function getPhpVersion(): string - { - return $this->phpVersion; - } - - public function getFixerVersion(): string - { - return $this->fixerVersion; - } - - public function getIndent(): string - { - return $this->indent; - } - - public function getLineEnding(): string - { - return $this->lineEnding; - } - - public function getRules(): array - { - return $this->rules; - } - - public function equals(SignatureInterface $signature): bool - { - return $this->phpVersion === $signature->getPhpVersion() - && $this->fixerVersion === $signature->getFixerVersion() - && $this->indent === $signature->getIndent() - && $this->lineEnding === $signature->getLineEnding() - && $this->rules === $signature->getRules(); - } - - private static function utf8Encode(array $data): array - { - if (!\function_exists('mb_detect_encoding')) { - return $data; - } - - array_walk_recursive($data, static function (&$item): void { - if (\is_string($item) && !mb_detect_encoding($item, 'utf-8', true)) { - $item = utf8_encode($item); - } - }); - - return $data; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Cache/SignatureInterface.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Cache/SignatureInterface.php deleted file mode 100644 index 062e96d..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Cache/SignatureInterface.php +++ /dev/null @@ -1,38 +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\Cache; - -/** - * @author Andreas Möller - * - * @internal - */ -interface SignatureInterface -{ - public function getPhpVersion(): string; - - public function getFixerVersion(): string; - - public function getIndent(): string; - - public function getLineEnding(): string; - - public function getRules(): array; - - /** - * @param SignatureInterface $signature - */ - public function equals(self $signature): bool; -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Config.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Config.php deleted file mode 100644 index ee59b26..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Config.php +++ /dev/null @@ -1,307 +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; - -use PhpCsFixer\Fixer\FixerInterface; - -/** - * @author Fabien Potencier - * @author Katsuhiro Ogawa - * @author Dariusz Rumiński - */ -class Config implements ConfigInterface -{ - /** - * @var string - */ - private $cacheFile = '.php-cs-fixer.cache'; - - /** - * @var FixerInterface[] - */ - private $customFixers = []; - - /** - * @var null|iterable - */ - private $finder; - - /** - * @var string - */ - private $format = 'txt'; - - /** - * @var bool - */ - private $hideProgress = false; - - /** - * @var string - */ - private $indent = ' '; - - /** - * @var bool - */ - private $isRiskyAllowed = false; - - /** - * @var string - */ - private $lineEnding = "\n"; - - /** - * @var string - */ - private $name; - - /** - * @var null|string - */ - private $phpExecutable; - - /** - * @var array - */ - private $rules = ['@PSR12' => true]; - - /** - * @var bool - */ - private $usingCache = true; - - public function __construct(string $name = 'default') - { - $this->name = $name; - } - - /** - * {@inheritdoc} - */ - public function getCacheFile(): string - { - return $this->cacheFile; - } - - /** - * {@inheritdoc} - */ - public function getCustomFixers(): array - { - return $this->customFixers; - } - - /** - * @return Finder - */ - public function getFinder(): iterable - { - if (null === $this->finder) { - $this->finder = new Finder(); - } - - return $this->finder; - } - - /** - * {@inheritdoc} - */ - public function getFormat(): string - { - return $this->format; - } - - /** - * {@inheritdoc} - */ - public function getHideProgress(): bool - { - return $this->hideProgress; - } - - /** - * {@inheritdoc} - */ - public function getIndent(): string - { - return $this->indent; - } - - /** - * {@inheritdoc} - */ - public function getLineEnding(): string - { - return $this->lineEnding; - } - - /** - * {@inheritdoc} - */ - public function getName(): string - { - return $this->name; - } - - /** - * {@inheritdoc} - */ - public function getPhpExecutable(): ?string - { - return $this->phpExecutable; - } - - /** - * {@inheritdoc} - */ - public function getRiskyAllowed(): bool - { - return $this->isRiskyAllowed; - } - - /** - * {@inheritdoc} - */ - public function getRules(): array - { - return $this->rules; - } - - /** - * {@inheritdoc} - */ - public function getUsingCache(): bool - { - return $this->usingCache; - } - - /** - * {@inheritdoc} - */ - public function registerCustomFixers(iterable $fixers): ConfigInterface - { - foreach ($fixers as $fixer) { - $this->addCustomFixer($fixer); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function setCacheFile(string $cacheFile): ConfigInterface - { - $this->cacheFile = $cacheFile; - - return $this; - } - - /** - * {@inheritdoc} - */ - public function setFinder(iterable $finder): ConfigInterface - { - $this->finder = $finder; - - return $this; - } - - /** - * {@inheritdoc} - */ - public function setFormat(string $format): ConfigInterface - { - $this->format = $format; - - return $this; - } - - /** - * {@inheritdoc} - */ - public function setHideProgress(bool $hideProgress): ConfigInterface - { - $this->hideProgress = $hideProgress; - - return $this; - } - - /** - * {@inheritdoc} - */ - public function setIndent(string $indent): ConfigInterface - { - $this->indent = $indent; - - return $this; - } - - /** - * {@inheritdoc} - */ - public function setLineEnding(string $lineEnding): ConfigInterface - { - $this->lineEnding = $lineEnding; - - return $this; - } - - /** - * {@inheritdoc} - */ - public function setPhpExecutable(?string $phpExecutable): ConfigInterface - { - $this->phpExecutable = $phpExecutable; - - return $this; - } - - /** - * {@inheritdoc} - */ - public function setRiskyAllowed(bool $isRiskyAllowed): ConfigInterface - { - $this->isRiskyAllowed = $isRiskyAllowed; - - return $this; - } - - /** - * {@inheritdoc} - */ - public function setRules(array $rules): ConfigInterface - { - $this->rules = $rules; - - return $this; - } - - /** - * {@inheritdoc} - */ - public function setUsingCache(bool $usingCache): ConfigInterface - { - $this->usingCache = $usingCache; - - return $this; - } - - private function addCustomFixer(FixerInterface $fixer): void - { - $this->customFixers[] = $fixer; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/ConfigInterface.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/ConfigInterface.php deleted file mode 100644 index bc16c19..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/ConfigInterface.php +++ /dev/null @@ -1,133 +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; - -use PhpCsFixer\Fixer\FixerInterface; - -/** - * @author Fabien Potencier - * @author Dariusz Rumiński - */ -interface ConfigInterface -{ - /** - * Returns the path to the cache file. - * - * @return null|string Returns null if not using cache - */ - public function getCacheFile(): ?string; - - /** - * Returns the custom fixers to use. - * - * @return FixerInterface[] - */ - public function getCustomFixers(): array; - - /** - * Returns files to scan. - * - * @return iterable|\Traversable - */ - public function getFinder(): iterable; - - public function getFormat(): string; - - /** - * Returns true if progress should be hidden. - */ - public function getHideProgress(): bool; - - public function getIndent(): string; - - public function getLineEnding(): string; - - /** - * Returns the name of the configuration. - * - * The name must be all lowercase and without any spaces. - * - * @return string The name of the configuration - */ - public function getName(): string; - - /** - * Get configured PHP executable, if any. - */ - public function getPhpExecutable(): ?string; - - /** - * Check if it is allowed to run risky fixers. - */ - public function getRiskyAllowed(): bool; - - /** - * Get rules. - * - * Keys of array are names of fixers/sets, values are true/false. - */ - public function getRules(): array; - - /** - * Returns true if caching should be enabled. - */ - public function getUsingCache(): bool; - - /** - * Adds a suite of custom fixers. - * - * Name of custom fixer should follow `VendorName/rule_name` convention. - * - * @param FixerInterface[]|iterable|\Traversable $fixers - */ - public function registerCustomFixers(iterable $fixers): self; - - /** - * Sets the path to the cache file. - */ - public function setCacheFile(string $cacheFile): self; - - public function setFinder(iterable $finder): self; - - public function setFormat(string $format): self; - - public function setHideProgress(bool $hideProgress): self; - - public function setIndent(string $indent): self; - - public function setLineEnding(string $lineEnding): self; - - /** - * Set PHP executable. - */ - public function setPhpExecutable(?string $phpExecutable): self; - - /** - * Set if it is allowed to run risky fixers. - */ - public function setRiskyAllowed(bool $isRiskyAllowed): self; - - /** - * Set rules. - * - * Keys of array are names of fixers or sets. - * Value for set must be bool (turn it on or off). - * Value for fixer may be bool (turn it on or off) or array of configuration - * (turn it on and contains configuration for FixerInterface::configure method). - */ - public function setRules(array $rules): self; - - public function setUsingCache(bool $usingCache): self; -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/ConfigurationException/InvalidConfigurationException.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/ConfigurationException/InvalidConfigurationException.php deleted file mode 100644 index 9356b60..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/ConfigurationException/InvalidConfigurationException.php +++ /dev/null @@ -1,37 +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\ConfigurationException; - -use PhpCsFixer\Console\Command\FixCommandExitStatusCalculator; - -/** - * Exceptions of this type are thrown on misconfiguration of the Fixer. - * - * @author SpacePossum - * - * @internal - * @final Only internal extending this class is supported - */ -class InvalidConfigurationException extends \InvalidArgumentException -{ - public function __construct(string $message, ?int $code = null, ?\Throwable $previous = null) - { - parent::__construct( - $message, - null === $code ? FixCommandExitStatusCalculator::EXIT_STATUS_FLAG_HAS_INVALID_CONFIG : $code, - $previous - ); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/ConfigurationException/InvalidFixerConfigurationException.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/ConfigurationException/InvalidFixerConfigurationException.php deleted file mode 100644 index b62ad0d..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/ConfigurationException/InvalidFixerConfigurationException.php +++ /dev/null @@ -1,48 +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\ConfigurationException; - -use PhpCsFixer\Console\Command\FixCommandExitStatusCalculator; - -/** - * Exception thrown by Fixers on misconfiguration. - * - * @author SpacePossum - * - * @internal - * @final Only internal extending this class is supported - */ -class InvalidFixerConfigurationException extends InvalidConfigurationException -{ - /** - * @var string - */ - private $fixerName; - - public function __construct(string $fixerName, string $message, ?\Throwable $previous = null) - { - parent::__construct( - sprintf('[%s] %s', $fixerName, $message), - FixCommandExitStatusCalculator::EXIT_STATUS_FLAG_HAS_INVALID_FIXER_CONFIG, - $previous - ); - $this->fixerName = $fixerName; - } - - public function getFixerName(): string - { - return $this->fixerName; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/ConfigurationException/InvalidForEnvFixerConfigurationException.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/ConfigurationException/InvalidForEnvFixerConfigurationException.php deleted file mode 100644 index 6e4dcd4..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/ConfigurationException/InvalidForEnvFixerConfigurationException.php +++ /dev/null @@ -1,24 +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\ConfigurationException; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -final class InvalidForEnvFixerConfigurationException extends InvalidFixerConfigurationException -{ -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/ConfigurationException/RequiredFixerConfigurationException.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/ConfigurationException/RequiredFixerConfigurationException.php deleted file mode 100644 index d229cda..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/ConfigurationException/RequiredFixerConfigurationException.php +++ /dev/null @@ -1,24 +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\ConfigurationException; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -final class RequiredFixerConfigurationException extends InvalidFixerConfigurationException -{ -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Application.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Application.php deleted file mode 100644 index d7708da..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Application.php +++ /dev/null @@ -1,143 +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\Console; - -use PhpCsFixer\Console\Command\DescribeCommand; -use PhpCsFixer\Console\Command\FixCommand; -use PhpCsFixer\Console\Command\HelpCommand; -use PhpCsFixer\Console\Command\ListFilesCommand; -use PhpCsFixer\Console\Command\ListSetsCommand; -use PhpCsFixer\Console\Command\SelfUpdateCommand; -use PhpCsFixer\Console\SelfUpdate\GithubClient; -use PhpCsFixer\Console\SelfUpdate\NewVersionChecker; -use PhpCsFixer\PharChecker; -use PhpCsFixer\ToolInfo; -use PhpCsFixer\Utils; -use Symfony\Component\Console\Application as BaseApplication; -use Symfony\Component\Console\Command\ListCommand; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\ConsoleOutputInterface; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * @author Fabien Potencier - * @author Dariusz Rumiński - * - * @internal - */ -final class Application extends BaseApplication -{ - public const VERSION = '3.1.0'; - public const VERSION_CODENAME = 'River'; - - /** - * @var ToolInfo - */ - private $toolInfo; - - public function __construct() - { - parent::__construct('PHP CS Fixer', self::VERSION); - - $this->toolInfo = new ToolInfo(); - - // in alphabetical order - $this->add(new DescribeCommand()); - $this->add(new FixCommand($this->toolInfo)); - $this->add(new ListFilesCommand($this->toolInfo)); - $this->add(new ListSetsCommand()); - $this->add(new SelfUpdateCommand( - new NewVersionChecker(new GithubClient()), - $this->toolInfo, - new PharChecker() - )); - } - - public static function getMajorVersion(): int - { - return (int) explode('.', self::VERSION)[0]; - } - - /** - * {@inheritdoc} - */ - public function doRun(InputInterface $input, OutputInterface $output): int - { - $stdErr = $output instanceof ConsoleOutputInterface - ? $output->getErrorOutput() - : ($input->hasParameterOption('--format', true) && 'txt' !== $input->getParameterOption('--format', null, true) ? null : $output) - ; - - if (null !== $stdErr) { - $warningsDetector = new WarningsDetector($this->toolInfo); - $warningsDetector->detectOldVendor(); - $warningsDetector->detectOldMajor(); - $warnings = $warningsDetector->getWarnings(); - - if ($warnings) { - foreach ($warnings as $warning) { - $stdErr->writeln(sprintf($stdErr->isDecorated() ? '%s' : '%s', $warning)); - } - $stdErr->writeln(''); - } - } - - $result = parent::doRun($input, $output); - - if ( - null !== $stdErr - && $output->getVerbosity() >= OutputInterface::VERBOSITY_VERBOSE - ) { - $triggeredDeprecations = Utils::getTriggeredDeprecations(); - if ($triggeredDeprecations) { - $stdErr->writeln(''); - $stdErr->writeln($stdErr->isDecorated() ? 'Detected deprecations in use:' : 'Detected deprecations in use:'); - foreach ($triggeredDeprecations as $deprecation) { - $stdErr->writeln(sprintf('- %s', $deprecation)); - } - } - } - - return $result; - } - - /** - * {@inheritdoc} - */ - public function getLongVersion(): string - { - $version = implode('', [ - parent::getLongVersion(), - 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', - ]); - - $commit = '@git-commit@'; - - if ('@'.'git-commit@' !== $commit) { // @phpstan-ignore-line as `$commit` is replaced during phar building - $version .= ' ('.substr($commit, 0, 7).')'; - } - - return $version; - } - - /** - * {@inheritdoc} - */ - protected function getDefaultCommands(): array - { - return [new HelpCommand(), new ListCommand()]; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Command/DescribeCommand.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Command/DescribeCommand.php deleted file mode 100644 index ba01315..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Command/DescribeCommand.php +++ /dev/null @@ -1,433 +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\Console\Command; - -use PhpCsFixer\Differ\DiffConsoleFormatter; -use PhpCsFixer\Differ\FullDiffer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -use PhpCsFixer\Fixer\DeprecatedFixerInterface; -use PhpCsFixer\Fixer\FixerInterface; -use PhpCsFixer\FixerConfiguration\AliasedFixerOption; -use PhpCsFixer\FixerConfiguration\AllowedValueSubset; -use PhpCsFixer\FixerConfiguration\DeprecatedFixerOption; -use PhpCsFixer\FixerDefinition\CodeSampleInterface; -use PhpCsFixer\FixerDefinition\FileSpecificCodeSampleInterface; -use PhpCsFixer\FixerDefinition\VersionSpecificCodeSampleInterface; -use PhpCsFixer\FixerFactory; -use PhpCsFixer\Preg; -use PhpCsFixer\RuleSet\RuleSets; -use PhpCsFixer\StdinFileInfo; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Utils; -use PhpCsFixer\WordMatcher; -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\Output\ConsoleOutputInterface; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * @author Dariusz Rumiński - * @author SpacePossum - * - * @internal - */ -final class DescribeCommand extends Command -{ - /** - * @var string - */ - protected static $defaultName = 'describe'; - - /** - * @var string[] - */ - private $setNames; - - /** - * @var FixerFactory - */ - private $fixerFactory; - - /** - * @var array - */ - private $fixers; - - public function __construct(?FixerFactory $fixerFactory = null) - { - parent::__construct(); - - if (null === $fixerFactory) { - $fixerFactory = new FixerFactory(); - $fixerFactory->registerBuiltInFixers(); - } - - $this->fixerFactory = $fixerFactory; - } - - /** - * {@inheritdoc} - */ - protected function configure(): void - { - $this - ->setDefinition( - [ - new InputArgument('name', InputArgument::REQUIRED, 'Name of rule / set.'), - ] - ) - ->setDescription('Describe rule / ruleset.') - ; - } - - /** - * {@inheritdoc} - */ - protected function execute(InputInterface $input, OutputInterface $output): int - { - if (OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity() && $output instanceof ConsoleOutputInterface) { - $stdErr = $output->getErrorOutput(); - $stdErr->writeln($this->getApplication()->getLongVersion()); - $stdErr->writeln(sprintf('Runtime: PHP %s', PHP_VERSION)); - } - - $name = $input->getArgument('name'); - - try { - if ('@' === $name[0]) { - $this->describeSet($output, $name); - - return 0; - } - - $this->describeRule($output, $name); - } catch (DescribeNameNotFoundException $e) { - $matcher = new WordMatcher( - 'set' === $e->getType() ? $this->getSetNames() : array_keys($this->getFixers()) - ); - - $alternative = $matcher->match($name); - - $this->describeList($output, $e->getType()); - - throw new \InvalidArgumentException(sprintf( - '%s "%s" not found.%s', - ucfirst($e->getType()), - $name, - null === $alternative ? '' : ' Did you mean "'.$alternative.'"?' - )); - } - - return 0; - } - - private function describeRule(OutputInterface $output, string $name): void - { - $fixers = $this->getFixers(); - - if (!isset($fixers[$name])) { - throw new DescribeNameNotFoundException($name, 'rule'); - } - - /** @var FixerInterface $fixer */ - $fixer = $fixers[$name]; - - $definition = $fixer->getDefinition(); - - $description = $definition->getSummary(); - - if ($fixer instanceof DeprecatedFixerInterface) { - $successors = $fixer->getSuccessorsNames(); - $message = [] === $successors - ? 'will be removed on next major version' - : sprintf('use %s instead', Utils::naturalLanguageJoinWithBackticks($successors)); - $message = Preg::replace('/(`.+?`)/', '$1', $message); - $description .= sprintf(' DEPRECATED: %s.', $message); - } - - $output->writeln(sprintf('Description of %s rule.', $name)); - - if ($output->getVerbosity() >= OutputInterface::VERBOSITY_VERBOSE) { - $output->writeln(sprintf('Fixer class: %s.', \get_class($fixer))); - } - - $output->writeln($description); - - if ($definition->getDescription()) { - $output->writeln($definition->getDescription()); - } - - $output->writeln(''); - - if ($fixer->isRisky()) { - $output->writeln('Fixer applying this rule is risky.'); - - if ($definition->getRiskyDescription()) { - $output->writeln($definition->getRiskyDescription()); - } - - $output->writeln(''); - } - - if ($fixer instanceof ConfigurableFixerInterface) { - $configurationDefinition = $fixer->getConfigurationDefinition(); - $options = $configurationDefinition->getOptions(); - - $output->writeln(sprintf('Fixer is configurable using following option%s:', 1 === \count($options) ? '' : 's')); - - foreach ($options as $option) { - $line = '* '.OutputFormatter::escape($option->getName()).''; - $allowed = HelpCommand::getDisplayableAllowedValues($option); - - if (null !== $allowed) { - foreach ($allowed as &$value) { - if ($value instanceof AllowedValueSubset) { - $value = 'a subset of '.HelpCommand::toString($value->getAllowedValues()).''; - } else { - $value = ''.HelpCommand::toString($value).''; - } - } - } else { - $allowed = array_map( - static function (string $type) { - return ''.$type.''; - }, - $option->getAllowedTypes() - ); - } - - if (null !== $allowed) { - $line .= ' ('.implode(', ', $allowed).')'; - } - - $description = Preg::replace('/(`.+?`)/', '$1', OutputFormatter::escape($option->getDescription())); - $line .= ': '.lcfirst(Preg::replace('/\.$/', '', $description)).'; '; - - if ($option->hasDefault()) { - $line .= sprintf( - 'defaults to %s', - HelpCommand::toString($option->getDefault()) - ); - } else { - $line .= 'required'; - } - - if ($option instanceof DeprecatedFixerOption) { - $line .= '. DEPRECATED: '.Preg::replace( - '/(`.+?`)/', - '$1', - OutputFormatter::escape(lcfirst($option->getDeprecationMessage())) - ); - } - - if ($option instanceof AliasedFixerOption) { - $line .= '; DEPRECATED alias: '.$option->getAlias().''; - } - - $output->writeln($line); - } - - $output->writeln(''); - } - - /** @var CodeSampleInterface[] $codeSamples */ - $codeSamples = array_filter($definition->getCodeSamples(), static function (CodeSampleInterface $codeSample) { - if ($codeSample instanceof VersionSpecificCodeSampleInterface) { - return $codeSample->isSuitableFor(\PHP_VERSION_ID); - } - - return true; - }); - - if (!\count($codeSamples)) { - $output->writeln([ - 'Fixing examples can not be demonstrated on the current PHP version.', - '', - ]); - } else { - $output->writeln('Fixing examples:'); - - $differ = new FullDiffer(); - $diffFormatter = new DiffConsoleFormatter( - $output->isDecorated(), - sprintf( - ' ---------- begin diff ----------%s%%s%s ----------- end diff -----------', - PHP_EOL, - PHP_EOL - ) - ); - - foreach ($codeSamples as $index => $codeSample) { - $old = $codeSample->getCode(); - $tokens = Tokens::fromCode($old); - - $configuration = $codeSample->getConfiguration(); - - if ($fixer instanceof ConfigurableFixerInterface) { - $fixer->configure(null === $configuration ? [] : $configuration); - } - - $file = $codeSample instanceof FileSpecificCodeSampleInterface - ? $codeSample->getSplFileInfo() - : new StdinFileInfo(); - - $fixer->fix($file, $tokens); - - $diff = $differ->diff($old, $tokens->generateCode()); - - if ($fixer instanceof ConfigurableFixerInterface) { - if (null === $configuration) { - $output->writeln(sprintf(' * Example #%d. Fixing with the default configuration.', $index + 1)); - } else { - $output->writeln(sprintf(' * Example #%d. Fixing with configuration: %s.', $index + 1, HelpCommand::toString($codeSample->getConfiguration()))); - } - } else { - $output->writeln(sprintf(' * Example #%d.', $index + 1)); - } - - $output->writeln([$diffFormatter->format($diff, ' %s'), '']); - } - } - } - - private function describeSet(OutputInterface $output, string $name): void - { - if (!\in_array($name, $this->getSetNames(), true)) { - throw new DescribeNameNotFoundException($name, 'set'); - } - - $ruleSetDefinitions = RuleSets::getSetDefinitions(); - $fixers = $this->getFixers(); - - $output->writeln(sprintf('Description of the %s set.', $ruleSetDefinitions[$name]->getName())); - $output->writeln($this->replaceRstLinks($ruleSetDefinitions[$name]->getDescription())); - - if ($ruleSetDefinitions[$name]->isRisky()) { - $output->writeln('This set contains risky rules.'); - } - - $output->writeln(''); - - $help = ''; - - foreach ($ruleSetDefinitions[$name]->getRules() as $rule => $config) { - if ('@' === $rule[0]) { - $set = $ruleSetDefinitions[$rule]; - $help .= sprintf( - " * %s%s\n | %s\n\n", - $rule, - $set->isRisky() ? ' risky' : '', - $this->replaceRstLinks($set->getDescription()) - ); - - continue; - } - - /** @var FixerInterface $fixer */ - $fixer = $fixers[$rule]; - - $definition = $fixer->getDefinition(); - $help .= sprintf( - " * %s%s\n | %s\n%s\n", - $rule, - $fixer->isRisky() ? ' risky' : '', - $definition->getSummary(), - true !== $config ? sprintf(" | Configuration: %s\n", HelpCommand::toString($config)) : '' - ); - } - - $output->write($help); - } - - /** - * @return array - */ - private function getFixers(): array - { - if (null !== $this->fixers) { - return $this->fixers; - } - - $fixers = []; - - foreach ($this->fixerFactory->getFixers() as $fixer) { - $fixers[$fixer->getName()] = $fixer; - } - - $this->fixers = $fixers; - ksort($this->fixers); - - return $this->fixers; - } - - /** - * @return string[] - */ - private function getSetNames(): array - { - if (null !== $this->setNames) { - return $this->setNames; - } - - $this->setNames = RuleSets::getSetDefinitionNames(); - - return $this->setNames; - } - - /** - * @param string $type 'rule'|'set' - */ - 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 { - return; - } - - /** @var string[] $items */ - foreach ($describe as $list => $items) { - $output->writeln(sprintf('Defined %s:', $list)); - - foreach ($items as $name => $item) { - $output->writeln(sprintf('* %s', \is_string($name) ? $name : $item)); - } - } - } - - private function replaceRstLinks(string $content): string - { - return Preg::replaceCallback( - '/(`[^<]+<[^>]+>`_)/', - static function (array $matches) { - return Preg::replaceCallback( - '/`(.*)<(.*)>`_/', - static function (array $matches) { - return $matches[1].'('.$matches[2].')'; - }, - $matches[1] - ); - }, - $content - ); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Command/DescribeNameNotFoundException.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Command/DescribeNameNotFoundException.php deleted file mode 100644 index b5a5355..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Command/DescribeNameNotFoundException.php +++ /dev/null @@ -1,51 +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\Console\Command; - -/** - * @author SpacePossum - * - * @internal - */ -final class DescribeNameNotFoundException extends \InvalidArgumentException -{ - /** - * @var string - */ - private $name; - - /** - * @var string 'rule'|'set' - */ - private $type; - - public function __construct(string $name, string $type) - { - $this->name = $name; - $this->type = $type; - - parent::__construct(); - } - - public function getName(): string - { - return $this->name; - } - - public function getType(): string - { - return $this->type; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Command/DocumentationCommand.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Command/DocumentationCommand.php deleted file mode 100644 index 3c3ab08..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Command/DocumentationCommand.php +++ /dev/null @@ -1,126 +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\Console\Command; - -use PhpCsFixer\Documentation\DocumentationGenerator; -use PhpCsFixer\FixerFactory; -use PhpCsFixer\RuleSet\RuleSets; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Filesystem\Filesystem; -use Symfony\Component\Finder\Finder; -use Symfony\Component\Finder\SplFileInfo; - -/** - * @internal - */ -final class DocumentationCommand extends Command -{ - /** - * @var string - */ - protected static $defaultName = 'documentation'; - - /** - * @var DocumentationGenerator - */ - private $generator; - - public function __construct(?string $name = null) - { - parent::__construct($name); - - $this->generator = new DocumentationGenerator(); - } - - protected function configure(): void - { - $this - ->setAliases(['doc']) - ->setDescription('Dumps the documentation of the project into its /doc directory.') - ; - } - - protected function execute(InputInterface $input, OutputInterface $output): int - { - $fixerFactory = new FixerFactory(); - $fixerFactory->registerBuiltInFixers(); - $fixers = $fixerFactory->getFixers(); - - $this->generateFixersDocs($fixers); - $this->generateRuleSetsDocs($fixers); - - $output->writeln('Docs updated.'); - - return 0; - } - - private function generateFixersDocs(array $fixers): void - { - $filesystem = new Filesystem(); - - // Array of existing fixer docs. - // We first override existing files, and then we will delete files that are no longer needed. - // We cannot remove all files first, as generation of docs is re-using existing docs to extract code-samples for - // VersionSpecificCodeSample under incompatible PHP version. - $docForFixerRelativePaths = []; - - foreach ($fixers as $fixer) { - $docForFixerRelativePaths[] = $this->generator->getFixerDocumentationFileRelativePath($fixer); - $filesystem->dumpFile( - $this->generator->getFixerDocumentationFilePath($fixer), - $this->generator->generateFixerDocumentation($fixer) - ); - } - - /** @var SplFileInfo $file */ - foreach ( - (new Finder())->files() - ->in($this->generator->getFixersDocumentationDirectoryPath()) - ->notPath($docForFixerRelativePaths) as $file - ) { - $filesystem->remove($file->getPathname()); - } - - $index = $this->generator->getFixersDocumentationIndexFilePath(); - - if (false === @file_put_contents($index, $this->generator->generateFixersDocumentationIndex($fixers))) { - throw new \RuntimeException("Failed updating file {$index}."); - } - } - - private function generateRuleSetsDocs(array $fixers): void - { - $filesystem = new Filesystem(); - - /** @var SplFileInfo $file */ - foreach ((new Finder())->files()->in($this->generator->getRuleSetsDocumentationDirectoryPath()) as $file) { - $filesystem->remove($file->getPathname()); - } - - $index = $this->generator->getRuleSetsDocumentationIndexFilePath(); - $paths = []; - - foreach (RuleSets::getSetDefinitions() as $name => $definition) { - $paths[$name] = $path = $this->generator->getRuleSetsDocumentationFilePath($name); - $filesystem->dumpFile($path, $this->generator->generateRuleSetsDocumentation($definition, $fixers)); - } - - if (false === @file_put_contents($index, $this->generator->generateRuleSetsDocumentationIndex($paths))) { - throw new \RuntimeException("Failed updating file {$index}."); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Command/FixCommand.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Command/FixCommand.php deleted file mode 100644 index a2b96cf..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Command/FixCommand.php +++ /dev/null @@ -1,372 +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\Console\Command; - -use PhpCsFixer\Config; -use PhpCsFixer\ConfigInterface; -use PhpCsFixer\ConfigurationException\InvalidConfigurationException; -use PhpCsFixer\Console\ConfigurationResolver; -use PhpCsFixer\Console\Output\ErrorOutput; -use PhpCsFixer\Console\Output\NullOutput; -use PhpCsFixer\Console\Output\ProcessOutput; -use PhpCsFixer\Console\Report\FixReport\ReportSummary; -use PhpCsFixer\Error\ErrorsManager; -use PhpCsFixer\Runner\Runner; -use PhpCsFixer\ToolInfoInterface; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Input\InputArgument; -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\Console\Terminal; -use Symfony\Component\EventDispatcher\EventDispatcher; -use Symfony\Component\EventDispatcher\EventDispatcherInterface; -use Symfony\Component\Stopwatch\Stopwatch; - -/** - * @author Fabien Potencier - * @author Dariusz Rumiński - * - * @internal - */ -final class FixCommand extends Command -{ - /** - * @var string - */ - protected static $defaultName = 'fix'; - - /** - * @var EventDispatcherInterface - */ - private $eventDispatcher; - - /** - * @var ErrorsManager - */ - private $errorsManager; - - /** - * @var Stopwatch - */ - private $stopwatch; - - /** - * @var ConfigInterface - */ - private $defaultConfig; - - /** - * @var ToolInfoInterface - */ - private $toolInfo; - - public function __construct(ToolInfoInterface $toolInfo) - { - parent::__construct(); - - $this->defaultConfig = new Config(); - $this->errorsManager = new ErrorsManager(); - $this->eventDispatcher = new EventDispatcher(); - $this->stopwatch = new Stopwatch(); - $this->toolInfo = $toolInfo; - } - - /** - * {@inheritdoc} - * - * Override here to only generate the help copy when used. - */ - public function getHelp(): string - { - return <<<'EOF' -The %command.name% command tries to fix as much coding standards -problems as possible on a given file or files in a given directory and its subdirectories: - - $ php %command.full_name% /path/to/dir - $ php %command.full_name% /path/to/file - -By default --path-mode is set to `override`, which means, that if you specify the path to a file or a directory via -command arguments, then the paths provided to a `Finder` in config file will be ignored. You can use --path-mode=intersection -to merge paths from the config file and from the argument: - - $ 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`. - -NOTE: the output for the following formats are generated in accordance with schemas - -* `checkstyle` follows the common `"checkstyle" XML schema `_ -* `json` follows the `own JSON schema `_ -* `junit` follows the `JUnit XML schema from Jenkins `_ -* `xml` follows the `own XML schema `_ - -The --quiet Do not output any message. - -The --verbose option will show the applied rules. When using the `txt` format it will also display progress notifications. - -NOTE: if there is an error like "errors reported during linting after fixing", you can use this to be even more verbose for debugging purpose - -* `-v`: verbose -* `-vv`: very verbose -* `-vvv`: debug - -The --rules option limits the rules to apply to the -project: - - $ php %command.full_name% /path/to/project --rules=@PSR12 - -By default the PSR-12 rules are used. - -The --rules option lets you choose the exact rules to -apply (the rule names must be separated by a comma): - - $ php %command.full_name% /path/to/dir --rules=line_ending,full_opening_tag,indentation_type - -You can also exclude the rules you don't want by placing a dash in front of the rule name, if this is more convenient, -using -name_of_fixer: - - $ php %command.full_name% /path/to/dir --rules=-full_opening_tag,-indentation_type - -When using combinations of exact and exclude rules, applying exact rules along with above excluded results: - - $ php %command.full_name% /path/to/project --rules=@Symfony,-@PSR1,-blank_line_before_statement,strict_comparison - -Complete configuration for rules can be supplied using a `json` formatted string. - - $ php %command.full_name% /path/to/project --rules='{"concat_space": {"spacing": "none"}}' - -The --dry-run flag will run the fixer without making changes to your files. - -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. -A rule is considered risky if it could change code behaviour. By default no risky rules are run. - -The --stop-on-violation flag stops the execution upon first file that needs to be fixed. - -The --show-progress option allows you to choose the way process progress is rendered: - -* none: disables progress output; -* dots: multiline progress output with number of files and percentage on each line. - -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. - - $ php %command.full_name% --verbose --show-progress=dots - -By using --using-cache option with `yes` or `no` you can set if the caching -mechanism should be used. - -The command can also read from standard input, in which case it won't -automatically fix anything: - - $ cat foo.php | php %command.full_name% --diff - - -Finally, if you don't need BC kept on CLI level, you might use `PHP_CS_FIXER_FUTURE_MODE` to start using options that -would be default in next MAJOR release and to forbid using deprecated configuration: - - $ PHP_CS_FIXER_FUTURE_MODE=1 php %command.full_name% -v --diff - -Exit code ---------- - -Exit code of the fix command is built using following bit flags: - -* 0 - OK. -* 1 - General error (or PHP minimal requirement not matched). -* 4 - Some files have invalid syntax (only in dry-run mode). -* 8 - Some files need fixing (only in dry-run mode). -* 16 - Configuration error of the application. -* 32 - Configuration error of a Fixer. -* 64 - Exception raised within the application. - -EOF - ; - } - - /** - * {@inheritdoc} - */ - protected function configure(): void - { - $this - ->setDefinition( - [ - new InputArgument('path', InputArgument::IS_ARRAY, 'The path.'), - new InputOption('path-mode', '', InputOption::VALUE_REQUIRED, 'Specify path mode (can be override or intersection).', ConfigurationResolver::PATH_MODE_OVERRIDE), - 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 .php-cs-fixer.php file.'), - new InputOption('dry-run', '', InputOption::VALUE_NONE, 'Only shows which files would have been modified.'), - new InputOption('rules', '', InputOption::VALUE_REQUIRED, 'The rules.'), - new InputOption('using-cache', '', InputOption::VALUE_REQUIRED, 'Does cache should 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, 'Also produce 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).'), - ] - ) - ->setDescription('Fixes a directory or a file.') - ; - } - - /** - * {@inheritdoc} - */ - protected function execute(InputInterface $input, OutputInterface $output): int - { - $verbosity = $output->getVerbosity(); - - $passedConfig = $input->getOption('config'); - $passedRules = $input->getOption('rules'); - - if (null !== $passedConfig && null !== $passedRules) { - throw new InvalidConfigurationException('Passing both `--config` and `--rules` options is not allowed.'); - } - - $resolver = new ConfigurationResolver( - $this->defaultConfig, - [ - 'allow-risky' => $input->getOption('allow-risky'), - 'config' => $passedConfig, - 'dry-run' => $input->getOption('dry-run'), - 'rules' => $passedRules, - 'path' => $input->getArgument('path'), - 'path-mode' => $input->getOption('path-mode'), - 'using-cache' => $input->getOption('using-cache'), - 'cache-file' => $input->getOption('cache-file'), - 'format' => $input->getOption('format'), - 'diff' => $input->getOption('diff'), - 'stop-on-violation' => $input->getOption('stop-on-violation'), - 'verbosity' => $verbosity, - 'show-progress' => $input->getOption('show-progress'), - ], - getcwd(), - $this->toolInfo - ); - - $reporter = $resolver->getReporter(); - - $stdErr = $output instanceof ConsoleOutputInterface - ? $output->getErrorOutput() - : ('txt' === $reporter->getFormat() ? $output : null) - ; - - if (null !== $stdErr) { - if (OutputInterface::VERBOSITY_VERBOSE <= $verbosity) { - $stdErr->writeln($this->getApplication()->getLongVersion()); - $stdErr->writeln(sprintf('Runtime: PHP %s', PHP_VERSION)); - } - - $configFile = $resolver->getConfigFile(); - $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)); - } - } - } - - $progressType = $resolver->getProgress(); - $finder = $resolver->getFinder(); - - 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.') - ); - } - - if ('none' === $progressType || null === $stdErr) { - $progressOutput = new NullOutput(); - } else { - $finder = new \ArrayIterator(iterator_to_array($finder)); - $progressOutput = new ProcessOutput( - $stdErr, - $this->eventDispatcher, - (new Terminal())->getWidth(), - \count($finder) - ); - } - - $runner = new Runner( - $finder, - $resolver->getFixers(), - $resolver->getDiffer(), - 'none' !== $progressType ? $this->eventDispatcher : null, - $this->errorsManager, - $resolver->getLinter(), - $resolver->isDryRun(), - $resolver->getCacheManager(), - $resolver->getDirectory(), - $resolver->shouldStopOnViolation() - ); - - $this->stopwatch->start('fixFiles'); - $changed = $runner->fix(); - $this->stopwatch->stop('fixFiles'); - - $progressOutput->printLegend(); - - $fixEvent = $this->stopwatch->getEvent('fixFiles'); - - $reportSummary = new ReportSummary( - $changed, - $fixEvent->getDuration(), - $fixEvent->getMemory(), - OutputInterface::VERBOSITY_VERBOSE <= $verbosity, - $resolver->isDryRun(), - $output->isDecorated() - ); - - $output->isDecorated() - ? $output->write($reporter->generate($reportSummary)) - : $output->write($reporter->generate($reportSummary), false, OutputInterface::OUTPUT_RAW) - ; - - $invalidErrors = $this->errorsManager->getInvalidErrors(); - $exceptionErrors = $this->errorsManager->getExceptionErrors(); - $lintErrors = $this->errorsManager->getLintErrors(); - - if (null !== $stdErr) { - $errorOutput = new ErrorOutput($stdErr); - - if (\count($invalidErrors) > 0) { - $errorOutput->listErrors('linting before fixing', $invalidErrors); - } - - if (\count($exceptionErrors) > 0) { - $errorOutput->listErrors('fixing', $exceptionErrors); - } - - if (\count($lintErrors) > 0) { - $errorOutput->listErrors('linting after fixing', $lintErrors); - } - } - - $exitStatusCalculator = new FixCommandExitStatusCalculator(); - - return $exitStatusCalculator->calculate( - $resolver->isDryRun(), - \count($changed) > 0, - \count($invalidErrors) > 0, - \count($exceptionErrors) > 0, - \count($lintErrors) > 0 - ); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Command/FixCommandExitStatusCalculator.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Command/FixCommandExitStatusCalculator.php deleted file mode 100644 index 727dfff..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Command/FixCommandExitStatusCalculator.php +++ /dev/null @@ -1,51 +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\Console\Command; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -final class FixCommandExitStatusCalculator -{ - // Exit status 1 is reserved for environment constraints not matched. - public const EXIT_STATUS_FLAG_HAS_INVALID_FILES = 4; - public const EXIT_STATUS_FLAG_HAS_CHANGED_FILES = 8; - public const EXIT_STATUS_FLAG_HAS_INVALID_CONFIG = 16; - 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 - { - $exitStatus = 0; - - if ($isDryRun) { - if ($hasChangedFiles) { - $exitStatus |= self::EXIT_STATUS_FLAG_HAS_CHANGED_FILES; - } - - if ($hasInvalidErrors) { - $exitStatus |= self::EXIT_STATUS_FLAG_HAS_INVALID_FILES; - } - } - - if ($hasExceptionErrors || $hasLintErrorsAfterFixing) { - $exitStatus |= self::EXIT_STATUS_FLAG_EXCEPTION_IN_APP; - } - - return $exitStatus; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Command/HelpCommand.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Command/HelpCommand.php deleted file mode 100644 index 585dc69..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Command/HelpCommand.php +++ /dev/null @@ -1,125 +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\Console\Command; - -use PhpCsFixer\FixerConfiguration\AllowedValueSubset; -use PhpCsFixer\FixerConfiguration\FixerOptionInterface; -use PhpCsFixer\Preg; -use Symfony\Component\Console\Command\HelpCommand as BaseHelpCommand; -use Symfony\Component\Console\Formatter\OutputFormatterStyle; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * @author Fabien Potencier - * @author Dariusz Rumiński - * @author SpacePossum - * - * @internal - */ -final class HelpCommand extends BaseHelpCommand -{ - /** - * @var string - */ - protected static $defaultName = 'help'; - - /** - * @param mixed $value - */ - public static function toString($value): string - { - return \is_array($value) - ? static::arrayToString($value) - : static::scalarToString($value) - ; - } - - /** - * Returns the allowed values of the given option that can be converted to a string. - */ - public static function getDisplayableAllowedValues(FixerOptionInterface $option): ?array - { - $allowed = $option->getAllowedValues(); - - if (null !== $allowed) { - $allowed = array_filter($allowed, static function ($value) { - return !($value instanceof \Closure); - }); - - usort($allowed, static function ($valueA, $valueB) { - if ($valueA instanceof AllowedValueSubset) { - return -1; - } - - if ($valueB instanceof AllowedValueSubset) { - return 1; - } - - return strcasecmp( - self::toString($valueA), - self::toString($valueB) - ); - }); - - if (0 === \count($allowed)) { - $allowed = null; - } - } - - return $allowed; - } - - /** - * {@inheritdoc} - */ - protected function initialize(InputInterface $input, OutputInterface $output): void - { - $output->getFormatter()->setStyle('url', new OutputFormatterStyle('blue')); - } - - /** - * @param mixed $value - */ - private static function scalarToString($value): string - { - $str = var_export($value, true); - - return Preg::replace('/\bNULL\b/', 'null', $str); - } - - private static function arrayToString(array $value): string - { - if (0 === \count($value)) { - return '[]'; - } - - $isHash = !array_is_list($value); - $str = '['; - - foreach ($value as $k => $v) { - if ($isHash) { - $str .= static::scalarToString($k).' => '; - } - - $str .= \is_array($v) - ? static::arrayToString($v).', ' - : static::scalarToString($v).', ' - ; - } - - return substr($str, 0, -2).']'; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Command/ListFilesCommand.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Command/ListFilesCommand.php deleted file mode 100644 index f88707c..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Command/ListFilesCommand.php +++ /dev/null @@ -1,101 +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\Console\Command; - -use PhpCsFixer\Config; -use PhpCsFixer\ConfigInterface; -use PhpCsFixer\Console\ConfigurationResolver; -use PhpCsFixer\ToolInfoInterface; -use SplFileInfo; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * @author Markus Staab - * - * @internal - */ -final class ListFilesCommand extends Command -{ - /** - * @var string - */ - protected static $defaultName = 'list-files'; - - /** - * @var ConfigInterface - */ - private $defaultConfig; - - /** - * @var ToolInfoInterface - */ - private $toolInfo; - - public function __construct(ToolInfoInterface $toolInfo) - { - parent::__construct(); - - $this->defaultConfig = new Config(); - $this->toolInfo = $toolInfo; - } - - /** - * {@inheritdoc} - */ - protected function configure(): void - { - $this - ->setDefinition( - [ - new InputOption('config', '', InputOption::VALUE_REQUIRED, 'The path to a .php-cs-fixer.php file.'), - ] - ) - ->setDescription('List all files being fixed by the given config.') - ; - } - - protected function execute(InputInterface $input, OutputInterface $output): int - { - $passedConfig = $input->getOption('config'); - $cwd = getcwd(); - - $resolver = new ConfigurationResolver( - $this->defaultConfig, - [ - 'config' => $passedConfig, - ], - $cwd, - $this->toolInfo - ); - - $finder = $resolver->getFinder(); - - /** @var SplFileInfo $file */ - foreach ($finder as $file) { - if ($file->isFile()) { - $relativePath = str_replace($cwd, '.', $file->getRealPath()); - // unify directory separators across operating system - $relativePath = str_replace('/', \DIRECTORY_SEPARATOR, $relativePath); - - $output->writeln(escapeshellarg($relativePath)); - } - } - - return 0; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Command/ListSetsCommand.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Command/ListSetsCommand.php deleted file mode 100644 index ad2a291..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Command/ListSetsCommand.php +++ /dev/null @@ -1,91 +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\Console\Command; - -use PhpCsFixer\ConfigurationException\InvalidConfigurationException; -use PhpCsFixer\Console\Report\ListSetsReport\ReporterFactory; -use PhpCsFixer\Console\Report\ListSetsReport\ReporterInterface; -use PhpCsFixer\Console\Report\ListSetsReport\ReportSummary; -use PhpCsFixer\Console\Report\ListSetsReport\TextReporter; -use PhpCsFixer\RuleSet\RuleSets; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Formatter\OutputFormatter; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -final class ListSetsCommand extends Command -{ - /** - * @var string - */ - protected static $defaultName = 'list-sets'; - - /** - * {@inheritdoc} - */ - protected function configure(): void - { - $this - ->setDefinition( - [ - new InputOption('format', '', InputOption::VALUE_REQUIRED, 'To output results in other formats.', (new TextReporter())->getFormat()), - ] - ) - ->setDescription('List all available RuleSets.') - ; - } - - protected function execute(InputInterface $input, OutputInterface $output) - { - $reporter = $this->resolveReporterWithFactory( - $input->getOption('format'), - new ReporterFactory() - ); - - $reportSummary = new ReportSummary( - array_values(RuleSets::getSetDefinitions()) - ); - - $report = $reporter->generate($reportSummary); - - $output->isDecorated() - ? $output->write(OutputFormatter::escape($report)) - : $output->write($report, false, OutputInterface::OUTPUT_RAW) - ; - - return 0; - } - - private function resolveReporterWithFactory(string $format, ReporterFactory $factory): ReporterInterface - { - try { - $factory->registerBuiltInReporters(); - $reporter = $factory->getReporter($format); - } catch (\UnexpectedValueException $e) { - $formats = $factory->getFormats(); - sort($formats); - - throw new InvalidConfigurationException(sprintf('The format "%s" is not defined, supported are "%s".', $format, implode('", "', $formats))); - } - - return $reporter; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Command/SelfUpdateCommand.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Command/SelfUpdateCommand.php deleted file mode 100644 index 5b242a7..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Command/SelfUpdateCommand.php +++ /dev/null @@ -1,189 +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\Console\Command; - -use PhpCsFixer\Console\SelfUpdate\NewVersionCheckerInterface; -use PhpCsFixer\PharCheckerInterface; -use PhpCsFixer\Preg; -use PhpCsFixer\ToolInfoInterface; -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; - -/** - * @author Igor Wiedler - * @author Stephane PY - * @author Grégoire Pineau - * @author Dariusz Rumiński - * @author SpacePossum - * - * @internal - */ -final class SelfUpdateCommand extends Command -{ - /** - * @var string - */ - protected static $defaultName = 'self-update'; - - /** - * @var NewVersionCheckerInterface - */ - private $versionChecker; - - /** - * @var ToolInfoInterface - */ - private $toolInfo; - - /** - * @var PharCheckerInterface - */ - private $pharChecker; - - public function __construct( - NewVersionCheckerInterface $versionChecker, - ToolInfoInterface $toolInfo, - PharCheckerInterface $pharChecker - ) { - parent::__construct(); - - $this->versionChecker = $versionChecker; - $this->toolInfo = $toolInfo; - $this->pharChecker = $pharChecker; - } - - /** - * {@inheritdoc} - */ - protected function configure(): void - { - $this - ->setAliases(['selfupdate']) - ->setDefinition( - [ - new InputOption('--force', '-f', InputOption::VALUE_NONE, 'Force update to next major version if available.'), - ] - ) - ->setDescription('Update php-cs-fixer.phar to the latest stable version.') - ->setHelp( - <<<'EOT' -The %command.name% command replace your php-cs-fixer.phar by the -latest version released on: -https://github.com/FriendsOfPHP/PHP-CS-Fixer/releases - -$ php php-cs-fixer.phar %command.name% - -EOT - ) - ; - } - - /** - * {@inheritdoc} - */ - protected function execute(InputInterface $input, OutputInterface $output): int - { - if (OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity() && $output instanceof ConsoleOutputInterface) { - $stdErr = $output->getErrorOutput(); - $stdErr->writeln($this->getApplication()->getLongVersion()); - $stdErr->writeln(sprintf('Runtime: PHP %s', PHP_VERSION)); - } - - if (!$this->toolInfo->isInstalledAsPhar()) { - $output->writeln('Self-update is available only for PHAR version.'); - - return 1; - } - - $currentVersion = $this->getApplication()->getVersion(); - Preg::match('/^v?(?\d+)\./', $currentVersion, $matches); - $currentMajor = (int) $matches['major']; - - try { - $latestVersion = $this->versionChecker->getLatestVersion(); - $latestVersionOfCurrentMajor = $this->versionChecker->getLatestVersionOfMajor($currentMajor); - } catch (\Exception $exception) { - $output->writeln(sprintf( - 'Unable to determine newest version: %s', - $exception->getMessage() - )); - - return 1; - } - - if (1 !== $this->versionChecker->compareVersions($latestVersion, $currentVersion)) { - $output->writeln('PHP CS Fixer is already up to date.'); - - return 0; - } - - $remoteTag = $latestVersion; - - if ( - 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/FriendsOfPHP/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...'); - - if (1 !== $this->versionChecker->compareVersions($latestVersionOfCurrentMajor, $currentVersion)) { - $output->writeln('No minor update for PHP CS Fixer.'); - - return 0; - } - - $remoteTag = $latestVersionOfCurrentMajor; - } - - $localFilename = realpath($_SERVER['argv'][0]) ?: $_SERVER['argv'][0]; - - if (!is_writable($localFilename)) { - $output->writeln(sprintf('No permission to update "%s" file.', $localFilename)); - - return 1; - } - - $tempFilename = \dirname($localFilename).'/'.basename($localFilename, '.phar').'-tmp.phar'; - $remoteFilename = $this->toolInfo->getPharDownloadUri($remoteTag); - - if (false === @copy($remoteFilename, $tempFilename)) { - $output->writeln(sprintf('Unable to download new version %s from the server.', $remoteTag)); - - return 1; - } - - chmod($tempFilename, 0777 & ~umask()); - - $pharInvalidityReason = $this->pharChecker->checkFileValidity($tempFilename); - if (null !== $pharInvalidityReason) { - unlink($tempFilename); - $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; - } - - rename($tempFilename, $localFilename); - - $output->writeln(sprintf('PHP CS Fixer updated (%s -> %s)', $currentVersion, $remoteTag)); - - return 0; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/ConfigurationResolver.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/ConfigurationResolver.php deleted file mode 100644 index ea2df2e..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/ConfigurationResolver.php +++ /dev/null @@ -1,879 +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\Console; - -use PhpCsFixer\Cache\CacheManagerInterface; -use PhpCsFixer\Cache\Directory; -use PhpCsFixer\Cache\DirectoryInterface; -use PhpCsFixer\Cache\FileCacheManager; -use PhpCsFixer\Cache\FileHandler; -use PhpCsFixer\Cache\NullCacheManager; -use PhpCsFixer\Cache\Signature; -use PhpCsFixer\ConfigInterface; -use PhpCsFixer\ConfigurationException\InvalidConfigurationException; -use PhpCsFixer\Console\Report\FixReport\ReporterFactory; -use PhpCsFixer\Console\Report\FixReport\ReporterInterface; -use PhpCsFixer\Differ\DifferInterface; -use PhpCsFixer\Differ\NullDiffer; -use PhpCsFixer\Differ\UnifiedDiffer; -use PhpCsFixer\Finder; -use PhpCsFixer\Fixer\DeprecatedFixerInterface; -use PhpCsFixer\Fixer\FixerInterface; -use PhpCsFixer\FixerFactory; -use PhpCsFixer\Linter\Linter; -use PhpCsFixer\Linter\LinterInterface; -use PhpCsFixer\RuleSet\RuleSet; -use PhpCsFixer\RuleSet\RuleSetInterface; -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; - -/** - * The resolver that resolves configuration to use by command line options and config. - * - * @author Fabien Potencier - * @author Katsuhiro Ogawa - * @author Dariusz Rumiński - * - * @internal - */ -final class ConfigurationResolver -{ - public const PATH_MODE_OVERRIDE = 'override'; - public const PATH_MODE_INTERSECTION = 'intersection'; - - /** - * @var null|bool - */ - private $allowRisky; - - /** - * @var null|ConfigInterface - */ - private $config; - - /** - * @var null|string - */ - private $configFile; - - /** - * @var string - */ - private $cwd; - - /** - * @var ConfigInterface - */ - private $defaultConfig; - - /** - * @var null|ReporterInterface - */ - private $reporter; - - /** - * @var null|bool - */ - private $isStdIn; - - /** - * @var null|bool - */ - private $isDryRun; - - /** - * @var null|FixerInterface[] - */ - private $fixers; - - /** - * @var null|bool - */ - private $configFinderIsOverridden; - - /** - * @var ToolInfoInterface - */ - private $toolInfo; - - /** - * @var array - */ - private $options = [ - 'allow-risky' => null, - 'cache-file' => null, - 'config' => null, - 'diff' => null, - 'dry-run' => null, - 'format' => null, - 'path' => [], - 'path-mode' => self::PATH_MODE_OVERRIDE, - 'rules' => null, - 'show-progress' => null, - 'stop-on-violation' => null, - 'using-cache' => null, - 'verbosity' => null, - ]; - - private $cacheFile; - - /** - * @var null|CacheManagerInterface - */ - private $cacheManager; - - /** - * @var null|DifferInterface - */ - private $differ; - - /** - * @var null|Directory - */ - private $directory; - - /** - * @var null|iterable - */ - private $finder; - - private $format; - - /** - * @var null|Linter - */ - private $linter; - - private $path; - - /** - * @var null|string - */ - private $progress; - - /** - * @var null|RuleSet - */ - private $ruleSet; - - /** - * @var null|bool - */ - private $usingCache; - - /** - * @var FixerFactory - */ - private $fixerFactory; - - public function __construct( - ConfigInterface $config, - array $options, - string $cwd, - ToolInfoInterface $toolInfo - ) { - $this->cwd = $cwd; - $this->defaultConfig = $config; - $this->toolInfo = $toolInfo; - - foreach ($options as $name => $value) { - $this->setOption($name, $value); - } - } - - public function getCacheFile(): ?string - { - if (!$this->getUsingCache()) { - return null; - } - - if (null === $this->cacheFile) { - if (null === $this->options['cache-file']) { - $this->cacheFile = $this->getConfig()->getCacheFile(); - } else { - $this->cacheFile = $this->options['cache-file']; - } - } - - return $this->cacheFile; - } - - public function getCacheManager(): CacheManagerInterface - { - if (null === $this->cacheManager) { - $cacheFile = $this->getCacheFile(); - - if (null === $cacheFile) { - $this->cacheManager = new NullCacheManager(); - } else { - $this->cacheManager = new FileCacheManager( - new FileHandler($cacheFile), - new Signature( - PHP_VERSION, - $this->toolInfo->getVersion(), - $this->getConfig()->getIndent(), - $this->getConfig()->getLineEnding(), - $this->getRules() - ), - $this->isDryRun(), - $this->getDirectory() - ); - } - } - - return $this->cacheManager; - } - - public function getConfig(): ConfigInterface - { - if (null === $this->config) { - foreach ($this->computeConfigFiles() as $configFile) { - if (!file_exists($configFile)) { - continue; - } - - $configFileBasename = basename($configFile); - $deprecatedConfigs = [ - '.php_cs' => '.php-cs-fixer.php', - '.php_cs.dist' => '.php-cs-fixer.dist.php', - ]; - - if (isset($deprecatedConfigs[$configFileBasename])) { - throw new InvalidConfigurationException("Configuration file `{$configFileBasename}` is outdated, rename to `{$deprecatedConfigs[$configFileBasename]}`."); - } - - $this->config = self::separatedContextLessInclude($configFile); - $this->configFile = $configFile; - - break; - } - - if (null === $this->config) { - $this->config = $this->defaultConfig; - } - } - - return $this->config; - } - - public function getConfigFile(): ?string - { - if (null === $this->configFile) { - $this->getConfig(); - } - - return $this->configFile; - } - - public function getDiffer(): DifferInterface - { - if (null === $this->differ) { - if ($this->options['diff']) { - $this->differ = new UnifiedDiffer(); - } else { - $this->differ = new NullDiffer(); - } - } - - return $this->differ; - } - - public function getDirectory(): DirectoryInterface - { - if (null === $this->directory) { - $path = $this->getCacheFile(); - if (null === $path) { - $absolutePath = $this->cwd; - } else { - $filesystem = new Filesystem(); - - $absolutePath = $filesystem->isAbsolutePath($path) - ? $path - : $this->cwd.\DIRECTORY_SEPARATOR.$path; - } - - $this->directory = new Directory(\dirname($absolutePath)); - } - - return $this->directory; - } - - /** - * @return FixerInterface[] An array of FixerInterface - */ - public function getFixers(): array - { - if (null === $this->fixers) { - $this->fixers = $this->createFixerFactory() - ->useRuleSet($this->getRuleSet()) - ->setWhitespacesConfig(new WhitespacesFixerConfig($this->config->getIndent(), $this->config->getLineEnding())) - ->getFixers() - ; - - if (false === $this->getRiskyAllowed()) { - $riskyFixers = array_map( - static function (FixerInterface $fixer) { - return $fixer->getName(); - }, - array_filter( - $this->fixers, - static function (FixerInterface $fixer) { - return $fixer->isRisky(); - } - ) - ); - - if (\count($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?', implode('", "', $riskyFixers))); - } - } - } - - return $this->fixers; - } - - public function getLinter(): LinterInterface - { - if (null === $this->linter) { - $this->linter = new Linter($this->getConfig()->getPhpExecutable()); - } - - return $this->linter; - } - - /** - * Returns path. - * - * @return string[] - */ - public function getPath(): array - { - if (null === $this->path) { - $filesystem = new Filesystem(); - $cwd = $this->cwd; - - if (1 === \count($this->options['path']) && '-' === $this->options['path'][0]) { - $this->path = $this->options['path']; - } else { - $this->path = array_map( - static function (string $rawPath) use ($cwd, $filesystem) { - $path = trim($rawPath); - - if ('' === $path) { - throw new InvalidConfigurationException("Invalid path: \"{$rawPath}\"."); - } - - $absolutePath = $filesystem->isAbsolutePath($path) - ? $path - : $cwd.\DIRECTORY_SEPARATOR.$path; - - if (!file_exists($absolutePath)) { - throw new InvalidConfigurationException(sprintf( - 'The path "%s" is not readable.', - $path - )); - } - - return $absolutePath; - }, - $this->options['path'] - ); - } - } - - return $this->path; - } - - /** - * @throws InvalidConfigurationException - */ - public function getProgress(): string - { - if (null === $this->progress) { - if (OutputInterface::VERBOSITY_VERBOSE <= $this->options['verbosity'] && 'txt' === $this->getFormat()) { - $progressType = $this->options['show-progress']; - $progressTypes = ['none', 'dots']; - - if (null === $progressType) { - $progressType = $this->getConfig()->getHideProgress() ? 'none' : 'dots'; - } elseif (!\in_array($progressType, $progressTypes, true)) { - throw new InvalidConfigurationException(sprintf( - 'The progress type "%s" is not defined, supported are "%s".', - $progressType, - implode('", "', $progressTypes) - )); - } - - $this->progress = $progressType; - } else { - $this->progress = 'none'; - } - } - - return $this->progress; - } - - public function getReporter(): ReporterInterface - { - if (null === $this->reporter) { - $reporterFactory = new ReporterFactory(); - $reporterFactory->registerBuiltInReporters(); - - $format = $this->getFormat(); - - try { - $this->reporter = $reporterFactory->getReporter($format); - } catch (\UnexpectedValueException $e) { - $formats = $reporterFactory->getFormats(); - sort($formats); - - throw new InvalidConfigurationException(sprintf('The format "%s" is not defined, supported are "%s".', $format, implode('", "', $formats))); - } - } - - return $this->reporter; - } - - public function getRiskyAllowed(): bool - { - if (null === $this->allowRisky) { - if (null === $this->options['allow-risky']) { - $this->allowRisky = $this->getConfig()->getRiskyAllowed(); - } else { - $this->allowRisky = $this->resolveOptionBooleanValue('allow-risky'); - } - } - - return $this->allowRisky; - } - - /** - * Returns rules. - */ - public function getRules(): array - { - return $this->getRuleSet()->getRules(); - } - - public function getUsingCache(): bool - { - if (null === $this->usingCache) { - if (null === $this->options['using-cache']) { - $this->usingCache = $this->getConfig()->getUsingCache(); - } else { - $this->usingCache = $this->resolveOptionBooleanValue('using-cache'); - } - } - - $this->usingCache = $this->usingCache && ($this->toolInfo->isInstalledAsPhar() || $this->toolInfo->isInstalledByComposer()); - - return $this->usingCache; - } - - public function getFinder(): iterable - { - if (null === $this->finder) { - $this->finder = $this->resolveFinder(); - } - - return $this->finder; - } - - /** - * Returns dry-run flag. - */ - public function isDryRun(): bool - { - if (null === $this->isDryRun) { - if ($this->isStdIn()) { - // Can't write to STDIN - $this->isDryRun = true; - } else { - $this->isDryRun = $this->options['dry-run']; - } - } - - return $this->isDryRun; - } - - public function shouldStopOnViolation(): bool - { - return $this->options['stop-on-violation']; - } - - public function configFinderIsOverridden(): bool - { - if (null === $this->configFinderIsOverridden) { - $this->resolveFinder(); - } - - return $this->configFinderIsOverridden; - } - - /** - * Compute file candidates for config file. - * - * @return string[] - */ - private function computeConfigFiles(): array - { - $configFile = $this->options['config']; - - if (null !== $configFile) { - if (false === file_exists($configFile) || false === is_readable($configFile)) { - throw new InvalidConfigurationException(sprintf('Cannot read config file "%s".', $configFile)); - } - - return [$configFile]; - } - - $path = $this->getPath(); - - if ($this->isStdIn() || 0 === \count($path)) { - $configDir = $this->cwd; - } elseif (1 < \count($path)) { - throw new InvalidConfigurationException('For multiple paths config parameter is required.'); - } elseif (!is_file($path[0])) { - $configDir = $path[0]; - } else { - $dirName = pathinfo($path[0], PATHINFO_DIRNAME); - $configDir = $dirName ?: $path[0]; - } - - $candidates = [ - $configDir.\DIRECTORY_SEPARATOR.'.php-cs-fixer.php', - $configDir.\DIRECTORY_SEPARATOR.'.php-cs-fixer.dist.php', - $configDir.\DIRECTORY_SEPARATOR.'.php_cs', // old v2 config, present here only to throw nice error message later - $configDir.\DIRECTORY_SEPARATOR.'.php_cs.dist', // old v2 config, present here only to throw nice error message later - ]; - - if ($configDir !== $this->cwd) { - $candidates[] = $this->cwd.\DIRECTORY_SEPARATOR.'.php-cs-fixer.php'; - $candidates[] = $this->cwd.\DIRECTORY_SEPARATOR.'.php-cs-fixer.dist.php'; - $candidates[] = $this->cwd.\DIRECTORY_SEPARATOR.'.php_cs'; // old v2 config, present here only to throw nice error message later - $candidates[] = $this->cwd.\DIRECTORY_SEPARATOR.'.php_cs.dist'; // old v2 config, present here only to throw nice error message later - } - - return $candidates; - } - - private function createFixerFactory(): FixerFactory - { - if (null === $this->fixerFactory) { - $fixerFactory = new FixerFactory(); - $fixerFactory->registerBuiltInFixers(); - $fixerFactory->registerCustomFixers($this->getConfig()->getCustomFixers()); - - $this->fixerFactory = $fixerFactory; - } - - return $this->fixerFactory; - } - - private function getFormat(): string - { - if (null === $this->format) { - $this->format = null === $this->options['format'] - ? $this->getConfig()->getFormat() - : $this->options['format']; - } - - return $this->format; - } - - private function getRuleSet(): RuleSetInterface - { - if (null === $this->ruleSet) { - $rules = $this->parseRules(); - $this->validateRules($rules); - - $this->ruleSet = new RuleSet($rules); - } - - return $this->ruleSet; - } - - private function isStdIn(): bool - { - if (null === $this->isStdIn) { - $this->isStdIn = 1 === \count($this->options['path']) && '-' === $this->options['path'][0]; - } - - return $this->isStdIn; - } - - private function iterableToTraversable(iterable $iterable): \Traversable - { - return \is_array($iterable) ? new \ArrayIterator($iterable) : $iterable; - } - - /** - * Compute rules. - */ - private function parseRules(): array - { - if (null === $this->options['rules']) { - return $this->getConfig()->getRules(); - } - - $rules = trim($this->options['rules']); - if ('' === $rules) { - throw new InvalidConfigurationException('Empty rules value is not allowed.'); - } - - if ('{' === $rules[0]) { - $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())); - } - - return $rules; - } - - $rules = []; - - foreach (explode(',', $this->options['rules']) as $rule) { - $rule = trim($rule); - if ('' === $rule) { - throw new InvalidConfigurationException('Empty rule name is not allowed.'); - } - - if ('-' === $rule[0]) { - $rules[substr($rule, 1)] = false; - } else { - $rules[$rule] = true; - } - } - - return $rules; - } - - /** - * @throws InvalidConfigurationException - */ - private function validateRules(array $rules): void - { - /** - * Create a ruleset that contains all configured rules, even when they originally have been disabled. - * - * @see RuleSet::resolveSet() - */ - $ruleSet = []; - foreach ($rules as $key => $value) { - if (\is_int($key)) { - throw new InvalidConfigurationException(sprintf('Missing value for "%s" rule/set.', $value)); - } - - $ruleSet[$key] = true; - } - $ruleSet = new RuleSet($ruleSet); - - /** @var string[] $configuredFixers */ - $configuredFixers = array_keys($ruleSet->getRules()); - - $fixers = $this->createFixerFactory()->getFixers(); - - /** @var string[] $availableFixers */ - $availableFixers = array_map(static function (FixerInterface $fixer) { - return $fixer->getName(); - }, $fixers); - - $unknownFixers = array_diff( - $configuredFixers, - $availableFixers - ); - - if (\count($unknownFixers)) { - $matcher = new WordMatcher($availableFixers); - - $message = 'The rules contain unknown fixers: '; - foreach ($unknownFixers as $unknownFixer) { - $alternative = $matcher->match($unknownFixer); - $message .= sprintf( - '"%s"%s, ', - $unknownFixer, - null === $alternative ? '' : ' (did you mean "'.$alternative.'"?)' - ); - } - - throw new InvalidConfigurationException(substr($message, 0, -2).'.'); - } - - foreach ($fixers as $fixer) { - $fixerName = $fixer->getName(); - 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))); - - Utils::triggerDeprecation(new \RuntimeException("Rule \"{$fixerName}\" is deprecated{$messageEnd}")); - } - } - } - - /** - * Apply path on config instance. - */ - private function resolveFinder(): iterable - { - $this->configFinderIsOverridden = false; - - if ($this->isStdIn()) { - return new \ArrayIterator([new StdinFileInfo()]); - } - - $modes = [self::PATH_MODE_OVERRIDE, self::PATH_MODE_INTERSECTION]; - - if (!\in_array( - $this->options['path-mode'], - $modes, - true - )) { - throw new InvalidConfigurationException(sprintf( - 'The path-mode "%s" is not defined, supported are "%s".', - $this->options['path-mode'], - implode('", "', $modes) - )); - } - - $isIntersectionPathMode = self::PATH_MODE_INTERSECTION === $this->options['path-mode']; - - $paths = array_filter(array_map( - static function (string $path) { - return realpath($path); - }, - $this->getPath() - )); - - if (!\count($paths)) { - if ($isIntersectionPathMode) { - return new \ArrayIterator([]); - } - - return $this->iterableToTraversable($this->getConfig()->getFinder()); - } - - $pathsByType = [ - 'file' => [], - 'dir' => [], - ]; - - foreach ($paths as $path) { - if (is_file($path)) { - $pathsByType['file'][] = $path; - } else { - $pathsByType['dir'][] = $path.\DIRECTORY_SEPARATOR; - } - } - - $nestedFinder = null; - $currentFinder = $this->iterableToTraversable($this->getConfig()->getFinder()); - - try { - $nestedFinder = $currentFinder instanceof \IteratorAggregate ? $currentFinder->getIterator() : $currentFinder; - } catch (\Exception $e) { - } - - if ($isIntersectionPathMode) { - if (null === $nestedFinder) { - throw new InvalidConfigurationException( - 'Cannot create intersection with not-fully defined Finder in configuration file.' - ); - } - - return new \CallbackFilterIterator( - new \IteratorIterator($nestedFinder), - static function (\SplFileInfo $current) use ($pathsByType) { - $currentRealPath = $current->getRealPath(); - - if (\in_array($currentRealPath, $pathsByType['file'], true)) { - return true; - } - - foreach ($pathsByType['dir'] as $path) { - if (0 === strpos($currentRealPath, $path)) { - return true; - } - } - - return false; - } - ); - } - - if (null !== $this->getConfigFile() && null !== $nestedFinder) { - $this->configFinderIsOverridden = true; - } - - if ($currentFinder instanceof SymfonyFinder && null === $nestedFinder) { - // finder from configuration Symfony finder and it is not fully defined, we may fulfill it - return $currentFinder->in($pathsByType['dir'])->append($pathsByType['file']); - } - - return Finder::create()->in($pathsByType['dir'])->append($pathsByType['file']); - } - - /** - * Set option that will be resolved. - * - * @param mixed $value - */ - private function setOption(string $name, $value): void - { - if (!\array_key_exists($name, $this->options)) { - throw new InvalidConfigurationException(sprintf('Unknown option name: "%s".', $name)); - } - - $this->options[$name] = $value; - } - - 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; - } - - if ('no' === $value) { - return false; - } - - throw new InvalidConfigurationException(sprintf('Expected "yes" or "no" for option "%s", got "%s".', $optionName, $value)); - } - - private static function separatedContextLessInclude(string $path): ConfigInterface - { - $config = include $path; - - // 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))); - } - - return $config; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Output/ErrorOutput.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Output/ErrorOutput.php deleted file mode 100644 index df7a5e7..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Output/ErrorOutput.php +++ /dev/null @@ -1,150 +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\Console\Output; - -use PhpCsFixer\Differ\DiffConsoleFormatter; -use PhpCsFixer\Error\Error; -use PhpCsFixer\Linter\LintingException; -use Symfony\Component\Console\Formatter\OutputFormatter; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * @author SpacePossum - * - * @internal - */ -final class ErrorOutput -{ - /** - * @var OutputInterface - */ - private $output; - - /** - * @var bool - */ - private $isDecorated; - - public function __construct(OutputInterface $output) - { - $this->output = $output; - $this->isDecorated = $output->isDecorated(); - } - - /** - * @param Error[] $errors - */ - public function listErrors(string $process, array $errors): void - { - $this->output->writeln(['', sprintf( - 'Files that were not fixed due to errors reported during %s:', - $process - )]); - - $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())); - $e = $error->getSource(); - if (!$showDetails || null === $e) { - continue; - } - - $class = sprintf('[%s]', \get_class($e)); - $message = $e->getMessage(); - $code = $e->getCode(); - if (0 !== $code) { - $message .= " ({$code})"; - } - - $length = max(\strlen($class), \strlen($message)); - $lines = [ - '', - $class, - $message, - '', - ]; - - $this->output->writeln(''); - - foreach ($lines as $line) { - if (\strlen($line) < $length) { - $line .= str_repeat(' ', $length - \strlen($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'], $trace['function']) && \Symfony\Component\Console\Command\Command::class === $trace['class'] && 'run' === $trace['function']) { - $this->output->writeln(' [ ... ]'); - - break; - } - - $this->outputTrace($trace); - } - } - - if (Error::TYPE_LINT === $error->getType() && 0 < \count($error->getAppliedFixers())) { - $this->output->writeln(''); - $this->output->writeln(sprintf(' Applied fixers: %s', implode(', ', $error->getAppliedFixers()))); - - $diff = $error->getDiff(); - if (!empty($diff)) { - $diffFormatter = new DiffConsoleFormatter( - $this->isDecorated, - sprintf( - ' ---------- begin diff ----------%s%%s%s ----------- end diff -----------', - PHP_EOL, - PHP_EOL - ) - ); - - $this->output->writeln($diffFormatter->format($diff)); - } - } - } - } - - private function outputTrace(array $trace): void - { - if (isset($trace['class'], $trace['type'], $trace['function'])) { - $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']))); - } - - if (isset($trace['file'])) { - $this->output->writeln(sprintf(' in %s at line %d', $this->prepareOutput($trace['file']), $trace['line'])); - } - } - - private function prepareOutput(string $string): string - { - return $this->isDecorated - ? OutputFormatter::escape($string) - : $string - ; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Output/NullOutput.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Output/NullOutput.php deleted file mode 100644 index 38b6999..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Output/NullOutput.php +++ /dev/null @@ -1,25 +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\Console\Output; - -/** - * @internal - */ -final class NullOutput implements ProcessOutputInterface -{ - public function printLegend(): void - { - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Output/ProcessOutput.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Output/ProcessOutput.php deleted file mode 100644 index c737c87..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Output/ProcessOutput.php +++ /dev/null @@ -1,146 +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\Console\Output; - -use PhpCsFixer\FixerFileProcessedEvent; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\EventDispatcher\EventDispatcherInterface; - -/** - * Output writer to show the process of a FixCommand. - * - * @internal - */ -final class ProcessOutput implements ProcessOutputInterface -{ - /** - * File statuses map. - * - * @var array - */ - private static $eventStatusMap = [ - FixerFileProcessedEvent::STATUS_UNKNOWN => ['symbol' => '?', 'format' => '%s', 'description' => 'unknown'], - FixerFileProcessedEvent::STATUS_INVALID => ['symbol' => 'I', 'format' => '%s', 'description' => 'invalid file syntax (file ignored)'], - FixerFileProcessedEvent::STATUS_SKIPPED => ['symbol' => 'S', 'format' => '%s', 'description' => 'skipped (cached or empty file)'], - FixerFileProcessedEvent::STATUS_NO_CHANGES => ['symbol' => '.', 'format' => '%s', 'description' => 'no changes'], - FixerFileProcessedEvent::STATUS_FIXED => ['symbol' => 'F', 'format' => '%s', 'description' => 'fixed'], - FixerFileProcessedEvent::STATUS_EXCEPTION => ['symbol' => 'E', 'format' => '%s', 'description' => 'error'], - FixerFileProcessedEvent::STATUS_LINT => ['symbol' => 'E', 'format' => '%s', 'description' => 'error'], - ]; - - /** - * @var EventDispatcherInterface - */ - private $eventDispatcher; - - /** - * @var OutputInterface - */ - private $output; - - /** - * @var int - */ - private $files; - - /** - * @var int - */ - private $processedFiles = 0; - - /** - * @var int - */ - private $symbolsPerLine; - - public function __construct(OutputInterface $output, EventDispatcherInterface $dispatcher, int $width, int $nbFiles) - { - $this->output = $output; - $this->eventDispatcher = $dispatcher; - $this->eventDispatcher->addListener(FixerFileProcessedEvent::NAME, [$this, 'onFixerFileProcessed']); - $this->files = $nbFiles; - - // max number of characters per line - // - total length x 2 (e.g. " 1 / 123" => 6 digits and padding spaces) - // - 11 (extra spaces, parentheses and percentage characters, e.g. " x / x (100%)") - $this->symbolsPerLine = max(1, $width - \strlen((string) $this->files) * 2 - 11); - } - - public function __destruct() - { - $this->eventDispatcher->removeListener(FixerFileProcessedEvent::NAME, [$this, 'onFixerFileProcessed']); - } - - /** - * This class is not intended to be serialized, - * and cannot be deserialized (see __wakeup method). - */ - public function __sleep(): array - { - throw new \BadMethodCallException('Cannot serialize '.__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 '.__CLASS__); - } - - public function onFixerFileProcessed(FixerFileProcessedEvent $event): void - { - $status = self::$eventStatusMap[$event->getStatus()]; - $this->output->write($this->output->isDecorated() ? sprintf($status['format'], $status['symbol']) : $status['symbol']); - - ++$this->processedFiles; - - $symbolsOnCurrentLine = $this->processedFiles % $this->symbolsPerLine; - $isLast = $this->processedFiles === $this->files; - - if (0 === $symbolsOnCurrentLine || $isLast) { - $this->output->write(sprintf( - '%s %'.\strlen((string) $this->files).'d / %d (%3d%%)', - $isLast && 0 !== $symbolsOnCurrentLine ? str_repeat(' ', $this->symbolsPerLine - $symbolsOnCurrentLine) : '', - $this->processedFiles, - $this->files, - round($this->processedFiles / $this->files * 100) - )); - - if (!$isLast) { - $this->output->writeln(''); - } - } - } - - public function printLegend(): void - { - $symbols = []; - - foreach (self::$eventStatusMap as $status) { - $symbol = $status['symbol']; - if ('' === $symbol || isset($symbols[$symbol])) { - continue; - } - - $symbols[$symbol] = sprintf('%s-%s', $this->output->isDecorated() ? sprintf($status['format'], $symbol) : $symbol, $status['description']); - } - - $this->output->write(sprintf("\nLegend: %s\n", implode(', ', $symbols))); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Output/ProcessOutputInterface.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Output/ProcessOutputInterface.php deleted file mode 100644 index 80726c3..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Output/ProcessOutputInterface.php +++ /dev/null @@ -1,23 +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\Console\Output; - -/** - * @internal - */ -interface ProcessOutputInterface -{ - public function printLegend(): void; -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/CheckstyleReporter.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/CheckstyleReporter.php deleted file mode 100644 index c283b23..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/CheckstyleReporter.php +++ /dev/null @@ -1,71 +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\Console\Report\FixReport; - -use Symfony\Component\Console\Formatter\OutputFormatter; - -/** - * @author Kévin Gomez - * - * @internal - */ -final class CheckstyleReporter implements ReporterInterface -{ - /** - * {@inheritdoc} - */ - public function getFormat(): string - { - return 'checkstyle'; - } - - /** - * {@inheritdoc} - */ - public function generate(ReportSummary $reportSummary): string - { - if (!\extension_loaded('dom')) { - throw new \RuntimeException('Cannot generate report! `ext-dom` is not available!'); - } - - $dom = new \DOMDocument('1.0', 'UTF-8'); - $checkstyles = $dom->appendChild($dom->createElement('checkstyle')); - - foreach ($reportSummary->getChanged() as $filePath => $fixResult) { - /** @var \DOMElement $file */ - $file = $checkstyles->appendChild($dom->createElement('file')); - $file->setAttribute('name', $filePath); - - foreach ($fixResult['appliedFixers'] as $appliedFixer) { - $error = $this->createError($dom, $appliedFixer); - $file->appendChild($error); - } - } - - $dom->formatOutput = true; - - return $reportSummary->isDecoratedOutput() ? OutputFormatter::escape($dom->saveXML()) : $dom->saveXML(); - } - - private function createError(\DOMDocument $dom, string $appliedFixer): \DOMElement - { - $error = $dom->createElement('error'); - $error->setAttribute('severity', 'warning'); - $error->setAttribute('source', 'PHP-CS-Fixer.'.$appliedFixer); - $error->setAttribute('message', 'Found violation(s) of type: '.$appliedFixer); - - return $error; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/GitlabReporter.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/GitlabReporter.php deleted file mode 100644 index 7f8a09d..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/GitlabReporter.php +++ /dev/null @@ -1,60 +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\Console\Report\FixReport; - -use Symfony\Component\Console\Formatter\OutputFormatter; - -/** - * Generates a report according to gitlabs subset of codeclimate json files. - * - * @see https://github.com/codeclimate/spec/blob/master/SPEC.md#data-types - * - * @author Hans-Christian Otto - * - * @internal - */ -final class GitlabReporter implements ReporterInterface -{ - public function getFormat(): string - { - return 'gitlab'; - } - - /** - * Process changed files array. Returns generated report. - */ - public function generate(ReportSummary $reportSummary): string - { - $report = []; - foreach ($reportSummary->getChanged() as $fileName => $change) { - foreach ($change['appliedFixers'] as $fixerName) { - $report[] = [ - 'description' => $fixerName, - 'fingerprint' => md5($fileName.$fixerName), - 'location' => [ - 'path' => $fileName, - 'lines' => [ - 'begin' => 0, // line numbers are required in the format, but not available to reports - ], - ], - ]; - } - } - - $jsonString = json_encode($report); - - return $reportSummary->isDecoratedOutput() ? OutputFormatter::escape($jsonString) : $jsonString; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/JsonReporter.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/JsonReporter.php deleted file mode 100644 index e99146d..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/JsonReporter.php +++ /dev/null @@ -1,73 +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\Console\Report\FixReport; - -use Symfony\Component\Console\Formatter\OutputFormatter; - -/** - * @author Boris Gorbylev - * - * @internal - */ -final class JsonReporter implements ReporterInterface -{ - /** - * {@inheritdoc} - */ - public function getFormat(): string - { - return 'json'; - } - - /** - * {@inheritdoc} - */ - public function generate(ReportSummary $reportSummary): string - { - $jFiles = []; - - foreach ($reportSummary->getChanged() as $file => $fixResult) { - $jfile = ['name' => $file]; - - if ($reportSummary->shouldAddAppliedFixers()) { - $jfile['appliedFixers'] = $fixResult['appliedFixers']; - } - - if (!empty($fixResult['diff'])) { - $jfile['diff'] = $fixResult['diff']; - } - - $jFiles[] = $jfile; - } - - $json = [ - 'files' => $jFiles, - ]; - - if (null !== $reportSummary->getTime()) { - $json['time'] = [ - 'total' => round($reportSummary->getTime() / 1000, 3), - ]; - } - - if (null !== $reportSummary->getMemory()) { - $json['memory'] = round($reportSummary->getMemory() / 1024 / 1024, 3); - } - - $json = json_encode($json); - - return $reportSummary->isDecoratedOutput() ? OutputFormatter::escape($json) : $json; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/JunitReporter.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/JunitReporter.php deleted file mode 100644 index 759754d..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/JunitReporter.php +++ /dev/null @@ -1,137 +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\Console\Report\FixReport; - -use PhpCsFixer\Preg; -use Symfony\Component\Console\Formatter\OutputFormatter; - -/** - * @author Boris Gorbylev - * - * @internal - */ -final class JunitReporter implements ReporterInterface -{ - /** - * {@inheritdoc} - */ - public function getFormat(): string - { - return 'junit'; - } - - /** - * {@inheritdoc} - */ - public function generate(ReportSummary $reportSummary): string - { - if (!\extension_loaded('dom')) { - throw new \RuntimeException('Cannot generate report! `ext-dom` is not available!'); - } - - $dom = new \DOMDocument('1.0', 'UTF-8'); - $testsuites = $dom->appendChild($dom->createElement('testsuites')); - /** @var \DomElement $testsuite */ - $testsuite = $testsuites->appendChild($dom->createElement('testsuite')); - $testsuite->setAttribute('name', 'PHP CS Fixer'); - - if (\count($reportSummary->getChanged())) { - $this->createFailedTestCases($dom, $testsuite, $reportSummary); - } else { - $this->createSuccessTestCase($dom, $testsuite); - } - - if ($reportSummary->getTime()) { - $testsuite->setAttribute( - 'time', - sprintf( - '%.3f', - $reportSummary->getTime() / 1000 - ) - ); - } - - $dom->formatOutput = true; - - return $reportSummary->isDecoratedOutput() ? OutputFormatter::escape($dom->saveXML()) : $dom->saveXML(); - } - - private function createSuccessTestCase(\DOMDocument $dom, \DOMElement $testsuite): void - { - $testcase = $dom->createElement('testcase'); - $testcase->setAttribute('name', 'All OK'); - $testcase->setAttribute('assertions', '1'); - - $testsuite->appendChild($testcase); - $testsuite->setAttribute('tests', '1'); - $testsuite->setAttribute('assertions', '1'); - $testsuite->setAttribute('failures', '0'); - $testsuite->setAttribute('errors', '0'); - } - - private function createFailedTestCases(\DOMDocument $dom, \DOMElement $testsuite, ReportSummary $reportSummary): void - { - $assertionsCount = 0; - foreach ($reportSummary->getChanged() as $file => $fixResult) { - $testcase = $this->createFailedTestCase( - $dom, - $file, - $fixResult, - $reportSummary->shouldAddAppliedFixers() - ); - $testsuite->appendChild($testcase); - $assertionsCount += (int) $testcase->getAttribute('assertions'); - } - - $testsuite->setAttribute('tests', (string) \count($reportSummary->getChanged())); - $testsuite->setAttribute('assertions', (string) $assertionsCount); - $testsuite->setAttribute('failures', (string) $assertionsCount); - $testsuite->setAttribute('errors', '0'); - } - - private function createFailedTestCase(\DOMDocument $dom, string $file, array $fixResult, bool $shouldAddAppliedFixers): \DOMElement - { - $appliedFixersCount = \count($fixResult['appliedFixers']); - - $testName = str_replace('.', '_DOT_', Preg::replace('@\.'.pathinfo($file, PATHINFO_EXTENSION).'$@', '', $file)); - - $testcase = $dom->createElement('testcase'); - $testcase->setAttribute('name', $testName); - $testcase->setAttribute('file', $file); - $testcase->setAttribute('assertions', (string) $appliedFixersCount); - - $failure = $dom->createElement('failure'); - $failure->setAttribute('type', 'code_style'); - $testcase->appendChild($failure); - - if ($shouldAddAppliedFixers) { - $failureContent = "applied fixers:\n---------------\n"; - - foreach ($fixResult['appliedFixers'] as $appliedFixer) { - $failureContent .= "* {$appliedFixer}\n"; - } - } else { - $failureContent = "Wrong code style\n"; - } - - if (!empty($fixResult['diff'])) { - $failureContent .= "\nDiff:\n---------------\n\n".$fixResult['diff']; - } - - $failure->appendChild($dom->createCDATASection(trim($failureContent))); - - return $testcase; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/ReportSummary.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/ReportSummary.php deleted file mode 100644 index d9b1aef..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/ReportSummary.php +++ /dev/null @@ -1,103 +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\Console\Report\FixReport; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -final class ReportSummary -{ - /** - * @var bool - */ - private $addAppliedFixers; - - /** - * @var array - */ - private $changed; - - /** - * @var bool - */ - private $isDecoratedOutput; - - /** - * @var bool - */ - private $isDryRun; - - /** - * @var int - */ - private $memory; - - /** - * @var int - */ - private $time; - - /** - * @param int $time duration in milliseconds - * @param int $memory memory usage in bytes - */ - public function __construct( - array $changed, - int $time, - int $memory, - bool $addAppliedFixers, - bool $isDryRun, - bool $isDecoratedOutput - ) { - $this->changed = $changed; - $this->time = $time; - $this->memory = $memory; - $this->addAppliedFixers = $addAppliedFixers; - $this->isDryRun = $isDryRun; - $this->isDecoratedOutput = $isDecoratedOutput; - } - - public function isDecoratedOutput(): bool - { - return $this->isDecoratedOutput; - } - - public function isDryRun(): bool - { - return $this->isDryRun; - } - - public function getChanged(): array - { - return $this->changed; - } - - public function getMemory(): int - { - return $this->memory; - } - - public function getTime(): int - { - return $this->time; - } - - public function shouldAddAppliedFixers(): bool - { - return $this->addAppliedFixers; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/ReporterFactory.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/ReporterFactory.php deleted file mode 100644 index b7ab998..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/ReporterFactory.php +++ /dev/null @@ -1,92 +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\Console\Report\FixReport; - -use Symfony\Component\Finder\Finder as SymfonyFinder; -use Symfony\Component\Finder\SplFileInfo; - -/** - * @author Boris Gorbylev - * - * @internal - */ -final class ReporterFactory -{ - /** @var ReporterInterface[] */ - private $reporters = []; - - public function registerBuiltInReporters(): self - { - /** @var null|string[] $builtInReporters */ - static $builtInReporters; - - if (null === $builtInReporters) { - $builtInReporters = []; - - /** @var SplFileInfo $file */ - foreach (SymfonyFinder::create()->files()->name('*Reporter.php')->in(__DIR__) as $file) { - $relativeNamespace = $file->getRelativePath(); - $builtInReporters[] = sprintf( - '%s\\%s%s', - __NAMESPACE__, - $relativeNamespace ? $relativeNamespace.'\\' : '', - $file->getBasename('.php') - ); - } - } - - foreach ($builtInReporters as $reporterClass) { - $this->registerReporter(new $reporterClass()); - } - - return $this; - } - - /** - * @return $this - */ - 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)); - } - - $this->reporters[$format] = $reporter; - - return $this; - } - - /** - * @return string[] - */ - public function getFormats(): array - { - $formats = array_keys($this->reporters); - sort($formats); - - return $formats; - } - - public function getReporter(string $format): ReporterInterface - { - if (!isset($this->reporters[$format])) { - throw new \UnexpectedValueException(sprintf('Reporter for format "%s" is not registered.', $format)); - } - - return $this->reporters[$format]; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/ReporterInterface.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/ReporterInterface.php deleted file mode 100644 index 44fab56..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/ReporterInterface.php +++ /dev/null @@ -1,30 +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\Console\Report\FixReport; - -/** - * @author Boris Gorbylev - * - * @internal - */ -interface ReporterInterface -{ - public function getFormat(): string; - - /** - * Process changed files array. Returns generated report. - */ - public function generate(ReportSummary $reportSummary): string; -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/TextReporter.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/TextReporter.php deleted file mode 100644 index 19525bc..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/TextReporter.php +++ /dev/null @@ -1,93 +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\Console\Report\FixReport; - -use PhpCsFixer\Differ\DiffConsoleFormatter; - -/** - * @author Boris Gorbylev - * - * @internal - */ -final class TextReporter implements ReporterInterface -{ - /** - * {@inheritdoc} - */ - public function getFormat(): string - { - return 'txt'; - } - - /** - * {@inheritdoc} - */ - public function generate(ReportSummary $reportSummary): string - { - $output = ''; - - $i = 0; - foreach ($reportSummary->getChanged() as $file => $fixResult) { - ++$i; - $output .= sprintf('%4d) %s', $i, $file); - - if ($reportSummary->shouldAddAppliedFixers()) { - $output .= $this->getAppliedFixers($reportSummary->isDecoratedOutput(), $fixResult); - } - - $output .= $this->getDiff($reportSummary->isDecoratedOutput(), $fixResult); - $output .= PHP_EOL; - } - - return $output.$this->getFooter($reportSummary->getTime(), $reportSummary->getMemory(), $reportSummary->isDryRun()); - } - - private function getAppliedFixers(bool $isDecoratedOutput, array $fixResult): string - { - return sprintf( - $isDecoratedOutput ? ' (%s)' : ' (%s)', - implode(', ', $fixResult['appliedFixers']) - ); - } - - private function getDiff(bool $isDecoratedOutput, array $fixResult): string - { - if (empty($fixResult['diff'])) { - return ''; - } - - $diffFormatter = new DiffConsoleFormatter($isDecoratedOutput, sprintf( - ' ---------- begin diff ----------%s%%s%s ----------- end diff -----------', - PHP_EOL, - PHP_EOL - )); - - return PHP_EOL.$diffFormatter->format($fixResult['diff']).PHP_EOL; - } - - private function getFooter(int $time, int $memory, bool $isDryRun): string - { - if (0 === $time || 0 === $memory) { - return ''; - } - - return PHP_EOL.sprintf( - '%s all files in %.3f seconds, %.3f MB memory used'.PHP_EOL, - $isDryRun ? 'Checked' : 'Fixed', - $time / 1000, - $memory / 1024 / 1024 - ); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/XmlReporter.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/XmlReporter.php deleted file mode 100644 index 16edd37..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/XmlReporter.php +++ /dev/null @@ -1,124 +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\Console\Report\FixReport; - -use Symfony\Component\Console\Formatter\OutputFormatter; - -/** - * @author Boris Gorbylev - * - * @internal - */ -final class XmlReporter implements ReporterInterface -{ - /** - * {@inheritdoc} - */ - public function getFormat(): string - { - return 'xml'; - } - - /** - * {@inheritdoc} - */ - public function generate(ReportSummary $reportSummary): string - { - if (!\extension_loaded('dom')) { - throw new \RuntimeException('Cannot generate report! `ext-dom` is not available!'); - } - - $dom = new \DOMDocument('1.0', 'UTF-8'); - // new nodes should be added to this or existing children - $root = $dom->createElement('report'); - $dom->appendChild($root); - - $filesXML = $dom->createElement('files'); - $root->appendChild($filesXML); - - $i = 1; - foreach ($reportSummary->getChanged() as $file => $fixResult) { - $fileXML = $dom->createElement('file'); - $fileXML->setAttribute('id', (string) $i++); - $fileXML->setAttribute('name', $file); - $filesXML->appendChild($fileXML); - - if ($reportSummary->shouldAddAppliedFixers()) { - $fileXML->appendChild($this->createAppliedFixersElement($dom, $fixResult)); - } - - if (!empty($fixResult['diff'])) { - $fileXML->appendChild($this->createDiffElement($dom, $fixResult)); - } - } - - if (0 !== $reportSummary->getTime()) { - $root->appendChild($this->createTimeElement($reportSummary->getTime(), $dom)); - } - - if (0 !== $reportSummary->getMemory()) { - $root->appendChild($this->createMemoryElement($reportSummary->getMemory(), $dom)); - } - - $dom->formatOutput = true; - - return $reportSummary->isDecoratedOutput() ? OutputFormatter::escape($dom->saveXML()) : $dom->saveXML(); - } - - private function createAppliedFixersElement(\DOMDocument $dom, array $fixResult): \DOMElement - { - $appliedFixersXML = $dom->createElement('applied_fixers'); - - foreach ($fixResult['appliedFixers'] as $appliedFixer) { - $appliedFixerXML = $dom->createElement('applied_fixer'); - $appliedFixerXML->setAttribute('name', $appliedFixer); - $appliedFixersXML->appendChild($appliedFixerXML); - } - - return $appliedFixersXML; - } - - private function createDiffElement(\DOMDocument $dom, array $fixResult): \DOMElement - { - $diffXML = $dom->createElement('diff'); - $diffXML->appendChild($dom->createCDATASection($fixResult['diff'])); - - return $diffXML; - } - - private function createTimeElement(float $time, \DOMDocument $dom): \DOMElement - { - $time = round($time / 1000, 3); - - $timeXML = $dom->createElement('time'); - $timeXML->setAttribute('unit', 's'); - $timeTotalXML = $dom->createElement('total'); - $timeTotalXML->setAttribute('value', (string) $time); - $timeXML->appendChild($timeTotalXML); - - return $timeXML; - } - - private function createMemoryElement(float $memory, \DOMDocument $dom): \DOMElement - { - $memory = round($memory / 1024 / 1024, 3); - - $memoryXML = $dom->createElement('memory'); - $memoryXML->setAttribute('value', (string) $memory); - $memoryXML->setAttribute('unit', 'MB'); - - return $memoryXML; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/ListSetsReport/JsonReporter.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/ListSetsReport/JsonReporter.php deleted file mode 100644 index be95b0c..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/ListSetsReport/JsonReporter.php +++ /dev/null @@ -1,58 +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\Console\Report\ListSetsReport; - -use PhpCsFixer\RuleSet\RuleSetDescriptionInterface; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -final class JsonReporter implements ReporterInterface -{ - /** - * {@inheritdoc} - */ - public function getFormat(): string - { - return 'json'; - } - - /** - * {@inheritdoc} - */ - public function generate(ReportSummary $reportSummary): string - { - $sets = $reportSummary->getSets(); - - usort($sets, function (RuleSetDescriptionInterface $a, RuleSetDescriptionInterface $b) { - return strcmp($a->getName(), $b->getName()); - }); - - $json = ['sets' => []]; - - foreach ($sets as $set) { - $setName = $set->getName(); - $json['sets'][$setName] = [ - 'description' => $set->getDescription(), - 'isRisky' => $set->isRisky(), - 'name' => $setName, - ]; - } - - return json_encode($json, JSON_PRETTY_PRINT); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/ListSetsReport/ReportSummary.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/ListSetsReport/ReportSummary.php deleted file mode 100644 index 351bdd4..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/ListSetsReport/ReportSummary.php +++ /dev/null @@ -1,47 +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\Console\Report\ListSetsReport; - -use PhpCsFixer\RuleSet\RuleSetDescriptionInterface; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -final class ReportSummary -{ - /** - * @var RuleSetDescriptionInterface[] - */ - private $sets; - - /** - * @param RuleSetDescriptionInterface[] $sets - */ - public function __construct( - array $sets - ) { - $this->sets = $sets; - } - - /** - * @return RuleSetDescriptionInterface[] - */ - public function getSets(): array - { - return $this->sets; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/ListSetsReport/ReporterFactory.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/ListSetsReport/ReporterFactory.php deleted file mode 100644 index 96ce3d5..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/ListSetsReport/ReporterFactory.php +++ /dev/null @@ -1,92 +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\Console\Report\ListSetsReport; - -use Symfony\Component\Finder\Finder as SymfonyFinder; -use Symfony\Component\Finder\SplFileInfo; - -/** - * @author Boris Gorbylev - * - * @internal - */ -final class ReporterFactory -{ - /** @var ReporterInterface[] */ - private $reporters = []; - - public function registerBuiltInReporters(): self - { - /** @var null|string[] $builtInReporters */ - static $builtInReporters; - - if (null === $builtInReporters) { - $builtInReporters = []; - - /** @var SplFileInfo $file */ - foreach (SymfonyFinder::create()->files()->name('*Reporter.php')->in(__DIR__) as $file) { - $relativeNamespace = $file->getRelativePath(); - $builtInReporters[] = sprintf( - '%s\\%s%s', - __NAMESPACE__, - $relativeNamespace ? $relativeNamespace.'\\' : '', - $file->getBasename('.php') - ); - } - } - - foreach ($builtInReporters as $reporterClass) { - $this->registerReporter(new $reporterClass()); - } - - return $this; - } - - /** - * @return $this - */ - public function registerReporter(ReporterInterface $reporter) - { - $format = $reporter->getFormat(); - - if (isset($this->reporters[$format])) { - throw new \UnexpectedValueException(sprintf('Reporter for format "%s" is already registered.', $format)); - } - - $this->reporters[$format] = $reporter; - - return $this; - } - - /** - * @return string[] - */ - public function getFormats(): array - { - $formats = array_keys($this->reporters); - sort($formats); - - return $formats; - } - - public function getReporter(string $format): ReporterInterface - { - if (!isset($this->reporters[$format])) { - throw new \UnexpectedValueException(sprintf('Reporter for format "%s" is not registered.', $format)); - } - - return $this->reporters[$format]; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/ListSetsReport/ReporterInterface.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/ListSetsReport/ReporterInterface.php deleted file mode 100644 index 4a03f33..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/ListSetsReport/ReporterInterface.php +++ /dev/null @@ -1,30 +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\Console\Report\ListSetsReport; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -interface ReporterInterface -{ - public function getFormat(): string; - - /** - * Process changed files array. Returns generated report. - */ - public function generate(ReportSummary $reportSummary): string; -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/ListSetsReport/TextReporter.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/ListSetsReport/TextReporter.php deleted file mode 100644 index a3d6cd5..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/Report/ListSetsReport/TextReporter.php +++ /dev/null @@ -1,57 +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\Console\Report\ListSetsReport; - -use PhpCsFixer\RuleSet\RuleSetDescriptionInterface; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -final class TextReporter implements ReporterInterface -{ - /** - * {@inheritdoc} - */ - public function getFormat(): string - { - return 'txt'; - } - - /** - * {@inheritdoc} - */ - public function generate(ReportSummary $reportSummary): string - { - $sets = $reportSummary->getSets(); - - usort($sets, function (RuleSetDescriptionInterface $a, RuleSetDescriptionInterface $b) { - return strcmp($a->getName(), $b->getName()); - }); - - $output = ''; - - foreach ($sets as $i => $set) { - $output .= sprintf('%2d) %s', $i + 1, $set->getName()).PHP_EOL.' '.$set->getDescription().PHP_EOL; - - if ($set->isRisky()) { - $output .= ' Set contains risky rules.'.PHP_EOL; - } - } - - return $output; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/SelfUpdate/GithubClient.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/SelfUpdate/GithubClient.php deleted file mode 100644 index 3da780f..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/SelfUpdate/GithubClient.php +++ /dev/null @@ -1,54 +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\Console\SelfUpdate; - -/** - * @internal - */ -final class GithubClient implements GithubClientInterface -{ - /** - * {@inheritdoc} - */ - public function getTags(): array - { - $url = 'https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/tags'; - - $result = @file_get_contents( - $url, - false, - stream_context_create([ - 'http' => [ - 'header' => 'User-Agent: FriendsOfPHP/PHP-CS-Fixer', - ], - ]) - ); - - if (false === $result) { - throw new \RuntimeException(sprintf('Failed to load tags at "%s".', $url)); - } - - $result = json_decode($result, true); - if (JSON_ERROR_NONE !== json_last_error()) { - throw new \RuntimeException(sprintf( - 'Failed to read response from "%s" as JSON: %s.', - $url, - json_last_error_msg() - )); - } - - return $result; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/SelfUpdate/GithubClientInterface.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/SelfUpdate/GithubClientInterface.php deleted file mode 100644 index 25e02a6..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/SelfUpdate/GithubClientInterface.php +++ /dev/null @@ -1,23 +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\Console\SelfUpdate; - -/** - * @internal - */ -interface GithubClientInterface -{ - public function getTags(): array; -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/SelfUpdate/NewVersionChecker.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/SelfUpdate/NewVersionChecker.php deleted file mode 100644 index 510ecb8..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/SelfUpdate/NewVersionChecker.php +++ /dev/null @@ -1,116 +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\Console\SelfUpdate; - -use Composer\Semver\Comparator; -use Composer\Semver\Semver; -use Composer\Semver\VersionParser; - -/** - * @internal - */ -final class NewVersionChecker implements NewVersionCheckerInterface -{ - /** - * @var GithubClientInterface - */ - private $githubClient; - - /** - * @var VersionParser - */ - private $versionParser; - - /** - * @var null|string[] - */ - private $availableVersions; - - public function __construct(GithubClientInterface $githubClient) - { - $this->githubClient = $githubClient; - $this->versionParser = new VersionParser(); - } - - /** - * {@inheritdoc} - */ - public function getLatestVersion(): string - { - $this->retrieveAvailableVersions(); - - return $this->availableVersions[0]; - } - - /** - * {@inheritdoc} - */ - public function getLatestVersionOfMajor(int $majorVersion): ?string - { - $this->retrieveAvailableVersions(); - - $semverConstraint = '^'.$majorVersion; - - foreach ($this->availableVersions as $availableVersion) { - if (Semver::satisfies($availableVersion, $semverConstraint)) { - return $availableVersion; - } - } - - return null; - } - - /** - * {@inheritdoc} - */ - public function compareVersions(string $versionA, string $versionB): int - { - $versionA = $this->versionParser->normalize($versionA); - $versionB = $this->versionParser->normalize($versionB); - - if (Comparator::lessThan($versionA, $versionB)) { - return -1; - } - - if (Comparator::greaterThan($versionA, $versionB)) { - return 1; - } - - return 0; - } - - private function retrieveAvailableVersions(): void - { - if (null !== $this->availableVersions) { - return; - } - - foreach ($this->githubClient->getTags() as $tag) { - $version = $tag['name']; - - try { - $this->versionParser->normalize($version); - - if ('stable' === VersionParser::parseStability($version)) { - $this->availableVersions[] = $version; - } - } catch (\UnexpectedValueException $exception) { - // not a valid version tag - } - } - - $this->availableVersions = Semver::rsort($this->availableVersions); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/SelfUpdate/NewVersionCheckerInterface.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/SelfUpdate/NewVersionCheckerInterface.php deleted file mode 100644 index c63b2a2..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/SelfUpdate/NewVersionCheckerInterface.php +++ /dev/null @@ -1,37 +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\Console\SelfUpdate; - -/** - * @internal - */ -interface NewVersionCheckerInterface -{ - /** - * Returns the tag of the latest version. - */ - public function getLatestVersion(): string; - - /** - * Returns the tag of the latest minor/patch version of the given major version. - */ - public function getLatestVersionOfMajor(int $majorVersion): ?string; - - /** - * Returns -1, 0, or 1 if the first version is respectively less than, - * equal to, or greater than the second. - */ - public function compareVersions(string $versionA, string $versionB): int; -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/WarningsDetector.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/WarningsDetector.php deleted file mode 100644 index 9d168ba..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Console/WarningsDetector.php +++ /dev/null @@ -1,78 +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\Console; - -use PhpCsFixer\ToolInfo; -use PhpCsFixer\ToolInfoInterface; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -final class WarningsDetector -{ - /** - * @var ToolInfoInterface - */ - private $toolInfo; - - /** - * @var string[] - */ - private $warnings = []; - - public function __construct(ToolInfoInterface $toolInfo) - { - $this->toolInfo = $toolInfo; - } - - public function detectOldMajor(): void - { - // @TODO 3.99 to be activated with new MAJOR release - // $currentMajorVersion = \intval(explode('.', Application::VERSION)[0], 10); - // $nextMajorVersion = $currentMajorVersion + 1; - // $this->warnings[] = "You are running PHP CS Fixer v{$currentMajorVersion}, which is not maintained anymore. Please update to v{$nextMajorVersion}."; - } - - public function detectOldVendor(): void - { - if ($this->toolInfo->isInstalledByComposer()) { - $details = $this->toolInfo->getComposerInstallationDetails(); - if (ToolInfo::COMPOSER_LEGACY_PACKAGE_NAME === $details['name']) { - $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 - ); - } - } - } - - /** - * @return string[] - */ - public function getWarnings(): array - { - if (!\count($this->warnings)) { - return []; - } - - return 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!'] - )); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Differ/DiffConsoleFormatter.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Differ/DiffConsoleFormatter.php deleted file mode 100644 index e756dad..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Differ/DiffConsoleFormatter.php +++ /dev/null @@ -1,94 +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\Differ; - -use PhpCsFixer\Preg; -use Symfony\Component\Console\Formatter\OutputFormatter; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -final class DiffConsoleFormatter -{ - /** - * @var bool - */ - private $isDecoratedOutput; - - /** - * @var string - */ - private $template; - - public function __construct(bool $isDecoratedOutput, string $template = '%s') - { - $this->isDecoratedOutput = $isDecoratedOutput; - $this->template = $template; - } - - public function format(string $diff, string $lineTemplate = '%s'): string - { - $isDecorated = $this->isDecoratedOutput; - - $template = $isDecorated - ? $this->template - : Preg::replace('/<[^<>]+>/', '', $this->template) - ; - - return sprintf( - $template, - implode( - PHP_EOL, - array_map( - static function (string $line) use ($isDecorated, $lineTemplate) { - if ($isDecorated) { - $count = 0; - $line = Preg::replaceCallback( - [ - '/^(\+.*)/', - '/^(\-.*)/', - '/^(@.*)/', - ], - static function (array $matches) { - if ('+' === $matches[0][0]) { - $colour = 'green'; - } elseif ('-' === $matches[0][0]) { - $colour = 'red'; - } else { - $colour = 'cyan'; - } - - return sprintf('%s', $colour, OutputFormatter::escape($matches[0]), $colour); - }, - $line, - 1, - $count - ); - - if (0 === $count) { - $line = OutputFormatter::escape($line); - } - } - - return sprintf($lineTemplate, $line); - }, - Preg::split('#\R#u', $diff) - ) - ) - ); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Differ/DifferInterface.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Differ/DifferInterface.php deleted file mode 100644 index a66f165..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Differ/DifferInterface.php +++ /dev/null @@ -1,26 +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\Differ; - -/** - * @author Dariusz Rumiński - */ -interface DifferInterface -{ - /** - * Create diff. - */ - public function diff(string $old, string $new, ?\SplFileInfo $file = null): string; -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Differ/FullDiffer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Differ/FullDiffer.php deleted file mode 100644 index 94f71c7..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Differ/FullDiffer.php +++ /dev/null @@ -1,50 +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\Differ; - -use PhpCsFixer\Diff\Differ; -use PhpCsFixer\Diff\Output\StrictUnifiedDiffOutputBuilder; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -final class FullDiffer implements DifferInterface -{ - /** - * @var Differ - */ - private $differ; - - public function __construct() - { - $this->differ = new Differ(new StrictUnifiedDiffOutputBuilder([ - 'collapseRanges' => false, - 'commonLineThreshold' => 100, - 'contextLines' => 100, - 'fromFile' => 'Original', - 'toFile' => 'New', - ])); - } - - /** - * {@inheritdoc} - */ - public function diff(string $old, string $new, ?\SplFileInfo $file = null): string - { - return $this->differ->diff($old, $new); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Differ/NullDiffer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Differ/NullDiffer.php deleted file mode 100644 index 8ef968e..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Differ/NullDiffer.php +++ /dev/null @@ -1,29 +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\Differ; - -/** - * @author Dariusz Rumiński - */ -final class NullDiffer implements DifferInterface -{ - /** - * {@inheritdoc} - */ - public function diff(string $old, string $new, ?\SplFileInfo $file = null): string - { - return ''; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Differ/UnifiedDiffer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Differ/UnifiedDiffer.php deleted file mode 100644 index b2b37c5..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Differ/UnifiedDiffer.php +++ /dev/null @@ -1,53 +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\Differ; - -use PhpCsFixer\Diff\Differ; -use PhpCsFixer\Diff\Output\StrictUnifiedDiffOutputBuilder; -use PhpCsFixer\Preg; - -/** - * @author SpacePossum - */ -final class UnifiedDiffer implements DifferInterface -{ - /** - * {@inheritdoc} - */ - public function diff(string $old, string $new, ?\SplFileInfo $file = null): string - { - if (null === $file) { - $options = [ - 'fromFile' => 'Original', - 'toFile' => 'New', - ]; - } else { - $filePath = $file->getRealPath(); - - if (1 === Preg::match('/\s/', $filePath)) { - $filePath = '"'.$filePath.'"'; - } - - $options = [ - 'fromFile' => $filePath, - 'toFile' => $filePath, - ]; - } - - $differ = new Differ(new StrictUnifiedDiffOutputBuilder($options)); - - return $differ->diff($old, $new); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/DocBlock/Annotation.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/DocBlock/Annotation.php deleted file mode 100644 index b1f5dce..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/DocBlock/Annotation.php +++ /dev/null @@ -1,310 +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\DocBlock; - -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Analyzer\Analysis\NamespaceAnalysis; -use PhpCsFixer\Tokenizer\Analyzer\Analysis\NamespaceUseAnalysis; - -/** - * This represents an entire annotation from a docblock. - * - * @author Graham Campbell - * @author Dariusz Rumiński - * - * @final - */ -final class Annotation -{ - /** - * All the annotation tag names with types. - * - * @var string[] - */ - private static $tags = [ - 'method', - 'param', - 'property', - 'property-read', - 'property-write', - 'return', - 'throws', - 'type', - 'var', - ]; - - /** - * The lines that make up the annotation. - * - * @var Line[] - */ - private $lines; - - /** - * The position of the first line of the annotation in the docblock. - * - * @var int - */ - private $start; - - /** - * The position of the last line of the annotation in the docblock. - * - * @var int - */ - private $end; - - /** - * The associated tag. - * - * @var null|Tag - */ - private $tag; - - /** - * Lazy loaded, cached types content. - * - * @var null|string - */ - private $typesContent; - - /** - * The cached types. - * - * @var null|string[] - */ - private $types; - - /** - * @var null|NamespaceAnalysis - */ - private $namespace; - - /** - * @var NamespaceUseAnalysis[] - */ - private $namespaceUses; - - /** - * Create a new line instance. - * - * @param Line[] $lines - * @param null|NamespaceAnalysis $namespace - * @param NamespaceUseAnalysis[] $namespaceUses - */ - public function __construct(array $lines, $namespace = null, array $namespaceUses = []) - { - $this->lines = array_values($lines); - $this->namespace = $namespace; - $this->namespaceUses = $namespaceUses; - - $keys = array_keys($lines); - - $this->start = $keys[0]; - $this->end = end($keys); - } - - /** - * Get the string representation of object. - */ - public function __toString(): string - { - return $this->getContent(); - } - - /** - * Get all the annotation tag names with types. - * - * @return string[] - */ - public static function getTagsWithTypes(): array - { - return self::$tags; - } - - /** - * Get the start position of this annotation. - */ - public function getStart(): int - { - return $this->start; - } - - /** - * Get the end position of this annotation. - */ - public function getEnd(): int - { - return $this->end; - } - - /** - * Get the associated tag. - */ - public function getTag(): Tag - { - if (null === $this->tag) { - $this->tag = new Tag($this->lines[0]); - } - - return $this->tag; - } - - /** - * @return TypeExpression - * - * @internal - */ - public function getTypeExpression() - { - return new TypeExpression($this->getTypesContent(), $this->namespace, $this->namespaceUses); - } - - /** - * @return null|string - * - * @internal - */ - public function getVariableName() - { - $type = preg_quote($this->getTypesContent(), '/'); - $regex = "/@{$this->tag->getName()}\\s+{$type}\\s+(?\\$.+?)(?:[\\s*]|$)/"; - - if (Preg::match($regex, $this->lines[0]->getContent(), $matches)) { - return $matches['variable']; - } - - return null; - } - - /** - * Get the types associated with this annotation. - * - * @return string[] - */ - public function getTypes(): array - { - if (null === $this->types) { - $this->types = $this->getTypeExpression()->getTypes(); - } - - return $this->types; - } - - /** - * Set the types associated with this annotation. - * - * @param string[] $types - */ - public function setTypes(array $types): void - { - $pattern = '/'.preg_quote($this->getTypesContent(), '/').'/'; - - $this->lines[0]->setContent(Preg::replace($pattern, implode('|', $types), $this->lines[0]->getContent(), 1)); - - $this->clearCache(); - } - - /** - * Get the normalized types associated with this annotation, so they can easily be compared. - * - * @return string[] - */ - public function getNormalizedTypes(): array - { - $normalized = array_map(static function (string $type) { - return strtolower($type); - }, $this->getTypes()); - - sort($normalized); - - return $normalized; - } - - /** - * Remove this annotation by removing all its lines. - */ - public function remove(): void - { - foreach ($this->lines as $line) { - if ($line->isTheStart() && $line->isTheEnd()) { - // Single line doc block, remove entirely - $line->remove(); - } elseif ($line->isTheStart()) { - // Multi line doc block, but start is on the same line as the first annotation, keep only the start - $content = Preg::replace('#(\s*/\*\*).*#', '$1', $line->getContent()); - - $line->setContent($content); - } elseif ($line->isTheEnd()) { - // Multi line doc block, but end is on the same line as the last annotation, keep only the end - $content = Preg::replace('#(\s*)\S.*(\*/.*)#', '$1$2', $line->getContent()); - - $line->setContent($content); - } else { - // Multi line doc block, neither start nor end on this line, can be removed safely - $line->remove(); - } - } - - $this->clearCache(); - } - - /** - * Get the annotation content. - */ - public function getContent(): string - { - return implode('', $this->lines); - } - - public function supportTypes(): bool - { - return \in_array($this->getTag()->getName(), self::$tags, true); - } - - /** - * Get the current types content. - * - * Be careful modifying the underlying line as that won't flush the cache. - */ - private function getTypesContent(): string - { - if (null === $this->typesContent) { - $name = $this->getTag()->getName(); - - if (!$this->supportTypes()) { - throw new \RuntimeException('This tag does not support types.'); - } - - $matchingResult = Preg::match( - '{^(?:\s*\*|/\*\*)\s*@'.$name.'\s+'.TypeExpression::REGEX_TYPES.'(?:[*\h\v].*)?\r?$}sx', - $this->lines[0]->getContent(), - $matches - ); - - $this->typesContent = 1 === $matchingResult - ? $matches['types'] - : ''; - } - - return $this->typesContent; - } - - private function clearCache(): void - { - $this->types = null; - $this->typesContent = null; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/DocBlock/DocBlock.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/DocBlock/DocBlock.php deleted file mode 100644 index 96353e6..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/DocBlock/DocBlock.php +++ /dev/null @@ -1,264 +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\DocBlock; - -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Analyzer\Analysis\NamespaceAnalysis; -use PhpCsFixer\Tokenizer\Analyzer\Analysis\NamespaceUseAnalysis; - -/** - * This class represents a docblock. - * - * It internally splits it up into "lines" that we can manipulate. - * - * @author Graham Campbell - * - * @final - */ -final class DocBlock -{ - /** - * The array of lines. - * - * @var Line[] - */ - private $lines = []; - - /** - * The array of annotations. - * - * @var null|Annotation[] - */ - private $annotations; - - /** - * @var null|NamespaceAnalysis - */ - private $namespace; - - /** - * @var NamespaceUseAnalysis[] - */ - private $namespaceUses; - - public function __construct(string $content, ?NamespaceAnalysis $namespace = null, array $namespaceUses = []) - { - foreach (Preg::split('/([^\n\r]+\R*)/', $content, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE) as $line) { - $this->lines[] = new Line($line); - } - - $this->namespace = $namespace; - $this->namespaceUses = $namespaceUses; - } - - /** - * Get the string representation of object. - */ - public function __toString(): string - { - return $this->getContent(); - } - - /** - * Get this docblock's lines. - * - * @return Line[] - */ - public function getLines(): array - { - return $this->lines; - } - - /** - * Get a single line. - */ - public function getLine(int $pos): ?Line - { - return $this->lines[$pos] ?? null; - } - - /** - * Get this docblock's annotations. - * - * @return Annotation[] - */ - public function getAnnotations(): array - { - if (null !== $this->annotations) { - return $this->annotations; - } - - $this->annotations = []; - $total = \count($this->lines); - - for ($index = 0; $index < $total; ++$index) { - if ($this->lines[$index]->containsATag()) { - // get all the lines that make up the annotation - $lines = \array_slice($this->lines, $index, $this->findAnnotationLength($index), true); - $annotation = new Annotation($lines, $this->namespace, $this->namespaceUses); - // move the index to the end of the annotation to avoid - // checking it again because we know the lines inside the - // current annotation cannot be part of another annotation - $index = $annotation->getEnd(); - // add the current annotation to the list of annotations - $this->annotations[] = $annotation; - } - } - - return $this->annotations; - } - - public function isMultiLine(): bool - { - return 1 !== \count($this->lines); - } - - /** - * Take a one line doc block, and turn it into a multi line doc block. - */ - public function makeMultiLine(string $indent, string $lineEnd): void - { - if ($this->isMultiLine()) { - return; - } - - $lineContent = $this->getSingleLineDocBlockEntry($this->lines[0]); - - if ('' === $lineContent) { - $this->lines = [ - new Line('/**'.$lineEnd), - new Line($indent.' *'.$lineEnd), - new Line($indent.' */'), - ]; - - return; - } - - $this->lines = [ - new Line('/**'.$lineEnd), - new Line($indent.' * '.$lineContent.$lineEnd), - new Line($indent.' */'), - ]; - } - - public function makeSingleLine(): void - { - if (!$this->isMultiLine()) { - return; - } - - $usefulLines = array_filter( - $this->lines, - static function (Line $line) { - return $line->containsUsefulContent(); - } - ); - - if (1 < \count($usefulLines)) { - return; - } - - $lineContent = ''; - if (\count($usefulLines)) { - $lineContent = $this->getSingleLineDocBlockEntry(array_shift($usefulLines)); - } - - $this->lines = [new Line('/** '.$lineContent.' */')]; - } - - public function getAnnotation(int $pos): ?Annotation - { - $annotations = $this->getAnnotations(); - - return $annotations[$pos] ?? null; - } - - /** - * Get specific types of annotations only. - * - * If none exist, we're returning an empty array. - * - * @param string|string[] $types - * - * @return Annotation[] - */ - public function getAnnotationsOfType($types): array - { - $annotations = []; - $types = (array) $types; - - foreach ($this->getAnnotations() as $annotation) { - $tag = $annotation->getTag()->getName(); - foreach ($types as $type) { - if ($type === $tag) { - $annotations[] = $annotation; - } - } - } - - return $annotations; - } - - /** - * Get the actual content of this docblock. - */ - public function getContent(): string - { - return implode('', $this->lines); - } - - private function findAnnotationLength(int $start): int - { - $index = $start; - - while ($line = $this->getLine(++$index)) { - if ($line->containsATag()) { - // we've 100% reached the end of the description if we get here - break; - } - - if (!$line->containsUsefulContent()) { - // if next line is also non-useful, or contains a tag, then we're done here - $next = $this->getLine($index + 1); - if (null === $next || !$next->containsUsefulContent() || $next->containsATag()) { - break; - } - // otherwise, continue, the annotation must have contained a blank line in its description - } - } - - return $index - $start; - } - - private function getSingleLineDocBlockEntry(Line $line): string - { - $lineString = $line->getContent(); - - if (0 === \strlen($lineString)) { - return $lineString; - } - - $lineString = str_replace('*/', '', $lineString); - $lineString = trim($lineString); - - if ('/**' === substr($lineString, 0, 3)) { - $lineString = substr($lineString, 3); - } elseif ('*' === substr($lineString, 0, 1)) { - $lineString = substr($lineString, 1); - } - - return trim($lineString); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/DocBlock/Line.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/DocBlock/Line.php deleted file mode 100644 index 8b369ff..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/DocBlock/Line.php +++ /dev/null @@ -1,132 +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\DocBlock; - -use PhpCsFixer\Preg; - -/** - * This represents a line of a docblock. - * - * @author Graham Campbell - * - * @final - */ -final class Line -{ - /** - * The content of this line. - * - * @var string - */ - private $content; - - /** - * Create a new line instance. - */ - public function __construct(string $content) - { - $this->content = $content; - } - - /** - * Get the string representation of object. - */ - public function __toString(): string - { - return $this->content; - } - - /** - * Get the content of this line. - */ - public function getContent(): string - { - return $this->content; - } - - /** - * Does this line contain useful content? - * - * If the line contains text or tags, then this is true. - */ - public function containsUsefulContent(): bool - { - return 0 !== Preg::match('/\\*\s*\S+/', $this->content) && '' !== trim(str_replace(['/', '*'], ' ', $this->content)); - } - - /** - * Does the line contain a tag? - * - * If this is true, then it must be the first line of an annotation. - */ - public function containsATag(): bool - { - return 0 !== Preg::match('/\\*\s*@/', $this->content); - } - - /** - * Is the line the start of a docblock? - */ - public function isTheStart(): bool - { - return false !== strpos($this->content, '/**'); - } - - /** - * Is the line the end of a docblock? - */ - public function isTheEnd(): bool - { - return false !== strpos($this->content, '*/'); - } - - /** - * Set the content of this line. - */ - public function setContent(string $content): void - { - $this->content = $content; - } - - /** - * Remove this line by clearing its contents. - * - * Note that this method technically brakes the internal state of the - * docblock, but is useful when we need to retain the indexes of lines - * during the execution of an algorithm. - */ - public function remove(): void - { - $this->content = ''; - } - - /** - * Append a blank docblock line to this line's contents. - * - * Note that this method technically brakes the internal state of the - * docblock, but is useful when we need to retain the indexes of lines - * during the execution of an algorithm. - */ - public function addBlank(): void - { - $matched = Preg::match('/^(\h*\*)[^\r\n]*(\r?\n)$/', $this->content, $matches); - - if (1 !== $matched) { - return; - } - - $this->content .= $matches[1].$matches[2]; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/DocBlock/ShortDescription.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/DocBlock/ShortDescription.php deleted file mode 100644 index eeb71f3..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/DocBlock/ShortDescription.php +++ /dev/null @@ -1,65 +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\DocBlock; - -/** - * This class represents a short description (aka summary) of a docblock. - * - * @internal - */ -final class ShortDescription -{ - /** - * The docblock containing the short description. - * - * @var DocBlock - */ - private $doc; - - public function __construct(DocBlock $doc) - { - $this->doc = $doc; - } - - /** - * Get the line index of the line containing the end of the short - * description, if present. - */ - public function getEnd(): ?int - { - $reachedContent = false; - - foreach ($this->doc->getLines() as $index => $line) { - // we went past a description, then hit a tag or blank line, so - // the last line of the description must be the one before this one - if ($reachedContent && ($line->containsATag() || !$line->containsUsefulContent())) { - return $index - 1; - } - - // no short description was found - if ($line->containsATag()) { - return null; - } - - // we've reached content, but need to check the next lines too - // in case the short description is multi-line - if ($line->containsUsefulContent()) { - $reachedContent = true; - } - } - - return null; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/DocBlock/Tag.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/DocBlock/Tag.php deleted file mode 100644 index 999ea48..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/DocBlock/Tag.php +++ /dev/null @@ -1,109 +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\DocBlock; - -use PhpCsFixer\Preg; - -/** - * This represents a tag, as defined by the proposed PSR PHPDoc standard. - * - * @author Graham Campbell - * - * @final - */ -final class Tag -{ - /** - * All the tags defined by the proposed PSR PHPDoc standard. - * - * @var string[] - */ - private static $tags = [ - 'api', 'author', 'category', 'copyright', 'deprecated', 'example', - 'global', 'internal', 'license', 'link', 'method', 'package', 'param', - 'property', 'property-read', 'property-write', 'return', 'see', - 'since', 'subpackage', 'throws', 'todo', 'uses', 'var', 'version', - ]; - - /** - * The line containing the tag. - * - * @var Line - */ - private $line; - - /** - * The cached tag name. - * - * @var null|string - */ - private $name; - - /** - * Create a new tag instance. - */ - public function __construct(Line $line) - { - $this->line = $line; - } - - /** - * Get the tag name. - * - * This may be "param", or "return", etc. - */ - public function getName(): string - { - if (null === $this->name) { - Preg::matchAll('/@[a-zA-Z0-9_-]+(?=\s|$)/', $this->line->getContent(), $matches); - - if (isset($matches[0][0])) { - $this->name = ltrim($matches[0][0], '@'); - } else { - $this->name = 'other'; - } - } - - return $this->name; - } - - /** - * Set the tag name. - * - * This will also be persisted to the upstream line and annotation. - */ - public function setName(string $name): void - { - $current = $this->getName(); - - if ('other' === $current) { - throw new \RuntimeException('Cannot set name on unknown tag.'); - } - - $this->line->setContent(Preg::replace("/@{$current}/", "@{$name}", $this->line->getContent(), 1)); - - $this->name = $name; - } - - /** - * Is the tag a known tag? - * - * This is defined by if it exists in the proposed PSR PHPDoc standard. - */ - public function valid(): bool - { - return \in_array($this->getName(), self::$tags, true); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/DocBlock/TagComparator.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/DocBlock/TagComparator.php deleted file mode 100644 index e9a3092..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/DocBlock/TagComparator.php +++ /dev/null @@ -1,59 +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\DocBlock; - -/** - * This class is responsible for comparing tags to see if they should be kept - * together, or kept apart. - * - * @author Graham Campbell - * - * @final - */ -final class TagComparator -{ - /** - * Groups of tags that should be allowed to immediately follow each other. - * - * @var array - */ - private static $groups = [ - ['deprecated', 'link', 'see', 'since'], - ['author', 'copyright', 'license'], - ['category', 'package', 'subpackage'], - ['property', 'property-read', 'property-write'], - ]; - - /** - * Should the given tags be kept together, or kept apart? - */ - public static function shouldBeTogether(Tag $first, Tag $second): bool - { - $firstName = $first->getName(); - $secondName = $second->getName(); - - if ($firstName === $secondName) { - return true; - } - - foreach (self::$groups as $group) { - if (\in_array($firstName, $group, true) && \in_array($secondName, $group, true)) { - return true; - } - } - - return false; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/DocBlock/TypeExpression.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/DocBlock/TypeExpression.php deleted file mode 100644 index 66738cb..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/DocBlock/TypeExpression.php +++ /dev/null @@ -1,284 +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\DocBlock; - -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Analyzer\Analysis\NamespaceAnalysis; -use PhpCsFixer\Tokenizer\Analyzer\Analysis\NamespaceUseAnalysis; - -/** - * @internal - */ -final class TypeExpression -{ - /** - * Regex to match any types, shall be used with `x` modifier. - * - * @internal - */ - public const REGEX_TYPES = ' - (? # alternation of several types separated by `|` - (? # single type - \?? # optionally nullable - (?: - (? - array\h*\{ - (? - \h*[^?:\h]+\h*\??\h*:\h*(?&types) - ) - (?:\h*,(?&object_like_array_key))* - \h*\} - ) - | - (? # callable syntax, e.g. `callable(string): bool` - (?:callable|Closure)\h*\(\h* - (?&types) - (?: - \h*,\h* - (?&types) - )* - \h*\) - (?: - \h*\:\h* - (?&types) - )? - ) - | - (? # generic syntax, e.g.: `array` - (?&name)+ - \h*<\h* - (?&types) - (?: - \h*,\h* - (?&types) - )* - \h*> - ) - | - (? # class constants with optional wildcard, e.g.: `Foo::*`, `Foo::CONST_A`, `FOO::CONST_*` - (?&name)::(\*|\w+\*?) - ) - | - (? # array expression, e.g.: `string[]`, `string[][]` - (?&name)(\[\])+ - ) - | - (? # single constant value (case insensitive), e.g.: 1, `\'a\'` - (?i) - null | true | false - | [\d.]+ - | \'[^\']+?\' | "[^"]+?" - | [@$]?(?:this | self | static) - (?-i) - ) - | - (? # single type, e.g.: `null`, `int`, `\Foo\Bar` - [\\\\\w-]++ - ) - ) - (?: # intersection - \h*&\h* - (?&type) - )* - ) - (?: - \h*\|\h* - (?&type) - )* - ) - '; - - /** - * @var string[] - */ - private $types = []; - - /** - * @var null|NamespaceAnalysis - */ - private $namespace; - - /** - * @var NamespaceUseAnalysis[] - */ - private $namespaceUses; - - /** - * @param NamespaceUseAnalysis[] $namespaceUses - */ - public function __construct(string $value, ?NamespaceAnalysis $namespace, array $namespaceUses) - { - while ('' !== $value) { - Preg::match( - '{^'.self::REGEX_TYPES.'$}x', - $value, - $matches - ); - - $this->types[] = $matches['type']; - $value = Preg::replace( - '/^'.preg_quote($matches['type'], '/').'(\h*\|\h*)?/', - '', - $value - ); - } - - $this->namespace = $namespace; - $this->namespaceUses = $namespaceUses; - } - - /** - * @return string[] - */ - public function getTypes(): array - { - return $this->types; - } - - public function getCommonType(): ?string - { - $aliases = [ - 'true' => 'bool', - 'false' => 'bool', - 'boolean' => 'bool', - 'integer' => 'int', - 'double' => 'float', - 'real' => 'float', - 'callback' => 'callable', - ]; - - $mainType = null; - - foreach ($this->types as $type) { - if ('null' === $type) { - continue; - } - - if (isset($aliases[$type])) { - $type = $aliases[$type]; - } elseif (1 === Preg::match('/\[\]$/', $type)) { - $type = 'array'; - } elseif (1 === Preg::match('/^(.+?)getParentType($type, $mainType); - - if (null === $mainType) { - return null; - } - } - - return $mainType; - } - - public function allowsNull(): bool - { - foreach ($this->types as $type) { - if (\in_array($type, ['null', 'mixed'], true)) { - return true; - } - } - - return false; - } - - private function getParentType(string $type1, string $type2): ?string - { - $types = [ - $this->normalize($type1), - $this->normalize($type2), - ]; - natcasesort($types); - $types = implode('|', $types); - - $parents = [ - 'array|iterable' => 'iterable', - 'array|Traversable' => 'iterable', - 'iterable|Traversable' => 'iterable', - 'self|static' => 'self', - ]; - - if (isset($parents[$types])) { - return $parents[$types]; - } - - return null; - } - - private function normalize(string $type): string - { - $aliases = [ - 'true' => 'bool', - 'false' => 'bool', - 'boolean' => 'bool', - 'integer' => 'int', - 'double' => 'float', - 'real' => 'float', - 'callback' => 'callable', - ]; - - if (isset($aliases[$type])) { - return $aliases[$type]; - } - - if (\in_array($type, [ - 'void', - 'null', - 'bool', - 'int', - 'float', - 'string', - 'array', - 'iterable', - 'object', - 'callable', - 'resource', - 'mixed', - ], true)) { - return $type; - } - - if (1 === Preg::match('/\[\]$/', $type)) { - return 'array'; - } - - if (1 === Preg::match('/^(.+?)namespaceUses as $namespaceUse) { - if ($namespaceUse->getShortName() === $type) { - return $namespaceUse->getFullName(); - } - } - - if (null === $this->namespace || '' === $this->namespace->getShortName()) { - return $type; - } - - return "{$this->namespace->getFullName()}\\{$type}"; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Doctrine/Annotation/Token.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Doctrine/Annotation/Token.php deleted file mode 100644 index 9134067..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Doctrine/Annotation/Token.php +++ /dev/null @@ -1,87 +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\Doctrine\Annotation; - -use Doctrine\Common\Annotations\DocLexer; - -/** - * A Doctrine annotation token. - * - * @internal - */ -final class Token -{ - /** - * @var int - */ - private $type; - - /** - * @var string - */ - private $content; - - /** - * @param int $type The type - * @param string $content The content - */ - public function __construct(int $type = DocLexer::T_NONE, string $content = '') - { - $this->type = $type; - $this->content = $content; - } - - public function getType(): int - { - return $this->type; - } - - public function setType(int $type): void - { - $this->type = $type; - } - - public function getContent(): string - { - return $this->content; - } - - public function setContent(string $content): void - { - $this->content = $content; - } - - /** - * Returns whether the token type is one of the given types. - * - * @param int|int[] $types - */ - public function isType($types): bool - { - if (!\is_array($types)) { - $types = [$types]; - } - - return \in_array($this->getType(), $types, true); - } - - /** - * Overrides the content with an empty string. - */ - public function clear(): void - { - $this->setContent(''); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Doctrine/Annotation/Tokens.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Doctrine/Annotation/Tokens.php deleted file mode 100644 index d2c579b..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Doctrine/Annotation/Tokens.php +++ /dev/null @@ -1,342 +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\Doctrine\Annotation; - -use Doctrine\Common\Annotations\DocLexer; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token as PhpToken; - -/** - * A list of Doctrine annotation tokens. - * - * @internal - */ -final class Tokens extends \SplFixedArray -{ - /** - * @param string[] $ignoredTags - * - * @throws \InvalidArgumentException - */ - public static function createFromDocComment(PhpToken $input, array $ignoredTags = []): self - { - if (!$input->isGivenKind(T_DOC_COMMENT)) { - throw new \InvalidArgumentException('Input must be a T_DOC_COMMENT token.'); - } - - $tokens = new self(); - - $content = $input->getContent(); - $ignoredTextPosition = 0; - $currentPosition = 0; - $token = null; - while (false !== $nextAtPosition = strpos($content, '@', $currentPosition)) { - if (0 !== $nextAtPosition && !Preg::match('/\s/', $content[$nextAtPosition - 1])) { - $currentPosition = $nextAtPosition + 1; - - continue; - } - - $lexer = new DocLexer(); - $lexer->setInput(substr($content, $nextAtPosition)); - - $scannedTokens = []; - $index = 0; - $nbScannedTokensToUse = 0; - $nbScopes = 0; - while (null !== $token = $lexer->peek()) { - if (0 === $index && DocLexer::T_AT !== $token['type']) { - break; - } - - if (1 === $index) { - if (DocLexer::T_IDENTIFIER !== $token['type'] || \in_array($token['value'], $ignoredTags, true)) { - break; - } - - $nbScannedTokensToUse = 2; - } - - if ($index >= 2 && 0 === $nbScopes && !\in_array($token['type'], [DocLexer::T_NONE, DocLexer::T_OPEN_PARENTHESIS], true)) { - break; - } - - $scannedTokens[] = $token; - - if (DocLexer::T_OPEN_PARENTHESIS === $token['type']) { - ++$nbScopes; - } elseif (DocLexer::T_CLOSE_PARENTHESIS === $token['type']) { - if (0 === --$nbScopes) { - $nbScannedTokensToUse = \count($scannedTokens); - - break; - } - } - - ++$index; - } - - if (0 !== $nbScopes) { - break; - } - - if (0 !== $nbScannedTokensToUse) { - $ignoredTextLength = $nextAtPosition - $ignoredTextPosition; - if (0 !== $ignoredTextLength) { - $tokens[] = new Token(DocLexer::T_NONE, substr($content, $ignoredTextPosition, $ignoredTextLength)); - } - - $lastTokenEndIndex = 0; - foreach (\array_slice($scannedTokens, 0, $nbScannedTokensToUse) as $token) { - if (DocLexer::T_STRING === $token['type']) { - $token['value'] = '"'.str_replace('"', '""', $token['value']).'"'; - } - - $missingTextLength = $token['position'] - $lastTokenEndIndex; - if ($missingTextLength > 0) { - $tokens[] = new Token(DocLexer::T_NONE, substr( - $content, - $nextAtPosition + $lastTokenEndIndex, - $missingTextLength - )); - } - - $tokens[] = new Token($token['type'], $token['value']); - $lastTokenEndIndex = $token['position'] + \strlen($token['value']); - } - - $currentPosition = $ignoredTextPosition = $nextAtPosition + $token['position'] + \strlen($token['value']); - } else { - $currentPosition = $nextAtPosition + 1; - } - } - - if ($ignoredTextPosition < \strlen($content)) { - $tokens[] = new Token(DocLexer::T_NONE, substr($content, $ignoredTextPosition)); - } - - return $tokens; - } - - /** - * Returns the index of the closest next token that is neither a comment nor a whitespace token. - */ - public function getNextMeaningfulToken(int $index): ?int - { - return $this->getMeaningfulTokenSibling($index, 1); - } - - /** - * Returns the index of the closest previous token that is neither a comment nor a whitespace token. - */ - public function getPreviousMeaningfulToken(int $index): ?int - { - return $this->getMeaningfulTokenSibling($index, -1); - } - - /** - * Returns the index of the closest next token of the given type. - * - * @param string|string[] $type - */ - public function getNextTokenOfType($type, int $index): ?int - { - return $this->getTokenOfTypeSibling($index, $type, 1); - } - - /** - * Returns the index of the closest previous token of the given type. - * - * @param string|string[] $type - */ - public function getPreviousTokenOfType($type, int $index): ?int - { - return $this->getTokenOfTypeSibling($index, $type, -1); - } - - /** - * Returns the index of the last token that is part of the annotation at the given index. - */ - public function getAnnotationEnd(int $index): ?int - { - $currentIndex = null; - - if (isset($this[$index + 2])) { - if ($this[$index + 2]->isType(DocLexer::T_OPEN_PARENTHESIS)) { - $currentIndex = $index + 2; - } elseif ( - isset($this[$index + 3]) - && $this[$index + 2]->isType(DocLexer::T_NONE) - && $this[$index + 3]->isType(DocLexer::T_OPEN_PARENTHESIS) - && Preg::match('/^(\R\s*\*\s*)*\s*$/', $this[$index + 2]->getContent()) - ) { - $currentIndex = $index + 3; - } - } - - if (null !== $currentIndex) { - $level = 0; - for ($max = \count($this); $currentIndex < $max; ++$currentIndex) { - if ($this[$currentIndex]->isType(DocLexer::T_OPEN_PARENTHESIS)) { - ++$level; - } elseif ($this[$currentIndex]->isType(DocLexer::T_CLOSE_PARENTHESIS)) { - --$level; - } - - if (0 === $level) { - return $currentIndex; - } - } - - return null; - } - - return $index + 1; - } - - /** - * Returns the index of the close brace that matches the open brace at the given index. - */ - public function getArrayEnd(int $index): ?int - { - $level = 1; - for (++$index, $max = \count($this); $index < $max; ++$index) { - if ($this[$index]->isType(DocLexer::T_OPEN_CURLY_BRACES)) { - ++$level; - } elseif ($this[$index]->isType($index, DocLexer::T_CLOSE_CURLY_BRACES)) { - --$level; - } - - if (0 === $level) { - return $index; - } - } - - return null; - } - - /** - * Returns the code from the tokens. - */ - public function getCode(): string - { - $code = ''; - foreach ($this as $token) { - $code .= $token->getContent(); - } - - return $code; - } - - /** - * Inserts a token at the given index. - */ - public function insertAt(int $index, Token $token): void - { - $this->setSize($this->getSize() + 1); - - for ($i = $this->getSize() - 1; $i > $index; --$i) { - $this[$i] = $this[$i - 1] ?? new Token(); - } - - $this[$index] = $token; - } - - /** - * {@inheritdoc} - * - * @throws \InvalidArgumentException - */ - public function offsetSet($index, $token): void - { - if (!$token instanceof Token) { - $type = \gettype($token); - if ('object' === $type) { - $type = \get_class($token); - } - - throw new \InvalidArgumentException(sprintf( - 'Token must be an instance of PhpCsFixer\\Doctrine\\Annotation\\Token, %s given.', - $type - )); - } - - if (null === $index) { - $index = \count($this); - $this->setSize($this->getSize() + 1); - } - - parent::offsetSet($index, $token); - } - - /** - * {@inheritdoc} - * - * @throws \OutOfBoundsException - */ - public function offsetUnset($index): void - { - if (!isset($this[$index])) { - throw new \OutOfBoundsException(sprintf('Index "%s" is invalid or does not exist.', $index)); - } - - $max = \count($this) - 1; - while ($index < $max) { - $this[$index] = $this[$index + 1]; - ++$index; - } - - parent::offsetUnset($index); - - $this->setSize($max); - } - - private function getMeaningfulTokenSibling(int $index, int $direction): ?int - { - while (true) { - $index += $direction; - - if (!$this->offsetExists($index)) { - break; - } - - if (!$this[$index]->isType(DocLexer::T_NONE)) { - return $index; - } - } - - return null; - } - - /** - * @param string|string[] $type - */ - private function getTokenOfTypeSibling(int $index, $type, int $direction): ?int - { - while (true) { - $index += $direction; - - if (!$this->offsetExists($index)) { - break; - } - - if ($this[$index]->isType($type)) { - return $index; - } - } - - return null; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Documentation/DocumentationGenerator.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Documentation/DocumentationGenerator.php deleted file mode 100644 index ae8e662..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Documentation/DocumentationGenerator.php +++ /dev/null @@ -1,488 +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\AbstractFixer; -use PhpCsFixer\Console\Command\HelpCommand; -use PhpCsFixer\Differ\FullDiffer; -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\FixerDefinition\CodeSampleInterface; -use PhpCsFixer\FixerDefinition\FileSpecificCodeSampleInterface; -use PhpCsFixer\FixerDefinition\VersionSpecificCodeSampleInterface; -use PhpCsFixer\Preg; -use PhpCsFixer\RuleSet\RuleSet; -use PhpCsFixer\RuleSet\RuleSetDescriptionInterface; -use PhpCsFixer\RuleSet\RuleSets; -use PhpCsFixer\StdinFileInfo; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Utils; - -/** - * @internal - */ -final class DocumentationGenerator -{ - /** - * @var FullDiffer - */ - private $differ; - - /** - * @var string - */ - private $path; - - public function __construct() - { - $this->differ = new FullDiffer(); - - $this->path = \dirname(__DIR__, 2).'/doc'; - } - - public function getFixersDocumentationDirectoryPath(): string - { - return $this->path.'/rules'; - } - - public function getFixersDocumentationIndexFilePath(): string - { - return $this->getFixersDocumentationDirectoryPath().'/index.rst'; - } - - /** - * @param AbstractFixer[] $fixers - */ - public function generateFixersDocumentationIndex(array $fixers): string - { - $overrideGroups = [ - 'PhpUnit' => 'PHPUnit', - 'PhpTag' => 'PHP Tag', - 'Phpdoc' => 'PHPDoc', - ]; - - usort($fixers, function (FixerInterface $a, FixerInterface $b) { - return strcmp(\get_class($a), \get_class($b)); - }); - - $documentation = <<<'RST' -======================= -List of Available Rules -======================= -RST; - - $currentGroup = null; - foreach ($fixers as $fixer) { - $namespace = Preg::replace('/^.*\\\\(.+)\\\\.+Fixer$/', '$1', \get_class($fixer)); - if (isset($overrideGroups[$namespace])) { - $group = $overrideGroups[$namespace]; - } else { - $group = Preg::replace('/(?<=[[:lower:]])(?=[[:upper:]])/', ' ', $namespace); - } - - if ($group !== $currentGroup) { - $underline = str_repeat('-', \strlen($group)); - $documentation .= "\n\n{$group}\n{$underline}\n"; - - $currentGroup = $group; - } - - $summary = str_replace('`', '``', $fixer->getDefinition()->getSummary()); - - $attributes = []; - if ($fixer instanceof DeprecatedFixerInterface) { - $attributes[] = 'deprecated'; - } - if ($fixer->isRisky()) { - $attributes[] = 'risky'; - } - - if ([] !== $attributes) { - $attributes = ' *('.implode(', ', $attributes).')*'; - } else { - $attributes = ''; - } - - $path = './'.$this->getFixerDocumentationFileRelativePath($fixer); - - $documentation .= <<getName()} <{$path}>`_{$attributes} - {$summary} -RST; - } - - return "{$documentation}\n"; - } - - public function getFixerDocumentationFilePath(FixerInterface $fixer): string - { - return $this->getFixersDocumentationDirectoryPath().'/'.Preg::replaceCallback( - '/^.*\\\\(.+)\\\\(.+)Fixer$/', - function (array $matches) { - return Utils::camelCaseToUnderscore($matches[1]).'/'.Utils::camelCaseToUnderscore($matches[2]); - }, - \get_class($fixer) - ).'.rst'; - } - - public function getFixerDocumentationFileRelativePath(FixerInterface $fixer): string - { - return Preg::replace( - '#^'.preg_quote($this->getFixersDocumentationDirectoryPath(), '#').'/#', - '', - $this->getFixerDocumentationFilePath($fixer) - ); - } - - public function generateFixerDocumentation(FixerInterface $fixer): string - { - $name = $fixer->getName(); - $title = "Rule ``{$name}``"; - $titleLine = str_repeat('=', \strlen($title)); - - $doc = "{$titleLine}\n{$title}\n{$titleLine}"; - - if ($fixer instanceof DeprecatedFixerInterface) { - $doc .= "\n\n.. warning:: This rule is deprecated and will be removed on next major version."; - - $alternatives = $fixer->getSuccessorsNames(); - if ([] !== $alternatives) { - $doc .= $this->toRst(sprintf( - "\n\nYou should use %s instead.", - Utils::naturalLanguageJoinWithBackticks($alternatives) - ), 3); - } - } - - $definition = $fixer->getDefinition(); - - $doc .= "\n\n".$this->toRst($definition->getSummary()); - - $description = $definition->getDescription(); - if (null !== $description) { - $description = $this->toRst($description); - $doc .= <<getRiskyDescription(); - $samples = $definition->getCodeSamples(); - - if (null !== $riskyDescription) { - $riskyDescription = $this->toRst($riskyDescription, 3); - - $doc .= <<getConfigurationDefinition(); - - foreach ($configurationDefinition->getOptions() as $option) { - $optionInfo = "``{$option->getName()}``"; - $optionInfo .= "\n".str_repeat('~', \strlen($optionInfo)); - - if ($option instanceof DeprecatedFixerOptionInterface) { - $optionInfo .= "\n\n.. warning:: This option is deprecated and will be removed on next major version. {$this->toRst($option->getDeprecationMessage())}"; - } - - $optionInfo .= "\n\n".$this->toRst($option->getDescription()); - - if ($option instanceof AliasedFixerOption) { - $optionInfo .= "\n\n.. note:: The previous name of this option was ``{$option->getAlias()}`` but it is now deprecated and will be removed on next major version."; - } - - $allowed = HelpCommand::getDisplayableAllowedValues($option); - $allowedKind = 'Allowed values'; - if (null !== $allowed) { - foreach ($allowed as &$value) { - if ($value instanceof AllowedValueSubset) { - $value = 'a subset of ``'.HelpCommand::toString($value->getAllowedValues()).'``'; - } else { - $value = '``'.HelpCommand::toString($value).'``'; - } - } - } else { - $allowedKind = 'Allowed types'; - $allowed = array_map(function ($value) { - return '``'.$value.'``'; - }, $option->getAllowedTypes()); - } - - if (null !== $allowed) { - $allowed = implode(', ', $allowed); - $optionInfo .= "\n\n{$allowedKind}: {$allowed}"; - } - - if ($option->hasDefault()) { - $default = HelpCommand::toString($option->getDefault()); - $optionInfo .= "\n\nDefault value: ``{$default}``"; - } else { - $optionInfo .= "\n\nThis option is required."; - } - - $doc .= "\n\n{$optionInfo}"; - } - } - - if (0 !== \count($samples)) { - $doc .= <<<'RST' - - -Examples --------- -RST; - - foreach ($samples as $index => $sample) { - $title = sprintf('Example #%d', $index + 1); - $titleLine = str_repeat('~', \strlen($title)); - $doc .= "\n\n{$title}\n{$titleLine}"; - - if ($fixer instanceof ConfigurableFixerInterface) { - if (null === $sample->getConfiguration()) { - $doc .= "\n\n*Default* configuration."; - } else { - $doc .= sprintf( - "\n\nWith configuration: ``%s``.", - HelpCommand::toString($sample->getConfiguration()) - ); - } - } - - $doc .= "\n".$this->generateSampleDiff($fixer, $sample, $index + 1, $name); - } - } - - $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' : ''; - $doc .= << $config) { - $ruleSetPath = $this->getRuleSetsDocumentationFilePath($set); - $ruleSetPath = substr($ruleSetPath, strrpos($ruleSetPath, '/')); - - $doc .= <<`_ rule set will enable the ``{$name}`` rule -RST; - - if (null !== $config) { - $doc .= " with the config below:\n\n ``".HelpCommand::toString($config).'``'; - } elseif ($fixer instanceof ConfigurableFixerInterface) { - $doc .= ' with the default config.'; - } else { - $doc .= '.'; - } - } - } - - return "{$doc}\n"; - } - - public function getRuleSetsDocumentationDirectoryPath(): string - { - return $this->path.'/ruleSets'; - } - - public function getRuleSetsDocumentationIndexFilePath(): string - { - return $this->getRuleSetsDocumentationDirectoryPath().'/index.rst'; - } - - /** - * @param AbstractFixer[] $fixers - */ - public function generateRuleSetsDocumentation(RuleSetDescriptionInterface $definition, array $fixers): string - { - $fixerNames = []; - foreach ($fixers as $fixer) { - $fixerNames[$fixer->getName()] = $fixer; - } - - $title = "Rule set ``{$definition->getName()}``"; - $titleLine = str_repeat('=', \strlen($title)); - $doc = "{$titleLine}\n{$title}\n{$titleLine}\n\n".$definition->getDescription(); - if ($definition->isRisky()) { - $doc .= ' This set contains rules that are risky.'; - } - $doc .= "\n\n"; - - $rules = $definition->getRules(); - - if (\count($rules) < 1) { - $doc .= 'This is an empty set.'; - } else { - $doc .= "Rules\n-----\n"; - - foreach ($rules as $rule => $config) { - if ('@' === $rule[0]) { - $ruleSetPath = $this->getRuleSetsDocumentationFilePath($rule); - $ruleSetPath = substr($ruleSetPath, strrpos($ruleSetPath, '/')); - - $doc .= "\n- `{$rule} <.{$ruleSetPath}>`_"; - } else { - $path = Preg::replace( - '#^'.preg_quote($this->getFixersDocumentationDirectoryPath(), '#').'/#', - './../rules/', - $this->getFixerDocumentationFilePath($fixerNames[$rule]) - ); - - $doc .= "\n- `{$rule} <{$path}>`_"; - } - - if (!\is_bool($config)) { - $doc .= "\n config:\n ``".HelpCommand::toString($config).'``'; - } - } - } - - return $doc."\n"; - } - - public function getRuleSetsDocumentationFilePath(string $name): string - { - return $this->getRuleSetsDocumentationDirectoryPath().'/'.str_replace(':risky', 'Risky', ucfirst(substr($name, 1))).'.rst'; - } - - public function generateRuleSetsDocumentationIndex(array $setDefinitions): string - { - $documentation = <<<'RST' -=========================== -List of Available Rule sets -=========================== -RST; - foreach ($setDefinitions as $name => $path) { - $path = substr($path, strrpos($path, '/')); - $documentation .= "\n- `{$name} <.{$path}>`_"; - } - - return $documentation."\n"; - } - - private function generateSampleDiff(FixerInterface $fixer, CodeSampleInterface $sample, int $sampleNumber, string $ruleName): string - { - if ($sample instanceof VersionSpecificCodeSampleInterface && !$sample->isSuitableFor(\PHP_VERSION_ID)) { - $existingFile = @file_get_contents($this->getFixerDocumentationFilePath($fixer)); - - if (false !== $existingFile) { - Preg::match("/\\RExample #{$sampleNumber}\\R.+?(?\\R\\.\\. code-block:: diff\\R\\R.*?)\\R(?:\\R\\S|$)/s", $existingFile, $matches); - - if (isset($matches['diff'])) { - return $matches['diff']; - } - } - - $error = <<getCode(); - - $tokens = Tokens::fromCode($old); - $file = $sample instanceof FileSpecificCodeSampleInterface - ? $sample->getSplFileInfo() - : new StdinFileInfo() - ; - - if ($fixer instanceof ConfigurableFixerInterface) { - $configuration = $sample->getConfiguration(); - - if (null === $configuration) { - $configuration = []; - } - - $fixer->configure($configuration); - } - - $fixer->fix($file, $tokens); - - $diff = $this->differ->diff($old, $tokens->generateCode()); - $diff = Preg::replace('/@@[ \+\-\d,]+@@\n/', '', $diff); - $diff = Preg::replace('/\r/', '^M', $diff); - $diff = Preg::replace('/^ $/m', '', $diff); - $diff = Preg::replace('/\n$/', '', $diff); - - return <<indent($diff, 3)} -RST; - } - - private function toRst(string $string, int $indent = 0): string - { - $string = wordwrap(Preg::replace('/(?indent($string, $indent); - } - - return $string; - } - - private function indent(string $string, int $indent): string - { - return Preg::replace('/(\n)(?!\n|$)/', '$1'.str_repeat(' ', $indent), $string); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Error/Error.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Error/Error.php deleted file mode 100644 index f4e30a1..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Error/Error.php +++ /dev/null @@ -1,99 +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\Error; - -/** - * An abstraction for errors that can occur before and during fixing. - * - * @author Andreas Möller - * - * @internal - */ -final class Error -{ - /** - * Error which has occurred in linting phase, before applying any fixers. - */ - public const TYPE_INVALID = 1; - - /** - * Error which has occurred during fixing phase. - */ - public const TYPE_EXCEPTION = 2; - - /** - * Error which has occurred in linting phase, after applying any fixers. - */ - public const TYPE_LINT = 3; - - /** - * @var int - */ - private $type; - - /** - * @var string - */ - private $filePath; - - /** - * @var null|\Throwable - */ - private $source; - - /** - * @var array - */ - private $appliedFixers; - - /** - * @var null|string - */ - private $diff; - - public function __construct(int $type, string $filePath, ?\Throwable $source = null, array $appliedFixers = [], ?string $diff = null) - { - $this->type = $type; - $this->filePath = $filePath; - $this->source = $source; - $this->appliedFixers = $appliedFixers; - $this->diff = $diff; - } - - public function getFilePath(): string - { - return $this->filePath; - } - - public function getSource(): ?\Throwable - { - return $this->source; - } - - public function getType(): int - { - return $this->type; - } - - public function getAppliedFixers(): array - { - return $this->appliedFixers; - } - - public function getDiff(): ?string - { - return $this->diff; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Error/ErrorsManager.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Error/ErrorsManager.php deleted file mode 100644 index b2b8308..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Error/ErrorsManager.php +++ /dev/null @@ -1,79 +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\Error; - -/** - * Manager of errors that occur during fixing. - * - * @author Dariusz Rumiński - * - * @internal - */ -final class ErrorsManager -{ - /** - * @var Error[] - */ - private $errors = []; - - /** - * Returns errors reported during linting before fixing. - * - * @return Error[] - */ - public function getInvalidErrors(): array - { - return array_filter($this->errors, static function (Error $error) { - return Error::TYPE_INVALID === $error->getType(); - }); - } - - /** - * Returns errors reported during fixing. - * - * @return Error[] - */ - public function getExceptionErrors(): array - { - return array_filter($this->errors, static function (Error $error) { - return Error::TYPE_EXCEPTION === $error->getType(); - }); - } - - /** - * Returns errors reported during linting after fixing. - * - * @return Error[] - */ - public function getLintErrors(): array - { - return array_filter($this->errors, static function (Error $error) { - return Error::TYPE_LINT === $error->getType(); - }); - } - - /** - * Returns true if no errors were reported. - */ - public function isEmpty(): bool - { - return empty($this->errors); - } - - public function report(Error $error): void - { - $this->errors[] = $error; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FileReader.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FileReader.php deleted file mode 100644 index 6f81e40..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FileReader.php +++ /dev/null @@ -1,73 +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; - -/** - * File reader that unify access to regular file and stdin-alike file. - * - * Regular file could be read multiple times with `file_get_contents`, but file provided on stdin can not. - * Consecutive try will provide empty content for stdin-alike file. - * This reader unifies access to them. - * - * @internal - */ -final class FileReader -{ - /** - * @var null|string - */ - private $stdinContent; - - public static function createSingleton(): self - { - static $instance = null; - - if (!$instance) { - $instance = new self(); - } - - return $instance; - } - - public function read(string $filePath): string - { - if ('php://stdin' === $filePath) { - if (null === $this->stdinContent) { - $this->stdinContent = $this->readRaw($filePath); - } - - return $this->stdinContent; - } - - return $this->readRaw($filePath); - } - - private function readRaw(string $realPath): string - { - $content = @file_get_contents($realPath); - - if (false === $content) { - $error = error_get_last(); - - throw new \RuntimeException(sprintf( - 'Failed to read content from "%s".%s', - $realPath, - $error ? ' '.$error['message'] : '' - )); - } - - return $content; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FileRemoval.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FileRemoval.php deleted file mode 100644 index 6264d3b..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FileRemoval.php +++ /dev/null @@ -1,98 +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; - -/** - * Handles files removal with possibility to remove them on shutdown. - * - * @author Adam Klvač - * @author Dariusz Rumiński - * - * @internal - */ -final class FileRemoval -{ - /** - * List of observed files to be removed. - * - * @var array - */ - private $files = []; - - public function __construct() - { - register_shutdown_function([$this, 'clean']); - } - - public function __destruct() - { - $this->clean(); - } - - /** - * This class is not intended to be serialized, - * and cannot be deserialized (see __wakeup method). - */ - public function __sleep(): array - { - throw new \BadMethodCallException('Cannot serialize '.__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 '.__CLASS__); - } - - /** - * Adds a file to be removed. - */ - public function observe(string $path): void - { - $this->files[$path] = true; - } - - /** - * Removes a file from shutdown removal. - */ - public function delete(string $path): void - { - if (isset($this->files[$path])) { - unset($this->files[$path]); - } - $this->unlink($path); - } - - /** - * Removes attached files. - */ - public function clean(): void - { - foreach ($this->files as $file => $value) { - $this->unlink($file); - } - $this->files = []; - } - - private function unlink(string $path): void - { - @unlink($path); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Finder.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Finder.php deleted file mode 100644 index 161937e..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Finder.php +++ /dev/null @@ -1,35 +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; - -use Symfony\Component\Finder\Finder as BaseFinder; - -/** - * @author Fabien Potencier - * @author Dariusz Rumiński - */ -class Finder extends BaseFinder -{ - public function __construct() - { - parent::__construct(); - - $this - ->files() - ->name('*.php') - ->exclude('vendor') - ; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/AbstractIncrementOperatorFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/AbstractIncrementOperatorFixer.php deleted file mode 100644 index 3a2db98..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/AbstractIncrementOperatorFixer.php +++ /dev/null @@ -1,58 +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\Fixer; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Tokenizer\Tokens; - -abstract class AbstractIncrementOperatorFixer extends AbstractFixer -{ - final protected function findStart(Tokens $tokens, int $index): int - { - do { - $index = $tokens->getPrevMeaningfulToken($index); - $token = $tokens[$index]; - - $blockType = Tokens::detectBlockType($token); - if (null !== $blockType && !$blockType['isStart']) { - $index = $tokens->findBlockStart($blockType['type'], $index); - $token = $tokens[$index]; - } - } while (!$token->equalsAny(['$', [T_VARIABLE]])); - - $prevIndex = $tokens->getPrevMeaningfulToken($index); - $prevToken = $tokens[$prevIndex]; - - if ($prevToken->equals('$')) { - return $this->findStart($tokens, $index); - } - - if ($prevToken->isObjectOperator()) { - return $this->findStart($tokens, $prevIndex); - } - - if ($prevToken->isGivenKind(T_PAAMAYIM_NEKUDOTAYIM)) { - $prevPrevIndex = $tokens->getPrevMeaningfulToken($prevIndex); - if (!$tokens[$prevPrevIndex]->isGivenKind([T_STATIC, T_STRING])) { - return $this->findStart($tokens, $prevIndex); - } - - $index = $tokens->getTokenNotOfKindsSibling($prevIndex, -1, [T_NS_SEPARATOR, T_STATIC, T_STRING]); - $index = $tokens->getNextMeaningfulToken($index); - } - - return $index; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/AbstractPhpUnitFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/AbstractPhpUnitFixer.php deleted file mode 100644 index 42a92a7..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/AbstractPhpUnitFixer.php +++ /dev/null @@ -1,58 +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\Fixer; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Indicator\PhpUnitTestCaseIndicator; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @internal - */ -abstract class AbstractPhpUnitFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - final public function isCandidate(Tokens $tokens): bool - { - return $tokens->isAllTokenKindsFound([T_CLASS, T_STRING]); - } - - final protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $phpUnitTestCaseIndicator = new PhpUnitTestCaseIndicator(); - - foreach ($phpUnitTestCaseIndicator->findPhpUnitClasses($tokens) as $indices) { - $this->applyPhpUnitClassFix($tokens, $indices[0], $indices[1]); - } - } - - abstract protected function applyPhpUnitClassFix(Tokens $tokens, int $startIndex, int $endIndex): void; - - final protected function getDocBlockIndex(Tokens $tokens, int $index): int - { - do { - $index = $tokens->getPrevNonWhitespace($index); - } while ($tokens[$index]->isGivenKind([T_PUBLIC, T_PROTECTED, T_PRIVATE, T_FINAL, T_ABSTRACT, T_COMMENT])); - - return $index; - } - - final protected function isPHPDoc(Tokens $tokens, int $index): bool - { - return $tokens[$index]->isGivenKind(T_DOC_COMMENT); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/ArrayPushFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/ArrayPushFixer.php deleted file mode 100644 index b4923b8..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/ArrayPushFixer.php +++ /dev/null @@ -1,222 +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\Fixer\Alias; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\FixerDefinition\VersionSpecification; -use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample; -use PhpCsFixer\Tokenizer\Analyzer\FunctionsAnalyzer; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author SpacePossum - */ -final class ArrayPushFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Converts simple usages of `array_push($x, $y);` to `$x[] = $y;`.', - [new VersionSpecificCodeSample("= 70000 && $tokens->isTokenKindFound(T_STRING) && $tokens->count() > 7; - } - - /** - * {@inheritdoc} - */ - public function isRisky(): bool - { - return true; - } - - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $functionsAnalyzer = new FunctionsAnalyzer(); - - for ($index = $tokens->count() - 7; $index > 0; --$index) { - if (!$tokens[$index]->equals([T_STRING, 'array_push'], false)) { - continue; - } - - if (!$functionsAnalyzer->isGlobalFunctionCall($tokens, $index)) { - continue; // redeclare/override - } - - // meaningful before must be `getPrevMeaningfulToken($index); - $namespaceSeparatorIndex = null; - - if ($tokens[$index]->isGivenKind(T_NS_SEPARATOR)) { - $namespaceSeparatorIndex = $index; - $index = $tokens->getPrevMeaningfulToken($index); - } - - if (!$tokens[$index]->equalsAny([';', '{', '}', ')', [T_OPEN_TAG]])) { - continue; - } - - // figure out where the arguments list opens - - $openBraceIndex = $tokens->getNextMeaningfulToken($callIndex); - $blockType = Tokens::detectBlockType($tokens[$openBraceIndex]); - - if (null === $blockType || Tokens::BLOCK_TYPE_PARENTHESIS_BRACE !== $blockType['type']) { - continue; - } - - // figure out where the arguments list closes - - $closeBraceIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $openBraceIndex); - - // meaningful after `)` must be `;`, `? >` or nothing - - $afterCloseBraceIndex = $tokens->getNextMeaningfulToken($closeBraceIndex); - - if (null !== $afterCloseBraceIndex && !$tokens[$afterCloseBraceIndex]->equalsAny([';', [T_CLOSE_TAG]])) { - continue; - } - - // must have 2 arguments - - // first argument must be a variable (with possibly array indexing etc.), - // after that nothing meaningful should be there till the next `,` or `)` - // if `)` than we cannot fix it (it is a single argument call) - - $firstArgumentStop = $this->getFirstArgumentEnd($tokens, $openBraceIndex); - $firstArgumentStop = $tokens->getNextMeaningfulToken($firstArgumentStop); - - if (!$tokens[$firstArgumentStop]->equals(',')) { - return; - } - - // second argument can be about anything but ellipsis, we must make sure there is not - // a third argument (or more) passed to `array_push` - - $secondArgumentStart = $tokens->getNextMeaningfulToken($firstArgumentStop); - $secondArgumentStop = $this->getSecondArgumentEnd($tokens, $secondArgumentStart, $closeBraceIndex); - - if (null === $secondArgumentStop) { - continue; - } - - // candidate is valid, replace tokens - - $tokens->clearTokenAndMergeSurroundingWhitespace($closeBraceIndex); - $tokens->clearTokenAndMergeSurroundingWhitespace($firstArgumentStop); - $tokens->insertAt( - $firstArgumentStop, - [ - new Token('['), - new Token(']'), - new Token([T_WHITESPACE, ' ']), - new Token('='), - ] - ); - $tokens->clearTokenAndMergeSurroundingWhitespace($openBraceIndex); - $tokens->clearTokenAndMergeSurroundingWhitespace($callIndex); - - if (null !== $namespaceSeparatorIndex) { - $tokens->clearTokenAndMergeSurroundingWhitespace($namespaceSeparatorIndex); - } - } - } - - private function getFirstArgumentEnd(Tokens $tokens, int $index): int - { - $nextIndex = $tokens->getNextMeaningfulToken($index); - $nextToken = $tokens[$nextIndex]; - - while ($nextToken->equalsAny([ - '$', - '[', - '(', - [CT::T_ARRAY_INDEX_CURLY_BRACE_OPEN], - [CT::T_DYNAMIC_PROP_BRACE_OPEN], - [CT::T_DYNAMIC_VAR_BRACE_OPEN], - [CT::T_NAMESPACE_OPERATOR], - [T_NS_SEPARATOR], - [T_STATIC], - [T_STRING], - [T_VARIABLE], - ])) { - $blockType = Tokens::detectBlockType($nextToken); - - if (null !== $blockType) { - $nextIndex = $tokens->findBlockEnd($blockType['type'], $nextIndex); - } - - $index = $nextIndex; - $nextIndex = $tokens->getNextMeaningfulToken($nextIndex); - $nextToken = $tokens[$nextIndex]; - } - - if ($nextToken->isGivenKind(T_OBJECT_OPERATOR)) { - return $this->getFirstArgumentEnd($tokens, $nextIndex); - } - - if ($nextToken->isGivenKind(T_PAAMAYIM_NEKUDOTAYIM)) { - return $this->getFirstArgumentEnd($tokens, $tokens->getNextMeaningfulToken($nextIndex)); - } - - return $index; - } - - /** - * @param int $endIndex boundary, i.e. tokens index of `)` - */ - private function getSecondArgumentEnd(Tokens $tokens, int $index, int $endIndex): ?int - { - if ($tokens[$index]->isGivenKind(T_ELLIPSIS)) { - return null; - } - - $index = $tokens->getNextMeaningfulToken($index); - - for (; $index <= $endIndex; ++$index) { - $blockType = Tokens::detectBlockType($tokens[$index]); - - while (null !== $blockType && $blockType['isStart']) { - $index = $tokens->findBlockEnd($blockType['type'], $index); - $index = $tokens->getNextMeaningfulToken($index); - $blockType = Tokens::detectBlockType($tokens[$index]); - } - - if ($tokens[$index]->equals(',') || $tokens[$index]->isGivenKind([T_YIELD, T_YIELD_FROM, T_LOGICAL_AND, T_LOGICAL_OR, T_LOGICAL_XOR])) { - return null; - } - } - - return $endIndex; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/BacktickToShellExecFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/BacktickToShellExecFixer.php deleted file mode 100644 index d4d91dd..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/BacktickToShellExecFixer.php +++ /dev/null @@ -1,148 +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\Fixer\Alias; - -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 Filippo Tessarotto - */ -final class BacktickToShellExecFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isTokenKindFound('`'); - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Converts backtick operators to `shell_exec` calls.', - [ - new CodeSample( - <<<'EOT' -call()}`; - -EOT - ), - ], - 'Conversion is done only when it is non risky, so when special chars like single-quotes, double-quotes and backticks are not used inside the command.' - ); - } - - /** - * {@inheritdoc} - * - * Must run before EscapeImplicitBackslashesFixer, ExplicitStringVariableFixer, NativeFunctionInvocationFixer, SingleQuoteFixer. - */ - public function getPriority(): int - { - return 2; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $backtickStarted = false; - $backtickTokens = []; - for ($index = $tokens->count() - 1; $index > 0; --$index) { - $token = $tokens[$index]; - if (!$token->equals('`')) { - if ($backtickStarted) { - $backtickTokens[$index] = $token; - } - - continue; - } - - $backtickTokens[$index] = $token; - if ($backtickStarted) { - $this->fixBackticks($tokens, $backtickTokens); - $backtickTokens = []; - } - $backtickStarted = !$backtickStarted; - } - } - - /** - * Override backtick code with corresponding double-quoted string. - */ - private function fixBackticks(Tokens $tokens, array $backtickTokens): void - { - // Track indexes for final override - ksort($backtickTokens); - $openingBacktickIndex = key($backtickTokens); - end($backtickTokens); - $closingBacktickIndex = key($backtickTokens); - - // Strip enclosing backticks - array_shift($backtickTokens); - array_pop($backtickTokens); - - // Double-quoted strings are parsed differently if they contain - // variables or not, so we need to build the new token array accordingly - $count = \count($backtickTokens); - - $newTokens = [ - new Token([T_STRING, 'shell_exec']), - new Token('('), - ]; - if (1 !== $count) { - $newTokens[] = new Token('"'); - } - foreach ($backtickTokens as $token) { - if (!$token->isGivenKind(T_ENCAPSED_AND_WHITESPACE)) { - $newTokens[] = $token; - - continue; - } - $content = $token->getContent(); - // Escaping special chars depends on the context: too tricky - if (Preg::match('/[`"\']/u', $content)) { - return; - } - - $kind = T_ENCAPSED_AND_WHITESPACE; - if (1 === $count) { - $content = '"'.$content.'"'; - $kind = T_CONSTANT_ENCAPSED_STRING; - } - - $newTokens[] = new Token([$kind, $content]); - } - if (1 !== $count) { - $newTokens[] = new Token('"'); - } - $newTokens[] = new Token(')'); - - $tokens->overrideRange($openingBacktickIndex, $closingBacktickIndex, $newTokens); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/EregToPregFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/EregToPregFixer.php deleted file mode 100644 index 1cfc7e8..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/EregToPregFixer.php +++ /dev/null @@ -1,184 +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\Fixer\Alias; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Preg; -use PhpCsFixer\PregException; -use PhpCsFixer\Tokenizer\Analyzer\FunctionsAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Matteo Beccati - */ -final class EregToPregFixer extends AbstractFixer -{ - /** - * @var array 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 $functions = [ - ['ereg', 'preg_match', ''], - ['eregi', 'preg_match', 'i'], - ['ereg_replace', 'preg_replace', ''], - ['eregi_replace', 'preg_replace', 'i'], - ['split', 'preg_split', ''], - ['spliti', 'preg_split', 'i'], - ]; - - /** - * @var array the list of preg delimiters, in order of preference - */ - private static $delimiters = ['/', '#', '!']; - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Replace deprecated `ereg` regular expression functions with `preg`.', - [new CodeSample("isTokenKindFound(T_STRING); - } - - /** - * {@inheritdoc} - */ - public function isRisky(): bool - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $end = $tokens->count() - 1; - $functionsAnalyzer = new FunctionsAnalyzer(); - - 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; - while (null !== $currIndex) { - $match = $tokens->findSequence($seq, $currIndex, $end, false); - - // did we find a match? - if (null === $match) { - break; - } - - // findSequence also returns the tokens, but we're only interested in the indexes, i.e.: - // 0 => function name, - // 1 => bracket "(" - // 2 => quoted string passed as 1st parameter - $match = array_keys($match); - - // advance tokenizer cursor - $currIndex = $match[2]; - - if (!$functionsAnalyzer->isGlobalFunctionCall($tokens, $match[0])) { - continue; - } - - // ensure the first parameter is just a string (e.g. has nothing appended) - $next = $tokens->getNextMeaningfulToken($match[2]); - if (null === $next || !$tokens[$next]->equalsAny([',', ')'])) { - continue; - } - - // convert to PCRE - $regexTokenContent = $tokens[$match[2]]->getContent(); - $string = substr($regexTokenContent, 1, -1); - $quote = $regexTokenContent[0]; - $delim = $this->getBestDelimiter($string); - $preg = $delim.addcslashes($string, $delim).$delim.'D'.$map[2]; - - // check if the preg is valid - if (!$this->checkPreg($preg)) { - continue; - } - - // modify function and argument - $tokens[$match[0]] = new Token([T_STRING, $map[1]]); - $tokens[$match[2]] = new Token([T_CONSTANT_ENCAPSED_STRING, $quote.$preg.$quote]); - } - } - } - - /** - * Check the validity of a PCRE. - * - * @param string $pattern the regular expression - */ - private function checkPreg(string $pattern): bool - { - try { - Preg::match($pattern, ''); - - return true; - } catch (PregException $e) { - return false; - } - } - - /** - * Get the delimiter that would require the least escaping in a regular expression. - * - * @param string $pattern the regular expression - * - * @return string the preg delimiter - */ - private function getBestDelimiter(string $pattern): string - { - // try do find something that's not used - $delimiters = []; - foreach (self::$delimiters as $k => $d) { - if (false === strpos($pattern, $d)) { - return $d; - } - - $delimiters[$d] = [substr_count($pattern, $d), $k]; - } - - // return the least used delimiter, using the position in the list as a tie breaker - uasort($delimiters, static function (array $a, array $b) { - if ($a[0] === $b[0]) { - return $a[1] <=> $b[1]; - } - - return $a[0] <=> $b[0]; - }); - - return key($delimiters); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/MbStrFunctionsFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/MbStrFunctionsFixer.php deleted file mode 100644 index b925b9f..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/MbStrFunctionsFixer.php +++ /dev/null @@ -1,133 +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\Fixer\Alias; - -use PhpCsFixer\AbstractFunctionReferenceFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Analyzer\ArgumentsAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Filippo Tessarotto - */ -final class MbStrFunctionsFixer extends AbstractFunctionReferenceFixer -{ - /** - * @var array the list of the string-related function names and their mb_ equivalent - */ - private static $functionsMap = [ - 'str_split' => ['alternativeName' => 'mb_str_split', 'argumentCount' => [1, 2, 3]], - 'stripos' => ['alternativeName' => 'mb_stripos', 'argumentCount' => [2, 3]], - 'stristr' => ['alternativeName' => 'mb_stristr', 'argumentCount' => [2, 3]], - 'strlen' => ['alternativeName' => 'mb_strlen', 'argumentCount' => [1]], - 'strpos' => ['alternativeName' => 'mb_strpos', 'argumentCount' => [2, 3]], - 'strrchr' => ['alternativeName' => 'mb_strrchr', 'argumentCount' => [2]], - 'strripos' => ['alternativeName' => 'mb_strripos', 'argumentCount' => [2, 3]], - 'strrpos' => ['alternativeName' => 'mb_strrpos', 'argumentCount' => [2, 3]], - 'strstr' => ['alternativeName' => 'mb_strstr', 'argumentCount' => [2, 3]], - 'strtolower' => ['alternativeName' => 'mb_strtolower', 'argumentCount' => [1]], - 'strtoupper' => ['alternativeName' => 'mb_strtoupper', 'argumentCount' => [1]], - 'substr' => ['alternativeName' => 'mb_substr', 'argumentCount' => [2, 3]], - 'substr_count' => ['alternativeName' => 'mb_substr_count', 'argumentCount' => [2, 3, 4]], - ]; - - /** - * @var array - */ - private $functions; - - public function __construct() - { - parent::__construct(); - - $this->functions = array_filter( - self::$functionsMap, - static function (array $mapping) { - return \function_exists($mapping['alternativeName']) && (new \ReflectionFunction($mapping['alternativeName']))->isInternal(); - } - ); - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Replace non multibyte-safe functions with corresponding mb function.', - [ - new CodeSample( - 'isTokenKindFound(T_STRING); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $argumentsAnalyzer = new ArgumentsAnalyzer(); - foreach ($this->functions as $functionIdentity => $functionReplacement) { - $currIndex = 0; - while (null !== $currIndex) { - // 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; - } - - [$functionName, $openParenthesis, $closeParenthesis] = $boundaries; - $count = $argumentsAnalyzer->countArguments($tokens, $openParenthesis, $closeParenthesis); - if (!\in_array($count, $functionReplacement['argumentCount'], true)) { - continue 2; - } - - // analysing cursor shift, so nested calls could be processed - $currIndex = $openParenthesis; - - $tokens[$functionName] = new Token([T_STRING, $functionReplacement['alternativeName']]); - } - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/NoAliasFunctionsFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/NoAliasFunctionsFixer.php deleted file mode 100644 index 2579b25..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/NoAliasFunctionsFixer.php +++ /dev/null @@ -1,338 +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\Fixer\Alias; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -use PhpCsFixer\FixerConfiguration\AllowedValueSubset; -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\ArgumentsAnalyzer; -use PhpCsFixer\Tokenizer\Analyzer\FunctionsAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Vladimir Reznichenko - * @author Dariusz Rumiński - */ -final class NoAliasFunctionsFixer extends AbstractFixer implements ConfigurableFixerInterface -{ - private const SETS = [ - '@internal' => [ - 'dir' => 'getdir', - 'diskfreespace' => 'disk_free_space', - - 'checkdnsrr' => 'dns_check_record', - 'getmxrr' => 'dns_get_mx', - - 'session_commit' => 'session_write_close', - - 'stream_register_wrapper' => 'stream_wrapper_register', - 'set_file_buffer' => 'stream_set_write_buffer', - 'socket_set_blocking' => 'stream_set_blocking', - 'socket_get_status' => 'stream_get_meta_data', - 'socket_set_timeout' => 'stream_set_timeout', - 'socket_getopt' => 'socket_get_option', - 'socket_setopt' => 'socket_set_option', - - 'chop' => 'rtrim', - 'close' => 'closedir', - 'doubleval' => 'floatval', - 'fputs' => 'fwrite', - 'get_required_files' => 'get_included_files', - 'ini_alter' => 'ini_set', - 'is_double' => 'is_float', - 'is_integer' => 'is_int', - 'is_long' => 'is_int', - 'is_real' => 'is_float', - 'is_writeable' => 'is_writable', - 'join' => 'implode', - 'key_exists' => 'array_key_exists', - 'magic_quotes_runtime' => 'set_magic_quotes_runtime', - 'pos' => 'current', - 'show_source' => 'highlight_file', - 'sizeof' => 'count', - 'strchr' => 'strstr', - 'user_error' => 'trigger_error', - ], - - '@IMAP' => [ - 'imap_create' => 'imap_createmailbox', - 'imap_fetchtext' => 'imap_body', - 'imap_header' => 'imap_headerinfo', - 'imap_listmailbox' => 'imap_list', - 'imap_listsubscribed' => 'imap_lsub', - 'imap_rename' => 'imap_renamemailbox', - 'imap_scan' => 'imap_listscan', - 'imap_scanmailbox' => 'imap_listscan', - ], - - '@snmp' => [ - 'snmpwalkoid' => 'snmprealwalk', - 'snmp_set_oid_numeric_print' => 'snmp_set_oid_output_format', - ], - - '@ldap' => [ - 'ldap_close' => 'ldap_unbind', - 'ldap_get_values' => 'ldap_get_values_len', - 'ldap_modify' => 'ldap_mod_replace', - ], - - '@mysqli' => [ - 'mysqli_execute' => 'mysqli_stmt_execute', - 'mysqli_set_opt' => 'mysqli_options', - 'mysqli_escape_string' => 'mysqli_real_escape_string', - ], - - '@pg' => [ - 'pg_exec' => 'pg_query', - ], - - '@oci' => [ - 'oci_free_cursor' => 'oci_free_statement', - ], - - '@odbc' => [ - 'odbc_do' => 'odbc_exec', - 'odbc_field_precision' => 'odbc_field_len', - ], - - '@mbreg' => [ - 'mbereg' => 'mb_ereg', - 'mbereg_match' => 'mb_ereg_match', - 'mbereg_replace' => 'mb_ereg_replace', - 'mbereg_search' => 'mb_ereg_search', - 'mbereg_search_getpos' => 'mb_ereg_search_getpos', - 'mbereg_search_getregs' => 'mb_ereg_search_getregs', - 'mbereg_search_init' => 'mb_ereg_search_init', - 'mbereg_search_pos' => 'mb_ereg_search_pos', - 'mbereg_search_regs' => 'mb_ereg_search_regs', - 'mbereg_search_setpos' => 'mb_ereg_search_setpos', - 'mberegi' => 'mb_eregi', - 'mberegi_replace' => 'mb_eregi_replace', - 'mbregex_encoding' => 'mb_regex_encoding', - 'mbsplit' => 'mb_split', - ], - - '@openssl' => [ - 'openssl_get_publickey' => 'openssl_pkey_get_public', - 'openssl_get_privatekey' => 'openssl_pkey_get_private', - ], - - '@sodium' => [ - 'sodium_crypto_scalarmult_base' => 'sodium_crypto_box_publickey_from_secretkey', - ], - - '@exif' => [ - 'read_exif_data' => 'exif_read_data', - ], - - '@ftp' => [ - 'ftp_quit' => 'ftp_close', - ], - - '@posix' => [ - 'posix_errno' => 'posix_get_last_error', - ], - - '@pcntl' => [ - 'pcntl_errno' => 'pcntl_get_last_error', - ], - - '@time' => [ - 'mktime' => ['time', 0], - 'gmmktime' => ['time', 0], - ], - ]; - - /** @var array|string> stores alias (key) - master (value) functions mapping */ - private $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]); - } - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Master functions shall be used instead of aliases.', - [ - new CodeSample( - ' ['@mbreg']] - ), - ], - null, - 'Risky when any of the alias functions are overridden.' - ); - } - - /** - * {@inheritdoc} - * - * Must run before ImplodeCallFixer, PhpUnitDedicateAssertFixer. - */ - public function getPriority(): int - { - return 40; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isTokenKindFound(T_STRING); - } - - /** - * {@inheritdoc} - */ - public function isRisky(): bool - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $functionsAnalyzer = new FunctionsAnalyzer(); - $argumentsAnalyzer = new ArgumentsAnalyzer(); - - /** @var Token $token */ - foreach ($tokens->findGivenKind(T_STRING) as $index => $token) { - // check mapping hit - $tokenContent = strtolower($token->getContent()); - if (!isset($this->aliases[$tokenContent])) { - continue; - } - - // skip expressions without parameters list - $openParenthesis = $tokens->getNextMeaningfulToken($index); - - if (!$tokens[$openParenthesis]->equals('(')) { - continue; - } - - if (!$functionsAnalyzer->isGlobalFunctionCall($tokens, $index)) { - continue; - } - - if (\is_array($this->aliases[$tokenContent])) { - [$alias, $numberOfArguments] = $this->aliases[$tokenContent]; - - $count = $argumentsAnalyzer->countArguments($tokens, $openParenthesis, $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $openParenthesis)); - - if ($numberOfArguments !== $count) { - continue; - } - } else { - $alias = $this->aliases[$tokenContent]; - } - - $tokens[$index] = new Token([T_STRING, $alias]); - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - $sets = [ - '@all' => 'all listed sets', - '@internal' => 'native functions', - '@exif' => 'EXIF functions', - '@ftp' => 'FTP functions', - '@IMAP' => 'IMAP functions', - '@ldap' => 'LDAP functions', - '@mbreg' => 'from `ext-mbstring`', - '@mysqli' => 'mysqli functions', - '@oci' => 'oci functions', - '@odbc' => 'odbc functions', - '@openssl' => 'openssl functions', - '@pcntl' => 'PCNTL functions', - '@pg' => 'pg functions', - '@posix' => 'POSIX functions', - '@snmp' => 'SNMP functions', - '@sodium' => 'libsodium functions', - '@time' => 'time functions', - ]; - - $list = ''; - foreach ($sets as $set => $description) { - $list .= sprintf("* `%s` (%s)\n", $set, $description); - } - $list = sprintf("List of sets to fix. Defined sets are:\n\n%s", $list); - - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('sets', $list)) - ->setAllowedTypes(['array']) - ->setAllowedValues([new AllowedValueSubset(array_keys($sets))]) - ->setDefault(['@internal', '@IMAP', '@pg']) - ->getOption(), - ]); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/NoAliasLanguageConstructCallFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/NoAliasLanguageConstructCallFixer.php deleted file mode 100644 index 41eab1c..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/NoAliasLanguageConstructCallFixer.php +++ /dev/null @@ -1,71 +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\Fixer\Alias; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author SpacePossum - */ -final class NoAliasLanguageConstructCallFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Master language constructs shall be used instead of aliases.', - [ - new CodeSample( - 'isTokenKindFound(T_EXIT); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind(T_EXIT)) { - continue; - } - - if ('exit' === strtolower($token->getContent())) { - continue; - } - - $tokens[$index] = new Token([T_EXIT, 'exit']); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/NoMixedEchoPrintFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/NoMixedEchoPrintFixer.php deleted file mode 100644 index 0e899a4..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/NoMixedEchoPrintFixer.php +++ /dev/null @@ -1,155 +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\Fixer\Alias; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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; - -/** - * @author Sullivan Senechal - * @author SpacePossum - */ -final class NoMixedEchoPrintFixer extends AbstractFixer implements ConfigurableFixerInterface -{ - /** - * @var string - */ - private $callBack; - - /** - * @var int T_ECHO or T_PRINT - */ - private $candidateTokenType; - - /** - * {@inheritdoc} - */ - 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'; - } - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Either language construct `print` or `echo` should be used.', - [ - new CodeSample(" 'print']), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run after EchoTagSyntaxFixer. - */ - public function getPriority(): int - { - return -10; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isTokenKindFound($this->candidateTokenType); - } - - /** - * {@inheritdoc} - */ - 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); - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('use', 'The desired language construct.')) - ->setAllowedValues(['print', 'echo']) - ->setDefault('echo') - ->getOption(), - ]); - } - - private function fixEchoToPrint(Tokens $tokens, int $index): void - { - $nextTokenIndex = $tokens->getNextMeaningfulToken($index); - $endTokenIndex = $tokens->getNextTokenOfKind($index, [';', [T_CLOSE_TAG]]); - $canBeConverted = true; - - for ($i = $nextTokenIndex; $i < $endTokenIndex; ++$i) { - if ($tokens[$i]->equalsAny(['(', [CT::T_ARRAY_SQUARE_BRACE_OPEN]])) { - $blockType = Tokens::detectBlockType($tokens[$i]); - $i = $tokens->findBlockEnd($blockType['type'], $i); - } - - if ($tokens[$i]->equals(',')) { - $canBeConverted = false; - - break; - } - } - - if (false === $canBeConverted) { - return; - } - - $tokens[$index] = new Token([T_PRINT, 'print']); - } - - private function fixPrintToEcho(Tokens $tokens, int $index): void - { - $prevToken = $tokens[$tokens->getPrevMeaningfulToken($index)]; - - if (!$prevToken->equalsAny([';', '{', '}', ')', [T_OPEN_TAG], [T_ELSE]])) { - return; - } - - $tokens[$index] = new Token([T_ECHO, 'echo']); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/PowToExponentiationFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/PowToExponentiationFixer.php deleted file mode 100644 index 8e3836f..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/PowToExponentiationFixer.php +++ /dev/null @@ -1,233 +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\Fixer\Alias; - -use PhpCsFixer\AbstractFunctionReferenceFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Analyzer\ArgumentsAnalyzer; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author SpacePossum - */ -final class PowToExponentiationFixer extends AbstractFunctionReferenceFixer -{ - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - // minimal candidate to fix is seven tokens: pow(x,y); - return $tokens->count() > 7 && $tokens->isTokenKindFound(T_STRING); - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Converts `pow` to the `**` operator.', - [ - new CodeSample( - "findPowCalls($tokens); - $argumentsAnalyzer = new ArgumentsAnalyzer(); - $numberOfTokensAdded = 0; - $previousCloseParenthesisIndex = \count($tokens); - - foreach (array_reverse($candidates) as $candidate) { - // if in the previous iteration(s) tokens were added to the collection and this is done within the tokens - // indexes of the current candidate than the index of the close ')' of the candidate has moved and so - // the index needs to be updated - if ($previousCloseParenthesisIndex < $candidate[2]) { - $previousCloseParenthesisIndex = $candidate[2]; - $candidate[2] += $numberOfTokensAdded; - } else { - $previousCloseParenthesisIndex = $candidate[2]; - $numberOfTokensAdded = 0; - } - - $arguments = $argumentsAnalyzer->getArguments($tokens, $candidate[1], $candidate[2]); - - if (2 !== \count($arguments)) { - continue; - } - - for ($i = $candidate[1]; $i < $candidate[2]; ++$i) { - if ($tokens[$i]->isGivenKind(T_ELLIPSIS)) { - continue 2; - } - } - - $numberOfTokensAdded += $this->fixPowToExponentiation( - $tokens, - $candidate[0], // functionNameIndex, - $candidate[1], // openParenthesisIndex, - $candidate[2], // closeParenthesisIndex, - $arguments - ); - } - } - - /** - * @return array[] - */ - private function findPowCalls(Tokens $tokens): array - { - $candidates = []; - - // Minimal candidate to fix is seven tokens: pow(x,y); - $end = \count($tokens) - 6; - - // First possible location is after the open token: 1 - for ($i = 1; $i < $end; ++$i) { - $candidate = $this->find('pow', $tokens, $i, $end); - - if (null === $candidate) { - break; - } - - $i = $candidate[1]; // proceed to openParenthesisIndex - $candidates[] = $candidate; - } - - return $candidates; - } - - /** - * @param array $arguments - * - * @return int number of tokens added to the collection - */ - private function fixPowToExponentiation(Tokens $tokens, int $functionNameIndex, int $openParenthesisIndex, int $closeParenthesisIndex, array $arguments): int - { - // find the argument separator ',' directly after the last token of the first argument; - // replace it with T_POW '**' - $tokens[$tokens->getNextTokenOfKind(reset($arguments), [','])] = new Token([T_POW, '**']); - - // clean up the function call tokens prt. I - $tokens->clearAt($closeParenthesisIndex); - $previousIndex = $tokens->getPrevMeaningfulToken($closeParenthesisIndex); - - if ($tokens[$previousIndex]->equals(',')) { - $tokens->clearAt($previousIndex); // trailing ',' in function call (PHP 7.3) - } - - $added = 0; - - // check if the arguments need to be wrapped in parenthesis - foreach (array_reverse($arguments, true) as $argumentStartIndex => $argumentEndIndex) { - if ($this->isParenthesisNeeded($tokens, $argumentStartIndex, $argumentEndIndex)) { - $tokens->insertAt($argumentEndIndex + 1, new Token(')')); - $tokens->insertAt($argumentStartIndex, new Token('(')); - $added += 2; - } - } - - // clean up the function call tokens prt. II - $tokens->clearAt($openParenthesisIndex); - $tokens->clearAt($functionNameIndex); - - $prevMeaningfulTokenIndex = $tokens->getPrevMeaningfulToken($functionNameIndex); - - if ($tokens[$prevMeaningfulTokenIndex]->isGivenKind(T_NS_SEPARATOR)) { - $tokens->clearAt($prevMeaningfulTokenIndex); - } - - return $added; - } - - private function isParenthesisNeeded(Tokens $tokens, int $argumentStartIndex, int $argumentEndIndex): bool - { - static $allowedKinds = null; - - if (null === $allowedKinds) { - $allowedKinds = $this->getAllowedKinds(); - } - - for ($i = $argumentStartIndex; $i <= $argumentEndIndex; ++$i) { - if ($tokens[$i]->isGivenKind($allowedKinds) || $tokens->isEmptyAt($i)) { - continue; - } - - $blockType = Tokens::detectBlockType($tokens[$i]); - - if (null !== $blockType) { - $i = $tokens->findBlockEnd($blockType['type'], $i); - - continue; - } - - if ($tokens[$i]->equals('$')) { - $i = $tokens->getNextMeaningfulToken($i); - if ($tokens[$i]->isGivenKind(CT::T_DYNAMIC_VAR_BRACE_OPEN)) { - $i = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_DYNAMIC_VAR_BRACE, $i); - - continue; - } - } - - if ($tokens[$i]->equals('+') && $tokens->getPrevMeaningfulToken($i) < $argumentStartIndex) { - continue; - } - - return true; - } - - return false; - } - - /** - * @return int[] - */ - private function getAllowedKinds(): array - { - return array_merge( - [ - T_DNUMBER, T_LNUMBER, T_VARIABLE, T_STRING, T_CONSTANT_ENCAPSED_STRING, T_DOUBLE_CAST, - T_INT_CAST, T_INC, T_DEC, T_NS_SEPARATOR, T_WHITESPACE, T_DOUBLE_COLON, T_LINE, T_COMMENT, T_DOC_COMMENT, - CT::T_NAMESPACE_OPERATOR, - ], - Token::getObjectOperatorKinds() - ); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/RandomApiMigrationFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/RandomApiMigrationFixer.php deleted file mode 100644 index 7626db9..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/RandomApiMigrationFixer.php +++ /dev/null @@ -1,178 +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\Fixer\Alias; - -use PhpCsFixer\AbstractFunctionReferenceFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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\ArgumentsAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use Symfony\Component\OptionsResolver\Exception\InvalidOptionsException; - -/** - * @author Vladimir Reznichenko - */ -final class RandomApiMigrationFixer extends AbstractFunctionReferenceFixer implements ConfigurableFixerInterface -{ - /** - * @var array - */ - private static $argumentCounts = [ - 'getrandmax' => [0], - 'mt_rand' => [1, 2], - 'rand' => [0, 2], - 'srand' => [0, 1], - 'random_int' => [0, 2], - ]; - - /** - * {@inheritdoc} - */ - 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], - ]; - } - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Replaces `rand`, `srand`, `getrandmax` functions calls with their `mt_*` analogs or `random_int`.', - [ - new CodeSample(" ['getrandmax' => 'mt_getrandmax']] - ), - new CodeSample( - " ['rand' => 'random_int']] - ), - ], - null, - 'Risky when the configured functions are overridden. Or when relying on the seed based generating of the numbers.' - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isTokenKindFound(T_STRING); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $argumentsAnalyzer = new ArgumentsAnalyzer(); - - foreach ($this->configuration['replacements'] as $functionIdentity => $functionReplacement) { - if ($functionIdentity === $functionReplacement['alternativeName']) { - continue; - } - - $currIndex = 0; - - while (null !== $currIndex) { - // 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; - } - - [$functionName, $openParenthesis, $closeParenthesis] = $boundaries; - $count = $argumentsAnalyzer->countArguments($tokens, $openParenthesis, $closeParenthesis); - - if (!\in_array($count, $functionReplacement['argumentCount'], true)) { - continue 2; - } - - // analysing cursor shift, so nested calls could be processed - $currIndex = $openParenthesis; - $tokens[$functionName] = new Token([T_STRING, $functionReplacement['alternativeName']]); - - if (0 === $count && 'random_int' === $functionReplacement['alternativeName']) { - $tokens->insertAt($currIndex + 1, [ - new Token([T_LNUMBER, '0']), - new Token(','), - new Token([T_WHITESPACE, ' ']), - new Token([T_STRING, 'getrandmax']), - new Token('('), - new Token(')'), - ]); - - $currIndex += 6; - } - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('replacements', 'Mapping between replaced functions with the new ones.')) - ->setAllowedTypes(['array']) - ->setAllowedValues([static function (array $value) { - foreach ($value as $functionName => $replacement) { - if (!\array_key_exists($functionName, self::$argumentCounts)) { - 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, - \is_object($replacement) ? \get_class($replacement) : \gettype($replacement) - )); - } - } - - return true; - }]) - ->setDefault([ - 'getrandmax' => 'mt_getrandmax', - 'rand' => 'mt_rand', // @TODO change to `random_int` as default on 4.0 - 'srand' => 'mt_srand', - ]) - ->getOption(), - ]); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/SetTypeToCastFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/SetTypeToCastFixer.php deleted file mode 100644 index ed56838..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/SetTypeToCastFixer.php +++ /dev/null @@ -1,239 +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\Fixer\Alias; - -use PhpCsFixer\AbstractFunctionReferenceFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Analyzer\ArgumentsAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author SpacePossum - */ -final class SetTypeToCastFixer extends AbstractFunctionReferenceFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Cast shall be used, not `settype`.', - [ - new CodeSample( - 'isAllTokenKindsFound([T_CONSTANT_ENCAPSED_STRING, T_STRING, T_VARIABLE]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $map = [ - 'array' => [T_ARRAY_CAST, '(array)'], - 'bool' => [T_BOOL_CAST, '(bool)'], - 'boolean' => [T_BOOL_CAST, '(bool)'], - 'double' => [T_DOUBLE_CAST, '(float)'], - 'float' => [T_DOUBLE_CAST, '(float)'], - 'int' => [T_INT_CAST, '(int)'], - 'integer' => [T_INT_CAST, '(int)'], - 'object' => [T_OBJECT_CAST, '(object)'], - 'string' => [T_STRING_CAST, '(string)'], - // note: `'null' is dealt with later on - ]; - - $argumentsAnalyzer = new ArgumentsAnalyzer(); - - foreach (array_reverse($this->findSettypeCalls($tokens)) as $candidate) { - $functionNameIndex = $candidate[0]; - - $arguments = $argumentsAnalyzer->getArguments($tokens, $candidate[1], $candidate[2]); - if (2 !== \count($arguments)) { - continue; // function must be overridden or used incorrectly - } - - $prev = $tokens->getPrevMeaningfulToken($functionNameIndex); - - if (!$tokens[$prev]->equalsAny([';', '{', '}', [T_OPEN_TAG]])) { - continue; // return value of the function is used - } - - reset($arguments); - - // --- Test first argument -------------------- - - $firstArgumentStart = key($arguments); - if ($tokens[$firstArgumentStart]->isComment() || $tokens[$firstArgumentStart]->isWhitespace()) { - $firstArgumentStart = $tokens->getNextMeaningfulToken($firstArgumentStart); - } - - if (!$tokens[$firstArgumentStart]->isGivenKind(T_VARIABLE)) { - continue; // settype only works with variables pass by reference, function must be overridden - } - - $commaIndex = $tokens->getNextMeaningfulToken($firstArgumentStart); - - if (null === $commaIndex || !$tokens[$commaIndex]->equals(',')) { - continue; // first argument is complex statement; function must be overridden - } - - // --- Test second argument ------------------- - - next($arguments); - $secondArgumentStart = key($arguments); - $secondArgumentEnd = $arguments[$secondArgumentStart]; - - if ($tokens[$secondArgumentStart]->isComment() || $tokens[$secondArgumentStart]->isWhitespace()) { - $secondArgumentStart = $tokens->getNextMeaningfulToken($secondArgumentStart); - } - - if ( - !$tokens[$secondArgumentStart]->isGivenKind(T_CONSTANT_ENCAPSED_STRING) - || $tokens->getNextMeaningfulToken($secondArgumentStart) < $secondArgumentEnd - ) { - continue; // second argument is of the wrong type or is a (complex) statement of some sort (function is overridden) - } - - // --- Test type ------------------------------ - - $type = strtolower(trim($tokens[$secondArgumentStart]->getContent(), '"\'"')); - - if ('null' !== $type && !isset($map[$type])) { - continue; // we don't know how to map - } - - // --- Fixing --------------------------------- - - $argumentToken = $tokens[$firstArgumentStart]; - - $this->removeSettypeCall( - $tokens, - $functionNameIndex, - $candidate[1], - $firstArgumentStart, - $commaIndex, - $secondArgumentStart, - $candidate[2] - ); - - if ('null' === $type) { - $this->findSettypeNullCall($tokens, $functionNameIndex, $argumentToken); - } else { - $this->fixSettypeCall($tokens, $functionNameIndex, $argumentToken, new Token($map[$type])); - } - } - } - - private function findSettypeCalls(Tokens $tokens): array - { - $candidates = []; - - $end = \count($tokens); - for ($i = 1; $i < $end; ++$i) { - $candidate = $this->find('settype', $tokens, $i, $end); - if (null === $candidate) { - break; - } - - $i = $candidate[1]; // proceed to openParenthesisIndex - $candidates[] = $candidate; - } - - return $candidates; - } - - private function removeSettypeCall( - Tokens $tokens, - int $functionNameIndex, - int $openParenthesisIndex, - int $firstArgumentStart, - int $commaIndex, - int $secondArgumentStart, - int $closeParenthesisIndex - ): void { - $tokens->clearTokenAndMergeSurroundingWhitespace($closeParenthesisIndex); - $prevIndex = $tokens->getPrevMeaningfulToken($closeParenthesisIndex); - if ($tokens[$prevIndex]->equals(',')) { - $tokens->clearTokenAndMergeSurroundingWhitespace($prevIndex); - } - $tokens->clearTokenAndMergeSurroundingWhitespace($secondArgumentStart); - $tokens->clearTokenAndMergeSurroundingWhitespace($commaIndex); - $tokens->clearTokenAndMergeSurroundingWhitespace($firstArgumentStart); - $tokens->clearTokenAndMergeSurroundingWhitespace($openParenthesisIndex); - $tokens->clearAt($functionNameIndex); // we'll be inserting here so no need to merge the space tokens - $tokens->clearEmptyTokens(); - } - - private function fixSettypeCall( - Tokens $tokens, - int $functionNameIndex, - Token $argumentToken, - Token $castToken - ): void { - $tokens->insertAt( - $functionNameIndex, - [ - clone $argumentToken, - new Token([T_WHITESPACE, ' ']), - new Token('='), - new Token([T_WHITESPACE, ' ']), - $castToken, - new Token([T_WHITESPACE, ' ']), - clone $argumentToken, - ] - ); - - $tokens->removeTrailingWhitespace($functionNameIndex + 6); // 6 = number of inserted tokens -1 for offset correction - } - - private function findSettypeNullCall( - Tokens $tokens, - int $functionNameIndex, - Token $argumentToken - ): void { - $tokens->insertAt( - $functionNameIndex, - [ - clone $argumentToken, - new Token([T_WHITESPACE, ' ']), - new Token('='), - new Token([T_WHITESPACE, ' ']), - new Token([T_STRING, 'null']), - ] - ); - - $tokens->removeTrailingWhitespace($functionNameIndex + 4); // 4 = number of inserted tokens -1 for offset correction - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/ArraySyntaxFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/ArraySyntaxFixer.php deleted file mode 100644 index 28d4449..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/ArraySyntaxFixer.php +++ /dev/null @@ -1,154 +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\Fixer\ArrayNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Gregor Harlan - * @author Sebastiaan Stok - * @author Dariusz Rumiński - * @author SpacePossum - */ -final class ArraySyntaxFixer extends AbstractFixer implements ConfigurableFixerInterface -{ - /** - * @var null|int - */ - private $candidateTokenKind; - - /** - * @var null|string - */ - private $fixCallback; - - /** - * {@inheritdoc} - */ - public function configure(array $configuration): void - { - parent::configure($configuration); - - $this->resolveCandidateTokenKind(); - $this->resolveFixCallback(); - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'PHP arrays should be declared using the configured syntax.', - [ - new VersionSpecificCodeSample( - " 'long'] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run before BinaryOperatorSpacesFixer, TernaryOperatorSpacesFixer. - */ - public function getPriority(): int - { - return 1; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isTokenKindFound($this->candidateTokenKind); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $callback = $this->fixCallback; - for ($index = $tokens->count() - 1; 0 <= $index; --$index) { - if ($tokens[$index]->isGivenKind($this->candidateTokenKind)) { - $this->{$callback}($tokens, $index); - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('syntax', 'Whether to use the `long` or `short` array syntax.')) - ->setAllowedValues(['long', 'short']) - ->setDefault('short') - ->getOption(), - ]); - } - - private function fixToLongArraySyntax(Tokens $tokens, int $index): void - { - $closeIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_ARRAY_SQUARE_BRACE, $index); - - $tokens[$index] = new Token('('); - $tokens[$closeIndex] = new Token(')'); - - $tokens->insertAt($index, new Token([T_ARRAY, 'array'])); - } - - private function fixToShortArraySyntax(Tokens $tokens, int $index): void - { - $openIndex = $tokens->getNextTokenOfKind($index, ['(']); - $closeIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $openIndex); - - $tokens[$openIndex] = new Token([CT::T_ARRAY_SQUARE_BRACE_OPEN, '[']); - $tokens[$closeIndex] = new Token([CT::T_ARRAY_SQUARE_BRACE_CLOSE, ']']); - - $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/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/NoMultilineWhitespaceAroundDoubleArrowFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/NoMultilineWhitespaceAroundDoubleArrowFixer.php deleted file mode 100644 index 41a40fb..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/NoMultilineWhitespaceAroundDoubleArrowFixer.php +++ /dev/null @@ -1,86 +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\Fixer\ArrayNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Carlos Cirello - * @author Dariusz Rumiński - * @author Graham Campbell - */ -final class NoMultilineWhitespaceAroundDoubleArrowFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Operator `=>` should not be surrounded by multi-line whitespaces.', - [new CodeSample(" 2);\n")] - ); - } - - /** - * {@inheritdoc} - * - * Must run before BinaryOperatorSpacesFixer, TrailingCommaInMultilineFixer. - */ - public function getPriority(): int - { - return 1; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isTokenKindFound(T_DOUBLE_ARROW); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind(T_DOUBLE_ARROW)) { - continue; - } - - $this->fixWhitespace($tokens, $index - 1); - // do not move anything about if there is a comment following the whitespace - if (!$tokens[$index + 2]->isComment()) { - $this->fixWhitespace($tokens, $index + 1); - } - } - } - - private function fixWhitespace(Tokens $tokens, int $index): void - { - $token = $tokens[$index]; - - if ($token->isWhitespace() && !$token->isWhitespace(" \t")) { - $tokens[$index] = new Token([T_WHITESPACE, rtrim($token->getContent()).' ']); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/NoTrailingCommaInSinglelineArrayFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/NoTrailingCommaInSinglelineArrayFixer.php deleted file mode 100644 index 3db6264..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/NoTrailingCommaInSinglelineArrayFixer.php +++ /dev/null @@ -1,89 +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\Fixer\ArrayNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * @author Dariusz Rumiński - * @author Sebastiaan Stok - */ -final class NoTrailingCommaInSinglelineArrayFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'PHP single-line arrays should not have trailing comma.', - [new CodeSample("isAnyTokenKindsFound([T_ARRAY, CT::T_ARRAY_SQUARE_BRACE_OPEN]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $tokensAnalyzer = new TokensAnalyzer($tokens); - - for ($index = 0, $c = $tokens->count(); $index < $c; ++$index) { - if ($tokensAnalyzer->isArray($index)) { - $this->fixArray($tokens, $index); - } - } - } - - private function fixArray(Tokens $tokens, int $index): void - { - $tokensAnalyzer = new TokensAnalyzer($tokens); - - if ($tokensAnalyzer->isArrayMultiLine($index)) { - return; - } - - $startIndex = $index; - - if ($tokens[$startIndex]->isGivenKind(T_ARRAY)) { - $startIndex = $tokens->getNextTokenOfKind($startIndex, ['(']); - $endIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $startIndex); - } else { - $endIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_ARRAY_SQUARE_BRACE, $startIndex); - } - - $beforeEndIndex = $tokens->getPrevMeaningfulToken($endIndex); - $beforeEndToken = $tokens[$beforeEndIndex]; - - if ($beforeEndToken->equals(',')) { - $tokens->removeTrailingWhitespace($beforeEndIndex); - $tokens->clearAt($beforeEndIndex); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/NoWhitespaceBeforeCommaInArrayFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/NoWhitespaceBeforeCommaInArrayFixer.php deleted file mode 100644 index b139069..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/NoWhitespaceBeforeCommaInArrayFixer.php +++ /dev/null @@ -1,152 +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\Fixer\ArrayNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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; -use PhpCsFixer\FixerDefinition\VersionSpecification; -use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Tokens; -use Symfony\Component\OptionsResolver\Options; - -/** - * @author Adam Marczuk - */ -final class NoWhitespaceBeforeCommaInArrayFixer extends AbstractFixer implements ConfigurableFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'In array declaration, there MUST NOT be a whitespace before each comma.', - [ - new CodeSample(" true] - ), - ] - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isAnyTokenKindsFound([T_ARRAY, CT::T_ARRAY_SQUARE_BRACE_OPEN]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - for ($index = $tokens->count() - 1; $index >= 0; --$index) { - if ($tokens[$index]->isGivenKind([T_ARRAY, CT::T_ARRAY_SQUARE_BRACE_OPEN])) { - $this->fixSpacing($index, $tokens); - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('after_heredoc', 'Whether the whitespace between heredoc end and comma should be removed.')) - ->setAllowedTypes(['bool']) - ->setDefault(false) - ->setNormalizer(static function (Options $options, $value) { - if (\PHP_VERSION_ID < 70300 && $value) { - throw new InvalidOptionsForEnvException('"after_heredoc" option can only be enabled with PHP 7.3+.'); - } - - return $value; - }) - ->getOption(), - ]); - } - - /** - * Method to fix spacing in array declaration. - */ - private function fixSpacing(int $index, Tokens $tokens): void - { - if ($tokens[$index]->isGivenKind(CT::T_ARRAY_SQUARE_BRACE_OPEN)) { - $startIndex = $index; - $endIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_ARRAY_SQUARE_BRACE, $startIndex); - } else { - $startIndex = $tokens->getNextTokenOfKind($index, ['(']); - $endIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $startIndex); - } - - for ($i = $endIndex - 1; $i > $startIndex; --$i) { - $i = $this->skipNonArrayElements($i, $tokens); - $currentToken = $tokens[$i]; - $prevIndex = $tokens->getPrevNonWhitespace($i - 1); - - if ( - $currentToken->equals(',') && !$tokens[$prevIndex]->isComment() - && ($this->configuration['after_heredoc'] || !$tokens[$prevIndex]->equals([T_END_HEREDOC])) - ) { - $tokens->removeLeadingWhitespace($i); - } - } - } - - /** - * Method to move index over the non-array elements like function calls or function declarations. - * - * @return int New index - */ - private function skipNonArrayElements(int $index, Tokens $tokens): int - { - if ($tokens[$index]->equals('}')) { - return $tokens->findBlockStart(Tokens::BLOCK_TYPE_CURLY_BRACE, $index); - } - - if ($tokens[$index]->equals(')')) { - $startIndex = $tokens->findBlockStart(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $index); - $startIndex = $tokens->getPrevMeaningfulToken($startIndex); - if (!$tokens[$startIndex]->isGivenKind([T_ARRAY, CT::T_ARRAY_SQUARE_BRACE_OPEN])) { - return $startIndex; - } - } - - return $index; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/NormalizeIndexBraceFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/NormalizeIndexBraceFixer.php deleted file mode 100644 index f4d7652..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/NormalizeIndexBraceFixer.php +++ /dev/null @@ -1,62 +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\Fixer\ArrayNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dariusz Rumiński - */ -final class NormalizeIndexBraceFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Array index should always be written by using square braces.', - [new CodeSample("isTokenKindFound(CT::T_ARRAY_INDEX_CURLY_BRACE_OPEN); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - foreach ($tokens as $index => $token) { - if ($token->isGivenKind(CT::T_ARRAY_INDEX_CURLY_BRACE_OPEN)) { - $tokens[$index] = new Token('['); - } elseif ($token->isGivenKind(CT::T_ARRAY_INDEX_CURLY_BRACE_CLOSE)) { - $tokens[$index] = new Token(']'); - } - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/TrimArraySpacesFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/TrimArraySpacesFixer.php deleted file mode 100644 index 00f0d11..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/TrimArraySpacesFixer.php +++ /dev/null @@ -1,104 +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\Fixer\ArrayNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Jared Henderson - */ -final class TrimArraySpacesFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Arrays should be formatted like function/method arguments, without leading or trailing single line space.', - [new CodeSample("isAnyTokenKindsFound([T_ARRAY, CT::T_ARRAY_SQUARE_BRACE_OPEN]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - for ($index = 0, $c = $tokens->count(); $index < $c; ++$index) { - if ($tokens[$index]->isGivenKind([T_ARRAY, CT::T_ARRAY_SQUARE_BRACE_OPEN])) { - self::fixArray($tokens, $index); - } - } - } - - /** - * Method to trim leading/trailing whitespace within single line arrays. - */ - private static function fixArray(Tokens $tokens, int $index): void - { - $startIndex = $index; - - if ($tokens[$startIndex]->isGivenKind(T_ARRAY)) { - $startIndex = $tokens->getNextMeaningfulToken($startIndex); - $endIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $startIndex); - } else { - $endIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_ARRAY_SQUARE_BRACE, $startIndex); - } - - $nextIndex = $startIndex + 1; - $nextToken = $tokens[$nextIndex]; - $nextNonWhitespaceIndex = $tokens->getNextNonWhitespace($startIndex); - $nextNonWhitespaceToken = $tokens[$nextNonWhitespaceIndex]; - $tokenAfterNextNonWhitespaceToken = $tokens[$nextNonWhitespaceIndex + 1]; - - $prevIndex = $endIndex - 1; - $prevToken = $tokens[$prevIndex]; - $prevNonWhitespaceIndex = $tokens->getPrevNonWhitespace($endIndex); - $prevNonWhitespaceToken = $tokens[$prevNonWhitespaceIndex]; - - if ( - $nextToken->isWhitespace(" \t") - && ( - !$nextNonWhitespaceToken->isComment() - || $nextNonWhitespaceIndex === $prevNonWhitespaceIndex - || $tokenAfterNextNonWhitespaceToken->isWhitespace(" \t") - || '/*' === substr($nextNonWhitespaceToken->getContent(), 0, 2) - ) - ) { - $tokens->clearAt($nextIndex); - } - - if ( - $prevToken->isWhitespace(" \t") - && !$prevNonWhitespaceToken->equals(',') - ) { - $tokens->clearAt($prevIndex); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/WhitespaceAfterCommaInArrayFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/WhitespaceAfterCommaInArrayFixer.php deleted file mode 100644 index 8fed4a1..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/WhitespaceAfterCommaInArrayFixer.php +++ /dev/null @@ -1,103 +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\Fixer\ArrayNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Adam Marczuk - */ -final class WhitespaceAfterCommaInArrayFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'In array declaration, there MUST be a whitespace after each comma.', - [new CodeSample("isAnyTokenKindsFound([T_ARRAY, CT::T_ARRAY_SQUARE_BRACE_OPEN]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $tokensToInsert = []; - - for ($index = $tokens->count() - 1; $index >= 0; --$index) { - if (!$tokens[$index]->isGivenKind([T_ARRAY, CT::T_ARRAY_SQUARE_BRACE_OPEN])) { - continue; - } - - if ($tokens[$index]->isGivenKind(CT::T_ARRAY_SQUARE_BRACE_OPEN)) { - $startIndex = $index; - $endIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_ARRAY_SQUARE_BRACE, $startIndex); - } else { - $startIndex = $tokens->getNextTokenOfKind($index, ['(']); - $endIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $startIndex); - } - - for ($i = $endIndex - 1; $i > $startIndex; --$i) { - $i = $this->skipNonArrayElements($i, $tokens); - if ($tokens[$i]->equals(',') && !$tokens[$i + 1]->isWhitespace()) { - $tokensToInsert[$i + 1] = new Token([T_WHITESPACE, ' ']); - } - } - } - - if ([] !== $tokensToInsert) { - $tokens->insertSlices($tokensToInsert); - } - } - - /** - * Method to move index over the non-array elements like function calls or function declarations. - * - * @return int New index - */ - private function skipNonArrayElements(int $index, Tokens $tokens): int - { - if ($tokens[$index]->equals('}')) { - return $tokens->findBlockStart(Tokens::BLOCK_TYPE_CURLY_BRACE, $index); - } - - if ($tokens[$index]->equals(')')) { - $startIndex = $tokens->findBlockStart(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $index); - $startIndex = $tokens->getPrevMeaningfulToken($startIndex); - if (!$tokens[$startIndex]->isGivenKind([T_ARRAY, CT::T_ARRAY_SQUARE_BRACE_OPEN])) { - return $startIndex; - } - } - - return $index; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/BracesFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/BracesFixer.php deleted file mode 100644 index 2c26e49..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/BracesFixer.php +++ /dev/null @@ -1,1008 +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\Fixer\Basic; - -use PhpCsFixer\AbstractProxyFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -use PhpCsFixer\Fixer\LanguageConstruct\DeclareParenthesesFixer; -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\WhitespacesAnalyzer; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * Fixer for rules defined in PSR2 ¶4.1, ¶4.4, ¶5. - * - * @author Dariusz Rumiński - */ -final class BracesFixer extends AbstractProxyFixer implements ConfigurableFixerInterface, WhitespacesAwareFixerInterface -{ - /** - * @internal - */ - public const LINE_NEXT = 'next'; - - /** - * @internal - */ - public const LINE_SAME = 'same'; - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'The body of each structure MUST be enclosed by braces. Braces should be properly placed. Body of braces should be properly indented.', - [ - new CodeSample( - '= 0; }; -$negative = function ($item) { - return $item < 0; }; -', - ['allow_single_line_closure' => true] - ), - new CodeSample( - ' self::LINE_SAME] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run before ArrayIndentationFixer, MethodArgumentSpaceFixer, MethodChainingIndentationFixer. - * Must run after ClassAttributesSeparationFixer, ClassDefinitionFixer, ElseifFixer, EmptyLoopBodyFixer, LineEndingFixer, NoAlternativeSyntaxFixer, NoEmptyStatementFixer, NoUselessElseFixer, SingleLineThrowFixer, SingleSpaceAfterConstructFixer, SingleTraitInsertPerStatementFixer. - */ - public function getPriority(): int - { - return 35; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $this->fixCommentBeforeBrace($tokens); - $this->fixMissingControlBraces($tokens); - $this->fixIndents($tokens); - $this->fixControlContinuationBraces($tokens); - $this->fixSpaceAroundToken($tokens); - $this->fixDoWhile($tokens); - - parent::applyFix($file, $tokens); - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('allow_single_line_anonymous_class_with_empty_body', 'Whether single line anonymous class with empty body notation should be allowed.')) - ->setAllowedTypes(['bool']) - ->setDefault(false) - ->getOption(), - (new FixerOptionBuilder('allow_single_line_closure', 'Whether single line lambda notation should be allowed.')) - ->setAllowedTypes(['bool']) - ->setDefault(false) - ->getOption(), - (new FixerOptionBuilder('position_after_functions_and_oop_constructs', 'whether the opening brace should be placed on "next" or "same" line after classy constructs (non-anonymous classes, interfaces, traits, methods and non-lambda functions).')) - ->setAllowedValues([self::LINE_NEXT, self::LINE_SAME]) - ->setDefault(self::LINE_NEXT) - ->getOption(), - (new FixerOptionBuilder('position_after_control_structures', 'whether the opening brace should be placed on "next" or "same" line after control structures.')) - ->setAllowedValues([self::LINE_NEXT, self::LINE_SAME]) - ->setDefault(self::LINE_SAME) - ->getOption(), - (new FixerOptionBuilder('position_after_anonymous_constructs', 'whether the opening brace should be placed on "next" or "same" line after anonymous constructs (anonymous classes and lambda functions).')) - ->setAllowedValues([self::LINE_NEXT, self::LINE_SAME]) - ->setDefault(self::LINE_SAME) - ->getOption(), - ]); - } - - protected function createProxyFixers(): array - { - return [ - new DeclareParenthesesFixer(), - ]; - } - - private function fixCommentBeforeBrace(Tokens $tokens): void - { - $tokensAnalyzer = new TokensAnalyzer($tokens); - $controlTokens = $this->getControlTokens(); - - for ($index = $tokens->count() - 1; 0 <= $index; --$index) { - $token = $tokens[$index]; - - if ($token->isGivenKind($controlTokens)) { - $prevIndex = $this->findParenthesisEnd($tokens, $index); - } elseif ( - ($token->isGivenKind(T_FUNCTION) && $tokensAnalyzer->isLambda($index)) - || ($token->isGivenKind(T_CLASS) && $tokensAnalyzer->isAnonymousClass($index)) - ) { - $prevIndex = $tokens->getNextTokenOfKind($index, ['{']); - $prevIndex = $tokens->getPrevMeaningfulToken($prevIndex); - } else { - continue; - } - - $commentIndex = $tokens->getNextNonWhitespace($prevIndex); - $commentToken = $tokens[$commentIndex]; - - if (!$commentToken->isGivenKind(T_COMMENT) || 0 === strpos($commentToken->getContent(), '/*')) { - continue; - } - - $braceIndex = $tokens->getNextMeaningfulToken($commentIndex); - $braceToken = $tokens[$braceIndex]; - - if (!$braceToken->equals('{')) { - continue; - } - - /** @var Token $tokenTmp */ - $tokenTmp = $tokens[$braceIndex]; - - $newBraceIndex = $prevIndex + 1; - for ($i = $braceIndex; $i > $newBraceIndex; --$i) { - // we might be moving one white space next to another, these have to be merged - /** @var Token $previousToken */ - $previousToken = $tokens[$i - 1]; - $tokens[$i] = $previousToken; - if ($tokens[$i]->isWhitespace() && $tokens[$i + 1]->isWhitespace()) { - $tokens[$i] = new Token([T_WHITESPACE, $tokens[$i]->getContent().$tokens[$i + 1]->getContent()]); - $tokens->clearAt($i + 1); - } - } - - $tokens[$newBraceIndex] = $tokenTmp; - $c = $tokens[$braceIndex]->getContent(); - if (substr_count($c, "\n") > 1) { - // left trim till last line break - $tokens[$braceIndex] = new Token([T_WHITESPACE, substr($c, strrpos($c, "\n"))]); - } - } - } - - private function fixControlContinuationBraces(Tokens $tokens): void - { - $controlContinuationTokens = $this->getControlContinuationTokens(); - - for ($index = \count($tokens) - 1; 0 <= $index; --$index) { - $token = $tokens[$index]; - - if (!$token->isGivenKind($controlContinuationTokens)) { - continue; - } - - $prevIndex = $tokens->getPrevNonWhitespace($index); - $prevToken = $tokens[$prevIndex]; - - if (!$prevToken->equals('}')) { - continue; - } - - $tokens->ensureWhitespaceAtIndex( - $index - 1, - 1, - self::LINE_NEXT === $this->configuration['position_after_control_structures'] ? - $this->whitespacesConfig->getLineEnding().WhitespacesAnalyzer::detectIndent($tokens, $index) - : ' ' - ); - } - } - - private function fixDoWhile(Tokens $tokens): void - { - for ($index = \count($tokens) - 1; 0 <= $index; --$index) { - $token = $tokens[$index]; - - if (!$token->isGivenKind(T_DO)) { - continue; - } - - $parenthesisEndIndex = $this->findParenthesisEnd($tokens, $index); - $startBraceIndex = $tokens->getNextNonWhitespace($parenthesisEndIndex); - $endBraceIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $startBraceIndex); - $nextNonWhitespaceIndex = $tokens->getNextNonWhitespace($endBraceIndex); - $nextNonWhitespaceToken = $tokens[$nextNonWhitespaceIndex]; - - if (!$nextNonWhitespaceToken->isGivenKind(T_WHILE)) { - continue; - } - - $tokens->ensureWhitespaceAtIndex($nextNonWhitespaceIndex - 1, 1, ' '); - } - } - - private function fixIndents(Tokens $tokens): void - { - $classyTokens = Token::getClassyTokenKinds(); - $classyAndFunctionTokens = array_merge([T_FUNCTION], $classyTokens); - $controlTokens = $this->getControlTokens(); - $indentTokens = array_filter( - array_merge($classyAndFunctionTokens, $controlTokens), - static function (int $item) { - return T_SWITCH !== $item; - } - ); - $tokensAnalyzer = new TokensAnalyzer($tokens); - - for ($index = 0, $limit = \count($tokens); $index < $limit; ++$index) { - $token = $tokens[$index]; - - // if token is not a structure element - continue - if (!$token->isGivenKind($indentTokens)) { - continue; - } - - // do not change indent for `while` in `do ... while ...` - if ( - $token->isGivenKind(T_WHILE) - && $tokensAnalyzer->isWhilePartOfDoWhile($index) - ) { - continue; - } - - if ( - $this->configuration['allow_single_line_anonymous_class_with_empty_body'] - && $token->isGivenKind(T_CLASS) - ) { - $prevIndex = $tokens->getPrevMeaningfulToken($index); - if ($tokens[$prevIndex]->isGivenKind(T_NEW)) { - $braceStartIndex = $tokens->getNextTokenOfKind($index, ['{']); - $braceEndIndex = $tokens->getNextMeaningfulToken($braceStartIndex); - - if ('}' === $tokens[$braceEndIndex]->getContent() && !$this->isMultilined($tokens, $index, $braceEndIndex)) { - $index = $braceEndIndex; - - continue; - } - } - } - - if ( - $this->configuration['allow_single_line_closure'] - && $token->isGivenKind(T_FUNCTION) - && $tokensAnalyzer->isLambda($index) - ) { - $braceEndIndex = $tokens->findBlockEnd( - Tokens::BLOCK_TYPE_CURLY_BRACE, - $tokens->getNextTokenOfKind($index, ['{']) - ); - - if (!$this->isMultilined($tokens, $index, $braceEndIndex)) { - $index = $braceEndIndex; - - continue; - } - } - - if ($token->isGivenKind($classyAndFunctionTokens)) { - $startBraceIndex = $tokens->getNextTokenOfKind($index, [';', '{']); - $startBraceToken = $tokens[$startBraceIndex]; - } else { - $parenthesisEndIndex = $this->findParenthesisEnd($tokens, $index); - $startBraceIndex = $tokens->getNextNonWhitespace($parenthesisEndIndex); - $startBraceToken = $tokens[$startBraceIndex]; - } - - // structure without braces block - nothing to do, e.g. do { } while (true); - if (!$startBraceToken->equals('{')) { - continue; - } - - $nextNonWhitespaceIndex = $tokens->getNextNonWhitespace($startBraceIndex, " \t"); - $nextNonWhitespace = $tokens[$nextNonWhitespaceIndex]; - - /* if CLOSE_TAG is after { on the same line, do not indent. e.g. */ - if ($nextNonWhitespace->isGivenKind(T_CLOSE_TAG)) { - continue; - } - - /* if CLOSE_TAG is after { on the next line and a comment on this line, do not indent. e.g. */ - if ($nextNonWhitespace->isComment() && $tokens[$tokens->getNextMeaningfulToken($nextNonWhitespaceIndex)]->isGivenKind(T_CLOSE_TAG)) { - continue; - } - - $endBraceIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $startBraceIndex); - - $indent = WhitespacesAnalyzer::detectIndent($tokens, $index); - - // fix indent near closing brace - $tokens->ensureWhitespaceAtIndex($endBraceIndex - 1, 1, $this->whitespacesConfig->getLineEnding().$indent); - - // fix indent between braces - $lastCommaIndex = $tokens->getPrevTokenOfKind($endBraceIndex - 1, [';', '}']); - - $nestLevel = 1; - for ($nestIndex = $lastCommaIndex; $nestIndex >= $startBraceIndex; --$nestIndex) { - $nestToken = $tokens[$nestIndex]; - - if ($nestToken->equalsAny([')', [CT::T_BRACE_CLASS_INSTANTIATION_CLOSE]])) { - $nestIndex = $tokens->findBlockStart( - $nestToken->equals(')') ? Tokens::BLOCK_TYPE_PARENTHESIS_BRACE : Tokens::BLOCK_TYPE_BRACE_CLASS_INSTANTIATION, - $nestIndex - ); - - continue; - } - - if (1 === $nestLevel) { - // Next token is the beginning of a line that can be indented when - // the current token is a `;`, a `}` or the opening `{` of current - // scope. Current token may also be a comment that follows `;` or - // `}`, in which case indentation will only be fixed if this - // comment is followed by a newline. - $nextLineCanBeIndented = false; - if ($nestToken->equalsAny([';', '}'])) { - $nextLineCanBeIndented = true; - } elseif ($this->isCommentWithFixableIndentation($tokens, $nestIndex)) { - for ($i = $nestIndex; $i > $startBraceIndex; --$i) { - if ($tokens[$i]->equalsAny([';', '}'])) { - $nextLineCanBeIndented = true; - - break; - } - - if (!$tokens[$i]->isWhitespace() && !$tokens[$i]->isComment()) { - break; - } - } - - if ($nextLineCanBeIndented || $i === $startBraceIndex) { - $nextToken = $tokens[$nestIndex + 1]; - $nextLineCanBeIndented = $nextToken->isWhitespace() && 1 === Preg::match('/\R/', $nextToken->getContent()); - } - } - - if (!$nextLineCanBeIndented) { - continue; - } - - $nextNonWhitespaceNestIndex = $tokens->getNextNonWhitespace($nestIndex); - $nextNonWhitespaceNestToken = $tokens[$nextNonWhitespaceNestIndex]; - - if ( - // next Token is not a comment on its own line - !($nextNonWhitespaceNestToken->isComment() && ( - !$tokens[$nextNonWhitespaceNestIndex - 1]->isWhitespace() - || !Preg::match('/\R/', $tokens[$nextNonWhitespaceNestIndex - 1]->getContent()) - )) - // and it is not a `$foo = function () {};` situation - && !($nestToken->equals('}') && $nextNonWhitespaceNestToken->equalsAny([';', ',', ']', [CT::T_ARRAY_SQUARE_BRACE_CLOSE]])) - // and it is not a `Foo::{bar}()` situation - && !($nestToken->equals('}') && $nextNonWhitespaceNestToken->equals('(')) - // and it is not a `${"a"}->...` and `${"b{$foo}"}->...` situation - && !($nestToken->equals('}') && $tokens[$nestIndex - 1]->equalsAny(['"', "'", [T_CONSTANT_ENCAPSED_STRING], [T_VARIABLE]])) - // and next token is not a closing tag that would break heredoc/nowdoc syntax - && !($tokens[$nestIndex - 1]->isGivenKind(T_END_HEREDOC) && $nextNonWhitespaceNestToken->isGivenKind(T_CLOSE_TAG)) - ) { - if ( - ( - self::LINE_NEXT !== $this->configuration['position_after_control_structures'] - && $nextNonWhitespaceNestToken->isGivenKind($this->getControlContinuationTokens()) - && !$tokens[$tokens->getPrevNonWhitespace($nextNonWhitespaceNestIndex)]->isComment() - ) - || $nextNonWhitespaceNestToken->isGivenKind(T_CLOSE_TAG) - || ( - self::LINE_NEXT !== $this->configuration['position_after_control_structures'] - && $nextNonWhitespaceNestToken->isGivenKind(T_WHILE) - && $tokensAnalyzer->isWhilePartOfDoWhile($nextNonWhitespaceNestIndex) - ) - ) { - $whitespace = ' '; - } else { - $nextToken = $tokens[$nestIndex + 1]; - $nextWhitespace = ''; - - if ($nextToken->isWhitespace()) { - $nextWhitespace = rtrim($nextToken->getContent(), " \t"); - - if ('' !== $nextWhitespace) { - $nextWhitespace = Preg::replace( - sprintf('/%s$/', $this->whitespacesConfig->getLineEnding()), - '', - $nextWhitespace, - 1 - ); - } - } - - $whitespace = $nextWhitespace.$this->whitespacesConfig->getLineEnding().$indent; - - if (!$nextNonWhitespaceNestToken->equals('}')) { - $determineIsIndentableBlockContent = static function (int $contentIndex) use ($tokens): bool { - if (!$tokens[$contentIndex]->isComment()) { - return true; - } - - if (!$tokens[$tokens->getPrevMeaningfulToken($contentIndex)]->equals(';')) { - return true; - } - - $nextIndex = $tokens->getNextMeaningfulToken($contentIndex); - - if (!$tokens[$nextIndex]->equals('}')) { - return true; - } - - $nextNextIndex = $tokens->getNextMeaningfulToken($nextIndex); - - if (null === $nextNextIndex) { - return true; - } - - if ($tokens[$nextNextIndex]->equalsAny([ - [T_ELSE], - [T_ELSEIF], - ',', - ])) { - return false; - } - - return true; - }; - - // add extra indent only if current content is not a comment for content outside of current block - if ($determineIsIndentableBlockContent($nestIndex + 2)) { - $whitespace .= $this->whitespacesConfig->getIndent(); - } - } - } - - $this->ensureWhitespaceAtIndexAndIndentMultilineComment($tokens, $nestIndex + 1, $whitespace); - } - } - - if ($nestToken->equals('}')) { - ++$nestLevel; - - continue; - } - - if ($nestToken->equals('{')) { - --$nestLevel; - - continue; - } - } - - // fix indent near opening brace - if (isset($tokens[$startBraceIndex + 2]) && $tokens[$startBraceIndex + 2]->equals('}')) { - $tokens->ensureWhitespaceAtIndex($startBraceIndex + 1, 0, $this->whitespacesConfig->getLineEnding().$indent); - } else { - $nextToken = $tokens[$startBraceIndex + 1]; - $nextNonWhitespaceToken = $tokens[$tokens->getNextNonWhitespace($startBraceIndex)]; - - // set indent only if it is not a case, when comment is following { on same line - if ( - !$nextNonWhitespaceToken->isComment() - || ($nextToken->isWhitespace() && 1 === substr_count($nextToken->getContent(), "\n")) // preserve blank lines - ) { - $this->ensureWhitespaceAtIndexAndIndentMultilineComment( - $tokens, - $startBraceIndex + 1, - $this->whitespacesConfig->getLineEnding().$indent.$this->whitespacesConfig->getIndent() - ); - } - } - - if ($token->isGivenKind($classyTokens) && !$tokensAnalyzer->isAnonymousClass($index)) { - if (self::LINE_SAME === $this->configuration['position_after_functions_and_oop_constructs'] && !$tokens[$tokens->getPrevNonWhitespace($startBraceIndex)]->isComment()) { - $ensuredWhitespace = ' '; - } else { - $ensuredWhitespace = $this->whitespacesConfig->getLineEnding().$indent; - } - - $tokens->ensureWhitespaceAtIndex($startBraceIndex - 1, 1, $ensuredWhitespace); - } elseif ( - $token->isGivenKind(T_FUNCTION) && !$tokensAnalyzer->isLambda($index) - || ( - self::LINE_NEXT === $this->configuration['position_after_control_structures'] && $token->isGivenKind($controlTokens) - || ( - self::LINE_NEXT === $this->configuration['position_after_anonymous_constructs'] - && ( - $token->isGivenKind(T_FUNCTION) && $tokensAnalyzer->isLambda($index) - || $token->isGivenKind(T_CLASS) && $tokensAnalyzer->isAnonymousClass($index) - ) - ) - ) - ) { - $isAnonymousClass = $token->isGivenKind($classyTokens) && $tokensAnalyzer->isAnonymousClass($index); - - $closingParenthesisIndex = $tokens->getPrevTokenOfKind($startBraceIndex, [')']); - if (null === $closingParenthesisIndex && !$isAnonymousClass) { - continue; - } - - if ( - !$isAnonymousClass - && $tokens[$closingParenthesisIndex - 1]->isWhitespace() - && false !== strpos($tokens[$closingParenthesisIndex - 1]->getContent(), "\n") - ) { - if (!$tokens[$startBraceIndex - 2]->isComment()) { - $tokens->ensureWhitespaceAtIndex($startBraceIndex - 1, 1, ' '); - } - } else { - if ( - self::LINE_SAME === $this->configuration['position_after_functions_and_oop_constructs'] - && ( - $token->isGivenKind(T_FUNCTION) && !$tokensAnalyzer->isLambda($index) - || $token->isGivenKind($classyTokens) && !$tokensAnalyzer->isAnonymousClass($index) - ) - && !$tokens[$tokens->getPrevNonWhitespace($startBraceIndex)]->isComment() - ) { - $ensuredWhitespace = ' '; - } else { - $ensuredWhitespace = $this->whitespacesConfig->getLineEnding().$indent; - } - - $tokens->ensureWhitespaceAtIndex($startBraceIndex - 1, 1, $ensuredWhitespace); - } - } else { - $tokens->ensureWhitespaceAtIndex($startBraceIndex - 1, 1, ' '); - } - - // reset loop limit due to collection change - $limit = \count($tokens); - } - } - - private function fixMissingControlBraces(Tokens $tokens): void - { - $controlTokens = $this->getControlTokens(); - - for ($index = $tokens->count() - 1; 0 <= $index; --$index) { - $token = $tokens[$index]; - - if (!$token->isGivenKind($controlTokens)) { - continue; - } - - $parenthesisEndIndex = $this->findParenthesisEnd($tokens, $index); - $nextAfterParenthesisEndIndex = $tokens->getNextMeaningfulToken($parenthesisEndIndex); - $tokenAfterParenthesis = $tokens[$nextAfterParenthesisEndIndex]; - - // if Token after parenthesis is { then we do not need to insert brace, but to fix whitespace before it - if ($tokenAfterParenthesis->equals('{') && self::LINE_SAME === $this->configuration['position_after_control_structures']) { - $tokens->ensureWhitespaceAtIndex($parenthesisEndIndex + 1, 0, ' '); - - continue; - } - - // do not add braces for cases: - // - structure without block, e.g. while ($iter->next()); - // - structure with block, e.g. while ($i) {...}, while ($i) : {...} endwhile; - if ($tokenAfterParenthesis->equalsAny([';', '{', ':'])) { - continue; - } - - // do not add for 'short if' followed by alternative loop, for example: if ($a) while ($b): ? > X < ?php endwhile; ? > - // or 'short if' after an alternative loop, for example: foreach ($arr as $index => $item) if ($item): - if ($tokenAfterParenthesis->isGivenKind([T_FOR, T_FOREACH, T_SWITCH, T_WHILE, T_IF])) { - $tokenAfterParenthesisBlockEnd = $tokens->findBlockEnd( // go to ')' - Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, - $tokens->getNextMeaningfulToken($nextAfterParenthesisEndIndex) - ); - - if ($tokens[$tokens->getNextMeaningfulToken($tokenAfterParenthesisBlockEnd)]->equals(':')) { - continue; - } - } - - $statementEndIndex = $this->findStatementEnd($tokens, $parenthesisEndIndex); - - // insert closing brace - $tokens->insertAt($statementEndIndex + 1, [new Token([T_WHITESPACE, ' ']), new Token('}')]); - - // insert missing `;` if needed - if (!$tokens[$statementEndIndex]->equalsAny([';', '}'])) { - $tokens->insertAt($statementEndIndex + 1, new Token(';')); - } - - // insert opening brace - $tokens->insertAt($parenthesisEndIndex + 1, new Token('{')); - $tokens->ensureWhitespaceAtIndex($parenthesisEndIndex + 1, 0, ' '); - } - } - - private function fixSpaceAroundToken(Tokens $tokens): void - { - $controlTokens = $this->getControlTokens(); - - for ($index = $tokens->count() - 1; 0 <= $index; --$index) { - $token = $tokens[$index]; - - // Declare tokens don't follow the same rules are other control statements - if ($token->isGivenKind(T_DECLARE)) { - continue; // delegated to DeclareParenthesesFixer - } - - if ($token->isGivenKind($controlTokens) || $token->isGivenKind(CT::T_USE_LAMBDA)) { - $nextNonWhitespaceIndex = $tokens->getNextNonWhitespace($index); - - if (!$tokens[$nextNonWhitespaceIndex]->equals(':')) { - $tokens->ensureWhitespaceAtIndex( - $index + 1, - 0, - self::LINE_NEXT === $this->configuration['position_after_control_structures'] && !$tokens[$nextNonWhitespaceIndex]->equals('(') ? - $this->whitespacesConfig->getLineEnding().WhitespacesAnalyzer::detectIndent($tokens, $index) - : ' ' - ); - } - - $prevToken = $tokens[$index - 1]; - - if (!$prevToken->isWhitespace() && !$prevToken->isComment() && !$prevToken->isGivenKind(T_OPEN_TAG)) { - $tokens->ensureWhitespaceAtIndex($index - 1, 1, ' '); - } - } - } - } - - private function findParenthesisEnd(Tokens $tokens, int $structureTokenIndex): int - { - $nextIndex = $tokens->getNextMeaningfulToken($structureTokenIndex); - $nextToken = $tokens[$nextIndex]; - - // return if next token is not opening parenthesis - if (!$nextToken->equals('(')) { - return $structureTokenIndex; - } - - return $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $nextIndex); - } - - private function findStatementEnd(Tokens $tokens, int $parenthesisEndIndex): int - { - $nextIndex = $tokens->getNextMeaningfulToken($parenthesisEndIndex); - $nextToken = $tokens[$nextIndex]; - - if (!$nextToken) { - return $parenthesisEndIndex; - } - - if ($nextToken->equals('{')) { - return $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $nextIndex); - } - - if ($nextToken->isGivenKind($this->getControlTokens())) { - $parenthesisEndIndex = $this->findParenthesisEnd($tokens, $nextIndex); - - $endIndex = $this->findStatementEnd($tokens, $parenthesisEndIndex); - - if ($nextToken->isGivenKind([T_IF, T_TRY, T_DO])) { - $openingTokenKind = $nextToken->getId(); - - while (true) { - $nextIndex = $tokens->getNextMeaningfulToken($endIndex); - $nextToken = isset($nextIndex) ? $tokens[$nextIndex] : null; - if ($nextToken && $nextToken->isGivenKind($this->getControlContinuationTokensForOpeningToken($openingTokenKind))) { - $parenthesisEndIndex = $this->findParenthesisEnd($tokens, $nextIndex); - - $endIndex = $this->findStatementEnd($tokens, $parenthesisEndIndex); - - if ($nextToken->isGivenKind($this->getFinalControlContinuationTokensForOpeningToken($openingTokenKind))) { - return $endIndex; - } - } else { - break; - } - } - } - - return $endIndex; - } - - $index = $parenthesisEndIndex; - - while (true) { - $token = $tokens[++$index]; - - // if there is some block in statement (eg lambda function) we need to skip it - if ($token->equals('{')) { - $index = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $index); - - continue; - } - - if ($token->equals(';')) { - return $index; - } - - if ($token->isGivenKind(T_CLOSE_TAG)) { - return $tokens->getPrevNonWhitespace($index); - } - } - } - - private function getControlTokens(): array - { - static $tokens = [ - T_DECLARE, - T_DO, - T_ELSE, - T_ELSEIF, - T_FINALLY, - T_FOR, - T_FOREACH, - T_IF, - T_WHILE, - T_TRY, - T_CATCH, - T_SWITCH, - ]; - - // @TODO: drop condition when PHP 8.0+ is required - if (\defined('T_MATCH')) { - $tokens['match'] = T_MATCH; - } - - return $tokens; - } - - private function getControlContinuationTokens(): array - { - static $tokens = [ - T_CATCH, - T_ELSE, - T_ELSEIF, - T_FINALLY, - ]; - - return $tokens; - } - - private function getControlContinuationTokensForOpeningToken(int $openingTokenKind): array - { - if (T_IF === $openingTokenKind) { - return [ - T_ELSE, - T_ELSEIF, - ]; - } - - if (T_DO === $openingTokenKind) { - return [T_WHILE]; - } - - if (T_TRY === $openingTokenKind) { - return [ - T_CATCH, - T_FINALLY, - ]; - } - - return []; - } - - private function getFinalControlContinuationTokensForOpeningToken(int $openingTokenKind): array - { - if (T_IF === $openingTokenKind) { - return [T_ELSE]; - } - - if (T_TRY === $openingTokenKind) { - return [T_FINALLY]; - } - - return []; - } - - private function ensureWhitespaceAtIndexAndIndentMultilineComment(Tokens $tokens, int $index, string $whitespace): void - { - if ($tokens[$index]->isWhitespace()) { - $nextTokenIndex = $tokens->getNextNonWhitespace($index); - } else { - $nextTokenIndex = $index; - } - - $nextToken = $tokens[$nextTokenIndex]; - if ($nextToken->isComment()) { - $previousToken = $tokens[$nextTokenIndex - 1]; - $nextTokenContent = $nextToken->getContent(); - - // do not indent inline comments used to comment out unused code - if ( - $previousToken->isWhitespace() - && 1 === Preg::match('/\R$/', $previousToken->getContent()) - && ( - (0 === strpos($nextTokenContent, '//'.$this->whitespacesConfig->getIndent()) || '//' === $nextTokenContent) - || (0 === strpos($nextTokenContent, '#'.$this->whitespacesConfig->getIndent()) || '#' === $nextTokenContent) - ) - ) { - return; - } - - $tokens[$nextTokenIndex] = new Token([ - $nextToken->getId(), - Preg::replace( - '/(\R)'.WhitespacesAnalyzer::detectIndent($tokens, $nextTokenIndex).'(\h*\S+.*)/', - '$1'.Preg::replace('/^.*\R(\h*)$/s', '$1', $whitespace).'$2', - $nextToken->getContent() - ), - ]); - } - - $tokens->ensureWhitespaceAtIndex($index, 0, $whitespace); - } - - private function isMultilined(Tokens $tokens, int $startParenthesisIndex, int $endParenthesisIndex): bool - { - for ($i = $startParenthesisIndex; $i < $endParenthesisIndex; ++$i) { - if (false !== strpos($tokens[$i]->getContent(), "\n")) { - return true; - } - } - - return false; - } - - /** - * Returns whether the token at given index is a comment whose indentation - * can be fixed. - * - * Indentation of a comment is not changed when the comment is part of a - * multi-line message whose lines are all single-line comments and at least - * one line has meaningful content. - */ - private function isCommentWithFixableIndentation(Tokens $tokens, int $index): bool - { - if (!$tokens[$index]->isComment()) { - return false; - } - - if (0 === strpos($tokens[$index]->getContent(), '/*')) { - return true; - } - - $firstCommentIndex = $index; - while (true) { - $i = $this->getSiblingContinuousSingleLineComment($tokens, $firstCommentIndex, false); - if (null === $i) { - break; - } - - $firstCommentIndex = $i; - } - - $lastCommentIndex = $index; - while (true) { - $i = $this->getSiblingContinuousSingleLineComment($tokens, $lastCommentIndex, true); - if (null === $i) { - break; - } - - $lastCommentIndex = $i; - } - - if ($firstCommentIndex === $lastCommentIndex) { - return true; - } - - for ($i = $firstCommentIndex + 1; $i < $lastCommentIndex; ++$i) { - if (!$tokens[$i]->isWhitespace() && !$tokens[$i]->isComment()) { - return false; - } - } - - return true; - } - - private function getSiblingContinuousSingleLineComment(Tokens $tokens, int $index, bool $after): ?int - { - $siblingIndex = $index; - do { - $siblingIndex = $tokens->getTokenOfKindSibling($siblingIndex, $after ? 1 : -1, [[T_COMMENT]]); - - if (null === $siblingIndex) { - return null; - } - } while (0 === strpos($tokens[$siblingIndex]->getContent(), '/*')); - - $newLines = 0; - for ($i = min($siblingIndex, $index) + 1, $max = max($siblingIndex, $index); $i < $max; ++$i) { - if ($tokens[$i]->isWhitespace() && Preg::match('/\R/', $tokens[$i]->getContent())) { - if (1 === $newLines || Preg::match('/\R.*\R/', $tokens[$i]->getContent())) { - return null; - } - - ++$newLines; - } - } - - return $siblingIndex; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/EncodingFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/EncodingFixer.php deleted file mode 100644 index 4e256e5..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/EncodingFixer.php +++ /dev/null @@ -1,95 +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\Fixer\Basic; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Fixer for rules defined in PSR1 ¶2.2. - * - * @author Dariusz Rumiński - */ -final class EncodingFixer extends AbstractFixer -{ - /** - * @var string - */ - private $BOM; - - public function __construct() - { - parent::__construct(); - - $this->BOM = pack('CCC', 0xef, 0xbb, 0xbf); - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'PHP code MUST use only UTF-8 without BOM (remove BOM).', - [ - new CodeSample( - $this->BOM.'getContent(); - - if (0 === strncmp($content, $this->BOM, 3)) { - $newContent = substr($content, 3); - - if ('' === $newContent) { - $tokens->clearAt(0); - } else { - $tokens[0] = new Token([$tokens[0]->getId(), $newContent]); - } - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/NonPrintableCharacterFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/NonPrintableCharacterFixer.php deleted file mode 100644 index c965828..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/NonPrintableCharacterFixer.php +++ /dev/null @@ -1,187 +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\Fixer\Basic; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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; -use PhpCsFixer\FixerDefinition\VersionSpecification; -use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use Symfony\Component\OptionsResolver\Options; - -/** - * Removes Zero-width space (ZWSP), Non-breaking space (NBSP) and other invisible unicode symbols. - * - * @author Ivan Boprzenkov - */ -final class NonPrintableCharacterFixer extends AbstractFixer implements ConfigurableFixerInterface -{ - private $symbolsReplace; - - private static $tokens = [ - T_STRING_VARNAME, - T_INLINE_HTML, - T_VARIABLE, - T_COMMENT, - T_ENCAPSED_AND_WHITESPACE, - T_CONSTANT_ENCAPSED_STRING, - T_DOC_COMMENT, - ]; - - public function __construct() - { - parent::__construct(); - - $this->symbolsReplace = [ - pack('H*', 'e2808b') => ['', '200b'], // ZWSP U+200B - pack('H*', 'e28087') => [' ', '2007'], // FIGURE SPACE U+2007 - pack('H*', 'e280af') => [' ', '202f'], // NBSP U+202F - pack('H*', 'e281a0') => ['', '2060'], // WORD JOINER U+2060 - pack('H*', 'c2a0') => [' ', 'a0'], // NO-BREAK SPACE U+A0 - ]; - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Remove Zero-width space (ZWSP), Non-breaking space (NBSP) and other invisible unicode symbols.', - [ - new CodeSample( - ' false] - ), - ], - null, - 'Risky when strings contain intended invisible characters.' - ); - } - - /** - * {@inheritdoc} - */ - public function isRisky(): bool - { - return true; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isAnyTokenKindsFound(self::$tokens); - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('use_escape_sequences_in_strings', 'Whether characters should be replaced with escape sequences in strings.')) - ->setAllowedTypes(['bool']) - ->setDefault(true) - ->setNormalizer(static function (Options $options, $value) { - if (\PHP_VERSION_ID < 70000 && $value) { - throw new InvalidOptionsForEnvException('Escape sequences require PHP 7.0+.'); - } - - return $value; - }) - ->getOption(), - ]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $replacements = []; - $escapeSequences = []; - - foreach ($this->symbolsReplace as $character => [$replacement, $codepoint]) { - $replacements[$character] = $replacement; - $escapeSequences[$character] = '\u{'.$codepoint.'}'; - } - - foreach ($tokens as $index => $token) { - $content = $token->getContent(); - - if ( - $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)) { - continue; - } - - $previousToken = $tokens[$index - 1]; - $stringTypeChanged = false; - $swapQuotes = false; - - if ($previousToken->isGivenKind(T_START_HEREDOC)) { - $previousTokenContent = $previousToken->getContent(); - - if (false !== strpos($previousTokenContent, '\'')) { - $tokens[$index - 1] = new Token([T_START_HEREDOC, str_replace('\'', '', $previousTokenContent)]); - $stringTypeChanged = true; - } - } elseif ("'" === $content[0]) { - $stringTypeChanged = true; - $swapQuotes = true; - } - - if ($swapQuotes) { - $content = str_replace("\\'", "'", $content); - } - - if ($stringTypeChanged) { - $content = Preg::replace('/(\\\\{1,2})/', '\\\\\\\\', $content); - $content = str_replace('$', '\$', $content); - } - - if ($swapQuotes) { - $content = str_replace('"', '\"', $content); - $content = Preg::replace('/^\'(.*)\'$/', '"$1"', $content); - } - - $tokens[$index] = new Token([$token->getId(), strtr($content, $escapeSequences)]); - - continue; - } - - if ($token->isGivenKind(self::$tokens)) { - $tokens[$index] = new Token([$token->getId(), strtr($content, $replacements)]); - } - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/PsrAutoloadingFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/PsrAutoloadingFixer.php deleted file mode 100644 index 4f79089..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/PsrAutoloadingFixer.php +++ /dev/null @@ -1,285 +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\Fixer\Basic; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\FileSpecificCodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Preg; -use PhpCsFixer\StdinFileInfo; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Jordi Boggiano - * @author Dariusz Rumiński - * @author Bram Gotink - * @author Graham Campbell - * @author Kuba Werłos - */ -final class PsrAutoloadingFixer extends AbstractFixer implements ConfigurableFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Classes must be in a path that matches their namespace, be at least one namespace deep and the class name should match the file name.', - [ - new FileSpecificCodeSample( - ' './src'] - ), - ], - null, - 'This fixer may change your class name, which will break the code that depends on the old name.' - ); - } - - /** - * {@inheritdoc} - */ - public function configure(array $configuration): void - { - parent::configure($configuration); - - if (null !== $this->configuration['dir']) { - $this->configuration['dir'] = realpath($this->configuration['dir']); - } - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isAnyTokenKindsFound(Token::getClassyTokenKinds()); - } - - /** - * {@inheritdoc} - */ - public function isRisky(): bool - { - return true; - } - - /** - * {@inheritdoc} - */ - public function getPriority(): int - { - return -10; - } - - /** - * {@inheritdoc} - */ - public function supports(\SplFileInfo $file): bool - { - if ($file instanceof StdinFileInfo) { - return false; - } - - if ( - // ignore file with extension other than php - ('php' !== $file->getExtension()) - // ignore file with name that cannot be a class name - || 0 === Preg::match('/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$/', $file->getBasename('.php')) - ) { - return false; - } - - try { - $tokens = Tokens::fromCode(sprintf('getBasename('.php'))); - - if ($tokens[3]->isKeyword() || $tokens[3]->isMagicConstant()) { - // name can not be a class name - detected by PHP 5.x - return false; - } - } catch (\ParseError $e) { - // name can not be a class name - detected by PHP 7.x - return false; - } - - // ignore stubs/fixtures, since they are typically containing invalid files for various reasons - return !Preg::match('{[/\\\\](stub|fixture)s?[/\\\\]}i', $file->getRealPath()); - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('dir', 'If provided, the directory where the project code is placed.')) - ->setAllowedTypes(['null', 'string']) - ->setDefault(null) - ->getOption(), - ]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - if (null !== $this->configuration['dir'] && 0 !== strpos($file->getRealPath(), $this->configuration['dir'])) { - return; - } - - $namespace = null; - $namespaceStartIndex = null; - $namespaceEndIndex = null; - - $classyName = null; - $classyIndex = null; - - foreach ($tokens as $index => $token) { - if ($token->isGivenKind(T_NAMESPACE)) { - if (null !== $namespace) { - return; - } - - $namespaceStartIndex = $tokens->getNextMeaningfulToken($index); - $namespaceEndIndex = $tokens->getNextTokenOfKind($namespaceStartIndex, [';']); - - $namespace = trim($tokens->generatePartialCode($namespaceStartIndex, $namespaceEndIndex - 1)); - } elseif ($token->isClassy()) { - if ($tokens[$tokens->getPrevMeaningfulToken($index)]->isGivenKind(T_NEW)) { - continue; - } - - if (null !== $classyName) { - return; - } - - $classyIndex = $tokens->getNextMeaningfulToken($index); - $classyName = $tokens[$classyIndex]->getContent(); - } - } - - if (null === $classyName) { - return; - } - - $expectedClassyName = $this->calculateClassyName($file, $namespace, $classyName); - - if ($classyName !== $expectedClassyName) { - $tokens[$classyIndex] = new Token([T_STRING, $expectedClassyName]); - } - - if (null === $this->configuration['dir'] || null === $namespace) { - return; - } - - if (!is_dir($this->configuration['dir'])) { - return; - } - - $configuredDir = realpath($this->configuration['dir']); - $fileDir = \dirname($file->getRealPath()); - if (\strlen($configuredDir) >= \strlen($fileDir)) { - return; - } - - $newNamespace = substr(str_replace('/', '\\', $fileDir), \strlen($configuredDir) + 1); - $originalNamespace = substr($namespace, -\strlen($newNamespace)); - - if ($originalNamespace !== $newNamespace && strtolower($originalNamespace) === strtolower($newNamespace)) { - $tokens->clearRange($namespaceStartIndex, $namespaceEndIndex); - $namespace = substr($namespace, 0, -\strlen($newNamespace)).$newNamespace; - - $newNamespace = Tokens::fromCode('clearRange(0, 2); - $newNamespace->clearEmptyTokens(); - - $tokens->insertAt($namespaceStartIndex, $newNamespace); - } - } - - private function calculateClassyName(\SplFileInfo $file, ?string $namespace, string $currentName): string - { - $name = $file->getBasename('.php'); - - $maxNamespace = $this->calculateMaxNamespace($file, $namespace); - - if (null !== $this->configuration['dir']) { - return ('' !== $maxNamespace ? (str_replace('\\', '_', $maxNamespace).'_') : '').$name; - } - - $namespaceParts = array_reverse(explode('\\', $maxNamespace)); - - foreach ($namespaceParts as $namespacePart) { - $nameCandidate = sprintf('%s_%s', $namespacePart, $name); - if (strtolower($nameCandidate) !== strtolower(substr($currentName, -\strlen($nameCandidate)))) { - break; - } - $name = $nameCandidate; - } - - return $name; - } - - private function calculateMaxNamespace(\SplFileInfo $file, ?string $namespace): string - { - if (null === $this->configuration['dir']) { - $root = \dirname($file->getRealPath()); - while ($root !== \dirname($root)) { - $root = \dirname($root); - } - } else { - $root = realpath($this->configuration['dir']); - } - - $namespaceAccordingToFileLocation = trim(str_replace(\DIRECTORY_SEPARATOR, '\\', substr(\dirname($file->getRealPath()), \strlen($root))), '\\'); - - if (null === $namespace) { - return $namespaceAccordingToFileLocation; - } - - $namespaceAccordingToFileLocationPartsReversed = array_reverse(explode('\\', $namespaceAccordingToFileLocation)); - $namespacePartsReversed = array_reverse(explode('\\', $namespace)); - - foreach ($namespacePartsReversed as $key => $namespaceParte) { - if (!isset($namespaceAccordingToFileLocationPartsReversed[$key])) { - break; - } - if (strtolower($namespaceParte) !== strtolower($namespaceAccordingToFileLocationPartsReversed[$key])) { - break; - } - unset($namespaceAccordingToFileLocationPartsReversed[$key]); - } - - return implode('\\', array_reverse($namespaceAccordingToFileLocationPartsReversed)); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/ConstantCaseFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/ConstantCaseFixer.php deleted file mode 100644 index 5b71c64..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/ConstantCaseFixer.php +++ /dev/null @@ -1,154 +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\Fixer\Casing; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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; - -/** - * Fixer for constants case. - * - * @author Pol Dellaiera - */ -final class ConstantCaseFixer extends AbstractFixer implements ConfigurableFixerInterface -{ - /** - * Hold the function that will be used to convert the constants. - * - * @var callable - */ - private $fixFunction; - - /** - * {@inheritdoc} - */ - public function configure(array $configuration): void - { - parent::configure($configuration); - - if ('lower' === $this->configuration['case']) { - $this->fixFunction = static function (string $content): string { - return strtolower($content); - }; - } - - if ('upper' === $this->configuration['case']) { - $this->fixFunction = static function (string $content): string { - return strtoupper($content); - }; - } - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'The PHP constants `true`, `false`, and `null` MUST be written using the correct casing.', - [ - new CodeSample(" 'upper']), - ] - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isTokenKindFound(T_STRING); - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('case', 'Whether to use the `upper` or `lower` case syntax.')) - ->setAllowedValues(['upper', 'lower']) - ->setDefault('lower') - ->getOption(), - ]); - } - - /** - * {@inheritdoc} - */ - 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)) - ) { - $tokens[$index] = new Token([$token->getId(), $fixFunction($token->getContent())]); - } - } - } - - private function isNeighbourAccepted(Tokens $tokens, int $index): bool - { - static $forbiddenTokens = null; - - if (null === $forbiddenTokens) { - $forbiddenTokens = array_merge( - [ - T_AS, - T_CLASS, - T_CONST, - T_EXTENDS, - T_IMPLEMENTS, - T_INSTANCEOF, - T_INSTEADOF, - T_INTERFACE, - 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); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/LowercaseKeywordsFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/LowercaseKeywordsFixer.php deleted file mode 100644 index d51243e..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/LowercaseKeywordsFixer.php +++ /dev/null @@ -1,78 +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\Fixer\Casing; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Fixer for rules defined in PSR2 ¶2.5. - * - * @author Dariusz Rumiński - */ -final class LowercaseKeywordsFixer extends AbstractFixer -{ - private static $excludedTokens = [T_HALT_COMPILER]; - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'PHP keywords MUST be in lower case.', - [ - new CodeSample( - 'isAnyTokenKindsFound(Token::getKeywords()); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - foreach ($tokens as $index => $token) { - if ($token->isKeyword() && !$token->isGivenKind(self::$excludedTokens)) { - $tokens[$index] = new Token([$token->getId(), strtolower($token->getContent())]); - } - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/LowercaseStaticReferenceFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/LowercaseStaticReferenceFixer.php deleted file mode 100644 index 085296d..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/LowercaseStaticReferenceFixer.php +++ /dev/null @@ -1,108 +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\Fixer\Casing; - -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\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Kuba Werłos - */ -final class LowercaseStaticReferenceFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Class static references `self`, `static` and `parent` MUST be in lower case.', - [ - new CodeSample('isAnyTokenKindsFound([T_STATIC, T_STRING]); - } - - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - foreach ($tokens as $index => $token) { - if (!$token->equalsAny([[T_STRING, 'self'], [T_STATIC, 'static'], [T_STRING, 'parent']], false)) { - continue; - } - - $newContent = strtolower($token->getContent()); - if ($token->getContent() === $newContent) { - continue; // case is already correct - } - - $prevIndex = $tokens->getPrevMeaningfulToken($index); - if ($tokens[$prevIndex]->isGivenKind([T_CONST, T_DOUBLE_COLON, T_FUNCTION, T_NAMESPACE, T_NS_SEPARATOR, T_PRIVATE, T_PROTECTED, T_PUBLIC]) || $tokens[$prevIndex]->isObjectOperator()) { - continue; - } - - $nextIndex = $tokens->getNextMeaningfulToken($index); - if ($tokens[$nextIndex]->isGivenKind([T_FUNCTION, T_NS_SEPARATOR, T_PRIVATE, T_PROTECTED, T_PUBLIC])) { - continue; - } - - if ('static' === $newContent && $tokens[$nextIndex]->isGivenKind(T_VARIABLE)) { - continue; - } - - $tokens[$index] = new Token([$token->getId(), $newContent]); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/MagicConstantCasingFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/MagicConstantCasingFixer.php deleted file mode 100644 index 3cfae9b..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/MagicConstantCasingFixer.php +++ /dev/null @@ -1,101 +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\Fixer\Casing; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author ntzm - */ -final class MagicConstantCasingFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Magic constants should be referred to using the correct casing.', - [new CodeSample("isAnyTokenKindsFound($this->getMagicConstantTokens()); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $magicConstants = $this->getMagicConstants(); - $magicConstantTokens = $this->getMagicConstantTokens(); - - foreach ($tokens as $index => $token) { - if ($token->isGivenKind($magicConstantTokens)) { - $tokens[$index] = new Token([$token->getId(), $magicConstants[$token->getId()]]); - } - } - } - - /** - * @return array - */ - private function getMagicConstants(): array - { - static $magicConstants = null; - - if (null === $magicConstants) { - $magicConstants = [ - T_LINE => '__LINE__', - T_FILE => '__FILE__', - T_DIR => '__DIR__', - T_FUNC_C => '__FUNCTION__', - T_CLASS_C => '__CLASS__', - T_METHOD_C => '__METHOD__', - T_NS_C => '__NAMESPACE__', - CT::T_CLASS_CONSTANT => 'class', - T_TRAIT_C => '__TRAIT__', - ]; - } - - return $magicConstants; - } - - /** - * @return array - */ - private function getMagicConstantTokens(): array - { - static $magicConstantTokens = null; - - if (null === $magicConstantTokens) { - $magicConstantTokens = array_keys($this->getMagicConstants()); - } - - return $magicConstantTokens; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/MagicMethodCasingFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/MagicMethodCasingFixer.php deleted file mode 100644 index 45979c8..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/MagicMethodCasingFixer.php +++ /dev/null @@ -1,205 +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\Fixer\Casing; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author SpacePossum - */ -final class MagicMethodCasingFixer extends AbstractFixer -{ - private static $magicNames = [ - '__call' => '__call', - '__callstatic' => '__callStatic', - '__clone' => '__clone', - '__construct' => '__construct', - '__debuginfo' => '__debugInfo', - '__destruct' => '__destruct', - '__get' => '__get', - '__invoke' => '__invoke', - '__isset' => '__isset', - '__serialize' => '__serialize', - '__set' => '__set', - '__set_state' => '__set_state', - '__sleep' => '__sleep', - '__tostring' => '__toString', - '__unserialize' => '__unserialize', - '__unset' => '__unset', - '__wakeup' => '__wakeup', - ]; - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Magic method definitions and calls must be using the correct casing.', - [ - new CodeSample( - '__INVOKE(1); -' - ), - ] - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isTokenKindFound(T_STRING) && $tokens->isAnyTokenKindsFound(array_merge([T_FUNCTION, T_DOUBLE_COLON], Token::getObjectOperatorKinds())); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $inClass = 0; - $tokenCount = \count($tokens); - - for ($index = 1; $index < $tokenCount - 2; ++$index) { - if (0 === $inClass && $tokens[$index]->isClassy()) { - $inClass = 1; - $index = $tokens->getNextTokenOfKind($index, ['{']); - - continue; - } - - if (0 !== $inClass) { - if ($tokens[$index]->equals('{')) { - ++$inClass; - - continue; - } - - if ($tokens[$index]->equals('}')) { - --$inClass; - - continue; - } - } - - if (!$tokens[$index]->isGivenKind(T_STRING)) { - continue; // wrong type - } - - $content = $tokens[$index]->getContent(); - if ('__' !== substr($content, 0, 2)) { - continue; // cheap look ahead - } - - $name = strtolower($content); - - if (!$this->isMagicMethodName($name)) { - continue; // method name is not one of the magic ones we can fix - } - - $nameInCorrectCasing = $this->getMagicMethodNameInCorrectCasing($name); - if ($nameInCorrectCasing === $content) { - continue; // method name is already in the correct casing, no fix needed - } - - if ($this->isFunctionSignature($tokens, $index)) { - if (0 !== $inClass) { - // this is a method definition we want to fix - $this->setTokenToCorrectCasing($tokens, $index, $nameInCorrectCasing); - } - - continue; - } - - if ($this->isMethodCall($tokens, $index)) { - $this->setTokenToCorrectCasing($tokens, $index, $nameInCorrectCasing); - - continue; - } - - if ( - ('__callstatic' === $name || '__set_state' === $name) - && $this->isStaticMethodCall($tokens, $index) - ) { - $this->setTokenToCorrectCasing($tokens, $index, $nameInCorrectCasing); - } - } - } - - private function isFunctionSignature(Tokens $tokens, int $index): bool - { - $prevIndex = $tokens->getPrevMeaningfulToken($index); - if (!$tokens[$prevIndex]->isGivenKind(T_FUNCTION)) { - return false; // not a method signature - } - - return $tokens[$tokens->getNextMeaningfulToken($index)]->equals('('); - } - - private function isMethodCall(Tokens $tokens, int $index): bool - { - $prevIndex = $tokens->getPrevMeaningfulToken($index); - if (!$tokens[$prevIndex]->isObjectOperator()) { - return false; // not a "simple" method call - } - - return $tokens[$tokens->getNextMeaningfulToken($index)]->equals('('); - } - - private function isStaticMethodCall(Tokens $tokens, int $index): bool - { - $prevIndex = $tokens->getPrevMeaningfulToken($index); - if (!$tokens[$prevIndex]->isGivenKind(T_DOUBLE_COLON)) { - return false; // not a "simple" static method call - } - - return $tokens[$tokens->getNextMeaningfulToken($index)]->equals('('); - } - - private function isMagicMethodName(string $name): bool - { - return isset(self::$magicNames[$name]); - } - - /** - * @param string $name name of a magic method - */ - private function getMagicMethodNameInCorrectCasing(string $name): string - { - return self::$magicNames[$name]; - } - - private function setTokenToCorrectCasing(Tokens $tokens, int $index, string $nameInCorrectCasing): void - { - $tokens[$index] = new Token([T_STRING, $nameInCorrectCasing]); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/NativeFunctionCasingFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/NativeFunctionCasingFixer.php deleted file mode 100644 index db9e4fe..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/NativeFunctionCasingFixer.php +++ /dev/null @@ -1,120 +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\Fixer\Casing; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author SpacePossum - */ -final class NativeFunctionCasingFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Function defined by PHP should be called using the correct casing.', - [new CodeSample("isTokenKindFound(T_STRING); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - static $nativeFunctionNames = null; - - if (null === $nativeFunctionNames) { - $nativeFunctionNames = $this->getNativeFunctionNames(); - } - - for ($index = 0, $count = $tokens->count(); $index < $count; ++$index) { - // test if we are at a function all - if (!$tokens[$index]->isGivenKind(T_STRING)) { - continue; - } - - $next = $tokens->getNextMeaningfulToken($index); - if (!$tokens[$next]->equals('(')) { - $index = $next; - - continue; - } - - $functionNamePrefix = $tokens->getPrevMeaningfulToken($index); - if ($tokens[$functionNamePrefix]->isGivenKind([T_DOUBLE_COLON, T_NEW, T_FUNCTION, CT::T_RETURN_REF]) || $tokens[$functionNamePrefix]->isObjectOperator()) { - continue; - } - - if ($tokens[$functionNamePrefix]->isGivenKind(T_NS_SEPARATOR)) { - // skip if the call is to a constructor or to a function in a namespace other than the default - $prev = $tokens->getPrevMeaningfulToken($functionNamePrefix); - if ($tokens[$prev]->isGivenKind([T_STRING, T_NEW])) { - continue; - } - } - - // test if the function call is to a native PHP function - $lower = strtolower($tokens[$index]->getContent()); - if (!\array_key_exists($lower, $nativeFunctionNames)) { - continue; - } - - $tokens[$index] = new Token([T_STRING, $nativeFunctionNames[$lower]]); - $index = $next; - } - } - - /** - * @return array - */ - private function getNativeFunctionNames(): array - { - $allFunctions = get_defined_functions(); - $functions = []; - foreach ($allFunctions['internal'] as $function) { - $functions[strtolower($function)] = $function; - } - - return $functions; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/NativeFunctionTypeDeclarationCasingFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/NativeFunctionTypeDeclarationCasingFixer.php deleted file mode 100644 index 32da7ea..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/NativeFunctionTypeDeclarationCasingFixer.php +++ /dev/null @@ -1,183 +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\Fixer\Casing; - -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\Analyzer\Analysis\TypeAnalysis; -use PhpCsFixer\Tokenizer\Analyzer\FunctionsAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author SpacePossum - */ -final class NativeFunctionTypeDeclarationCasingFixer extends AbstractFixer -{ - /** - * https://secure.php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration. - * - * self PHP 5.0 - * array PHP 5.1 - * callable PHP 5.4 - * bool PHP 7.0 - * float PHP 7.0 - * int PHP 7.0 - * string PHP 7.0 - * iterable PHP 7.1 - * void PHP 7.1 - * object PHP 7.2 - * static PHP 8.0 (return type only) - * mixed PHP 8.0 - * - * @var array - */ - private $hints; - - /** - * @var FunctionsAnalyzer - */ - private $functionsAnalyzer; - - public function __construct() - { - parent::__construct(); - - $this->hints = [ - 'array' => true, - 'callable' => true, - 'self' => true, - ]; - - if (\PHP_VERSION_ID >= 70000) { - $this->hints = array_merge( - $this->hints, - [ - 'bool' => true, - 'float' => true, - 'int' => true, - 'string' => true, - ] - ); - } - - if (\PHP_VERSION_ID >= 70100) { - $this->hints = array_merge( - $this->hints, - [ - 'iterable' => true, - 'void' => true, - ] - ); - } - - if (\PHP_VERSION_ID >= 70200) { - $this->hints = array_merge($this->hints, ['object' => true]); - } - - if (\PHP_VERSION_ID >= 80000) { - $this->hints = array_merge($this->hints, ['static' => true]); - $this->hints = array_merge($this->hints, ['mixed' => true]); - } - - $this->functionsAnalyzer = new FunctionsAnalyzer(); - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Native type hints for functions should use the correct case.', - [ - new CodeSample("isAllTokenKindsFound([T_FUNCTION, T_STRING]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - for ($index = $tokens->count() - 1; $index >= 0; --$index) { - if ($tokens[$index]->isGivenKind(T_FUNCTION)) { - if (\PHP_VERSION_ID >= 70000) { - $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)) { - continue; - } - - $lowerCasedName = strtolower($tokens[$index]->getContent()); - - if (!isset($this->hints[$lowerCasedName])) { - continue; - } - - $tokens[$index] = new Token([$tokens[$index]->getId(), $lowerCasedName]); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/CastNotation/CastSpacesFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/CastNotation/CastSpacesFixer.php deleted file mode 100644 index 5310960..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/CastNotation/CastSpacesFixer.php +++ /dev/null @@ -1,130 +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\Fixer\CastNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dariusz Rumiński - */ -final class CastSpacesFixer extends AbstractFixer implements ConfigurableFixerInterface -{ - private const INSIDE_CAST_SPACE_REPLACE_MAP = [ - ' ' => '', - "\t" => '', - "\n" => '', - "\r" => '', - "\0" => '', - "\x0B" => '', - ]; - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'A single space or none should be between cast and variable.', - [ - new CodeSample( - " 'single'] - ), - new CodeSample( - " 'none'] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run after NoShortBoolCastFixer. - */ - public function getPriority(): int - { - return -10; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isAnyTokenKindsFound(Token::getCastTokenKinds()); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - foreach ($tokens as $index => $token) { - if (!$token->isCast()) { - continue; - } - - $tokens[$index] = new Token([ - $token->getId(), - strtr($token->getContent(), self::INSIDE_CAST_SPACE_REPLACE_MAP), - ]); - - if ('single' === $this->configuration['space']) { - // force single whitespace after cast token: - if ($tokens[$index + 1]->isWhitespace(" \t")) { - // - if next token is whitespaces that contains only spaces and tabs - override next token with single space - $tokens[$index + 1] = new Token([T_WHITESPACE, ' ']); - } elseif (!$tokens[$index + 1]->isWhitespace()) { - // - if next token is not whitespaces that contains spaces, tabs and new lines - append single space to current token - $tokens->insertAt($index + 1, new Token([T_WHITESPACE, ' '])); - } - - continue; - } - - // force no whitespace after cast token: - if ($tokens[$index + 1]->isWhitespace()) { - $tokens->clearAt($index + 1); - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('space', 'spacing to apply between cast and variable.')) - ->setAllowedValues(['none', 'single']) - ->setDefault('single') - ->getOption(), - ]); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/CastNotation/LowercaseCastFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/CastNotation/LowercaseCastFixer.php deleted file mode 100644 index a3f501a..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/CastNotation/LowercaseCastFixer.php +++ /dev/null @@ -1,98 +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\Fixer\CastNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\FixerDefinition\VersionSpecification; -use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author SpacePossum - */ -final class LowercaseCastFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Cast should be written in lower case.', - [ - new VersionSpecificCodeSample( - 'isAnyTokenKindsFound(Token::getCastTokenKinds()); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - for ($index = 0, $count = $tokens->count(); $index < $count; ++$index) { - if (!$tokens[$index]->isCast()) { - continue; - } - - $tokens[$index] = new Token([$tokens[$index]->getId(), strtolower($tokens[$index]->getContent())]); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/CastNotation/ModernizeTypesCastingFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/CastNotation/ModernizeTypesCastingFixer.php deleted file mode 100644 index 99e51c0..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/CastNotation/ModernizeTypesCastingFixer.php +++ /dev/null @@ -1,162 +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\Fixer\CastNotation; - -use PhpCsFixer\AbstractFunctionReferenceFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Analyzer\ArgumentsAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Vladimir Reznichenko - */ -final class ModernizeTypesCastingFixer extends AbstractFunctionReferenceFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Replaces `intval`, `floatval`, `doubleval`, `strval` and `boolval` function calls with according type casting operator.', - [ - new CodeSample( - 'isTokenKindFound(T_STRING); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - // replacement patterns - static $replacement = [ - 'intval' => [T_INT_CAST, '(int)'], - 'floatval' => [T_DOUBLE_CAST, '(float)'], - 'doubleval' => [T_DOUBLE_CAST, '(float)'], - 'strval' => [T_STRING_CAST, '(string)'], - 'boolval' => [T_BOOL_CAST, '(bool)'], - ]; - - $argumentsAnalyzer = new ArgumentsAnalyzer(); - - foreach ($replacement as $functionIdentity => $newToken) { - $currIndex = 0; - while (null !== $currIndex) { - // 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; - } - - [$functionName, $openParenthesis, $closeParenthesis] = $boundaries; - - // analysing cursor shift - $currIndex = $openParenthesis; - - // indicator that the function is overridden - if (1 !== $argumentsAnalyzer->countArguments($tokens, $openParenthesis, $closeParenthesis)) { - continue; - } - - $paramContentEnd = $closeParenthesis; - $commaCandidate = $tokens->getPrevMeaningfulToken($paramContentEnd); - if ($tokens[$commaCandidate]->equals(',')) { - $tokens->removeTrailingWhitespace($commaCandidate); - $tokens->clearAt($commaCandidate); - $paramContentEnd = $commaCandidate; - } - - // check if something complex passed as an argument and preserve parenthesises then - $countParamTokens = 0; - for ($paramContentIndex = $openParenthesis + 1; $paramContentIndex < $paramContentEnd; ++$paramContentIndex) { - //not a space, means some sensible token - if (!$tokens[$paramContentIndex]->isGivenKind(T_WHITESPACE)) { - ++$countParamTokens; - } - } - - $preserveParenthesises = $countParamTokens > 1; - - $afterCloseParenthesisIndex = $tokens->getNextMeaningfulToken($closeParenthesis); - $afterCloseParenthesisToken = $tokens[$afterCloseParenthesisIndex]; - $wrapInParenthesises = $afterCloseParenthesisToken->equalsAny(['[', '{']) || $afterCloseParenthesisToken->isGivenKind(T_POW); - - // analyse namespace specification (root one or none) and decide what to do - $prevTokenIndex = $tokens->getPrevMeaningfulToken($functionName); - if ($tokens[$prevTokenIndex]->isGivenKind(T_NS_SEPARATOR)) { - // get rid of root namespace when it used - $tokens->removeTrailingWhitespace($prevTokenIndex); - $tokens->clearAt($prevTokenIndex); - } - - // perform transformation - $replacementSequence = [ - new Token($newToken), - new Token([T_WHITESPACE, ' ']), - ]; - if ($wrapInParenthesises) { - array_unshift($replacementSequence, new Token('(')); - } - - if (!$preserveParenthesises) { - // closing parenthesis removed with leading spaces - $tokens->removeLeadingWhitespace($closeParenthesis); - $tokens->clearAt($closeParenthesis); - - // opening parenthesis removed with trailing spaces - $tokens->removeLeadingWhitespace($openParenthesis); - $tokens->removeTrailingWhitespace($openParenthesis); - $tokens->clearAt($openParenthesis); - } else { - // we'll need to provide a space after a casting operator - $tokens->removeTrailingWhitespace($functionName); - } - - if ($wrapInParenthesises) { - $tokens->insertAt($closeParenthesis, new Token(')')); - } - - $tokens->overrideRange($functionName, $functionName, $replacementSequence); - - // nested transformations support - $currIndex = $functionName; - } - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/CastNotation/NoShortBoolCastFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/CastNotation/NoShortBoolCastFixer.php deleted file mode 100644 index dbe032a..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/CastNotation/NoShortBoolCastFixer.php +++ /dev/null @@ -1,100 +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\Fixer\CastNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author SpacePossum - */ -final class NoShortBoolCastFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - * - * Must run before CastSpacesFixer. - */ - public function getPriority(): int - { - return -9; - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Short cast `bool` using double exclamation mark should not be used.', - [new CodeSample("isTokenKindFound('!'); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - for ($index = \count($tokens) - 1; $index > 1; --$index) { - if ($tokens[$index]->equals('!')) { - $index = $this->fixShortCast($tokens, $index); - } - } - } - - private function fixShortCast(Tokens $tokens, int $index): int - { - for ($i = $index - 1; $i > 1; --$i) { - if ($tokens[$i]->equals('!')) { - $this->fixShortCastToBoolCast($tokens, $i, $index); - - break; - } - - if (!$tokens[$i]->isComment() && !$tokens[$i]->isWhitespace()) { - break; - } - } - - return $i; - } - - private function fixShortCastToBoolCast(Tokens $tokens, int $start, int $end): void - { - for (; $start <= $end; ++$start) { - if ( - !$tokens[$start]->isComment() - && !($tokens[$start]->isWhitespace() && $tokens[$start - 1]->isComment()) - ) { - $tokens->clearAt($start); - } - } - - $tokens->insertAt($start, new Token([T_BOOL_CAST, '(bool)'])); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/CastNotation/NoUnsetCastFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/CastNotation/NoUnsetCastFixer.php deleted file mode 100644 index 79d6c24..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/CastNotation/NoUnsetCastFixer.php +++ /dev/null @@ -1,100 +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\Fixer\CastNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author SpacePossum - */ -final class NoUnsetCastFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Variables must be set `null` instead of using `(unset)` casting.', - [new CodeSample("isTokenKindFound(T_UNSET_CAST); - } - - /** - * {@inheritdoc} - * - * Must run before BinaryOperatorSpacesFixer. - */ - public function getPriority(): int - { - return 0; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - for ($index = \count($tokens) - 1; $index > 0; --$index) { - if ($tokens[$index]->isGivenKind(T_UNSET_CAST)) { - $this->fixUnsetCast($tokens, $index); - } - } - } - - private function fixUnsetCast(Tokens $tokens, int $index): void - { - $assignmentIndex = $tokens->getPrevMeaningfulToken($index); - if (null === $assignmentIndex || !$tokens[$assignmentIndex]->equals('=')) { - return; - } - - $varIndex = $tokens->getNextMeaningfulToken($index); - if (null === $varIndex || !$tokens[$varIndex]->isGivenKind(T_VARIABLE)) { - return; - } - - $afterVar = $tokens->getNextMeaningfulToken($varIndex); - if (null === $afterVar || !$tokens[$afterVar]->equalsAny([';', [T_CLOSE_TAG]])) { - return; - } - - $nextIsWhiteSpace = $tokens[$assignmentIndex + 1]->isWhitespace(); - - $tokens->clearTokenAndMergeSurroundingWhitespace($index); - $tokens->clearTokenAndMergeSurroundingWhitespace($varIndex); - - ++$assignmentIndex; - if (!$nextIsWhiteSpace) { - $tokens->insertAt($assignmentIndex, new Token([T_WHITESPACE, ' '])); - } - - ++$assignmentIndex; - $tokens->insertAt($assignmentIndex, new Token([T_STRING, 'null'])); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/CastNotation/ShortScalarCastFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/CastNotation/ShortScalarCastFixer.php deleted file mode 100644 index d775848..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/CastNotation/ShortScalarCastFixer.php +++ /dev/null @@ -1,89 +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\Fixer\CastNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\FixerDefinition\VersionSpecification; -use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author SpacePossum - */ -final class ShortScalarCastFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Cast `(boolean)` and `(integer)` should be written as `(bool)` and `(int)`, `(double)` and `(real)` as `(float)`, `(binary)` as `(string)`.', - [ - new VersionSpecificCodeSample( - "isAnyTokenKindsFound(Token::getCastTokenKinds()); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - static $castMap = [ - 'boolean' => 'bool', - 'integer' => 'int', - 'double' => 'float', - 'real' => 'float', - 'binary' => 'string', - ]; - - for ($index = 0, $count = $tokens->count(); $index < $count; ++$index) { - if (!$tokens[$index]->isCast()) { - continue; - } - - $castFrom = trim(substr($tokens[$index]->getContent(), 1, -1)); - $castFromLowered = strtolower($castFrom); - - if (!\array_key_exists($castFromLowered, $castMap)) { - continue; - } - - $tokens[$index] = new Token([ - $tokens[$index]->getId(), - str_replace($castFrom, $castMap[$castFromLowered], $tokens[$index]->getContent()), - ]); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/ClassAttributesSeparationFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/ClassAttributesSeparationFixer.php deleted file mode 100644 index 0d0dabb..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/ClassAttributesSeparationFixer.php +++ /dev/null @@ -1,578 +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\Fixer\ClassNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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\FixerDefinition\VersionSpecification; -use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; -use Symfony\Component\OptionsResolver\Exception\InvalidOptionsException; - -/** - * 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'. - * - * @author SpacePossum - */ -final class ClassAttributesSeparationFixer extends AbstractFixer implements ConfigurableFixerInterface, WhitespacesAwareFixerInterface -{ - private const SPACING_NONE = 'none'; - - private const SPACING_ONE = 'one'; - - private const SPACING_ONLY_IF_META = 'only_if_meta'; - - private const SUPPORTED_SPACINGS = [self::SPACING_NONE, self::SPACING_ONE, self::SPACING_ONLY_IF_META]; - - private const SUPPORTED_TYPES = ['const', 'method', 'property', 'trait_import']; - - /** - * @var array - */ - private $classElementTypes = []; - - /** - * @var array - */ - private $possibleMetadataKinds = []; - - /** - * {@inheritdoc} - */ - 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; - } - - $this->possibleMetadataKinds = [T_DOC_COMMENT]; - if (\defined('T_ATTRIBUTE')) { - // @todo remove check when PHP 8.0+ is required - $this->possibleMetadataKinds[] = T_ATTRIBUTE; - } - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Class, trait and interface elements must be separated with one or none blank line.', - [ - new CodeSample( - ' ['property' => self::SPACING_ONE]] - ), - new CodeSample( - ' ['const' => self::SPACING_ONE]] - ), - new CodeSample( - ' ['const' => self::SPACING_ONLY_IF_META]] - ), - new VersionSpecificCodeSample( - ' ['property' => self::SPACING_ONLY_IF_META]] - ), - new VersionSpecificCodeSample( - ' ['property' => self::SPACING_ONLY_IF_META]] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run before BracesFixer, IndentationTypeFixer. - * Must run after OrderedClassElementsFixer, SingleClassElementPerStatementFixer. - */ - public function getPriority(): int - { - return 55; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isAnyTokenKindsFound(Token::getClassyTokenKinds()); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $tokensAnalyzer = new TokensAnalyzer($tokens); - $class = $classStart = $classEnd = false; - - foreach (array_reverse($tokensAnalyzer->getClassyElements(), true) as $index => $element) { - if (!isset($this->classElementTypes[$element['type']])) { - continue; // not configured to be fixed - } - - $spacing = $this->classElementTypes[$element['type']]; - - if ($element['classIndex'] !== $class) { - $class = $element['classIndex']; - $classStart = $tokens->getNextTokenOfKind($class, ['{']); - $classEnd = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $classStart); - } - - if ('method' === $element['type'] && !$tokens[$class]->isGivenKind(T_INTERFACE)) { - // method of class or trait - $attributes = $tokensAnalyzer->getMethodAttributes($index); - - $methodEnd = true === $attributes['abstract'] - ? $tokens->getNextTokenOfKind($index, [';']) - : $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $tokens->getNextTokenOfKind($index, ['{'])) - ; - - $this->fixSpaceBelowClassMethod($tokens, $classEnd, $methodEnd, $spacing); - $this->fixSpaceAboveClassElement($tokens, $classStart, $index, $spacing); - - continue; - } - - // `const`, `property` or `method` of an `interface` - $this->fixSpaceBelowClassElement($tokens, $classEnd, $tokens->getNextTokenOfKind($index, [';']), $spacing); - $this->fixSpaceAboveClassElement($tokens, $classStart, $index, $spacing); - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('elements', sprintf('Dictionary of `%s` => `%s` values.', implode('|', self::SUPPORTED_TYPES), implode('|', self::SUPPORTED_SPACINGS)))) - ->setAllowedTypes(['array']) - ->setAllowedValues([static function (array $option) { - foreach ($option as $type => $spacing) { - if (!\in_array($type, self::SUPPORTED_TYPES, true)) { - throw new InvalidOptionsException( - sprintf( - 'Unexpected element type, expected any of "%s", got "%s".', - implode('", "', self::SUPPORTED_TYPES), - \gettype($type).'#'.$type - ) - ); - } - - if (!\in_array($spacing, self::SUPPORTED_SPACINGS, true)) { - throw new InvalidOptionsException( - sprintf( - 'Unexpected spacing for element type "%s", expected any of "%s", got "%s".', - $spacing, - implode('", "', self::SUPPORTED_SPACINGS), - \is_object($spacing) ? \get_class($spacing) : (null === $spacing ? 'null' : \gettype($spacing).'#'.$spacing) - ) - ); - } - } - - return true; - }]) - ->setDefault([ - 'const' => self::SPACING_ONE, - 'method' => self::SPACING_ONE, - 'property' => self::SPACING_ONE, - 'trait_import' => self::SPACING_ONE, - ]) - ->getOption(), - ]); - } - - /** - * Fix spacing below an element of a class, interface or trait. - * - * Deals with comments, PHPDocs and spaces above the element with respect to the position of the - * element within the class, interface or trait. - */ - private function fixSpaceBelowClassElement(Tokens $tokens, int $classEndIndex, int $elementEndIndex, string $spacing): void - { - for ($nextNotWhite = $elementEndIndex + 1;; ++$nextNotWhite) { - if (($tokens[$nextNotWhite]->isComment() || $tokens[$nextNotWhite]->isWhitespace()) && false === strpos($tokens[$nextNotWhite]->getContent(), "\n")) { - continue; - } - - break; - } - - if ($tokens[$nextNotWhite]->isWhitespace()) { - $nextNotWhite = $tokens->getNextNonWhitespace($nextNotWhite); - } - - $functionIndex = $tokens->getTokenNotOfKindsSibling($nextNotWhite - 1, 1, [T_ABSTRACT, T_FINAL, T_PUBLIC, T_PROTECTED, T_PRIVATE, T_STATIC, T_WHITESPACE, T_COMMENT, T_DOC_COMMENT]); - - if ($tokens[$functionIndex]->isGivenKind(T_FUNCTION)) { - $this->correctLineBreaks($tokens, $elementEndIndex, $nextNotWhite, 2); - - return; - } - - $reqLineCount = $this->determineRequiredLineCount($tokens, $nextNotWhite, $classEndIndex, $spacing); - - $this->correctLineBreaks($tokens, $elementEndIndex, $nextNotWhite, $reqLineCount); - } - - /** - * Fix spacing below a method of a class or trait. - * - * Deals with comments, PHPDocs and spaces above the method with respect to the position of the - * method within the class or trait. - */ - private function fixSpaceBelowClassMethod(Tokens $tokens, int $classEndIndex, int $elementEndIndex, string $spacing): void - { - $nextNotWhite = $tokens->getNextNonWhitespace($elementEndIndex); - $reqLineCount = $this->determineRequiredLineCount($tokens, $nextNotWhite, $classEndIndex, $spacing); - - $this->correctLineBreaks($tokens, $elementEndIndex, $nextNotWhite, $reqLineCount); - } - - /** - * Fix spacing above an element of a class, interface or trait. - * - * Deals with comments, PHPDocs and spaces above the element with respect to the position of the - * element within the class, interface or trait. - * - * @param int $classStartIndex index of the class Token the element is in - * @param int $elementIndex index of the element to fix - */ - private function fixSpaceAboveClassElement(Tokens $tokens, int $classStartIndex, int $elementIndex, string $spacing): void - { - static $methodAttr = [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]; - - $nonWhiteAbove = null; - - // find out where the element definition starts - $firstElementAttributeIndex = $elementIndex; - - for ($i = $elementIndex; $i > $classStartIndex; --$i) { - $nonWhiteAbove = $tokens->getPrevNonWhitespace($i); - - if (null !== $nonWhiteAbove && $tokens[$nonWhiteAbove]->isGivenKind($methodAttr)) { - $firstElementAttributeIndex = $nonWhiteAbove; - } else { - break; - } - } - - // deal with comments above an element - if ($tokens[$nonWhiteAbove]->isGivenKind(T_COMMENT)) { - if (1 === $firstElementAttributeIndex - $nonWhiteAbove) { - // no white space found between comment and element start - $this->correctLineBreaks($tokens, $nonWhiteAbove, $firstElementAttributeIndex, 1); - - return; - } - - // $tokens[$nonWhiteAbove + 1] is always a white space token here - if (substr_count($tokens[$nonWhiteAbove + 1]->getContent(), "\n") > 1) { - // more than one line break, always bring it back to 2 line breaks between the element start and what is above it - $this->correctLineBreaks($tokens, $nonWhiteAbove, $firstElementAttributeIndex, 2); - - return; - } - - // there are 2 cases: - if ($tokens[$nonWhiteAbove - 1]->isWhitespace() && substr_count($tokens[$nonWhiteAbove - 1]->getContent(), "\n") > 0) { - // 1. The comment is meant for the element (although not a PHPDoc), - // make sure there is one line break between the element and the comment... - $this->correctLineBreaks($tokens, $nonWhiteAbove, $firstElementAttributeIndex, 1); - // ... and make sure there is blank line above the comment (with the exception when it is directly after a class opening) - $nonWhiteAbove = $this->findCommentBlockStart($tokens, $nonWhiteAbove); - $nonWhiteAboveComment = $tokens->getPrevNonWhitespace($nonWhiteAbove); - - $this->correctLineBreaks($tokens, $nonWhiteAboveComment, $nonWhiteAbove, $nonWhiteAboveComment === $classStartIndex ? 1 : 2); - } else { - // 2. The comment belongs to the code above the element, - // make sure there is a blank line above the element (i.e. 2 line breaks) - $this->correctLineBreaks($tokens, $nonWhiteAbove, $firstElementAttributeIndex, 2); - } - - return; - } - - // deal with element with a PHPDoc above it - if ($tokens[$nonWhiteAbove]->isGivenKind(T_DOC_COMMENT)) { - // there should be one linebreak between the element and the PHPDoc above it - $this->correctLineBreaks($tokens, $nonWhiteAbove, $firstElementAttributeIndex, 1); - - // there should be one blank line between the PHPDoc and whatever is above (with the exception when it is directly after a class opening) - $nonWhiteAbovePHPDoc = $tokens->getPrevNonWhitespace($nonWhiteAbove); - $reqLineCount = $nonWhiteAbovePHPDoc === $classStartIndex ? 1 : 2; - - if ($tokens[$nonWhiteAbovePHPDoc]->isGivenKind(CT::T_ATTRIBUTE_CLOSE)) { - // PHPDocs can have attributes adjacent to them, so adjust our comparison points - [$nonWhiteAbove, $nonWhiteAbovePHPDoc, $reqLineCount] = $this->getAttributePhpdocSequenceOffset($tokens, $nonWhiteAbovePHPDoc, $classStartIndex); - } - - $this->correctLineBreaks($tokens, $nonWhiteAbovePHPDoc, $nonWhiteAbove, $reqLineCount); - - return; - } - - // deal with element with an attribute above it - if ($tokens[$nonWhiteAbove]->isGivenKind(CT::T_ATTRIBUTE_CLOSE)) { - // there should be one linebreak between the element and the attribute above it - $this->correctLineBreaks($tokens, $nonWhiteAbove, $firstElementAttributeIndex, 1); - - // make sure there is blank line above the attribute comment - // with the exception when it is directly after a class opening or has an adjacent PHPDoc - [$nonWhiteAbove, $nonWhiteAboveComment, $reqLineCount] = $this->getAttributePhpdocSequenceOffset($tokens, $nonWhiteAbove, $classStartIndex); - - $this->correctLineBreaks($tokens, $nonWhiteAboveComment, $nonWhiteAbove, $reqLineCount); - - return; - } - - $reqLineCount = $this->determineRequiredLineCount($tokens, $nonWhiteAbove, $classStartIndex, $spacing); - - $this->correctLineBreaks($tokens, $nonWhiteAbove, $firstElementAttributeIndex, $reqLineCount); - } - - /** - * @return array - */ - private function getAttributePhpdocSequenceOffset(Tokens $tokens, int $attributeCloseIndex, int $classStartIndex): array - { - $attributeStartIndex = $this->findAttributeBlockStart($tokens, $attributeCloseIndex); - $nonWhiteAboveAttribute = $tokens->getNonWhitespaceSibling($attributeStartIndex, -1); - $reqLineCount = $nonWhiteAboveAttribute === $classStartIndex || $tokens[$nonWhiteAboveAttribute]->isGivenKind(T_DOC_COMMENT) ? 1 : 2; - - return [$attributeStartIndex, $nonWhiteAboveAttribute, $reqLineCount]; - } - - private function determineRequiredLineCount(Tokens $tokens, int $notWhiteIndex, int $classStartOrEndIndex, string $spacing): int - { - // if the two indices are equal, this means the index is either at the - // start or end of the class and no additional line breaks are needed - if ($notWhiteIndex === $classStartOrEndIndex) { - return 1; - } - - if (self::SPACING_NONE === $spacing) { - return 1; - } - - if (self::SPACING_ONE === $spacing) { - return 2; - } - - if (self::SPACING_ONLY_IF_META === $spacing && $tokens[$notWhiteIndex]->isGivenKind($this->possibleMetadataKinds)) { - return 2; - } - - return 1; - } - - private function correctLineBreaks(Tokens $tokens, int $startIndex, int $endIndex, int $reqLineCount = 2): void - { - $lineEnding = $this->whitespacesConfig->getLineEnding(); - - ++$startIndex; - $numbOfWhiteTokens = $endIndex - $startIndex; - - if (0 === $numbOfWhiteTokens) { - $tokens->insertAt($startIndex, new Token([T_WHITESPACE, str_repeat($lineEnding, $reqLineCount)])); - - return; - } - - $lineBreakCount = $this->getLineBreakCount($tokens, $startIndex, $endIndex); - - if ($reqLineCount === $lineBreakCount) { - return; - } - - if ($lineBreakCount < $reqLineCount) { - $tokens[$startIndex] = new Token([ - T_WHITESPACE, - str_repeat($lineEnding, $reqLineCount - $lineBreakCount).$tokens[$startIndex]->getContent(), - ]); - - return; - } - - // $lineCount = > $reqLineCount : check the one Token case first since this one will be true most of the time - if (1 === $numbOfWhiteTokens) { - $tokens[$startIndex] = new Token([ - T_WHITESPACE, - Preg::replace('/\r\n|\n/', '', $tokens[$startIndex]->getContent(), $lineBreakCount - $reqLineCount), - ]); - - return; - } - - // $numbOfWhiteTokens = > 1 - $toReplaceCount = $lineBreakCount - $reqLineCount; - - for ($i = $startIndex; $i < $endIndex && $toReplaceCount > 0; ++$i) { - $tokenLineCount = substr_count($tokens[$i]->getContent(), "\n"); - - if ($tokenLineCount > 0) { - $tokens[$i] = new Token([ - T_WHITESPACE, - Preg::replace('/\r\n|\n/', '', $tokens[$i]->getContent(), min($toReplaceCount, $tokenLineCount)), - ]); - $toReplaceCount -= $tokenLineCount; - } - } - } - - private function getLineBreakCount(Tokens $tokens, int $whiteSpaceStartIndex, int $whiteSpaceEndIndex): int - { - $lineCount = 0; - - for ($i = $whiteSpaceStartIndex; $i < $whiteSpaceEndIndex; ++$i) { - $lineCount += substr_count($tokens[$i]->getContent(), "\n"); - } - - return $lineCount; - } - - private function findCommentBlockStart(Tokens $tokens, int $commentIndex): int - { - $start = $commentIndex; - - for ($i = $commentIndex - 1; $i > 0; --$i) { - if ($tokens[$i]->isComment()) { - $start = $i; - - continue; - } - - if (!$tokens[$i]->isWhitespace() || $this->getLineBreakCount($tokens, $i, $i + 1) > 1) { - break; - } - } - - return $start; - } - - /** - * @param int $index attribute close index - */ - private function findAttributeBlockStart(Tokens $tokens, int $index): int - { - $start = $index = $tokens->findBlockStart(Tokens::BLOCK_TYPE_ATTRIBUTE, $index); - - for ($i = $index - 1; $i > 0; --$i) { - if ($tokens[$i]->isGivenKind(CT::T_ATTRIBUTE_CLOSE)) { - $start = $i = $tokens->findBlockStart(Tokens::BLOCK_TYPE_ATTRIBUTE, $i); - - continue; - } - - if (!$tokens[$i]->isWhitespace() || $this->getLineBreakCount($tokens, $i, $i + 1) > 1) { - break; - } - } - - return $start; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/ClassDefinitionFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/ClassDefinitionFixer.php deleted file mode 100644 index d550535..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/ClassDefinitionFixer.php +++ /dev/null @@ -1,438 +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\Fixer\ClassNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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\FixerDefinition\VersionSpecification; -use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample; -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. - * - * @author SpacePossum - */ -final class ClassDefinitionFixer extends AbstractFixer implements ConfigurableFixerInterface, WhitespacesAwareFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Whitespace around the keywords of a class, trait or interfaces definition should be one space.', - [ - new CodeSample( - ' true] - ), - new CodeSample( - ' true] - ), - new CodeSample( - ' true] - ), - new CodeSample( - ' true] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run before BracesFixer. - */ - public function getPriority(): int - { - return 36; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isAnyTokenKindsFound(Token::getClassyTokenKinds()); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - // -4, one for count to index, 3 because min. of tokens for a classy location. - for ($index = $tokens->getSize() - 4; $index > 0; --$index) { - if ($tokens[$index]->isClassy()) { - $this->fixClassyDefinition($tokens, $index); - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('multi_line_extends_each_single_line', 'Whether definitions should be multiline.')) - ->setAllowedTypes(['bool']) - ->setDefault(false) - ->getOption(), - (new FixerOptionBuilder('single_item_single_line', 'Whether definitions should be single line when including a single item.')) - ->setAllowedTypes(['bool']) - ->setDefault(false) - ->getOption(), - (new FixerOptionBuilder('single_line', 'Whether definitions should be single line.')) - ->setAllowedTypes(['bool']) - ->setDefault(false) - ->getOption(), - (new FixerOptionBuilder('space_before_parenthesis', 'Whether there should be a single space after the parenthesis of anonymous class (PSR12) or not.')) - ->setAllowedTypes(['bool']) - ->setDefault(false) - ->getOption(), - ]); - } - - /** - * @param int $classyIndex Class definition token start index - */ - private function fixClassyDefinition(Tokens $tokens, int $classyIndex): void - { - $classDefInfo = $this->getClassyDefinitionInfo($tokens, $classyIndex); - - // PSR2 4.1 Lists of implements MAY be split across multiple lines, where each subsequent line is indented once. - // When doing so, the first item in the list MUST be on the next line, and there MUST be only one interface per line. - - if (false !== $classDefInfo['implements']) { - $classDefInfo['implements'] = $this->fixClassyDefinitionImplements( - $tokens, - $classDefInfo['open'], - $classDefInfo['implements'] - ); - } - - if (false !== $classDefInfo['extends']) { - $classDefInfo['extends'] = $this->fixClassyDefinitionExtends( - $tokens, - false === $classDefInfo['implements'] ? $classDefInfo['open'] : $classDefInfo['implements']['start'], - $classDefInfo['extends'] - ); - } - - // PSR2: class definition open curly brace must go on a new line. - // PSR12: anonymous class curly brace on same line if not multi line implements. - - $classDefInfo['open'] = $this->fixClassyDefinitionOpenSpacing($tokens, $classDefInfo); - - if ($classDefInfo['implements']) { - $end = $classDefInfo['implements']['start']; - } elseif ($classDefInfo['extends']) { - $end = $classDefInfo['extends']['start']; - } else { - $end = $tokens->getPrevNonWhitespace($classDefInfo['open']); - } - - // 4.1 The extends and implements keywords MUST be declared on the same line as the class name. - $this->makeClassyDefinitionSingleLine($tokens, $classDefInfo['start'], $end); - } - - private function fixClassyDefinitionExtends(Tokens $tokens, int $classOpenIndex, array $classExtendsInfo): array - { - $endIndex = $tokens->getPrevNonWhitespace($classOpenIndex); - - if ($this->configuration['single_line'] || false === $classExtendsInfo['multiLine']) { - $this->makeClassyDefinitionSingleLine($tokens, $classExtendsInfo['start'], $endIndex); - $classExtendsInfo['multiLine'] = false; - } elseif ($this->configuration['single_item_single_line'] && 1 === $classExtendsInfo['numberOfExtends']) { - $this->makeClassyDefinitionSingleLine($tokens, $classExtendsInfo['start'], $endIndex); - $classExtendsInfo['multiLine'] = false; - } elseif ($this->configuration['multi_line_extends_each_single_line'] && $classExtendsInfo['multiLine']) { - $this->makeClassyInheritancePartMultiLine($tokens, $classExtendsInfo['start'], $endIndex); - $classExtendsInfo['multiLine'] = true; - } - - return $classExtendsInfo; - } - - private function fixClassyDefinitionImplements(Tokens $tokens, int $classOpenIndex, array $classImplementsInfo): array - { - $endIndex = $tokens->getPrevNonWhitespace($classOpenIndex); - - if ($this->configuration['single_line'] || false === $classImplementsInfo['multiLine']) { - $this->makeClassyDefinitionSingleLine($tokens, $classImplementsInfo['start'], $endIndex); - $classImplementsInfo['multiLine'] = false; - } elseif ($this->configuration['single_item_single_line'] && 1 === $classImplementsInfo['numberOfImplements']) { - $this->makeClassyDefinitionSingleLine($tokens, $classImplementsInfo['start'], $endIndex); - $classImplementsInfo['multiLine'] = false; - } else { - $this->makeClassyInheritancePartMultiLine($tokens, $classImplementsInfo['start'], $endIndex); - $classImplementsInfo['multiLine'] = true; - } - - return $classImplementsInfo; - } - - private function fixClassyDefinitionOpenSpacing(Tokens $tokens, array $classDefInfo): int - { - if ($classDefInfo['anonymousClass']) { - if (false !== $classDefInfo['implements']) { - $spacing = $classDefInfo['implements']['multiLine'] ? $this->whitespacesConfig->getLineEnding() : ' '; - } elseif (false !== $classDefInfo['extends']) { - $spacing = $classDefInfo['extends']['multiLine'] ? $this->whitespacesConfig->getLineEnding() : ' '; - } else { - $spacing = ' '; - } - } else { - $spacing = $this->whitespacesConfig->getLineEnding(); - } - - $openIndex = $tokens->getNextTokenOfKind($classDefInfo['classy'], ['{']); - - if (' ' !== $spacing && false !== strpos($tokens[$openIndex - 1]->getContent(), "\n")) { - return $openIndex; - } - - if ($tokens[$openIndex - 1]->isWhitespace()) { - if (' ' !== $spacing || !$tokens[$tokens->getPrevNonWhitespace($openIndex - 1)]->isComment()) { - $tokens[$openIndex - 1] = new Token([T_WHITESPACE, $spacing]); - } - - return $openIndex; - } - - $tokens->insertAt($openIndex, new Token([T_WHITESPACE, $spacing])); - - return $openIndex + 1; - } - - private function getClassyDefinitionInfo(Tokens $tokens, int $classyIndex): array - { - $openIndex = $tokens->getNextTokenOfKind($classyIndex, ['{']); - $extends = false; - $implements = false; - $anonymousClass = false; - - if (!$tokens[$classyIndex]->isGivenKind(T_TRAIT)) { - $extends = $tokens->findGivenKind(T_EXTENDS, $classyIndex, $openIndex); - $extends = \count($extends) ? $this->getClassyInheritanceInfo($tokens, key($extends), 'numberOfExtends') : false; - - if (!$tokens[$classyIndex]->isGivenKind(T_INTERFACE)) { - $implements = $tokens->findGivenKind(T_IMPLEMENTS, $classyIndex, $openIndex); - $implements = \count($implements) ? $this->getClassyInheritanceInfo($tokens, key($implements), 'numberOfImplements') : false; - $tokensAnalyzer = new TokensAnalyzer($tokens); - $anonymousClass = $tokensAnalyzer->isAnonymousClass($classyIndex); - } - } - - if ($anonymousClass) { - $startIndex = $tokens->getPrevMeaningfulToken($classyIndex); // go to "new" for anonymous class - } else { - $prev = $tokens->getPrevMeaningfulToken($classyIndex); - $startIndex = $tokens[$prev]->isGivenKind([T_FINAL, T_ABSTRACT]) ? $prev : $classyIndex; - } - - return [ - 'start' => $startIndex, - 'classy' => $classyIndex, - 'open' => $openIndex, - 'extends' => $extends, - 'implements' => $implements, - 'anonymousClass' => $anonymousClass, - ]; - } - - private function getClassyInheritanceInfo(Tokens $tokens, int $startIndex, string $label): array - { - $implementsInfo = ['start' => $startIndex, $label => 1, 'multiLine' => false]; - ++$startIndex; - $endIndex = $tokens->getNextTokenOfKind($startIndex, ['{', [T_IMPLEMENTS], [T_EXTENDS]]); - $endIndex = $tokens[$endIndex]->equals('{') ? $tokens->getPrevNonWhitespace($endIndex) : $endIndex; - - for ($i = $startIndex; $i < $endIndex; ++$i) { - if ($tokens[$i]->equals(',')) { - ++$implementsInfo[$label]; - - continue; - } - - if (!$implementsInfo['multiLine'] && false !== strpos($tokens[$i]->getContent(), "\n")) { - $implementsInfo['multiLine'] = true; - } - } - - return $implementsInfo; - } - - private function makeClassyDefinitionSingleLine(Tokens $tokens, int $startIndex, int $endIndex): void - { - for ($i = $endIndex; $i >= $startIndex; --$i) { - if ($tokens[$i]->isWhitespace()) { - if ($tokens[$i - 1]->isComment() || $tokens[$i + 1]->isComment()) { - $content = $tokens[$i - 1]->getContent(); - - if (!('#' === $content || '//' === substr($content, 0, 2))) { - $content = $tokens[$i + 1]->getContent(); - - if (!('#' === $content || '//' === substr($content, 0, 2))) { - $tokens[$i] = new Token([T_WHITESPACE, ' ']); - } - } - - continue; - } - - if ($tokens[$i - 1]->isGivenKind(T_CLASS) && $tokens[$i + 1]->equals('(')) { - if (true === $this->configuration['space_before_parenthesis']) { - $tokens[$i] = new Token([T_WHITESPACE, ' ']); - } else { - $tokens->clearAt($i); - } - - continue; - } - - if (!$tokens[$i - 1]->equals(',') && $tokens[$i + 1]->equalsAny([',', ')']) || $tokens[$i - 1]->equals('(')) { - $tokens->clearAt($i); - - continue; - } - - $tokens[$i] = new Token([T_WHITESPACE, ' ']); - - continue; - } - - if ($tokens[$i]->equals(',') && !$tokens[$i + 1]->isWhitespace()) { - $tokens->insertAt($i + 1, new Token([T_WHITESPACE, ' '])); - - continue; - } - - if ($this->configuration['space_before_parenthesis'] && $tokens[$i]->isGivenKind(T_CLASS) && !$tokens[$i + 1]->isWhitespace()) { - $tokens->insertAt($i + 1, new Token([T_WHITESPACE, ' '])); - - continue; - } - - if (!$tokens[$i]->isComment()) { - continue; - } - - if (!$tokens[$i + 1]->isWhitespace() && !$tokens[$i + 1]->isComment() && false === strpos($tokens[$i]->getContent(), "\n")) { - $tokens->insertAt($i + 1, new Token([T_WHITESPACE, ' '])); - } - - if (!$tokens[$i - 1]->isWhitespace() && !$tokens[$i - 1]->isComment()) { - $tokens->insertAt($i, new Token([T_WHITESPACE, ' '])); - } - } - } - - private function makeClassyInheritancePartMultiLine(Tokens $tokens, int $startIndex, int $endIndex): void - { - for ($i = $endIndex; $i > $startIndex; --$i) { - $previousInterfaceImplementingIndex = $tokens->getPrevTokenOfKind($i, [',', [T_IMPLEMENTS], [T_EXTENDS]]); - $breakAtIndex = $tokens->getNextMeaningfulToken($previousInterfaceImplementingIndex); - - // make the part of a ',' or 'implements' single line - $this->makeClassyDefinitionSingleLine( - $tokens, - $breakAtIndex, - $i - ); - - // make sure the part is on its own line - $isOnOwnLine = false; - - for ($j = $breakAtIndex; $j > $previousInterfaceImplementingIndex; --$j) { - if (false !== strpos($tokens[$j]->getContent(), "\n")) { - $isOnOwnLine = true; - - break; - } - } - - if (!$isOnOwnLine) { - if ($tokens[$breakAtIndex - 1]->isWhitespace()) { - $tokens[$breakAtIndex - 1] = new Token([ - T_WHITESPACE, - $this->whitespacesConfig->getLineEnding().$this->whitespacesConfig->getIndent(), - ]); - } else { - $tokens->insertAt($breakAtIndex, new Token([T_WHITESPACE, $this->whitespacesConfig->getLineEnding().$this->whitespacesConfig->getIndent()])); - } - } - - $i = $previousInterfaceImplementingIndex + 1; - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/FinalClassFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/FinalClassFixer.php deleted file mode 100644 index 5372ca7..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/FinalClassFixer.php +++ /dev/null @@ -1,63 +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\Fixer\ClassNotation; - -use PhpCsFixer\AbstractProxyFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; - -/** - * @author Filippo Tessarotto - */ -final class FinalClassFixer extends AbstractProxyFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'All classes must be final, except abstract ones and Doctrine entities.', - [ - new CodeSample( - 'configure([ - 'annotation_include' => [], - 'consider_absent_docblock_as_internal_class' => true, - ]); - - return [$fixer]; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/FinalInternalClassFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/FinalInternalClassFixer.php deleted file mode 100644 index d70ff5d..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/FinalInternalClassFixer.php +++ /dev/null @@ -1,221 +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\Fixer\ClassNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\ConfigurationException\InvalidFixerConfigurationException; -use PhpCsFixer\DocBlock\DocBlock; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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; -use Symfony\Component\OptionsResolver\Options; - -/** - * @author Dariusz Rumiński - * @author SpacePossum - */ -final class FinalInternalClassFixer extends AbstractFixer implements ConfigurableFixerInterface -{ - /** - * {@inheritdoc} - */ - public function configure(array $configuration): void - { - parent::configure($configuration); - - $intersect = array_intersect_assoc( - $this->configuration['annotation_include'], - $this->configuration['annotation_exclude'] - ); - - if (\count($intersect)) { - throw new InvalidFixerConfigurationException($this->getName(), sprintf('Annotation cannot be used in both the include and exclude list, got duplicates: "%s".', implode('", "', array_keys($intersect)))); - } - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Internal classes should be `final`.', - [ - new CodeSample(" ['@Custom'], - 'annotation_exclude' => ['@not-fix'], - ] - ), - ], - null, - 'Changing classes to `final` might cause code execution to break.' - ); - } - - /** - * {@inheritdoc} - * - * Must run before ProtectedToPrivateFixer, SelfStaticAccessorFixer. - * Must run after PhpUnitInternalClassFixer. - */ - public function getPriority(): int - { - return 67; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isTokenKindFound(T_CLASS); - } - - /** - * {@inheritdoc} - */ - public function isRisky(): bool - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - for ($index = $tokens->count() - 1; 0 <= $index; --$index) { - if (!$tokens[$index]->isGivenKind(T_CLASS) || !$this->isClassCandidate($tokens, $index)) { - continue; - } - - // make class final - $tokens->insertAt( - $index, - [ - new Token([T_FINAL, 'final']), - new Token([T_WHITESPACE, ' ']), - ] - ); - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - $annotationsAsserts = [static function (array $values): bool { - foreach ($values as $value) { - if (!\is_string($value) || '' === $value) { - return false; - } - } - - return true; - }]; - - $annotationsNormalizer = static function (Options $options, array $value): array { - $newValue = []; - foreach ($value as $key) { - if ('@' === $key[0]) { - $key = substr($key, 1); - } - - $newValue[strtolower($key)] = true; - } - - return $newValue; - }; - - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('annotation_include', 'Class level annotations tags that must be set in order to fix the class. (case insensitive)')) - ->setAllowedTypes(['array']) - ->setAllowedValues($annotationsAsserts) - ->setDefault(['@internal']) - ->setNormalizer($annotationsNormalizer) - ->getOption(), - (new FixerOptionBuilder('annotation_exclude', 'Class level annotations 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']) - ->setAllowedValues($annotationsAsserts) - ->setDefault([ - '@final', - '@Entity', - '@ORM\Entity', - '@ORM\Mapping\Entity', - '@Mapping\Entity', - '@Document', - '@ODM\Document', - ]) - ->setNormalizer($annotationsNormalizer) - ->getOption(), - (new FixerOptionBuilder('consider_absent_docblock_as_internal_class', 'Should classes without any DocBlock be fixed to final?')) - ->setAllowedTypes(['bool']) - ->setDefault(false) - ->getOption(), - ]); - } - - /** - * @param int $index T_CLASS index - */ - private function isClassCandidate(Tokens $tokens, int $index): bool - { - if ($tokens[$tokens->getPrevMeaningfulToken($index)]->isGivenKind([T_ABSTRACT, T_FINAL, T_NEW])) { - return false; // ignore class; it is abstract or already final - } - - $docToken = $tokens[$tokens->getPrevNonWhitespace($index)]; - - if (!$docToken->isGivenKind(T_DOC_COMMENT)) { - return $this->configuration['consider_absent_docblock_as_internal_class']; - } - - $doc = new DocBlock($docToken->getContent()); - $tags = []; - - foreach ($doc->getAnnotations() as $annotation) { - if (1 !== Preg::match('/@\S+(?=\s|$)/', $annotation->getContent(), $matches)) { - continue; - } - $tag = strtolower(substr(array_shift($matches), 1)); - foreach ($this->configuration['annotation_exclude'] as $tagStart => $true) { - if (0 === strpos($tag, $tagStart)) { - return false; // ignore class: class-level PHPDoc contains tag that has been excluded through configuration - } - } - - $tags[$tag] = true; - } - - foreach ($this->configuration['annotation_include'] as $tag => $true) { - if (!isset($tags[$tag])) { - return false; // ignore class: class-level PHPDoc does not contain all tags that has been included through configuration - } - } - - return true; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/FinalPublicMethodForAbstractClassFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/FinalPublicMethodForAbstractClassFixer.php deleted file mode 100644 index b0d96a5..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/FinalPublicMethodForAbstractClassFixer.php +++ /dev/null @@ -1,167 +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\Fixer\ClassNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Filippo Tessarotto - */ -final class FinalPublicMethodForAbstractClassFixer extends AbstractFixer -{ - /** - * @var array - */ - private $magicMethods = [ - '__construct' => true, - '__destruct' => true, - '__call' => true, - '__callstatic' => true, - '__get' => true, - '__set' => true, - '__isset' => true, - '__unset' => true, - '__sleep' => true, - '__wakeup' => true, - '__tostring' => true, - '__invoke' => true, - '__set_state' => true, - '__clone' => true, - '__debuginfo' => true, - ]; - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'All `public` methods of `abstract` classes should be `final`.', - [ - new CodeSample( - 'isAllTokenKindsFound([T_CLASS, T_ABSTRACT, T_PUBLIC, T_FUNCTION]); - } - - /** - * {@inheritdoc} - */ - public function isRisky(): bool - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $classes = array_keys($tokens->findGivenKind(T_CLASS)); - - while ($classIndex = array_pop($classes)) { - $prevToken = $tokens[$tokens->getPrevMeaningfulToken($classIndex)]; - if (!$prevToken->isGivenKind(T_ABSTRACT)) { - continue; - } - - $classOpen = $tokens->getNextTokenOfKind($classIndex, ['{']); - $classClose = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $classOpen); - - $this->fixClass($tokens, $classOpen, $classClose); - } - } - - private function fixClass(Tokens $tokens, int $classOpenIndex, int $classCloseIndex): void - { - for ($index = $classCloseIndex - 1; $index > $classOpenIndex; --$index) { - // skip method contents - if ($tokens[$index]->equals('}')) { - $index = $tokens->findBlockStart(Tokens::BLOCK_TYPE_CURLY_BRACE, $index); - - continue; - } - - // skip non public methods - if (!$tokens[$index]->isGivenKind(T_PUBLIC)) { - continue; - } - $nextIndex = $tokens->getNextMeaningfulToken($index); - $nextToken = $tokens[$nextIndex]; - if ($nextToken->isGivenKind(T_STATIC)) { - $nextIndex = $tokens->getNextMeaningfulToken($nextIndex); - $nextToken = $tokens[$nextIndex]; - } - - // skip uses, attributes, constants etc - if (!$nextToken->isGivenKind(T_FUNCTION)) { - continue; - } - $nextIndex = $tokens->getNextMeaningfulToken($nextIndex); - $nextToken = $tokens[$nextIndex]; - - // skip magic methods - if (isset($this->magicMethods[strtolower($nextToken->getContent())])) { - continue; - } - - $prevIndex = $tokens->getPrevMeaningfulToken($index); - $prevToken = $tokens[$prevIndex]; - if ($prevToken->isGivenKind(T_STATIC)) { - $index = $prevIndex; - $prevIndex = $tokens->getPrevMeaningfulToken($index); - $prevToken = $tokens[$prevIndex]; - } - // skip abstract or already final methods - if ($prevToken->isGivenKind([T_ABSTRACT, T_FINAL])) { - $index = $prevIndex; - - continue; - } - - $tokens->insertAt( - $index, - [ - new Token([T_FINAL, 'final']), - new Token([T_WHITESPACE, ' ']), - ] - ); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/NoBlankLinesAfterClassOpeningFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/NoBlankLinesAfterClassOpeningFixer.php deleted file mode 100644 index 868cfd6..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/NoBlankLinesAfterClassOpeningFixer.php +++ /dev/null @@ -1,102 +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\Fixer\ClassNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Ceeram - */ -final class NoBlankLinesAfterClassOpeningFixer extends AbstractFixer implements WhitespacesAwareFixerInterface -{ - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isAnyTokenKindsFound(Token::getClassyTokenKinds()); - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'There should be no empty lines after class opening brace.', - [ - new CodeSample( - ' $token) { - if (!$token->isClassy()) { - continue; - } - - $startBraceIndex = $tokens->getNextTokenOfKind($index, ['{']); - if (!$tokens[$startBraceIndex + 1]->isWhitespace()) { - continue; - } - - $this->fixWhitespace($tokens, $startBraceIndex + 1); - } - } - - /** - * Cleanup a whitespace token. - */ - private function fixWhitespace(Tokens $tokens, int $index): void - { - $content = $tokens[$index]->getContent(); - // if there is more than one new line in the whitespace, then we need to fix it - if (substr_count($content, "\n") > 1) { - // the final bit of the whitespace must be the next statement's indentation - $tokens[$index] = new Token([T_WHITESPACE, $this->whitespacesConfig->getLineEnding().substr($content, strrpos($content, "\n") + 1)]); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/NoNullPropertyInitializationFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/NoNullPropertyInitializationFixer.php deleted file mode 100644 index 01adc32..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/NoNullPropertyInitializationFixer.php +++ /dev/null @@ -1,150 +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\Fixer\ClassNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author ntzm - */ -final class NoNullPropertyInitializationFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Properties MUST not be explicitly initialized with `null` except when they have a type declaration (PHP 7.4).', - [ - new CodeSample( - 'isAnyTokenKindsFound([T_CLASS, T_TRAIT]) && $tokens->isAnyTokenKindsFound([T_PUBLIC, T_PROTECTED, T_PRIVATE, T_VAR, T_STATIC]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $inClass = []; - $classLevel = 0; - - for ($index = 0, $count = $tokens->count(); $index < $count; ++$index) { - if ($tokens[$index]->isClassy()) { - ++$classLevel; - $inClass[$classLevel] = 1; - - $index = $tokens->getNextTokenOfKind($index, ['{']); - - continue; - } - - if (0 === $classLevel) { - continue; - } - - if ($tokens[$index]->equals('{')) { - ++$inClass[$classLevel]; - - continue; - } - - if ($tokens[$index]->equals('}')) { - --$inClass[$classLevel]; - - if (0 === $inClass[$classLevel]) { - unset($inClass[$classLevel]); - --$classLevel; - } - - continue; - } - - // Ensure we are in a class but not in a method in case there are static variables defined - if (1 !== $inClass[$classLevel]) { - continue; - } - - if (!$tokens[$index]->isGivenKind([T_PUBLIC, T_PROTECTED, T_PRIVATE, T_VAR, T_STATIC])) { - continue; - } - - while (true) { - $varTokenIndex = $index = $tokens->getNextMeaningfulToken($index); - - if ($tokens[$index]->isGivenKind(T_STATIC)) { - $varTokenIndex = $index = $tokens->getNextMeaningfulToken($index); - } - - if (!$tokens[$index]->isGivenKind(T_VARIABLE)) { - break; - } - - $index = $tokens->getNextMeaningfulToken($index); - - if ($tokens[$index]->equals('=')) { - $index = $tokens->getNextMeaningfulToken($index); - - if ($tokens[$index]->isGivenKind(T_NS_SEPARATOR)) { - $index = $tokens->getNextMeaningfulToken($index); - } - - if ($tokens[$index]->equals([T_STRING, 'null'], false)) { - for ($i = $varTokenIndex + 1; $i <= $index; ++$i) { - if ( - !($tokens[$i]->isWhitespace() && false !== strpos($tokens[$i]->getContent(), "\n")) - && !$tokens[$i]->isComment() - ) { - $tokens->clearAt($i); - } - } - } - - ++$index; - } - - if (!$tokens[$index]->equals(',')) { - break; - } - } - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/NoPhp4ConstructorFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/NoPhp4ConstructorFixer.php deleted file mode 100644 index 423c409..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/NoPhp4ConstructorFixer.php +++ /dev/null @@ -1,408 +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\Fixer\ClassNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * @author Matteo Beccati - */ -final class NoPhp4ConstructorFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Convert PHP4-style constructors to `__construct`.', - [ - new CodeSample('isTokenKindFound(T_CLASS); - } - - /** - * {@inheritdoc} - */ - public function isRisky(): bool - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $tokensAnalyzer = new TokensAnalyzer($tokens); - $classes = array_keys($tokens->findGivenKind(T_CLASS)); - $numClasses = \count($classes); - - for ($i = 0; $i < $numClasses; ++$i) { - $index = $classes[$i]; - - // is it an an anonymous class definition? - if ($tokensAnalyzer->isAnonymousClass($index)) { - continue; - } - - // is it inside a namespace? - $nspIndex = $tokens->getPrevTokenOfKind($index, [[T_NAMESPACE, 'namespace']]); - if (null !== $nspIndex) { - $nspIndex = $tokens->getNextMeaningfulToken($nspIndex); - - // make sure it's not the global namespace, as PHP4 constructors are allowed in there - if (!$tokens[$nspIndex]->equals('{')) { - // unless it's the global namespace, the index currently points to the name - $nspIndex = $tokens->getNextTokenOfKind($nspIndex, [';', '{']); - - if ($tokens[$nspIndex]->equals(';')) { - // the class is inside a (non-block) namespace, no PHP4-code should be in there - break; - } - - // the index points to the { of a block-namespace - $nspEnd = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $nspIndex); - if ($index < $nspEnd) { - // the class is inside a block namespace, skip other classes that might be in it - for ($j = $i + 1; $j < $numClasses; ++$j) { - if ($classes[$j] < $nspEnd) { - ++$i; - } - } - // and continue checking the classes that might follow - continue; - } - } - } - - $classNameIndex = $tokens->getNextMeaningfulToken($index); - $className = $tokens[$classNameIndex]->getContent(); - $classStart = $tokens->getNextTokenOfKind($classNameIndex, ['{']); - $classEnd = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $classStart); - - $this->fixConstructor($tokens, $className, $classStart, $classEnd); - $this->fixParent($tokens, $classStart, $classEnd); - } - } - - /** - * Fix constructor within a class, if possible. - * - * @param Tokens $tokens the Tokens instance - * @param string $className the class name - * @param int $classStart the class start index - * @param int $classEnd the class end index - */ - private function fixConstructor(Tokens $tokens, string $className, int $classStart, int $classEnd): void - { - $php4 = $this->findFunction($tokens, $className, $classStart, $classEnd); - - if (null === $php4) { - // no PHP4-constructor! - return; - } - - if (!empty($php4['modifiers'][T_ABSTRACT]) || !empty($php4['modifiers'][T_STATIC])) { - // PHP4 constructor can't be abstract or static - return; - } - - $php5 = $this->findFunction($tokens, '__construct', $classStart, $classEnd); - - if (null === $php5) { - // no PHP5-constructor, we can rename the old one to __construct - $tokens[$php4['nameIndex']] = new Token([T_STRING, '__construct']); - - // in some (rare) cases we might have just created an infinite recursion issue - $this->fixInfiniteRecursion($tokens, $php4['bodyIndex'], $php4['endIndex']); - - return; - } - - // does the PHP4-constructor only call $this->__construct($args, ...)? - [$sequences, $case] = $this->getWrapperMethodSequence($tokens, '__construct', $php4['startIndex'], $php4['bodyIndex']); - foreach ($sequences as $seq) { - if (null !== $tokens->findSequence($seq, $php4['bodyIndex'] - 1, $php4['endIndex'], $case)) { - // good, delete it! - for ($i = $php4['startIndex']; $i <= $php4['endIndex']; ++$i) { - $tokens->clearAt($i); - } - - return; - } - } - - // does __construct only call the PHP4-constructor (with the same args)? - [$sequences, $case] = $this->getWrapperMethodSequence($tokens, $className, $php4['startIndex'], $php4['bodyIndex']); - foreach ($sequences as $seq) { - if (null !== $tokens->findSequence($seq, $php5['bodyIndex'] - 1, $php5['endIndex'], $case)) { - // that was a weird choice, but we can safely delete it and... - for ($i = $php5['startIndex']; $i <= $php5['endIndex']; ++$i) { - $tokens->clearAt($i); - } - // rename the PHP4 one to __construct - $tokens[$php4['nameIndex']] = new Token([T_STRING, '__construct']); - - return; - } - } - } - - /** - * Fix calls to the parent constructor within a class. - * - * @param Tokens $tokens the Tokens instance - * @param int $classStart the class start index - * @param int $classEnd the class end index - */ - private function fixParent(Tokens $tokens, int $classStart, int $classEnd): void - { - // check calls to the parent constructor - foreach ($tokens->findGivenKind(T_EXTENDS) as $index => $token) { - $parentIndex = $tokens->getNextMeaningfulToken($index); - $parentClass = $tokens[$parentIndex]->getContent(); - - // using parent::ParentClassName() or ParentClassName::ParentClassName() - $parentSeq = $tokens->findSequence([ - [T_STRING], - [T_DOUBLE_COLON], - [T_STRING, $parentClass], - '(', - ], $classStart, $classEnd, [2 => false]); - - if (null !== $parentSeq) { - // we only need indexes - $parentSeq = array_keys($parentSeq); - - // match either of the possibilities - if ($tokens[$parentSeq[0]]->equalsAny([[T_STRING, 'parent'], [T_STRING, $parentClass]], false)) { - // replace with parent::__construct - $tokens[$parentSeq[0]] = new Token([T_STRING, 'parent']); - $tokens[$parentSeq[2]] = new Token([T_STRING, '__construct']); - } - } - - foreach (Token::getObjectOperatorKinds() as $objectOperatorKind) { - // using $this->ParentClassName() - $parentSeq = $tokens->findSequence([ - [T_VARIABLE, '$this'], - [$objectOperatorKind], - [T_STRING, $parentClass], - '(', - ], $classStart, $classEnd, [2 => false]); - - if (null !== $parentSeq) { - // we only need indexes - $parentSeq = array_keys($parentSeq); - - // replace call with parent::__construct() - $tokens[$parentSeq[0]] = new Token([ - T_STRING, - 'parent', - ]); - $tokens[$parentSeq[1]] = new Token([ - T_DOUBLE_COLON, - '::', - ]); - $tokens[$parentSeq[2]] = new Token([T_STRING, '__construct']); - } - } - } - } - - /** - * Fix a particular infinite recursion issue happening when the parent class has __construct and the child has only - * a PHP4 constructor that calls the parent constructor as $this->__construct(). - * - * @param Tokens $tokens the Tokens instance - * @param int $start the PHP4 constructor body start - * @param int $end the PHP4 constructor body end - */ - private function fixInfiniteRecursion(Tokens $tokens, int $start, int $end): void - { - foreach (Token::getObjectOperatorKinds() as $objectOperatorKind) { - $seq = [ - [T_VARIABLE, '$this'], - [$objectOperatorKind], - [T_STRING, '__construct'], - ]; - - while (true) { - $callSeq = $tokens->findSequence($seq, $start, $end, [2 => false]); - - if (null === $callSeq) { - return; - } - - $callSeq = array_keys($callSeq); - - $tokens[$callSeq[0]] = new Token([T_STRING, 'parent']); - $tokens[$callSeq[1]] = new Token([T_DOUBLE_COLON, '::']); - } - } - } - - /** - * Generate the sequence of tokens necessary for the body of a wrapper method that simply - * calls $this->{$method}( [args...] ) with the same arguments as its own signature. - * - * @param Tokens $tokens the Tokens instance - * @param string $method the wrapped method name - * @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 ] - */ - private function getWrapperMethodSequence(Tokens $tokens, string $method, int $startIndex, int $bodyIndex): array - { - $sequences = []; - - foreach (Token::getObjectOperatorKinds() as $objectOperatorKind) { - // initialise sequence as { $this->{$method}( - $seq = [ - '{', - [T_VARIABLE, '$this'], - [$objectOperatorKind], - [T_STRING, $method], - '(', - ]; - - // parse method parameters, if any - $index = $startIndex; - while (true) { - // find the next variable name - $index = $tokens->getNextTokenOfKind($index, [[T_VARIABLE]]); - - if (null === $index || $index >= $bodyIndex) { - // we've reached the body already - break; - } - - // append a comma if it's not the first variable - if (\count($seq) > 5) { - $seq[] = ','; - } - - // append variable name to the sequence - $seq[] = [T_VARIABLE, $tokens[$index]->getContent()]; - } - - // almost done, close the sequence with ); } - $seq[] = ')'; - $seq[] = ';'; - $seq[] = '}'; - - $sequences[] = $seq; - } - - return [$sequences, [3 => false]]; - } - - /** - * Find a function or method matching a given name within certain bounds. - * - * @param Tokens $tokens the Tokens instance - * @param string $name the function/Method name - * @param int $startIndex the search start index - * @param int $endIndex the search end index - * - * @return null|array An associative array, if a match is found: - * - * - nameIndex (int): The index of the function/method name. - * - startIndex (int): The index of the function/method start. - * - endIndex (int): The index of the function/method end. - * - bodyIndex (int): The index of the function/method body. - * - modifiers (array): The modifiers as array keys and their index as - * the values, e.g. array(T_PUBLIC => 10) - */ - private function findFunction(Tokens $tokens, string $name, int $startIndex, int $endIndex): ?array - { - $function = $tokens->findSequence([ - [T_FUNCTION], - [T_STRING, $name], - '(', - ], $startIndex, $endIndex, false); - - if (null === $function) { - return null; - } - - // keep only the indexes - $function = array_keys($function); - - // find previous block, saving method modifiers for later use - $possibleModifiers = [T_PUBLIC, T_PROTECTED, T_PRIVATE, T_STATIC, T_ABSTRACT, T_FINAL]; - $modifiers = []; - - $prevBlock = $tokens->getPrevMeaningfulToken($function[0]); - while (null !== $prevBlock && $tokens[$prevBlock]->isGivenKind($possibleModifiers)) { - $modifiers[$tokens[$prevBlock]->getId()] = $prevBlock; - $prevBlock = $tokens->getPrevMeaningfulToken($prevBlock); - } - - if (isset($modifiers[T_ABSTRACT])) { - // abstract methods have no body - $bodyStart = null; - $funcEnd = $tokens->getNextTokenOfKind($function[2], [';']); - } else { - // find method body start and the end of the function definition - $bodyStart = $tokens->getNextTokenOfKind($function[2], ['{']); - $funcEnd = null !== $bodyStart ? $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $bodyStart) : null; - } - - return [ - 'nameIndex' => $function[1], - 'startIndex' => $prevBlock + 1, - 'endIndex' => $funcEnd, - 'bodyIndex' => $bodyStart, - 'modifiers' => $modifiers, - ]; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/NoUnneededFinalMethodFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/NoUnneededFinalMethodFixer.php deleted file mode 100644 index dadc06d..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/NoUnneededFinalMethodFixer.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\Fixer\ClassNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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\Tokens; - -/** - * @author Filippo Tessarotto - */ -final class NoUnneededFinalMethodFixer extends AbstractFixer implements ConfigurableFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'A `final` class must not have `final` methods and `private` methods must not be `final`.', - [ - new CodeSample( - ' false] - ), - ], - null, - 'Risky when child class overrides a `private` method.' - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isAllTokenKindsFound([T_CLASS, T_FINAL]); - } - - public function isRisky(): bool - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $tokensCount = \count($tokens); - for ($index = 0; $index < $tokensCount; ++$index) { - if (!$tokens[$index]->isGivenKind(T_CLASS)) { - continue; - } - - $classOpen = $tokens->getNextTokenOfKind($index, ['{']); - $prevToken = $tokens[$tokens->getPrevMeaningfulToken($index)]; - $classIsFinal = $prevToken->isGivenKind(T_FINAL); - - $this->fixClass($tokens, $classOpen, $classIsFinal); - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('private_methods', 'Private methods of non-`final` classes must not be declared `final`.')) - ->setAllowedTypes(['bool']) - ->setDefault(true) - ->getOption(), - ]); - } - - private function fixClass(Tokens $tokens, int $classOpenIndex, bool $classIsFinal): void - { - $tokensCount = \count($tokens); - - for ($index = $classOpenIndex + 1; $index < $tokensCount; ++$index) { - // Class end - if ($tokens[$index]->equals('}')) { - return; - } - - // Skip method content - if ($tokens[$index]->equals('{')) { - $index = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $index); - - continue; - } - - if (!$tokens[$index]->isGivenKind(T_FINAL)) { - continue; - } - - if (!$classIsFinal && (!$this->isPrivateMethodOtherThanConstructor($tokens, $index, $classOpenIndex) || !$this->configuration['private_methods'])) { - continue; - } - - $tokens->clearAt($index); - - ++$index; - - if ($tokens[$index]->isWhitespace()) { - $tokens->clearAt($index); - } - } - } - - private function isPrivateMethodOtherThanConstructor(Tokens $tokens, int $index, int $classOpenIndex): bool - { - $index = max($classOpenIndex + 1, $tokens->getPrevTokenOfKind($index, [';', '{', '}'])); - $private = false; - - while (!$tokens[$index]->isGivenKind(T_FUNCTION)) { - if ($tokens[$index]->isGivenKind(T_PRIVATE)) { - $private = true; - } - - $index = $tokens->getNextMeaningfulToken($index); - } - - return $private && '__construct' !== strtolower($tokens[$tokens->getNextMeaningfulToken($index)]->getContent()); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/OrderedClassElementsFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/OrderedClassElementsFixer.php deleted file mode 100644 index 61084b3..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/OrderedClassElementsFixer.php +++ /dev/null @@ -1,511 +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\Fixer\ClassNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -use PhpCsFixer\FixerConfiguration\AllowedValueSubset; -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; - -/** - * @author Gregor Harlan - */ -final class OrderedClassElementsFixer extends AbstractFixer implements ConfigurableFixerInterface -{ - /** @internal */ - public const SORT_ALPHA = 'alpha'; - - /** @internal */ - public const SORT_NONE = 'none'; - - private const SUPPORTED_SORT_ALGORITHMS = [ - self::SORT_NONE, - self::SORT_ALPHA, - ]; - - /** - * @var array Array containing all class element base types (keys) and their parent types (values) - */ - private static $typeHierarchy = [ - 'use_trait' => null, - 'public' => null, - 'protected' => null, - 'private' => null, - 'constant' => null, - 'constant_public' => ['constant', 'public'], - 'constant_protected' => ['constant', 'protected'], - 'constant_private' => ['constant', 'private'], - 'property' => null, - 'property_static' => ['property'], - 'property_public' => ['property', 'public'], - 'property_protected' => ['property', 'protected'], - 'property_private' => ['property', 'private'], - 'property_public_static' => ['property_static', 'property_public'], - 'property_protected_static' => ['property_static', 'property_protected'], - 'property_private_static' => ['property_static', 'property_private'], - 'method' => null, - 'method_abstract' => ['method'], - 'method_static' => ['method'], - 'method_public' => ['method', 'public'], - 'method_protected' => ['method', 'protected'], - 'method_private' => ['method', 'private'], - 'method_public_abstract' => ['method_abstract', 'method_public'], - 'method_protected_abstract' => ['method_abstract', 'method_protected'], - 'method_public_abstract_static' => ['method_abstract', 'method_static', 'method_public'], - 'method_protected_abstract_static' => ['method_abstract', 'method_static', 'method_protected'], - 'method_public_static' => ['method_static', 'method_public'], - 'method_protected_static' => ['method_static', 'method_protected'], - 'method_private_static' => ['method_static', 'method_private'], - ]; - - /** - * @var array Array containing special method types - */ - private static $specialTypes = [ - 'construct' => null, - 'destruct' => null, - 'magic' => null, - 'phpunit' => null, - ]; - - /** - * @var array Resolved configuration array (type => position) - */ - private $typePosition; - - /** - * {@inheritdoc} - */ - 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 (!$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; - } - // last digit is used by phpunit method ordering - $pos *= 10; - } - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isAnyTokenKindsFound(Token::getClassyTokenKinds()); - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Orders the elements of classes/interfaces/traits.', - [ - new CodeSample( - ' ['method_private', 'method_public']] - ), - new CodeSample( - ' ['method_public'], 'sort_algorithm' => self::SORT_ALPHA] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run before ClassAttributesSeparationFixer, NoBlankLinesAfterClassOpeningFixer, SpaceAfterSemicolonFixer. - * Must run after NoPhp4ConstructorFixer, ProtectedToPrivateFixer. - */ - public function getPriority(): int - { - return 65; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - for ($i = 1, $count = $tokens->count(); $i < $count; ++$i) { - if (!$tokens[$i]->isClassy()) { - continue; - } - - $i = $tokens->getNextTokenOfKind($i, ['{']); - $elements = $this->getElements($tokens, $i); - - if (0 === \count($elements)) { - continue; - } - - $sorted = $this->sortElements($elements); - $endIndex = $elements[\count($elements) - 1]['end']; - - if ($sorted !== $elements) { - $this->sortTokens($tokens, $i, $endIndex, $sorted); - } - - $i = $endIndex; - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('order', 'List of strings defining order of elements.')) - ->setAllowedTypes(['array']) - ->setAllowedValues([new AllowedValueSubset(array_keys(array_merge(self::$typeHierarchy, self::$specialTypes)))]) - ->setDefault([ - 'use_trait', - 'constant_public', - 'constant_protected', - 'constant_private', - 'property_public', - 'property_protected', - 'property_private', - 'construct', - 'destruct', - 'magic', - 'phpunit', - 'method_public', - 'method_protected', - 'method_private', - ]) - ->getOption(), - (new FixerOptionBuilder('sort_algorithm', 'How multiple occurrences of same type statements should be sorted')) - ->setAllowedValues(self::SUPPORTED_SORT_ALGORITHMS) - ->setDefault(self::SORT_NONE) - ->getOption(), - ]); - } - - /** - * @return array[] - */ - private function getElements(Tokens $tokens, int $startIndex): array - { - static $elementTokenKinds = [CT::T_USE_TRAIT, T_CONST, T_VARIABLE, T_FUNCTION]; - - ++$startIndex; - $elements = []; - - while (true) { - $element = [ - 'start' => $startIndex, - 'visibility' => 'public', - 'abstract' => false, - 'static' => false, - ]; - - for ($i = $startIndex;; ++$i) { - $token = $tokens[$i]; - - // class end - if ($token->equals('}')) { - return $elements; - } - - if ($token->isGivenKind(T_ABSTRACT)) { - $element['abstract'] = true; - - continue; - } - - if ($token->isGivenKind(T_STATIC)) { - $element['static'] = true; - - continue; - } - - if ($token->isGivenKind([T_PROTECTED, T_PRIVATE])) { - $element['visibility'] = strtolower($token->getContent()); - - continue; - } - - if (!$token->isGivenKind($elementTokenKinds)) { - continue; - } - - $type = $this->detectElementType($tokens, $i); - if (\is_array($type)) { - $element['type'] = $type[0]; - $element['name'] = $type[1]; - } else { - $element['type'] = $type; - } - - if ('property' === $element['type']) { - $element['name'] = $tokens[$i]->getContent(); - } elseif (\in_array($element['type'], ['use_trait', 'constant', 'method', 'magic', 'construct', 'destruct'], true)) { - $element['name'] = $tokens[$tokens->getNextMeaningfulToken($i)]->getContent(); - } - - $element['end'] = $this->findElementEnd($tokens, $i); - - break; - } - - $elements[] = $element; - $startIndex = $element['end'] + 1; - } - } - - /** - * @return array|string type or array of type and name - */ - private function detectElementType(Tokens $tokens, int $index) - { - $token = $tokens[$index]; - - if ($token->isGivenKind(CT::T_USE_TRAIT)) { - return 'use_trait'; - } - - if ($token->isGivenKind(T_CONST)) { - return 'constant'; - } - - if ($token->isGivenKind(T_VARIABLE)) { - return 'property'; - } - - $nameToken = $tokens[$tokens->getNextMeaningfulToken($index)]; - - if ($nameToken->equals([T_STRING, '__construct'], false)) { - return 'construct'; - } - - if ($nameToken->equals([T_STRING, '__destruct'], false)) { - return 'destruct'; - } - - if ( - $nameToken->equalsAny([ - [T_STRING, 'setUpBeforeClass'], - [T_STRING, 'doSetUpBeforeClass'], - [T_STRING, 'tearDownAfterClass'], - [T_STRING, 'doTearDownAfterClass'], - [T_STRING, 'setUp'], - [T_STRING, 'doSetUp'], - [T_STRING, 'tearDown'], - [T_STRING, 'doTearDown'], - ], false) - ) { - return ['phpunit', strtolower($nameToken->getContent())]; - } - - if ('__' === substr($nameToken->getContent(), 0, 2)) { - return 'magic'; - } - - return 'method'; - } - - private function findElementEnd(Tokens $tokens, int $index): int - { - $index = $tokens->getNextTokenOfKind($index, ['{', ';']); - - if ($tokens[$index]->equals('{')) { - $index = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $index); - } - - for (++$index; $tokens[$index]->isWhitespace(" \t") || $tokens[$index]->isComment(); ++$index); - - --$index; - - return $tokens[$index]->isWhitespace() ? $index - 1 : $index; - } - - /** - * @param array[] $elements - * - * @return array[] - */ - private function sortElements(array $elements): array - { - static $phpunitPositions = [ - 'setupbeforeclass' => 1, - 'dosetupbeforeclass' => 2, - 'teardownafterclass' => 3, - 'doteardownafterclass' => 4, - 'setup' => 5, - 'dosetup' => 6, - 'teardown' => 7, - 'doteardown' => 8, - ]; - - foreach ($elements as &$element) { - $type = $element['type']; - - if (\array_key_exists($type, self::$specialTypes)) { - if (isset($this->typePosition[$type])) { - $element['position'] = $this->typePosition[$type]; - if ('phpunit' === $type) { - $element['position'] += $phpunitPositions[$element['name']]; - } - - continue; - } - - $type = 'method'; - } - - if (\in_array($type, ['constant', 'property', 'method'], true)) { - $type .= '_'.$element['visibility']; - if ($element['abstract']) { - $type .= '_abstract'; - } - if ($element['static']) { - $type .= '_static'; - } - } - - $element['position'] = $this->typePosition[$type]; - } - unset($element); - - usort($elements, function (array $a, array $b) { - if ($a['position'] === $b['position']) { - return $this->sortGroupElements($a, $b); - } - - return $a['position'] <=> $b['position']; - }); - - return $elements; - } - - private function sortGroupElements(array $a, array $b): int - { - $selectedSortAlgorithm = $this->configuration['sort_algorithm']; - - if (self::SORT_ALPHA === $selectedSortAlgorithm) { - return strcasecmp($a['name'], $b['name']); - } - - return $a['start'] <=> $b['start']; - } - - /** - * @param array[] $elements - */ - private function sortTokens(Tokens $tokens, int $startIndex, int $endIndex, array $elements): void - { - $replaceTokens = []; - - foreach ($elements as $element) { - for ($i = $element['start']; $i <= $element['end']; ++$i) { - $replaceTokens[] = clone $tokens[$i]; - } - } - - $tokens->overrideRange($startIndex + 1, $endIndex, $replaceTokens); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/OrderedInterfacesFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/OrderedInterfacesFixer.php deleted file mode 100644 index 63aaa53..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/OrderedInterfacesFixer.php +++ /dev/null @@ -1,235 +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\Fixer\ClassNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dave van der Brugge - */ -final class OrderedInterfacesFixer extends AbstractFixer implements ConfigurableFixerInterface -{ - /** @internal */ - public const OPTION_DIRECTION = 'direction'; - - /** @internal */ - public const OPTION_ORDER = 'order'; - - /** @internal */ - public const DIRECTION_ASCEND = 'ascend'; - - /** @internal */ - public const DIRECTION_DESCEND = 'descend'; - - /** @internal */ - public const ORDER_ALPHA = 'alpha'; - - /** @internal */ - public const ORDER_LENGTH = 'length'; - - /** - * Array of supported directions in configuration. - * - * @var string[] - */ - private const SUPPORTED_DIRECTION_OPTIONS = [ - self::DIRECTION_ASCEND, - self::DIRECTION_DESCEND, - ]; - - /** - * Array of supported orders in configuration. - * - * @var string[] - */ - private const SUPPORTED_ORDER_OPTIONS = [ - self::ORDER_ALPHA, - self::ORDER_LENGTH, - ]; - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Orders the interfaces in an `implements` or `interface extends` clause.', - [ - new CodeSample( - " self::DIRECTION_DESCEND] - ), - new CodeSample( - " self::ORDER_LENGTH] - ), - new CodeSample( - " self::ORDER_LENGTH, - self::OPTION_DIRECTION => self::DIRECTION_DESCEND, - ] - ), - ], - null, - "Risky for `implements` when specifying both an interface and its parent interface, because PHP doesn't break on `parent, child` but does on `child, parent`." - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isTokenKindFound(T_IMPLEMENTS) - || $tokens->isAllTokenKindsFound([T_INTERFACE, T_EXTENDS]); - } - - /** - * {@inheritdoc} - */ - public function isRisky(): bool - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind(T_IMPLEMENTS)) { - if (!$token->isGivenKind(T_EXTENDS)) { - continue; - } - - $nameTokenIndex = $tokens->getPrevMeaningfulToken($index); - $interfaceTokenIndex = $tokens->getPrevMeaningfulToken($nameTokenIndex); - $interfaceToken = $tokens[$interfaceTokenIndex]; - - if (!$interfaceToken->isGivenKind(T_INTERFACE)) { - continue; - } - } - - $interfaceIndex = 0; - $interfaces = [['tokens' => []]]; - - $implementsStart = $index + 1; - $classStart = $tokens->getNextTokenOfKind($implementsStart, ['{']); - $implementsEnd = $tokens->getPrevNonWhitespace($classStart); - - for ($i = $implementsStart; $i <= $implementsEnd; ++$i) { - if ($tokens[$i]->equals(',')) { - ++$interfaceIndex; - $interfaces[$interfaceIndex] = ['tokens' => []]; - - continue; - } - - $interfaces[$interfaceIndex]['tokens'][] = $tokens[$i]; - } - - if (1 === \count($interfaces)) { - continue; - } - - foreach ($interfaces as $interfaceIndex => $interface) { - $interfaceTokens = Tokens::fromArray($interface['tokens'], false); - - $normalized = ''; - $actualInterfaceIndex = $interfaceTokens->getNextMeaningfulToken(-1); - - while ($interfaceTokens->offsetExists($actualInterfaceIndex)) { - $token = $interfaceTokens[$actualInterfaceIndex]; - - if (null === $token || $token->isComment() || $token->isWhitespace()) { - break; - } - - $normalized .= str_replace('\\', ' ', $token->getContent()); - ++$actualInterfaceIndex; - } - - $interfaces[$interfaceIndex]['normalized'] = $normalized; - $interfaces[$interfaceIndex]['originalIndex'] = $interfaceIndex; - } - - usort($interfaces, function (array $first, array $second) { - $score = self::ORDER_LENGTH === $this->configuration[self::OPTION_ORDER] - ? \strlen($first['normalized']) - \strlen($second['normalized']) - : strcasecmp($first['normalized'], $second['normalized']); - - if (self::DIRECTION_DESCEND === $this->configuration[self::OPTION_DIRECTION]) { - $score *= -1; - } - - return $score; - }); - - $changed = false; - - foreach ($interfaces as $interfaceIndex => $interface) { - if ($interface['originalIndex'] !== $interfaceIndex) { - $changed = true; - - break; - } - } - - if (!$changed) { - continue; - } - - $newTokens = array_shift($interfaces)['tokens']; - - foreach ($interfaces as $interface) { - array_push($newTokens, new Token(','), ...$interface['tokens']); - } - - $tokens->overrideRange($implementsStart, $implementsEnd, $newTokens); - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder(self::OPTION_ORDER, 'How the interfaces should be ordered')) - ->setAllowedValues(self::SUPPORTED_ORDER_OPTIONS) - ->setDefault(self::ORDER_ALPHA) - ->getOption(), - (new FixerOptionBuilder(self::OPTION_DIRECTION, 'Which direction the interfaces should be ordered')) - ->setAllowedValues(self::SUPPORTED_DIRECTION_OPTIONS) - ->setDefault(self::DIRECTION_ASCEND) - ->getOption(), - ]); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/OrderedTraitsFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/OrderedTraitsFixer.php deleted file mode 100644 index 33653ff..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/OrderedTraitsFixer.php +++ /dev/null @@ -1,197 +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\Fixer\ClassNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Tokens; - -final class OrderedTraitsFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Trait `use` statements must be sorted alphabetically.', - [ - new CodeSample("isTokenKindFound(CT::T_USE_TRAIT); - } - - /** - * {@inheritdoc} - */ - public function isRisky(): bool - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - foreach ($this->findUseStatementsGroups($tokens) as $uses) { - $this->sortUseStatements($tokens, $uses); - } - } - - /** - * @return iterable> - */ - private function findUseStatementsGroups(Tokens $tokens): iterable - { - $uses = []; - - for ($index = 1, $max = \count($tokens); $index < $max; ++$index) { - $token = $tokens[$index]; - - if ($token->isWhitespace() || $token->isComment()) { - continue; - } - - if (!$token->isGivenKind(CT::T_USE_TRAIT)) { - if (\count($uses) > 0) { - yield $uses; - - $uses = []; - } - - continue; - } - - $endIndex = $tokens->getNextTokenOfKind($index, [';', '{']); - - if ($tokens[$endIndex]->equals('{')) { - $endIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $endIndex); - } - - $use = []; - - for ($i = $index; $i <= $endIndex; ++$i) { - $use[] = $tokens[$i]; - } - - $uses[$index] = Tokens::fromArray($use); - - $index = $endIndex; - } - } - - /** - * @param array $uses - */ - private function sortUseStatements(Tokens $tokens, array $uses): void - { - foreach ($uses as $use) { - $this->sortMultipleTraitsInStatement($use); - } - - $this->sort($tokens, $uses); - } - - private function sortMultipleTraitsInStatement(Tokens $use): void - { - $traits = []; - $indexOfName = null; - $name = []; - - for ($index = 0, $max = \count($use); $index < $max; ++$index) { - $token = $use[$index]; - - if ($token->isGivenKind([T_STRING, T_NS_SEPARATOR])) { - $name[] = $token; - - if (null === $indexOfName) { - $indexOfName = $index; - } - - continue; - } - - if ($token->equalsAny([',', ';', '{'])) { - $traits[$indexOfName] = Tokens::fromArray($name); - - $name = []; - $indexOfName = null; - } - - if ($token->equals('{')) { - $index = $use->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $index); - } - } - - $this->sort($use, $traits); - } - - /** - * @param array $elements - */ - private function sort(Tokens $tokens, array $elements): void - { - /** - * @return string - */ - $toTraitName = static function (Tokens $use): string { - $string = ''; - - foreach ($use as $token) { - if ($token->equalsAny([';', '{'])) { - break; - } - - if ($token->isGivenKind([T_NS_SEPARATOR, T_STRING])) { - $string .= $token->getContent(); - } - } - - return ltrim($string, '\\'); - }; - - $sortedElements = $elements; - uasort($sortedElements, static function (Tokens $useA, Tokens $useB) use ($toTraitName) { - return strcasecmp($toTraitName($useA), $toTraitName($useB)); - }); - - $sortedElements = array_combine( - array_keys($elements), - array_values($sortedElements) - ); - - foreach (array_reverse($sortedElements, true) as $index => $tokensToInsert) { - $tokens->overrideRange( - $index, - $index + \count($elements[$index]) - 1, - $tokensToInsert - ); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/ProtectedToPrivateFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/ProtectedToPrivateFixer.php deleted file mode 100644 index 63f2e45..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/ProtectedToPrivateFixer.php +++ /dev/null @@ -1,133 +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\Fixer\ClassNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Filippo Tessarotto - * @author SpacePossum - */ -final class ProtectedToPrivateFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Converts `protected` variables and methods to `private` where possible.', - [ - new CodeSample( - 'isAllTokenKindsFound([T_CLASS, T_FINAL, T_PROTECTED]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $end = \count($tokens) - 3; // min. number of tokens to form a class candidate to fix - for ($index = 0; $index < $end; ++$index) { - if (!$tokens[$index]->isGivenKind(T_CLASS)) { - continue; - } - - $classOpen = $tokens->getNextTokenOfKind($index, ['{']); - $classClose = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $classOpen); - - if (!$this->skipClass($tokens, $index, $classOpen, $classClose)) { - $this->fixClass($tokens, $classOpen, $classClose); - } - - $index = $classClose; - } - } - - private function fixClass(Tokens $tokens, int $classOpenIndex, int $classCloseIndex): void - { - for ($index = $classOpenIndex + 1; $index < $classCloseIndex; ++$index) { - if ($tokens[$index]->equals('{')) { - $index = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $index); - - continue; - } - - if (!$tokens[$index]->isGivenKind(T_PROTECTED)) { - continue; - } - - $tokens[$index] = new Token([T_PRIVATE, 'private']); - } - } - - /** - * Decide whether or not skip the fix for given class. - */ - private function skipClass(Tokens $tokens, int $classIndex, int $classOpenIndex, int $classCloseIndex): bool - { - $prevToken = $tokens[$tokens->getPrevMeaningfulToken($classIndex)]; - if (!$prevToken->isGivenKind(T_FINAL)) { - return true; - } - - for ($index = $classIndex; $index < $classOpenIndex; ++$index) { - if ($tokens[$index]->isGivenKind(T_EXTENDS)) { - return true; - } - } - - $useIndex = $tokens->getNextTokenOfKind($classIndex, [[CT::T_USE_TRAIT]]); - - return $useIndex && $useIndex < $classCloseIndex; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/SelfAccessorFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/SelfAccessorFixer.php deleted file mode 100644 index 568ab6e..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/SelfAccessorFixer.php +++ /dev/null @@ -1,189 +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\Fixer\ClassNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Analyzer\NamespacesAnalyzer; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * @author Gregor Harlan - */ -final class SelfAccessorFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Inside class or interface element `self` should be preferred to the class name itself.', - [ - new CodeSample( - 'isAnyTokenKindsFound([T_CLASS, T_INTERFACE]); - } - - /** - * {@inheritdoc} - */ - public function isRisky(): bool - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $tokensAnalyzer = new TokensAnalyzer($tokens); - - foreach ((new NamespacesAnalyzer())->getDeclarations($tokens) as $namespace) { - for ($index = $namespace->getScopeStartIndex(); $index < $namespace->getScopeEndIndex(); ++$index) { - if (!$tokens[$index]->isGivenKind([T_CLASS, T_INTERFACE]) || $tokensAnalyzer->isAnonymousClass($index)) { - continue; - } - - $nameIndex = $tokens->getNextTokenOfKind($index, [[T_STRING]]); - $startIndex = $tokens->getNextTokenOfKind($nameIndex, ['{']); - $endIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $startIndex); - - $name = $tokens[$nameIndex]->getContent(); - - $this->replaceNameOccurrences($tokens, $namespace->getFullName(), $name, $startIndex, $endIndex); - - $index = $endIndex; - } - } - } - - /** - * Replace occurrences of the name of the classy element by "self" (if possible). - */ - private function replaceNameOccurrences(Tokens $tokens, string $namespace, string $name, int $startIndex, int $endIndex): void - { - $tokensAnalyzer = new TokensAnalyzer($tokens); - $insideMethodSignatureUntil = null; - - for ($i = $startIndex; $i < $endIndex; ++$i) { - if ($i === $insideMethodSignatureUntil) { - $insideMethodSignatureUntil = null; - } - - $token = $tokens[$i]; - - // skip anonymous classes - if ($token->isGivenKind(T_CLASS) && $tokensAnalyzer->isAnonymousClass($i)) { - $i = $tokens->getNextTokenOfKind($i, ['{']); - $i = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $i); - - continue; - } - - if ($token->isGivenKind(T_FUNCTION)) { - $i = $tokens->getNextTokenOfKind($i, ['(']); - $insideMethodSignatureUntil = $tokens->getNextTokenOfKind($i, ['{', ';']); - - continue; - } - - if (!$token->equals([T_STRING, $name], false)) { - continue; - } - - $nextToken = $tokens[$tokens->getNextMeaningfulToken($i)]; - if ($nextToken->isGivenKind(T_NS_SEPARATOR)) { - continue; - } - - $classStartIndex = $i; - $prevToken = $tokens[$tokens->getPrevMeaningfulToken($i)]; - if ($prevToken->isGivenKind(T_NS_SEPARATOR)) { - $classStartIndex = $this->getClassStart($tokens, $i, $namespace); - if (null === $classStartIndex) { - continue; - } - $prevToken = $tokens[$tokens->getPrevMeaningfulToken($classStartIndex)]; - } - if ($prevToken->isGivenKind(T_STRING) || $prevToken->isObjectOperator()) { - continue; - } - - if ( - $prevToken->isGivenKind([T_INSTANCEOF, T_NEW]) - || $nextToken->isGivenKind(T_PAAMAYIM_NEKUDOTAYIM) - || ( - null !== $insideMethodSignatureUntil - && $i < $insideMethodSignatureUntil - && $prevToken->equalsAny(['(', ',', [CT::T_TYPE_COLON], [CT::T_NULLABLE_TYPE]]) - ) - ) { - for ($j = $classStartIndex; $j < $i; ++$j) { - $tokens->clearTokenAndMergeSurroundingWhitespace($j); - } - $tokens[$i] = new Token([T_STRING, 'self']); - } - } - } - - private function getClassStart(Tokens $tokens, int $index, string $namespace): ?int - { - $namespace = ('' !== $namespace ? '\\'.$namespace : '').'\\'; - - 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)) { - return null; - } - } elseif (!$tokens[$index]->equals([T_STRING, $piece], false)) { - return null; - } - } - - return $index; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/SelfStaticAccessorFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/SelfStaticAccessorFixer.php deleted file mode 100644 index b46e63f..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/SelfStaticAccessorFixer.php +++ /dev/null @@ -1,204 +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\Fixer\ClassNotation; - -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\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -final class SelfStaticAccessorFixer extends AbstractFixer -{ - /** - * @var TokensAnalyzer - */ - private $tokensAnalyzer; - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Inside a `final` class or anonymous class `self` should be preferred to `static`.', - [ - new CodeSample( - 'isAllTokenKindsFound([T_CLASS, T_STATIC]) && $tokens->isAnyTokenKindsFound([T_DOUBLE_COLON, T_NEW, T_INSTANCEOF]); - } - - /** - * {@inheritdoc} - * - * Must run after FinalInternalClassFixer, FunctionToConstantFixer, PhpUnitTestCaseStaticMethodCallsFixer. - */ - public function getPriority(): int - { - return -10; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $this->tokensAnalyzer = $tokensAnalyzer = new TokensAnalyzer($tokens); - - $classIndex = $tokens->getNextTokenOfKind(0, [[T_CLASS]]); - - while (null !== $classIndex) { - if ( - $tokens[$tokens->getPrevMeaningfulToken($classIndex)]->isGivenKind(T_FINAL) - || $tokensAnalyzer->isAnonymousClass($classIndex) - ) { - $classIndex = $this->fixClass($tokens, $classIndex); - } - - $classIndex = $tokens->getNextTokenOfKind($classIndex, [[T_CLASS]]); - } - } - - private function fixClass(Tokens $tokens, int $index): int - { - $index = $tokens->getNextTokenOfKind($index, ['{']); - $classOpenCount = 1; - - while ($classOpenCount > 0) { - ++$index; - - if ($tokens[$index]->equals('{')) { - ++$classOpenCount; - - continue; - } - - if ($tokens[$index]->equals('}')) { - --$classOpenCount; - - continue; - } - - if ($tokens[$index]->isGivenKind(T_FUNCTION)) { - // do not fix inside lambda - if ($this->tokensAnalyzer->isLambda($index)) { - // figure out where the lambda starts - $index = $tokens->getNextTokenOfKind($index, ['{']); - $openCount = 1; - - do { - $index = $tokens->getNextTokenOfKind($index, ['}', '{', [T_CLASS]]); - if ($tokens[$index]->equals('}')) { - --$openCount; - } elseif ($tokens[$index]->equals('{')) { - ++$openCount; - } else { - $index = $this->fixClass($tokens, $index); - } - } while ($openCount > 0); - } - - continue; - } - - if ($tokens[$index]->isGivenKind([T_NEW, T_INSTANCEOF])) { - $index = $tokens->getNextMeaningfulToken($index); - - if ($tokens[$index]->isGivenKind(T_STATIC)) { - $tokens[$index] = new Token([T_STRING, 'self']); - } - - continue; - } - - if (!$tokens[$index]->isGivenKind(T_STATIC)) { - continue; - } - - $staticIndex = $index; - $index = $tokens->getNextMeaningfulToken($index); - - if (!$tokens[$index]->isGivenKind(T_DOUBLE_COLON)) { - continue; - } - - $tokens[$staticIndex] = new Token([T_STRING, 'self']); - } - - return $index; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/SingleClassElementPerStatementFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/SingleClassElementPerStatementFixer.php deleted file mode 100644 index 4451a44..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/SingleClassElementPerStatementFixer.php +++ /dev/null @@ -1,233 +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\Fixer\ClassNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerConfiguration\AllowedValueSubset; -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\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * Fixer for rules defined in PSR2 ¶4.2. - * - * @author Javier Spagnoletti - * @author SpacePossum - * @author Dariusz Rumiński - */ -final class SingleClassElementPerStatementFixer extends AbstractFixer implements ConfigurableFixerInterface, WhitespacesAwareFixerInterface -{ - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isAnyTokenKindsFound(Token::getClassyTokenKinds()); - } - - /** - * {@inheritdoc} - * - * Must run before ClassAttributesSeparationFixer. - */ - public function getPriority(): int - { - return 56; - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'There MUST NOT be more than one property or constant declared per statement.', - [ - new CodeSample( - ' ['property']] - ), - ] - ); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $analyzer = new TokensAnalyzer($tokens); - $elements = array_reverse($analyzer->getClassyElements(), true); - - foreach ($elements as $index => $element) { - if (!\in_array($element['type'], $this->configuration['elements'], true)) { - continue; // not in configuration - } - - $this->fixElement($tokens, $element['type'], $index); - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - $values = ['const', 'property']; - - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('elements', 'List of strings which element should be modified.')) - ->setDefault($values) - ->setAllowedTypes(['array']) - ->setAllowedValues([new AllowedValueSubset($values)]) - ->getOption(), - ]); - } - - private function fixElement(Tokens $tokens, string $type, int $index): void - { - $tokensAnalyzer = new TokensAnalyzer($tokens); - $repeatIndex = $index; - - while (true) { - $repeatIndex = $tokens->getNextMeaningfulToken($repeatIndex); - $repeatToken = $tokens[$repeatIndex]; - - if ($tokensAnalyzer->isArray($repeatIndex)) { - if ($repeatToken->isGivenKind(T_ARRAY)) { - $repeatIndex = $tokens->getNextTokenOfKind($repeatIndex, ['(']); - $repeatIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $repeatIndex); - } else { - $repeatIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_ARRAY_SQUARE_BRACE, $repeatIndex); - } - - continue; - } - - if ($repeatToken->equals(';')) { - return; // no repeating found, no fixing needed - } - - if ($repeatToken->equals(',')) { - break; - } - } - - $start = $tokens->getPrevTokenOfKind($index, [';', '{', '}']); - $this->expandElement( - $tokens, - $type, - $tokens->getNextMeaningfulToken($start), - $tokens->getNextTokenOfKind($index, [';']) - ); - } - - private function expandElement(Tokens $tokens, string $type, int $startIndex, int $endIndex): void - { - $divisionContent = null; - if ($tokens[$startIndex - 1]->isWhitespace()) { - $divisionContent = $tokens[$startIndex - 1]->getContent(); - if (Preg::match('#(\n|\r\n)#', $divisionContent, $matches)) { - $divisionContent = $matches[0].trim($divisionContent, "\r\n"); - } - } - - // iterate variables to split up - for ($i = $endIndex - 1; $i > $startIndex; --$i) { - $token = $tokens[$i]; - - if ($token->equals(')')) { - $i = $tokens->findBlockStart(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $i); - - continue; - } - - if ($token->isGivenKind(CT::T_ARRAY_SQUARE_BRACE_CLOSE)) { - $i = $tokens->findBlockStart(Tokens::BLOCK_TYPE_ARRAY_SQUARE_BRACE, $i); - - continue; - } - - if (!$tokens[$i]->equals(',')) { - continue; - } - - $tokens[$i] = new Token(';'); - if ($tokens[$i + 1]->isWhitespace()) { - $tokens->clearAt($i + 1); - } - - if (null !== $divisionContent && '' !== $divisionContent) { - $tokens->insertAt($i + 1, new Token([T_WHITESPACE, $divisionContent])); - } - - // collect modifiers - $sequence = $this->getModifiersSequences($tokens, $type, $startIndex, $endIndex); - $tokens->insertAt($i + 2, $sequence); - } - } - - /** - * @return Token[] - */ - private function getModifiersSequences(Tokens $tokens, string $type, int $startIndex, int $endIndex): array - { - if ('property' === $type) { - $tokenKinds = [T_PUBLIC, T_PROTECTED, T_PRIVATE, T_STATIC, T_VAR, T_STRING, T_NS_SEPARATOR, CT::T_NULLABLE_TYPE, CT::T_ARRAY_TYPEHINT]; - } else { - $tokenKinds = [T_PUBLIC, T_PROTECTED, T_PRIVATE, T_CONST]; - } - - $sequence = []; - for ($i = $startIndex; $i < $endIndex - 1; ++$i) { - if ($tokens[$i]->isComment()) { - continue; - } - - if (!$tokens[$i]->isWhitespace() && !$tokens[$i]->isGivenKind($tokenKinds)) { - break; - } - - $sequence[] = clone $tokens[$i]; - } - - return $sequence; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/SingleTraitInsertPerStatementFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/SingleTraitInsertPerStatementFixer.php deleted file mode 100644 index 06b9fe3..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/SingleTraitInsertPerStatementFixer.php +++ /dev/null @@ -1,119 +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\Fixer\ClassNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author SpacePossum - */ -final class SingleTraitInsertPerStatementFixer extends AbstractFixer -{ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Each trait `use` must be done as single statement.', - [ - new CodeSample( - 'isTokenKindFound(CT::T_USE_TRAIT); - } - - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - for ($index = \count($tokens) - 1; 1 < $index; --$index) { - if ($tokens[$index]->isGivenKind(CT::T_USE_TRAIT)) { - $candidates = $this->getCandidates($tokens, $index); - if (\count($candidates) > 0) { - $this->fixTraitUse($tokens, $index, $candidates); - } - } - } - } - - /** - * @param int[] $candidates ',' indexes to fix - */ - private function fixTraitUse(Tokens $tokens, int $useTraitIndex, array $candidates): void - { - foreach ($candidates as $commaIndex) { - $inserts = [ - new Token([CT::T_USE_TRAIT, 'use']), - new Token([T_WHITESPACE, ' ']), - ]; - - $nextImportStartIndex = $tokens->getNextMeaningfulToken($commaIndex); - - if ($tokens[$nextImportStartIndex - 1]->isWhitespace()) { - if (1 === Preg::match('/\R/', $tokens[$nextImportStartIndex - 1]->getContent())) { - array_unshift($inserts, clone $tokens[$useTraitIndex - 1]); - } - $tokens->clearAt($nextImportStartIndex - 1); - } - - $tokens[$commaIndex] = new Token(';'); - $tokens->insertAt($nextImportStartIndex, $inserts); - } - } - - /** - * @return int[] - */ - private function getCandidates(Tokens $tokens, int $index): array - { - $indexes = []; - $index = $tokens->getNextTokenOfKind($index, [',', ';', '{']); - - while (!$tokens[$index]->equals(';')) { - if ($tokens[$index]->equals('{')) { - return []; // do not fix use cases with grouping - } - - $indexes[] = $index; - $index = $tokens->getNextTokenOfKind($index, [',', ';', '{']); - } - - return array_reverse($indexes); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/VisibilityRequiredFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/VisibilityRequiredFixer.php deleted file mode 100644 index cf82363..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/VisibilityRequiredFixer.php +++ /dev/null @@ -1,195 +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\Fixer\ClassNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -use PhpCsFixer\FixerConfiguration\AllowedValueSubset; -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\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * Fixer for rules defined in PSR2 ¶4.3, ¶4.5. - * - * @author Dariusz Rumiński - * @author SpacePossum - */ -final class VisibilityRequiredFixer extends AbstractFixer implements ConfigurableFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Visibility MUST be declared on all properties and methods; `abstract` and `final` MUST be declared before the visibility; `static` MUST be declared after the visibility.', - [ - new CodeSample( - ' ['const']] - ), - ] - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isAnyTokenKindsFound(Token::getClassyTokenKinds()); - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - 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']) - ->getOption(), - ]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $tokensAnalyzer = new TokensAnalyzer($tokens); - $propertyTypeDeclarationKinds = [T_STRING, T_NS_SEPARATOR, CT::T_NULLABLE_TYPE, CT::T_ARRAY_TYPEHINT, CT::T_TYPE_ALTERNATION]; - - foreach (array_reverse($tokensAnalyzer->getClassyElements(), true) as $index => $element) { - if (!\in_array($element['type'], $this->configuration['elements'], true)) { - continue; - } - - if (\PHP_VERSION_ID < 70100 && 'const' === $element['type']) { - continue; - } - - $abstractFinalIndex = null; - $visibilityIndex = null; - $staticIndex = null; - $typeIndex = null; - $prevIndex = $tokens->getPrevMeaningfulToken($index); - $expectedKinds = [T_ABSTRACT, T_FINAL, T_PRIVATE, T_PROTECTED, T_PUBLIC, T_STATIC, T_VAR]; - - if ('property' === $element['type']) { - $expectedKinds = array_merge($expectedKinds, $propertyTypeDeclarationKinds); - } - - while ($tokens[$prevIndex]->isGivenKind($expectedKinds)) { - if ($tokens[$prevIndex]->isGivenKind([T_ABSTRACT, T_FINAL])) { - $abstractFinalIndex = $prevIndex; - } elseif ($tokens[$prevIndex]->isGivenKind(T_STATIC)) { - $staticIndex = $prevIndex; - } elseif ($tokens[$prevIndex]->isGivenKind($propertyTypeDeclarationKinds)) { - $typeIndex = $prevIndex; - } else { - $visibilityIndex = $prevIndex; - } - - $prevIndex = $tokens->getPrevMeaningfulToken($prevIndex); - } - - if (null !== $typeIndex) { - $index = $typeIndex; - } - - if ($tokens[$prevIndex]->equals(',')) { - continue; - } - - if (null !== $staticIndex) { - if ($this->isKeywordPlacedProperly($tokens, $staticIndex, $index)) { - $index = $staticIndex; - } else { - $this->moveTokenAndEnsureSingleSpaceFollows($tokens, $staticIndex, $index); - } - } - - if (null === $visibilityIndex) { - $tokens->insertAt($index, [new Token([T_PUBLIC, 'public']), new Token([T_WHITESPACE, ' '])]); - } else { - if ($tokens[$visibilityIndex]->isGivenKind(T_VAR)) { - $tokens[$visibilityIndex] = new Token([T_PUBLIC, 'public']); - } - if ($this->isKeywordPlacedProperly($tokens, $visibilityIndex, $index)) { - $index = $visibilityIndex; - } else { - $this->moveTokenAndEnsureSingleSpaceFollows($tokens, $visibilityIndex, $index); - } - } - - if (null === $abstractFinalIndex) { - continue; - } - - if ($this->isKeywordPlacedProperly($tokens, $abstractFinalIndex, $index)) { - continue; - } - - $this->moveTokenAndEnsureSingleSpaceFollows($tokens, $abstractFinalIndex, $index); - } - } - - private function isKeywordPlacedProperly(Tokens $tokens, int $keywordIndex, int $comparedIndex): bool - { - return $keywordIndex + 2 === $comparedIndex && ' ' === $tokens[$keywordIndex + 1]->getContent(); - } - - private function moveTokenAndEnsureSingleSpaceFollows(Tokens $tokens, int $fromIndex, int $toIndex): void - { - $tokens->insertAt($toIndex, [$tokens[$fromIndex], new Token([T_WHITESPACE, ' '])]); - - $tokens->clearAt($fromIndex); - if ($tokens[$fromIndex + 1]->isWhitespace()) { - $tokens->clearAt($fromIndex + 1); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassUsage/DateTimeImmutableFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassUsage/DateTimeImmutableFixer.php deleted file mode 100644 index fc611a0..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassUsage/DateTimeImmutableFixer.php +++ /dev/null @@ -1,161 +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\Fixer\ClassUsage; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Kuba Werłos - */ -final class DateTimeImmutableFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Class `DateTimeImmutable` should be used instead of `DateTime`.', - [new CodeSample("isTokenKindFound(T_STRING); - } - - /** - * {@inheritdoc} - */ - public function isRisky(): bool - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $isInNamespace = false; - $isImported = false; // e.g. use DateTime; - - for ($index = 0, $limit = $tokens->count(); $index < $limit; ++$index) { - $token = $tokens[$index]; - - if ($token->isGivenKind(T_NAMESPACE)) { - $isInNamespace = true; - - continue; - } - - if ($token->isGivenKind(T_USE) && $isInNamespace) { - $nextIndex = $tokens->getNextMeaningfulToken($index); - if ('datetime' !== strtolower($tokens[$nextIndex]->getContent())) { - continue; - } - $nextNextIndex = $tokens->getNextMeaningfulToken($nextIndex); - if ($tokens[$nextNextIndex]->equals(';')) { - $isImported = true; - } - - $index = $nextNextIndex; - - continue; - } - - if (!$token->isGivenKind(T_STRING)) { - continue; - } - - $prevIndex = $tokens->getPrevMeaningfulToken($index); - if ($tokens[$prevIndex]->isGivenKind(T_FUNCTION)) { - continue; - } - - $lowercaseContent = strtolower($token->getContent()); - - if ('datetime' === $lowercaseContent) { - $this->fixClassUsage($tokens, $index, $isInNamespace, $isImported); - $limit = $tokens->count(); // update limit, as fixing class usage may insert new token - } elseif ('date_create' === $lowercaseContent) { - $this->fixFunctionUsage($tokens, $index, 'date_create_immutable'); - } elseif ('date_create_from_format' === $lowercaseContent) { - $this->fixFunctionUsage($tokens, $index, 'date_create_immutable_from_format'); - } - } - } - - private function fixClassUsage(Tokens $tokens, int $index, bool $isInNamespace, bool $isImported): void - { - $nextIndex = $tokens->getNextMeaningfulToken($index); - if ($tokens[$nextIndex]->isGivenKind(T_DOUBLE_COLON)) { - $nextNextIndex = $tokens->getNextMeaningfulToken($nextIndex); - if ($tokens[$nextNextIndex]->isGivenKind(T_STRING)) { - $nextNextNextIndex = $tokens->getNextMeaningfulToken($nextNextIndex); - if (!$tokens[$nextNextNextIndex]->equals('(')) { - return; - } - } - } - - $isUsedAlone = false; // e.g. new DateTime(); - $isUsedWithLeadingBackslash = false; // e.g. new \DateTime(); - - $prevIndex = $tokens->getPrevMeaningfulToken($index); - if ($tokens[$prevIndex]->isGivenKind(T_NS_SEPARATOR)) { - $prevPrevIndex = $tokens->getPrevMeaningfulToken($prevIndex); - if (!$tokens[$prevPrevIndex]->isGivenKind(T_STRING)) { - $isUsedWithLeadingBackslash = true; - } - } elseif (!$tokens[$prevIndex]->isGivenKind(T_DOUBLE_COLON) && !$tokens[$prevIndex]->isObjectOperator()) { - $isUsedAlone = true; - } - - if ($isUsedWithLeadingBackslash || $isUsedAlone && ($isInNamespace && $isImported || !$isInNamespace)) { - $tokens[$index] = new Token([T_STRING, \DateTimeImmutable::class]); - if ($isInNamespace && $isUsedAlone) { - $tokens->insertAt($index, new Token([T_NS_SEPARATOR, '\\'])); - } - } - } - - private function fixFunctionUsage(Tokens $tokens, int $index, string $replacement): void - { - $prevIndex = $tokens->getPrevMeaningfulToken($index); - if ($tokens[$prevIndex]->isGivenKind([T_DOUBLE_COLON, T_NEW]) || $tokens[$prevIndex]->isObjectOperator()) { - return; - } - if ($tokens[$prevIndex]->isGivenKind(T_NS_SEPARATOR)) { - $prevPrevIndex = $tokens->getPrevMeaningfulToken($prevIndex); - if ($tokens[$prevPrevIndex]->isGivenKind([T_NEW, T_STRING])) { - return; - } - } - - $tokens[$index] = new Token([T_STRING, $replacement]); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/CommentToPhpdocFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/CommentToPhpdocFixer.php deleted file mode 100644 index 0eff6ca..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/CommentToPhpdocFixer.php +++ /dev/null @@ -1,239 +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\Fixer\Comment; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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\CommentsAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Utils; - -/** - * @author Kuba Werłos - */ -final class CommentToPhpdocFixer extends AbstractFixer implements ConfigurableFixerInterface, WhitespacesAwareFixerInterface -{ - /** - * @var string[] - */ - private $ignoredTags = []; - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isTokenKindFound(T_COMMENT); - } - - /** - * {@inheritdoc} - */ - public function isRisky(): bool - { - return true; - } - - /** - * {@inheritdoc} - * - * Must run before GeneralPhpdocAnnotationRemoveFixer, GeneralPhpdocTagRenameFixer, NoBlankLinesAfterPhpdocFixer, NoEmptyPhpdocFixer, NoSuperfluousPhpdocTagsFixer, PhpdocAddMissingParamAnnotationFixer, PhpdocAlignFixer, PhpdocAlignFixer, PhpdocAnnotationWithoutDotFixer, PhpdocInlineTagNormalizerFixer, PhpdocLineSpanFixer, PhpdocNoAccessFixer, PhpdocNoAliasTagFixer, PhpdocNoEmptyReturnFixer, PhpdocNoPackageFixer, PhpdocNoUselessInheritdocFixer, PhpdocOrderByValueFixer, PhpdocOrderFixer, PhpdocReturnSelfReferenceFixer, PhpdocSeparationFixer, PhpdocSingleLineVarSpacingFixer, PhpdocSummaryFixer, PhpdocTagCasingFixer, PhpdocTagTypeFixer, PhpdocToCommentFixer, PhpdocToParamTypeFixer, PhpdocToPropertyTypeFixer, PhpdocToReturnTypeFixer, PhpdocTrimConsecutiveBlankLineSeparationFixer, PhpdocTrimFixer, PhpdocTypesOrderFixer, PhpdocVarAnnotationCorrectOrderFixer, PhpdocVarWithoutNameFixer. - * Must run after AlignMultilineCommentFixer. - */ - public function getPriority(): int - { - // Should be run before all other PHPDoc fixers - return 26; - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Comments with annotation should be docblock when used on structural elements.', - [ - new CodeSample(" ['todo']]), - ], - null, - 'Risky as new docblocks might mean more, e.g. a Doctrine entity might have a new column in database.' - ); - } - - /** - * {@inheritdoc} - */ - public function configure(array $configuration): void - { - parent::configure($configuration); - - $this->ignoredTags = array_map( - static function (string $tag) { - return strtolower($tag); - }, - $this->configuration['ignored_tags'] - ); - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('ignored_tags', 'List of ignored tags')) - ->setAllowedTypes(['array']) - ->setDefault([]) - ->getOption(), - ]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $commentsAnalyzer = new CommentsAnalyzer(); - - for ($index = 0, $limit = \count($tokens); $index < $limit; ++$index) { - $token = $tokens[$index]; - - if (!$token->isGivenKind(T_COMMENT)) { - continue; - } - - if ($commentsAnalyzer->isHeaderComment($tokens, $index)) { - continue; - } - - if (!$commentsAnalyzer->isBeforeStructuralElement($tokens, $index)) { - continue; - } - - $commentIndices = $commentsAnalyzer->getCommentBlockIndices($tokens, $index); - - if ($this->isCommentCandidate($tokens, $commentIndices)) { - $this->fixComment($tokens, $commentIndices); - } - - $index = max($commentIndices); - } - } - - /** - * @param int[] $indices - */ - private function isCommentCandidate(Tokens $tokens, array $indices): bool - { - return array_reduce( - $indices, - function (bool $carry, int $index) use ($tokens) { - if ($carry) { - return true; - } - if (1 !== Preg::match('~(?:#|//|/\*+|\R(?:\s*\*)?)\s*\@([a-zA-Z0-9_\\\\-]+)(?=\s|\(|$)~', $tokens[$index]->getContent(), $matches)) { - return false; - } - - return !\in_array(strtolower($matches[1]), $this->ignoredTags, true); - }, - false - ); - } - - /** - * @param int[] $indices - */ - private function fixComment(Tokens $tokens, array $indices): void - { - if (1 === \count($indices)) { - $this->fixCommentSingleLine($tokens, reset($indices)); - } else { - $this->fixCommentMultiLine($tokens, $indices); - } - } - - private function fixCommentSingleLine(Tokens $tokens, int $index): void - { - $message = $this->getMessage($tokens[$index]->getContent()); - - if ('' !== trim(substr($message, 0, 1))) { - $message = ' '.$message; - } - - if ('' !== trim(substr($message, -1))) { - $message .= ' '; - } - - $tokens[$index] = new Token([T_DOC_COMMENT, '/**'.$message.'*/']); - } - - /** - * @param int[] $indices - */ - private function fixCommentMultiLine(Tokens $tokens, array $indices): void - { - $startIndex = reset($indices); - $indent = Utils::calculateTrailingWhitespaceIndent($tokens[$startIndex - 1]); - - $newContent = '/**'.$this->whitespacesConfig->getLineEnding(); - $count = max($indices); - - for ($index = $startIndex; $index <= $count; ++$index) { - if (!$tokens[$index]->isComment()) { - continue; - } - if (false !== strpos($tokens[$index]->getContent(), '*/')) { - return; - } - $message = $this->getMessage($tokens[$index]->getContent()); - if ('' !== trim(substr($message, 0, 1))) { - $message = ' '.$message; - } - $newContent .= $indent.' *'.$message.$this->whitespacesConfig->getLineEnding(); - } - - for ($index = $startIndex; $index <= $count; ++$index) { - $tokens->clearAt($index); - } - - $newContent .= $indent.' */'; - - $tokens->insertAt($startIndex, new Token([T_DOC_COMMENT, $newContent])); - } - - private function getMessage(string $content): string - { - if (0 === strpos($content, '#')) { - return substr($content, 1); - } - if (0 === strpos($content, '//')) { - return substr($content, 2); - } - - return rtrim(ltrim($content, '/*'), '*/'); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/HeaderCommentFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/HeaderCommentFixer.php deleted file mode 100644 index cae05c7..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/HeaderCommentFixer.php +++ /dev/null @@ -1,459 +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\Fixer\Comment; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\ConfigurationException\InvalidFixerConfigurationException; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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\Token; -use PhpCsFixer\Tokenizer\Tokens; -use Symfony\Component\OptionsResolver\Options; - -/** - * @author Antonio J. García Lagar - * @author SpacePossum - */ -final class HeaderCommentFixer extends AbstractFixer implements ConfigurableFixerInterface, WhitespacesAwareFixerInterface -{ - /** - * @internal - */ - public const HEADER_PHPDOC = 'PHPDoc'; - - /** - * @internal - */ - public const HEADER_COMMENT = 'comment'; - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Add, replace or remove header comment.', - [ - new CodeSample( - ' 'Made with love.', - ] - ), - new CodeSample( - ' 'Made with love.', - 'comment_type' => 'PHPDoc', - 'location' => 'after_open', - 'separate' => 'bottom', - ] - ), - new CodeSample( - ' 'Made with love.', - 'comment_type' => 'comment', - 'location' => 'after_declare_strict', - ] - ), - new CodeSample( - ' '', - ] - ), - ] - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return isset($tokens[0]) && $tokens[0]->isGivenKind(T_OPEN_TAG) && $tokens->isMonolithicPhp(); - } - - /** - * {@inheritdoc} - * - * Must run before SingleLineCommentStyleFixer. - * Must run after DeclareStrictTypesFixer, NoBlankLinesAfterPhpdocFixer. - */ - public function getPriority(): int - { - // When this fixer is configured with ["separate" => "bottom", "comment_type" => "PHPDoc"] - // and the target file has no namespace or declare() construct, - // the fixed header comment gets trimmed by NoBlankLinesAfterPhpdocFixer if we run before it. - return -30; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $location = $this->configuration['location']; - $locationIndexes = []; - - foreach (['after_open', 'after_declare_strict'] as $possibleLocation) { - $locationIndex = $this->findHeaderCommentInsertionIndex($tokens, $possibleLocation); - - if (!isset($locationIndexes[$locationIndex]) || $possibleLocation === $location) { - $locationIndexes[$locationIndex] = $possibleLocation; - - continue; - } - } - - foreach (array_values($locationIndexes) 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); - - if (null === $headerCurrentIndex) { - if ('' === $this->configuration['header'] || $possibleLocation !== $location) { - continue; - } - - $this->insertHeader($tokens, $headerNewIndex); - - continue; - } - - $sameComment = $this->getHeaderAsComment() === $tokens[$headerCurrentIndex]->getContent(); - $expectedLocation = $possibleLocation === $location; - - if (!$sameComment || !$expectedLocation) { - if ($expectedLocation ^ $sameComment) { - $this->removeHeader($tokens, $headerCurrentIndex); - } - - if ('' === $this->configuration['header']) { - continue; - } - - if ($possibleLocation === $location) { - $this->insertHeader($tokens, $headerNewIndex); - } - - continue; - } - - $this->fixWhiteSpaceAroundHeader($tokens, $headerCurrentIndex); - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - $fixerName = $this->getName(); - - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('header', 'Proper header content.')) - ->setAllowedTypes(['string']) - ->setNormalizer(static function (Options $options, $value) use ($fixerName) { - if ('' === trim($value)) { - return ''; - } - - if (false !== strpos($value, '*/')) { - throw new InvalidFixerConfigurationException($fixerName, 'Cannot use \'*/\' in header.'); - } - - return $value; - }) - ->getOption(), - (new FixerOptionBuilder('comment_type', 'Comment syntax type.')) - ->setAllowedValues([self::HEADER_PHPDOC, self::HEADER_COMMENT]) - ->setDefault(self::HEADER_COMMENT) - ->getOption(), - (new FixerOptionBuilder('location', 'The location of the inserted header.')) - ->setAllowedValues(['after_open', 'after_declare_strict']) - ->setDefault('after_declare_strict') - ->getOption(), - (new FixerOptionBuilder('separate', 'Whether the header should be separated from the file content with a new line.')) - ->setAllowedValues(['both', 'top', 'bottom', 'none']) - ->setDefault('both') - ->getOption(), - ]); - } - - /** - * Enclose the given text in a comment block. - */ - private function getHeaderAsComment(): string - { - $lineEnding = $this->whitespacesConfig->getLineEnding(); - $comment = (self::HEADER_COMMENT === $this->configuration['comment_type'] ? '/*' : '/**').$lineEnding; - $lines = explode("\n", str_replace("\r", '', $this->configuration['header'])); - - foreach ($lines as $line) { - $comment .= rtrim(' * '.$line).$lineEnding; - } - - return $comment.' */'; - } - - private function findHeaderCommentCurrentIndex(Tokens $tokens, int $headerNewIndex): ?int - { - $index = $tokens->getNextNonWhitespace($headerNewIndex); - - if (null === $index || !$tokens[$index]->isComment()) { - return null; - } - - $next = $index + 1; - - if (!isset($tokens[$next]) || \in_array($this->configuration['separate'], ['top', 'none'], true) || !$tokens[$index]->isGivenKind(T_DOC_COMMENT)) { - return $index; - } - - if ($tokens[$next]->isWhitespace()) { - if (!Preg::match('/^\h*\R\h*$/D', $tokens[$next]->getContent())) { - return $index; - } - - ++$next; - } - - if (!isset($tokens[$next]) || !$tokens[$next]->isClassy() && !$tokens[$next]->isGivenKind(T_FUNCTION)) { - return $index; - } - - return $this->getHeaderAsComment() === $tokens[$index]->getContent() ? $index : null; - } - - /** - * Find the index where the header comment must be inserted. - */ - private function findHeaderCommentInsertionIndex(Tokens $tokens, string $location): int - { - if ('after_open' === $location) { - return 1; - } - - $index = $tokens->getNextMeaningfulToken(0); - - if (null === $index) { - return 1; // file without meaningful tokens but an open tag, comment should always be placed directly after the open tag - } - - if (!$tokens[$index]->isGivenKind(T_DECLARE)) { - return 1; - } - - $next = $tokens->getNextMeaningfulToken($index); - - if (null === $next || !$tokens[$next]->equals('(')) { - return 1; - } - - $next = $tokens->getNextMeaningfulToken($next); - - if (null === $next || !$tokens[$next]->equals([T_STRING, 'strict_types'], false)) { - return 1; - } - - $next = $tokens->getNextMeaningfulToken($next); - - if (null === $next || !$tokens[$next]->equals('=')) { - return 1; - } - - $next = $tokens->getNextMeaningfulToken($next); - - if (null === $next || !$tokens[$next]->isGivenKind(T_LNUMBER)) { - return 1; - } - - $next = $tokens->getNextMeaningfulToken($next); - - if (null === $next || !$tokens[$next]->equals(')')) { - return 1; - } - - $next = $tokens->getNextMeaningfulToken($next); - - if (null === $next || !$tokens[$next]->equals(';')) { // don't insert after close tag - return 1; - } - - return $next + 1; - } - - private function fixWhiteSpaceAroundHeader(Tokens $tokens, int $headerIndex): void - { - $lineEnding = $this->whitespacesConfig->getLineEnding(); - - // fix lines after header comment - if ( - ('both' === $this->configuration['separate'] || 'bottom' === $this->configuration['separate']) - && null !== $tokens->getNextMeaningfulToken($headerIndex) - ) { - $expectedLineCount = 2; - } else { - $expectedLineCount = 1; - } - - if ($headerIndex === \count($tokens) - 1) { - $tokens->insertAt($headerIndex + 1, new Token([T_WHITESPACE, str_repeat($lineEnding, $expectedLineCount)])); - } else { - $lineBreakCount = $this->getLineBreakCount($tokens, $headerIndex, 1); - - if ($lineBreakCount < $expectedLineCount) { - $missing = str_repeat($lineEnding, $expectedLineCount - $lineBreakCount); - - if ($tokens[$headerIndex + 1]->isWhitespace()) { - $tokens[$headerIndex + 1] = new Token([T_WHITESPACE, $missing.$tokens[$headerIndex + 1]->getContent()]); - } else { - $tokens->insertAt($headerIndex + 1, new Token([T_WHITESPACE, $missing])); - } - } elseif ($lineBreakCount > $expectedLineCount && $tokens[$headerIndex + 1]->isWhitespace()) { - $newLinesToRemove = $lineBreakCount - $expectedLineCount; - $tokens[$headerIndex + 1] = new Token([ - T_WHITESPACE, - Preg::replace("/^\\R{{$newLinesToRemove}}/", '', $tokens[$headerIndex + 1]->getContent()), - ]); - } - } - - // fix lines before header comment - $expectedLineCount = 'both' === $this->configuration['separate'] || 'top' === $this->configuration['separate'] ? 2 : 1; - $prev = $tokens->getPrevNonWhitespace($headerIndex); - - $regex = '/\h$/'; - - if ($tokens[$prev]->isGivenKind(T_OPEN_TAG) && Preg::match($regex, $tokens[$prev]->getContent())) { - $tokens[$prev] = new Token([T_OPEN_TAG, Preg::replace($regex, $lineEnding, $tokens[$prev]->getContent())]); - } - - $lineBreakCount = $this->getLineBreakCount($tokens, $headerIndex, -1); - - if ($lineBreakCount < $expectedLineCount) { - // because of the way the insert index was determined for header comment there cannot be an empty token here - $tokens->insertAt($headerIndex, new Token([T_WHITESPACE, str_repeat($lineEnding, $expectedLineCount - $lineBreakCount)])); - } - } - - private function getLineBreakCount(Tokens $tokens, int $index, int $direction): int - { - $whitespace = ''; - - for ($index += $direction; isset($tokens[$index]); $index += $direction) { - $token = $tokens[$index]; - - if ($token->isWhitespace()) { - $whitespace .= $token->getContent(); - - continue; - } - - if (-1 === $direction && $token->isGivenKind(T_OPEN_TAG)) { - $whitespace .= $token->getContent(); - } - - if ('' !== $token->getContent()) { - break; - } - } - - return substr_count($whitespace, "\n"); - } - - private function removeHeader(Tokens $tokens, int $index): void - { - $prevIndex = $index - 1; - $prevToken = $tokens[$prevIndex]; - $newlineRemoved = false; - - if ($prevToken->isWhitespace()) { - $content = $prevToken->getContent(); - - if (Preg::match('/\R/', $content)) { - $newlineRemoved = true; - } - - $content = Preg::replace('/\R?\h*$/', '', $content); - - if ('' === $content) { - $tokens->clearAt($prevIndex); - } else { - $tokens[$prevIndex] = new Token([T_WHITESPACE, $content]); - } - } - - $nextIndex = $index + 1; - $nextToken = $tokens[$nextIndex] ?? null; - - if (!$newlineRemoved && null !== $nextToken && $nextToken->isWhitespace()) { - $content = Preg::replace('/^\R/', '', $nextToken->getContent()); - - if ('' === $content) { - $tokens->clearAt($nextIndex); - } else { - $tokens[$nextIndex] = new Token([T_WHITESPACE, $content]); - } - } - - $tokens->clearTokenAndMergeSurroundingWhitespace($index); - } - - private function insertHeader(Tokens $tokens, int $index): void - { - $tokens->insertAt($index, new Token([self::HEADER_COMMENT === $this->configuration['comment_type'] ? T_COMMENT : T_DOC_COMMENT, $this->getHeaderAsComment()])); - $this->fixWhiteSpaceAroundHeader($tokens, $index); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/MultilineCommentOpeningClosingFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/MultilineCommentOpeningClosingFixer.php deleted file mode 100644 index 7e32153..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/MultilineCommentOpeningClosingFixer.php +++ /dev/null @@ -1,98 +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\Fixer\Comment; - -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 Filippo Tessarotto - */ -final class MultilineCommentOpeningClosingFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'DocBlocks must start with two asterisks, multiline comments must start with a single asterisk, after the opening slash. Both must end with a single asterisk before the closing slash.', - [ - new CodeSample( - <<<'EOT' -isAnyTokenKindsFound([T_COMMENT, T_DOC_COMMENT]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - foreach ($tokens as $index => $token) { - $originalContent = $token->getContent(); - - if ( - !$token->isGivenKind(T_DOC_COMMENT) - && !($token->isGivenKind(T_COMMENT) && 0 === strpos($originalContent, '/*')) - ) { - continue; - } - - $newContent = $originalContent; - - // Fix opening - if ($token->isGivenKind(T_COMMENT)) { - $newContent = Preg::replace('/^\\/\\*{2,}(?!\\/)/', '/*', $newContent); - } - - // Fix closing - $newContent = Preg::replace('/(?getId(), $newContent]); - } - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/NoEmptyCommentFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/NoEmptyCommentFixer.php deleted file mode 100644 index c2a3c0e..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/NoEmptyCommentFixer.php +++ /dev/null @@ -1,160 +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\Fixer\Comment; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author SpacePossum - */ -final class NoEmptyCommentFixer extends AbstractFixer -{ - private const TYPE_HASH = 1; - - private const TYPE_DOUBLE_SLASH = 2; - - private const TYPE_SLASH_ASTERISK = 3; - - /** - * {@inheritdoc} - * - * Must run before NoExtraBlankLinesFixer, NoTrailingWhitespaceFixer, NoWhitespaceInBlankLineFixer. - * Must run after PhpdocToCommentFixer. - */ - public function getPriority(): int - { - return 2; - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'There should not be any empty comments.', - [new CodeSample("isTokenKindFound(T_COMMENT); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - for ($index = 1, $count = \count($tokens); $index < $count; ++$index) { - if (!$tokens[$index]->isGivenKind(T_COMMENT)) { - continue; - } - - [$blockStart, $index, $isEmpty] = $this->getCommentBlock($tokens, $index); - if (false === $isEmpty) { - continue; - } - - for ($i = $blockStart; $i <= $index; ++$i) { - $tokens->clearTokenAndMergeSurroundingWhitespace($i); - } - } - } - - /** - * Return the start index, end index and a flag stating if the comment block is empty. - * - * @param int $index T_COMMENT index - */ - private function getCommentBlock(Tokens $tokens, int $index): array - { - $commentType = $this->getCommentType($tokens[$index]->getContent()); - $empty = $this->isEmptyComment($tokens[$index]->getContent()); - - if (self::TYPE_SLASH_ASTERISK === $commentType) { - return [$index, $index, $empty]; - } - - $start = $index; - $count = \count($tokens); - ++$index; - - for (; $index < $count; ++$index) { - if ($tokens[$index]->isComment()) { - if ($commentType !== $this->getCommentType($tokens[$index]->getContent())) { - break; - } - - if ($empty) { // don't retest if already known the block not being empty - $empty = $this->isEmptyComment($tokens[$index]->getContent()); - } - - continue; - } - - if (!$tokens[$index]->isWhitespace() || $this->getLineBreakCount($tokens, $index, $index + 1) > 1) { - break; - } - } - - return [$start, $index - 1, $empty]; - } - - private function getCommentType(string $content): int - { - if ('#' === $content[0]) { - return self::TYPE_HASH; - } - - if ('*' === $content[1]) { - return self::TYPE_SLASH_ASTERISK; - } - - return self::TYPE_DOUBLE_SLASH; - } - - private function getLineBreakCount(Tokens $tokens, int $whiteStart, int $whiteEnd): int - { - $lineCount = 0; - for ($i = $whiteStart; $i < $whiteEnd; ++$i) { - $lineCount += Preg::matchAll('/\R/u', $tokens[$i]->getContent(), $matches); - } - - return $lineCount; - } - - private function isEmptyComment(string $content): bool - { - static $mapper = [ - self::TYPE_HASH => '|^#\s*$|', // single line comment starting with '#' - self::TYPE_SLASH_ASTERISK => '|^/\*[\s\*]*\*+/$|', // comment starting with '/*' and ending with '*/' (but not a PHPDoc) - self::TYPE_DOUBLE_SLASH => '|^//\s*$|', // single line comment starting with '//' - ]; - - $type = $this->getCommentType($content); - - return 1 === Preg::match($mapper[$type], $content); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/NoTrailingWhitespaceInCommentFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/NoTrailingWhitespaceInCommentFixer.php deleted file mode 100644 index eac9a96..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/NoTrailingWhitespaceInCommentFixer.php +++ /dev/null @@ -1,88 +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\Fixer\Comment; - -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 Dariusz Rumiński - */ -final class NoTrailingWhitespaceInCommentFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'There MUST be no trailing spaces inside comment or PHPDoc.', - [new CodeSample('isAnyTokenKindsFound([T_COMMENT, T_DOC_COMMENT]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - foreach ($tokens as $index => $token) { - if ($token->isGivenKind(T_DOC_COMMENT)) { - $tokens[$index] = new Token([T_DOC_COMMENT, Preg::replace('/(*ANY)[\h]+$/m', '', $token->getContent())]); - - continue; - } - - if ($token->isGivenKind(T_COMMENT)) { - if ('/*' === substr($token->getContent(), 0, 2)) { - $tokens[$index] = new Token([T_COMMENT, Preg::replace('/(*ANY)[\h]+$/m', '', $token->getContent())]); - } elseif (isset($tokens[$index + 1]) && $tokens[$index + 1]->isWhitespace()) { - $trimmedContent = ltrim($tokens[$index + 1]->getContent(), " \t"); - if ('' !== $trimmedContent) { - $tokens[$index + 1] = new Token([T_WHITESPACE, $trimmedContent]); - } else { - $tokens->clearAt($index + 1); - } - } - } - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/SingleLineCommentStyleFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/SingleLineCommentStyleFixer.php deleted file mode 100644 index ff81467..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/SingleLineCommentStyleFixer.php +++ /dev/null @@ -1,186 +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\Fixer\Comment; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -use PhpCsFixer\FixerConfiguration\AllowedValueSubset; -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 - */ -final class SingleLineCommentStyleFixer extends AbstractFixer implements ConfigurableFixerInterface -{ - /** - * @var bool - */ - private $asteriskEnabled; - - /** - * @var bool - */ - private $hashEnabled; - - /** - * {@inheritdoc} - */ - 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); - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Single-line comments and multi-line comments with only one line of actual content should use the `//` syntax.', - [ - new CodeSample( - ' ['asterisk']] - ), - new CodeSample( - " ['hash']] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run after HeaderCommentFixer, NoUselessReturnFixer. - */ - public function getPriority(): int - { - return -31; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isTokenKindFound(T_COMMENT); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind(T_COMMENT)) { - continue; - } - - $content = $token->getContent(); - $commentContent = substr($content, 2, -2) ?: ''; - - if ($this->hashEnabled && '#' === $content[0]) { - if (isset($content[1]) && '[' === $content[1]) { - continue; // This might be attribute on PHP8, do not change - } - - $tokens[$index] = new Token([$token->getId(), '//'.substr($content, 1)]); - - continue; - } - - if ( - !$this->asteriskEnabled - || false !== strpos($commentContent, '?>') - || '/*' !== substr($content, 0, 2) - || 1 === Preg::match('/[^\s\*].*\R.*[^\s\*]/s', $commentContent) - ) { - continue; - } - - $nextTokenIndex = $index + 1; - if (isset($tokens[$nextTokenIndex])) { - $nextToken = $tokens[$nextTokenIndex]; - if (!$nextToken->isWhitespace() || 1 !== Preg::match('/\R/', $nextToken->getContent())) { - continue; - } - - $tokens[$nextTokenIndex] = new Token([$nextToken->getId(), ltrim($nextToken->getContent(), " \t")]); - } - - $content = '//'; - if (1 === Preg::match('/[^\s\*]/', $commentContent)) { - $content = '// '.Preg::replace('/[\s\*]*([^\s\*](?:.+[^\s\*])?)[\s\*]*/', '\1', $commentContent); - } - $tokens[$index] = new Token([$token->getId(), $content]); - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('comment_types', 'List of comment types to fix')) - ->setAllowedTypes(['array']) - ->setAllowedValues([new AllowedValueSubset(['asterisk', 'hash'])]) - ->setDefault(['asterisk', 'hash']) - ->getOption(), - ]); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ConfigurableFixerInterface.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ConfigurableFixerInterface.php deleted file mode 100644 index 8b22117..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ConfigurableFixerInterface.php +++ /dev/null @@ -1,48 +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\Fixer; - -use PhpCsFixer\ConfigurationException\InvalidFixerConfigurationException; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; - -/** - * @author Dariusz Rumiński - * @author SpacePossum - */ -interface ConfigurableFixerInterface extends FixerInterface -{ - /** - * Set configuration. - * - * New configuration must override current one, not patch it. - * Using empty array makes fixer to use default configuration - * (or reset configuration from previously configured back to default one). - * - * Some fixers may have no configuration, then - simply don't implement this interface. - * Other ones may have configuration that will change behavior of fixer, - * 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 - * - * @throws InvalidFixerConfigurationException - */ - public function configure(array $configuration): void; - - /** - * Defines the available configuration options of the fixer. - */ - public function getConfigurationDefinition(): FixerConfigurationResolverInterface; -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ConstantNotation/NativeConstantInvocationFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ConstantNotation/NativeConstantInvocationFixer.php deleted file mode 100644 index 11137b5..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ConstantNotation/NativeConstantInvocationFixer.php +++ /dev/null @@ -1,302 +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\Fixer\ConstantNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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\NamespaceAnalysis; -use PhpCsFixer\Tokenizer\Analyzer\NamespacesAnalyzer; -use PhpCsFixer\Tokenizer\Analyzer\NamespaceUsesAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; -use Symfony\Component\OptionsResolver\Exception\InvalidOptionsException; - -/** - * @author Filippo Tessarotto - */ -final class NativeConstantInvocationFixer extends AbstractFixer implements ConfigurableFixerInterface -{ - /** - * @var array - */ - private $constantsToEscape = []; - - /** - * @var array - */ - private $caseInsensitiveConstantsToEscape = []; - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Add leading `\` before constant invocation of internal constant to speed up resolving. Constant name match is case-sensitive, except for `null`, `false` and `true`.', - [ - new CodeSample(" 'namespaced'] - ), - new CodeSample( - " [ - 'MY_CUSTOM_PI', - ], - ] - ), - new CodeSample( - " false, - 'include' => [ - 'MY_CUSTOM_PI', - ], - ] - ), - new CodeSample( - " [ - 'M_PI', - ], - ] - ), - ], - null, - 'Risky when any of the constants are namespaced or overridden.' - ); - } - - /** - * {@inheritdoc} - * - * Must run before GlobalNamespaceImportFixer. - */ - public function getPriority(): int - { - return 10; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isTokenKindFound(T_STRING); - } - - /** - * {@inheritdoc} - */ - public function isRisky(): bool - { - return true; - } - - /** - * {@inheritdoc} - */ - public function configure(array $configuration): void - { - parent::configure($configuration); - - $uniqueConfiguredExclude = array_unique($this->configuration['exclude']); - - // Case sensitive constants handling - $constantsToEscape = array_values($this->configuration['include']); - - if (true === $this->configuration['fix_built_in']) { - $getDefinedConstants = get_defined_constants(true); - unset($getDefinedConstants['user']); - foreach ($getDefinedConstants as $constants) { - $constantsToEscape = array_merge($constantsToEscape, array_keys($constants)); - } - } - - $constantsToEscape = array_diff( - array_unique($constantsToEscape), - $uniqueConfiguredExclude - ); - - // Case insensitive constants handling - static $caseInsensitiveConstants = ['null', 'false', 'true']; - $caseInsensitiveConstantsToEscape = []; - - foreach ($constantsToEscape as $constantIndex => $constant) { - $loweredConstant = strtolower($constant); - if (\in_array($loweredConstant, $caseInsensitiveConstants, true)) { - $caseInsensitiveConstantsToEscape[] = $loweredConstant; - unset($constantsToEscape[$constantIndex]); - } - } - - $caseInsensitiveConstantsToEscape = array_diff( - array_unique($caseInsensitiveConstantsToEscape), - array_map(static function (string $function) { return strtolower($function); }, $uniqueConfiguredExclude) - ); - - // Store the cache - $this->constantsToEscape = array_fill_keys($constantsToEscape, true); - ksort($this->constantsToEscape); - - $this->caseInsensitiveConstantsToEscape = array_fill_keys($caseInsensitiveConstantsToEscape, true); - ksort($this->caseInsensitiveConstantsToEscape); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - if ('all' === $this->configuration['scope']) { - $this->fixConstantInvocations($tokens, 0, \count($tokens) - 1); - - return; - } - - $namespaces = (new NamespacesAnalyzer())->getDeclarations($tokens); - - // 'scope' is 'namespaced' here - /** @var NamespaceAnalysis $namespace */ - foreach (array_reverse($namespaces) as $namespace) { - if ('' === $namespace->getFullName()) { - continue; - } - - $this->fixConstantInvocations($tokens, $namespace->getScopeStartIndex(), $namespace->getScopeEndIndex()); - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - $constantChecker = static function (array $value): bool { - foreach ($value as $constantName) { - if (!\is_string($constantName) || '' === trim($constantName) || trim($constantName) !== $constantName) { - throw new InvalidOptionsException(sprintf( - 'Each element must be a non-empty, trimmed string, got "%s" instead.', - \is_object($constantName) ? \get_class($constantName) : \gettype($constantName) - )); - } - } - - return true; - }; - - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('fix_built_in', 'Whether to fix constants returned by `get_defined_constants`. User constants are not accounted in this list and must be specified in the include one.')) - ->setAllowedTypes(['bool']) - ->setDefault(true) - ->getOption(), - (new FixerOptionBuilder('include', 'List of additional constants to fix.')) - ->setAllowedTypes(['array']) - ->setAllowedValues([$constantChecker]) - ->setDefault([]) - ->getOption(), - (new FixerOptionBuilder('exclude', 'List of constants to ignore.')) - ->setAllowedTypes(['array']) - ->setAllowedValues([$constantChecker]) - ->setDefault(['null', 'false', 'true']) - ->getOption(), - (new FixerOptionBuilder('scope', 'Only fix constant invocations that are made within a namespace or fix all.')) - ->setAllowedValues(['all', 'namespaced']) - ->setDefault('all') - ->getOption(), - (new FixerOptionBuilder('strict', 'Whether leading `\` of constant invocation not meant to have it should be removed.')) - ->setAllowedTypes(['bool']) - ->setDefault(true) - ->getOption(), - ]); - } - - private function fixConstantInvocations(Tokens $tokens, int $startIndex, int $endIndex): void - { - $useDeclarations = (new NamespaceUsesAnalyzer())->getDeclarationsFromTokens($tokens); - $useConstantDeclarations = []; - - foreach ($useDeclarations as $use) { - if ($use->isConstant()) { - $useConstantDeclarations[$use->getShortName()] = true; - } - } - - $tokenAnalyzer = new TokensAnalyzer($tokens); - - for ($index = $endIndex; $index > $startIndex; --$index) { - $token = $tokens[$index]; - - // test if we are at a constant call - if (!$token->isGivenKind(T_STRING)) { - continue; - } - - if (!$tokenAnalyzer->isConstantInvocation($index)) { - continue; - } - - $tokenContent = $token->getContent(); - $prevIndex = $tokens->getPrevMeaningfulToken($index); - - if (!isset($this->constantsToEscape[$tokenContent]) && !isset($this->caseInsensitiveConstantsToEscape[strtolower($tokenContent)])) { - if (!$this->configuration['strict']) { - continue; - } - - if (!$tokens[$prevIndex]->isGivenKind(T_NS_SEPARATOR)) { - continue; - } - - $prevPrevIndex = $tokens->getPrevMeaningfulToken($prevIndex); - - if ($tokens[$prevPrevIndex]->isGivenKind(T_STRING)) { - continue; - } - - $tokens->clearTokenAndMergeSurroundingWhitespace($prevIndex); - - continue; - } - - if (isset($useConstantDeclarations[$tokenContent])) { - continue; - } - - if ($tokens[$prevIndex]->isGivenKind(T_NS_SEPARATOR)) { - continue; - } - - $tokens->insertAt($index, new Token([T_NS_SEPARATOR, '\\'])); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/ElseifFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/ElseifFixer.php deleted file mode 100644 index 10c2343..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/ElseifFixer.php +++ /dev/null @@ -1,105 +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\Fixer\ControlStructure; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Fixer for rules defined in PSR2 ¶5.1. - * - * @author Dariusz Rumiński - */ -final class ElseifFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'The keyword `elseif` should be used instead of `else if` so that all control keywords look like single words.', - [new CodeSample("isAllTokenKindsFound([T_IF, T_ELSE]); - } - - /** - * Replace all `else if` (T_ELSE T_IF) with `elseif` (T_ELSEIF). - * - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind(T_ELSE)) { - continue; - } - - $ifTokenIndex = $tokens->getNextMeaningfulToken($index); - - // if next meaningful token is not T_IF - continue searching, this is not the case for fixing - if (!$tokens[$ifTokenIndex]->isGivenKind(T_IF)) { - continue; - } - - // if next meaningful token is T_IF, but uses an alternative syntax - this is not the case for fixing neither - $conditionEndBraceIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $tokens->getNextMeaningfulToken($ifTokenIndex)); - $afterConditionIndex = $tokens->getNextMeaningfulToken($conditionEndBraceIndex); - if ($tokens[$afterConditionIndex]->equals(':')) { - continue; - } - - // now we have T_ELSE following by T_IF with no alternative syntax so we could fix this - // 1. clear whitespaces between T_ELSE and T_IF - $tokens->clearAt($index + 1); - - // 2. change token from T_ELSE into T_ELSEIF - $tokens[$index] = new Token([T_ELSEIF, 'elseif']); - - // 3. clear succeeding T_IF - $tokens->clearAt($ifTokenIndex); - - $beforeIfTokenIndex = $tokens->getPrevNonWhitespace($ifTokenIndex); - - // 4. clear extra whitespace after T_IF in T_COMMENT,T_WHITESPACE?,T_IF,T_WHITESPACE sequence - if ($tokens[$beforeIfTokenIndex]->isComment() && $tokens[$ifTokenIndex + 1]->isWhitespace()) { - $tokens->clearAt($ifTokenIndex + 1); - } - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/EmptyLoopBodyFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/EmptyLoopBodyFixer.php deleted file mode 100644 index 98476e4..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/EmptyLoopBodyFixer.php +++ /dev/null @@ -1,140 +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\Fixer\ControlStructure; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * @author SpacePossum - */ -final class EmptyLoopBodyFixer extends AbstractFixer implements ConfigurableFixerInterface -{ - private const STYLE_BRACES = 'braces'; - - private const STYLE_SEMICOLON = 'semicolon'; - - private const TOKEN_LOOP_KINDS = [T_FOR, T_FOREACH, T_WHILE]; - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Empty loop-body must be in configured style.', - [ - new CodeSample(" 'braces', - ] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run before BracesFixer, NoExtraBlankLinesFixer, NoTrailingWhitespaceFixer. - * Must run after NoEmptyStatementFixer. - */ - public function getPriority(): int - { - return 39; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isAnyTokenKindsFound(self::TOKEN_LOOP_KINDS); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - if (self::STYLE_BRACES === $this->configuration['style']) { - $analyzer = new TokensAnalyzer($tokens); - $fixLoop = static function (int $index, int $endIndex) use ($tokens, $analyzer): void { - if ($tokens[$index]->isGivenKind(T_WHILE) && $analyzer->isWhilePartOfDoWhile($index)) { - return; - } - - $semiColonIndex = $tokens->getNextMeaningfulToken($endIndex); - - if (!$tokens[$semiColonIndex]->equals(';')) { - return; - } - - $tokens[$semiColonIndex] = new Token('{'); - $tokens->insertAt($semiColonIndex + 1, new Token('}')); - }; - } else { - $fixLoop = static function (int $index, int $endIndex) use ($tokens): void { - $braceOpenIndex = $tokens->getNextMeaningfulToken($endIndex); - - if (!$tokens[$braceOpenIndex]->equals('{')) { - return; - } - - $braceCloseIndex = $tokens->getNextMeaningfulToken($braceOpenIndex); - - if (!$tokens[$braceCloseIndex]->equals('}')) { - return; - } - - $tokens[$braceOpenIndex] = new Token(';'); - $tokens->clearTokenAndMergeSurroundingWhitespace($braceCloseIndex); - }; - } - - for ($index = $tokens->count() - 1; $index > 0; --$index) { - if ($tokens[$index]->isGivenKind(self::TOKEN_LOOP_KINDS)) { - $endIndex = $tokens->getNextTokenOfKind($index, ['(']); // proceed to open '(' - $endIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $endIndex); // proceed to close ')' - $fixLoop($index, $endIndex); // fix loop if needs fixing - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('style', 'Style of empty loop-bodies.')) - ->setAllowedTypes(['string']) - ->setAllowedValues([self::STYLE_BRACES, self::STYLE_SEMICOLON]) - ->setDefault(self::STYLE_SEMICOLON) - ->getOption(), - ]); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/IncludeFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/IncludeFixer.php deleted file mode 100644 index 4440114..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/IncludeFixer.php +++ /dev/null @@ -1,153 +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\Fixer\ControlStructure; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Analyzer\BlocksAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Sebastiaan Stok - * @author Dariusz Rumiński - * @author Kuba Werłos - */ -final class IncludeFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Include/Require and file path should be divided with a single space. File path should not be placed under brackets.', - [ - new CodeSample( - 'isAnyTokenKindsFound([T_REQUIRE, T_REQUIRE_ONCE, T_INCLUDE, T_INCLUDE_ONCE]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $this->clearIncludies($tokens, $this->findIncludies($tokens)); - } - - private function clearIncludies(Tokens $tokens, array $includies): void - { - $blocksAnalyzer = new BlocksAnalyzer(); - - foreach ($includies as $includy) { - if ($includy['end'] && !$tokens[$includy['end']]->isGivenKind(T_CLOSE_TAG)) { - $afterEndIndex = $tokens->getNextNonWhitespace($includy['end']); - if (null === $afterEndIndex || !$tokens[$afterEndIndex]->isComment()) { - $tokens->removeLeadingWhitespace($includy['end']); - } - } - - $braces = $includy['braces']; - - if (null !== $braces) { - $prevIndex = $tokens->getPrevMeaningfulToken($includy['begin']); - $nextIndex = $tokens->getNextMeaningfulToken($braces['close']); - - // Include is also legal as function parameter or condition statement but requires being wrapped then. - if (!$tokens[$nextIndex]->equalsAny([';', [T_CLOSE_TAG]]) && !$blocksAnalyzer->isBlock($tokens, $prevIndex, $nextIndex)) { - continue; - } - - $this->removeWhitespaceAroundIfPossible($tokens, $braces['open']); - $this->removeWhitespaceAroundIfPossible($tokens, $braces['close']); - $tokens->clearTokenAndMergeSurroundingWhitespace($braces['open']); - $tokens->clearTokenAndMergeSurroundingWhitespace($braces['close']); - } - - $nextIndex = $tokens->getNonEmptySibling($includy['begin'], 1); - - if ($tokens[$nextIndex]->isWhitespace()) { - $tokens[$nextIndex] = new Token([T_WHITESPACE, ' ']); - } elseif (null !== $braces || $tokens[$nextIndex]->isGivenKind([T_VARIABLE, T_CONSTANT_ENCAPSED_STRING, T_COMMENT])) { - $tokens->insertAt($includy['begin'] + 1, new Token([T_WHITESPACE, ' '])); - } - } - } - - private function findIncludies(Tokens $tokens): array - { - static $includyTokenKinds = [T_REQUIRE, T_REQUIRE_ONCE, T_INCLUDE, T_INCLUDE_ONCE]; - - $includies = []; - - foreach ($tokens->findGivenKind($includyTokenKinds) as $includyTokens) { - foreach ($includyTokens as $index => $token) { - $includy = [ - 'begin' => $index, - 'braces' => null, - 'end' => $tokens->getNextTokenOfKind($index, [';', [T_CLOSE_TAG]]), - ]; - - $braceOpenIndex = $tokens->getNextMeaningfulToken($index); - - if ($tokens[$braceOpenIndex]->equals('(')) { - $braceCloseIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $braceOpenIndex); - - $includy['braces'] = [ - 'open' => $braceOpenIndex, - 'close' => $braceCloseIndex, - ]; - } - - $includies[$index] = $includy; - } - } - - krsort($includies); - - return $includies; - } - - private function removeWhitespaceAroundIfPossible(Tokens $tokens, int $index): void - { - $nextIndex = $tokens->getNextNonWhitespace($index); - if (null === $nextIndex || !$tokens[$nextIndex]->isComment()) { - $tokens->removeLeadingWhitespace($index); - } - - $prevIndex = $tokens->getPrevNonWhitespace($index); - if (null === $prevIndex || !$tokens[$prevIndex]->isComment()) { - $tokens->removeTrailingWhitespace($index); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoAlternativeSyntaxFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoAlternativeSyntaxFixer.php deleted file mode 100644 index 0c0c28a..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoAlternativeSyntaxFixer.php +++ /dev/null @@ -1,234 +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\Fixer\ControlStructure; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Eddilbert Macharia - */ -final class NoAlternativeSyntaxFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Replace control structure alternative syntax to use braces.', - [ - new CodeSample( - "hasAlternativeSyntax(); - } - - /** - * {@inheritdoc} - * - * Must run before BracesFixer, ElseifFixer, NoSuperfluousElseifFixer, NoUselessElseFixer, SwitchContinueToBreakFixer. - */ - public function getPriority(): int - { - return 42; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - for ($index = \count($tokens) - 1; 0 <= $index; --$index) { - $token = $tokens[$index]; - $this->fixElseif($index, $token, $tokens); - $this->fixElse($index, $token, $tokens); - $this->fixOpenCloseControls($index, $token, $tokens); - } - } - - private function findParenthesisEnd(Tokens $tokens, int $structureTokenIndex): int - { - $nextIndex = $tokens->getNextMeaningfulToken($structureTokenIndex); - $nextToken = $tokens[$nextIndex]; - - // return if next token is not opening parenthesis - if (!$nextToken->equals('(')) { - return $structureTokenIndex; - } - - return $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $nextIndex); - } - - /** - * Handle both extremes of the control structures. - * e.g. if(): or endif;. - * - * @param int $index the index of the token being processed - * @param Token $token the token being processed - * @param Tokens $tokens the collection of tokens - */ - private function fixOpenCloseControls(int $index, Token $token, Tokens $tokens): void - { - if ($token->isGivenKind([T_IF, T_FOREACH, T_WHILE, T_FOR, T_SWITCH, T_DECLARE])) { - $openIndex = $tokens->getNextTokenOfKind($index, ['(']); - $closeIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $openIndex); - $afterParenthesisIndex = $tokens->getNextMeaningfulToken($closeIndex); - $afterParenthesis = $tokens[$afterParenthesisIndex]; - - if (!$afterParenthesis->equals(':')) { - return; - } - - $items = []; - - if (!$tokens[$afterParenthesisIndex - 1]->isWhitespace()) { - $items[] = new Token([T_WHITESPACE, ' ']); - } - - $items[] = new Token('{'); - - if (!$tokens[$afterParenthesisIndex + 1]->isWhitespace()) { - $items[] = new Token([T_WHITESPACE, ' ']); - } - - $tokens->clearAt($afterParenthesisIndex); - $tokens->insertAt($afterParenthesisIndex, $items); - } - - if (!$token->isGivenKind([T_ENDIF, T_ENDFOREACH, T_ENDWHILE, T_ENDFOR, T_ENDSWITCH, T_ENDDECLARE])) { - return; - } - - $nextTokenIndex = $tokens->getNextMeaningfulToken($index); - $nextToken = $tokens[$nextTokenIndex]; - $tokens[$index] = new Token('}'); - - if ($nextToken->equals(';')) { - $tokens->clearAt($nextTokenIndex); - } - } - - /** - * Handle the else: cases. - * - * @param int $index the index of the token being processed - * @param Token $token the token being processed - * @param Tokens $tokens the collection of tokens - */ - private function fixElse(int $index, Token $token, Tokens $tokens): void - { - if (!$token->isGivenKind(T_ELSE)) { - return; - } - - $tokenAfterElseIndex = $tokens->getNextMeaningfulToken($index); - $tokenAfterElse = $tokens[$tokenAfterElseIndex]; - - if (!$tokenAfterElse->equals(':')) { - return; - } - - $this->addBraces($tokens, new Token([T_ELSE, 'else']), $index, $tokenAfterElseIndex); - } - - /** - * Handle the elsif(): cases. - * - * @param int $index the index of the token being processed - * @param Token $token the token being processed - * @param Tokens $tokens the collection of tokens - */ - private function fixElseif(int $index, Token $token, Tokens $tokens): void - { - if (!$token->isGivenKind(T_ELSEIF)) { - return; - } - - $parenthesisEndIndex = $this->findParenthesisEnd($tokens, $index); - $tokenAfterParenthesisIndex = $tokens->getNextMeaningfulToken($parenthesisEndIndex); - $tokenAfterParenthesis = $tokens[$tokenAfterParenthesisIndex]; - - if (!$tokenAfterParenthesis->equals(':')) { - return; - } - - $this->addBraces($tokens, new Token([T_ELSEIF, 'elseif']), $index, $tokenAfterParenthesisIndex); - } - - /** - * Add opening and closing braces to the else: and elseif: cases. - * - * @param Tokens $tokens the tokens collection - * @param Token $token the current token - * @param int $index the current token index - * @param int $colonIndex the index of the colon - */ - private function addBraces(Tokens $tokens, Token $token, int $index, int $colonIndex): void - { - $items = [ - new Token('}'), - new Token([T_WHITESPACE, ' ']), - $token, - ]; - - if (!$tokens[$index + 1]->isWhitespace()) { - $items[] = new Token([T_WHITESPACE, ' ']); - } - - $tokens->clearAt($index); - $tokens->insertAt( - $index, - $items - ); - - // increment the position of the colon by number of items inserted - $colonIndex += \count($items); - - $items = [new Token('{')]; - - if (!$tokens[$colonIndex + 1]->isWhitespace()) { - $items[] = new Token([T_WHITESPACE, ' ']); - } - - $tokens->clearAt($colonIndex); - $tokens->insertAt( - $colonIndex, - $items - ); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoBreakCommentFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoBreakCommentFixer.php deleted file mode 100644 index 8a750bf..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoBreakCommentFixer.php +++ /dev/null @@ -1,353 +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\Fixer\ControlStructure; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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\WhitespacesAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use Symfony\Component\OptionsResolver\Exception\InvalidOptionsException; -use Symfony\Component\OptionsResolver\Options; - -/** - * Fixer for rule defined in PSR2 ¶5.2. - */ -final class NoBreakCommentFixer extends AbstractFixer implements ConfigurableFixerInterface, WhitespacesAwareFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'There must be a comment when fall-through is intentional in a non-empty case body.', - [ - new CodeSample( - ' 'some comment'] - ), - ], - 'Adds a "no break" comment before fall-through cases, and removes it if there is no fall-through.' - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isAnyTokenKindsFound([T_CASE, T_DEFAULT]); - } - - /** - * {@inheritdoc} - * - * Must run after NoUselessElseFixer. - */ - public function getPriority(): int - { - return 0; - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('comment_text', 'The text to use in the added comment and to detect it.')) - ->setAllowedTypes(['string']) - ->setAllowedValues([ - static function (string $value) { - if (Preg::match('/\R/', $value)) { - throw new InvalidOptionsException('The comment text must not contain new lines.'); - } - - return true; - }, - ]) - ->setNormalizer(static function (Options $options, $value) { - return rtrim($value); - }) - ->setDefault('no break') - ->getOption(), - ]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - for ($index = \count($tokens) - 1; $index >= 0; --$index) { - if (!$tokens[$index]->isGivenKind([T_CASE, T_DEFAULT])) { - continue; - } - - $caseColonIndex = $tokens->getNextTokenOfKind($index, [':', ';', [T_DOUBLE_ARROW]]); - - if ($tokens[$caseColonIndex]->isGivenKind(T_DOUBLE_ARROW)) { - continue; // this is "default" from "match" - } - - $this->fixCase($tokens, $caseColonIndex); - } - } - - private function fixCase(Tokens $tokens, int $casePosition): void - { - $empty = true; - $fallThrough = true; - $commentPosition = null; - - for ($i = $casePosition + 1, $max = \count($tokens); $i < $max; ++$i) { - if ($tokens[$i]->isGivenKind([T_SWITCH, T_IF, T_ELSE, T_ELSEIF, T_FOR, T_FOREACH, T_WHILE, T_DO, T_FUNCTION, T_CLASS])) { - $empty = false; - $i = $this->getStructureEnd($tokens, $i); - - continue; - } - - if ($tokens[$i]->isGivenKind([T_BREAK, T_CONTINUE, T_RETURN, T_EXIT, T_GOTO])) { - $fallThrough = false; - - continue; - } - - if ($tokens[$i]->isGivenKind([T_THROW])) { - $previousIndex = $tokens->getPrevMeaningfulToken($i); - - if ($previousIndex === $casePosition || $tokens[$previousIndex]->equalsAny(['{', ';', '}', [T_OPEN_TAG]])) { - $fallThrough = false; - } - - continue; - } - - if ($tokens[$i]->equals('}') || $tokens[$i]->isGivenKind(T_ENDSWITCH)) { - if (null !== $commentPosition) { - $this->removeComment($tokens, $commentPosition); - } - - break; - } - - if ($this->isNoBreakComment($tokens[$i])) { - $commentPosition = $i; - - continue; - } - - if ($tokens[$i]->isGivenKind([T_CASE, T_DEFAULT])) { - if (!$empty && $fallThrough) { - if (null !== $commentPosition && $tokens->getPrevNonWhitespace($i) !== $commentPosition) { - $this->removeComment($tokens, $commentPosition); - $commentPosition = null; - } - - if (null === $commentPosition) { - $this->insertCommentAt($tokens, $i); - } else { - $text = $this->configuration['comment_text']; - $tokens[$commentPosition] = new Token([ - $tokens[$commentPosition]->getId(), - str_ireplace($text, $text, $tokens[$commentPosition]->getContent()), - ]); - - $this->ensureNewLineAt($tokens, $commentPosition); - } - } elseif (null !== $commentPosition) { - $this->removeComment($tokens, $commentPosition); - } - - break; - } - - if (!$tokens[$i]->isGivenKind([T_COMMENT, T_WHITESPACE])) { - $empty = false; - } - } - } - - private function isNoBreakComment(Token $token): bool - { - if (!$token->isComment()) { - return false; - } - - $text = preg_quote($this->configuration['comment_text'], '~'); - - return 1 === Preg::match("~^((//|#)\\s*{$text}\\s*)|(/\\*\\*?\\s*{$text}\\s*\\*/)$~i", $token->getContent()); - } - - private function insertCommentAt(Tokens $tokens, int $casePosition): void - { - $lineEnding = $this->whitespacesConfig->getLineEnding(); - $newlinePosition = $this->ensureNewLineAt($tokens, $casePosition); - $newlineToken = $tokens[$newlinePosition]; - $nbNewlines = substr_count($newlineToken->getContent(), $lineEnding); - - if ($newlineToken->isGivenKind(T_OPEN_TAG) && Preg::match('/\R/', $newlineToken->getContent())) { - ++$nbNewlines; - } elseif ($tokens[$newlinePosition - 1]->isGivenKind(T_OPEN_TAG) && Preg::match('/\R/', $tokens[$newlinePosition - 1]->getContent())) { - ++$nbNewlines; - - if (!Preg::match('/\R/', $newlineToken->getContent())) { - $tokens[$newlinePosition] = new Token([$newlineToken->getId(), $lineEnding.$newlineToken->getContent()]); - } - } - - if ($nbNewlines > 1) { - Preg::match('/^(.*?)(\R\h*)$/s', $newlineToken->getContent(), $matches); - - $indent = WhitespacesAnalyzer::detectIndent($tokens, $newlinePosition - 1); - $tokens[$newlinePosition] = new Token([$newlineToken->getId(), $matches[1].$lineEnding.$indent]); - $tokens->insertAt(++$newlinePosition, new Token([T_WHITESPACE, $matches[2]])); - } - - $tokens->insertAt($newlinePosition, new Token([T_COMMENT, '// '.$this->configuration['comment_text']])); - $this->ensureNewLineAt($tokens, $newlinePosition); - } - - /** - * @return int The newline token position - */ - private function ensureNewLineAt(Tokens $tokens, int $position): int - { - $lineEnding = $this->whitespacesConfig->getLineEnding(); - $content = $lineEnding.WhitespacesAnalyzer::detectIndent($tokens, $position); - $whitespaceToken = $tokens[$position - 1]; - - if (!$whitespaceToken->isGivenKind(T_WHITESPACE)) { - if ($whitespaceToken->isGivenKind(T_OPEN_TAG)) { - $content = Preg::replace('/\R/', '', $content); - if (!Preg::match('/\R/', $whitespaceToken->getContent())) { - $tokens[$position - 1] = new Token([T_OPEN_TAG, Preg::replace('/\s+$/', $lineEnding, $whitespaceToken->getContent())]); - } - } - - if ('' !== $content) { - $tokens->insertAt($position, new Token([T_WHITESPACE, $content])); - - return $position; - } - - return $position - 1; - } - - if ($tokens[$position - 2]->isGivenKind(T_OPEN_TAG) && Preg::match('/\R/', $tokens[$position - 2]->getContent())) { - $content = Preg::replace('/^\R/', '', $content); - } - - if (!Preg::match('/\R/', $whitespaceToken->getContent())) { - $tokens[$position - 1] = new Token([T_WHITESPACE, $content]); - } - - return $position - 1; - } - - private function removeComment(Tokens $tokens, int $commentPosition): void - { - if ($tokens[$tokens->getPrevNonWhitespace($commentPosition)]->isGivenKind(T_OPEN_TAG)) { - $whitespacePosition = $commentPosition + 1; - $regex = '/^\R\h*/'; - } else { - $whitespacePosition = $commentPosition - 1; - $regex = '/\R\h*$/'; - } - - $whitespaceToken = $tokens[$whitespacePosition]; - - if ($whitespaceToken->isGivenKind(T_WHITESPACE)) { - $content = Preg::replace($regex, '', $whitespaceToken->getContent()); - if ('' !== $content) { - $tokens[$whitespacePosition] = new Token([T_WHITESPACE, $content]); - } else { - $tokens->clearAt($whitespacePosition); - } - } - - $tokens->clearTokenAndMergeSurroundingWhitespace($commentPosition); - } - - private function getStructureEnd(Tokens $tokens, int $position): int - { - $initialToken = $tokens[$position]; - - if ($initialToken->isGivenKind([T_FOR, T_FOREACH, T_WHILE, T_IF, T_ELSEIF, T_SWITCH, T_FUNCTION])) { - $position = $tokens->findBlockEnd( - Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, - $tokens->getNextTokenOfKind($position, ['(']) - ); - } elseif ($initialToken->isGivenKind(T_CLASS)) { - $openParenthesisPosition = $tokens->getNextMeaningfulToken($position); - if ('(' === $tokens[$openParenthesisPosition]->getContent()) { - $position = $tokens->findBlockEnd( - Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, - $openParenthesisPosition - ); - } - } - - $position = $tokens->getNextMeaningfulToken($position); - - if ('{' !== $tokens[$position]->getContent()) { - return $tokens->getNextTokenOfKind($position, [';']); - } - - $position = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $position); - - if ($initialToken->isGivenKind(T_DO)) { - $position = $tokens->findBlockEnd( - Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, - $tokens->getNextTokenOfKind($position, ['(']) - ); - - return $tokens->getNextTokenOfKind($position, [';']); - } - - return $position; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoSuperfluousElseifFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoSuperfluousElseifFixer.php deleted file mode 100644 index a8b6f92..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoSuperfluousElseifFixer.php +++ /dev/null @@ -1,110 +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\Fixer\ControlStructure; - -use PhpCsFixer\AbstractNoUselessElseFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -final class NoSuperfluousElseifFixer extends AbstractNoUselessElseFixer -{ - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isAnyTokenKindsFound([T_ELSE, T_ELSEIF]); - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Replaces superfluous `elseif` with `if`.', - [ - new CodeSample(" $token) { - if ($this->isElseif($tokens, $index) && $this->isSuperfluousElse($tokens, $index)) { - $this->convertElseifToIf($tokens, $index); - } - } - } - - private function isElseif(Tokens $tokens, int $index): bool - { - return - $tokens[$index]->isGivenKind(T_ELSEIF) - || ($tokens[$index]->isGivenKind(T_ELSE) && $tokens[$tokens->getNextMeaningfulToken($index)]->isGivenKind(T_IF)) - ; - } - - private function convertElseifToIf(Tokens $tokens, int $index): void - { - if ($tokens[$index]->isGivenKind(T_ELSE)) { - $tokens->clearTokenAndMergeSurroundingWhitespace($index); - } else { - $tokens[$index] = new Token([T_IF, 'if']); - } - - $whitespace = ''; - - for ($previous = $index - 1; $previous > 0; --$previous) { - $token = $tokens[$previous]; - if ($token->isWhitespace() && Preg::match('/(\R\N*)$/', $token->getContent(), $matches)) { - $whitespace = $matches[1]; - - break; - } - } - - if ('' === $whitespace) { - return; - } - - $previousToken = $tokens[$index - 1]; - - if (!$previousToken->isWhitespace()) { - $tokens->insertAt($index, new Token([T_WHITESPACE, $whitespace])); - } elseif (!Preg::match('/\R/', $previousToken->getContent())) { - $tokens[$index - 1] = new Token([T_WHITESPACE, $whitespace]); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoTrailingCommaInListCallFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoTrailingCommaInListCallFixer.php deleted file mode 100644 index 0252750..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoTrailingCommaInListCallFixer.php +++ /dev/null @@ -1,77 +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\Fixer\ControlStructure; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dariusz Rumiński - */ -final class NoTrailingCommaInListCallFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Remove trailing commas in list function calls.', - [new CodeSample("isTokenKindFound(T_LIST); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - for ($index = $tokens->count() - 1; $index >= 0; --$index) { - $token = $tokens[$index]; - - if (!$token->isGivenKind(T_LIST)) { - continue; - } - - $openIndex = $tokens->getNextMeaningfulToken($index); - $closeIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $openIndex); - $markIndex = null; - $prevIndex = $tokens->getPrevNonWhitespace($closeIndex); - - while ($tokens[$prevIndex]->equals(',')) { - $markIndex = $prevIndex; - $prevIndex = $tokens->getPrevNonWhitespace($prevIndex); - } - - if (null !== $markIndex) { - $tokens->clearRange( - $tokens->getPrevNonWhitespace($markIndex) + 1, - $closeIndex - 1 - ); - } - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoUnneededControlParenthesesFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoUnneededControlParenthesesFixer.php deleted file mode 100644 index 69085b9..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoUnneededControlParenthesesFixer.php +++ /dev/null @@ -1,189 +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\Fixer\ControlStructure; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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; - -/** - * @author Sullivan Senechal - * @author Dariusz Rumiński - * @author Gregor Harlan - */ -final class NoUnneededControlParenthesesFixer extends AbstractFixer implements ConfigurableFixerInterface -{ - private static $loops = [ - 'break' => ['lookupTokens' => T_BREAK, 'neededSuccessors' => [';']], - 'clone' => ['lookupTokens' => T_CLONE, 'neededSuccessors' => [';', ':', ',', ')'], 'forbiddenContents' => ['?', ':', [T_COALESCE, '??']]], - 'continue' => ['lookupTokens' => T_CONTINUE, 'neededSuccessors' => [';']], - 'echo_print' => ['lookupTokens' => [T_ECHO, T_PRINT], 'neededSuccessors' => [';', [T_CLOSE_TAG]]], - 'return' => ['lookupTokens' => T_RETURN, 'neededSuccessors' => [';', [T_CLOSE_TAG]]], - 'switch_case' => ['lookupTokens' => T_CASE, 'neededSuccessors' => [';', ':']], - 'yield' => ['lookupTokens' => T_YIELD, 'neededSuccessors' => [';', ')']], - 'yield_from' => ['lookupTokens' => T_YIELD_FROM, 'neededSuccessors' => [';', ')']], - ]; - - /** - * Dynamic option set on constructor. - */ - public function __construct() - { - parent::__construct(); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - $types = []; - - foreach (self::$loops as $loop) { - $types[] = (array) $loop['lookupTokens']; - } - $types = array_merge(...$types); - - return $tokens->isAnyTokenKindsFound($types); - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Removes unneeded parentheses around control statements.', - [ - new CodeSample( - ' ['break', 'continue']] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run before NoTrailingWhitespaceFixer. - */ - public function getPriority(): int - { - return 30; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - // Checks if specific statements are set and uses them in this case. - $loops = array_intersect_key(self::$loops, array_flip($this->configuration['statements'])); - - foreach ($tokens as $index => $token) { - if (!$token->equalsAny(['(', [CT::T_BRACE_CLASS_INSTANTIATION_OPEN]])) { - continue; - } - - $blockStartIndex = $index; - $index = $tokens->getPrevMeaningfulToken($index); - $prevToken = $tokens[$index]; - - foreach ($loops as $loop) { - if (!$prevToken->isGivenKind($loop['lookupTokens'])) { - continue; - } - - $blockEndIndex = $tokens->findBlockEnd( - $token->equals('(') ? Tokens::BLOCK_TYPE_PARENTHESIS_BRACE : Tokens::BLOCK_TYPE_BRACE_CLASS_INSTANTIATION, - $blockStartIndex - ); - $blockEndNextIndex = $tokens->getNextMeaningfulToken($blockEndIndex); - - if (!$tokens[$blockEndNextIndex]->equalsAny($loop['neededSuccessors'])) { - continue; - } - - if (\array_key_exists('forbiddenContents', $loop)) { - $forbiddenTokenIndex = $tokens->getNextTokenOfKind($blockStartIndex, $loop['forbiddenContents']); - // A forbidden token is found and is inside the parenthesis. - if (null !== $forbiddenTokenIndex && $forbiddenTokenIndex < $blockEndIndex) { - continue; - } - } - - if ($tokens[$blockStartIndex - 1]->isWhitespace() || $tokens[$blockStartIndex - 1]->isComment()) { - $tokens->clearTokenAndMergeSurroundingWhitespace($blockStartIndex); - } else { - // Adds a space to prevent broken code like `return2`. - $tokens[$blockStartIndex] = new Token([T_WHITESPACE, ' ']); - } - - $tokens->clearTokenAndMergeSurroundingWhitespace($blockEndIndex); - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('statements', 'List of control statements to fix.')) - ->setAllowedTypes(['array']) - ->setDefault([ - 'break', - 'clone', - 'continue', - 'echo_print', - 'return', - 'switch_case', - 'yield', - ]) - ->getOption(), - ]); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoUnneededCurlyBracesFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoUnneededCurlyBracesFixer.php deleted file mode 100644 index c130965..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoUnneededCurlyBracesFixer.php +++ /dev/null @@ -1,172 +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\Fixer\ControlStructure; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author SpacePossum - */ -final class NoUnneededCurlyBracesFixer extends AbstractFixer implements ConfigurableFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Removes unneeded curly braces that are superfluous and aren\'t part of a control structure\'s body.', - [ - new CodeSample( - ' true] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run before NoUselessElseFixer, NoUselessReturnFixer, ReturnAssignmentFixer, SimplifiedIfReturnFixer. - */ - public function getPriority(): int - { - return 40; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isTokenKindFound('}'); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - foreach ($this->findCurlyBraceOpen($tokens) as $index) { - if ($this->isOverComplete($tokens, $index)) { - $this->clearOverCompleteBraces($tokens, $index, $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $index)); - } - } - - if ($this->configuration['namespaces']) { - $this->clearIfIsOverCompleteNamespaceBlock($tokens); - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('namespaces', 'Remove unneeded curly braces from bracketed namespaces.')) - ->setAllowedTypes(['bool']) - ->setDefault(false) - ->getOption(), - ]); - } - - /** - * @param int $openIndex index of `{` token - * @param int $closeIndex index of `}` token - */ - private function clearOverCompleteBraces(Tokens $tokens, int $openIndex, int $closeIndex): void - { - $tokens->clearTokenAndMergeSurroundingWhitespace($closeIndex); - $tokens->clearTokenAndMergeSurroundingWhitespace($openIndex); - } - - private function findCurlyBraceOpen(Tokens $tokens): iterable - { - for ($i = \count($tokens) - 1; $i > 0; --$i) { - if ($tokens[$i]->equals('{')) { - yield $i; - } - } - } - - /** - * @param int $index index of `{` token - */ - private function isOverComplete(Tokens $tokens, int $index): bool - { - static $include = ['{', '}', [T_OPEN_TAG], ':', ';']; - - return $tokens[$tokens->getPrevMeaningfulToken($index)]->equalsAny($include); - } - - private function clearIfIsOverCompleteNamespaceBlock(Tokens $tokens): void - { - if (1 !== $tokens->countTokenKind(T_NAMESPACE)) { - return; // fast check, we never fix if multiple namespaces are defined - } - - $index = $tokens->getNextTokenOfKind(0, [[T_NAMESPACE]]); - - do { - $index = $tokens->getNextMeaningfulToken($index); - } while ($tokens[$index]->isGivenKind([T_STRING, T_NS_SEPARATOR])); - - if (!$tokens[$index]->equals('{')) { - return; // `;` - } - - $closeIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $index); - $afterCloseIndex = $tokens->getNextMeaningfulToken($closeIndex); - - if (null !== $afterCloseIndex && (!$tokens[$afterCloseIndex]->isGivenKind(T_CLOSE_TAG) || null !== $tokens->getNextMeaningfulToken($afterCloseIndex))) { - return; - } - - // clear up - $tokens->clearTokenAndMergeSurroundingWhitespace($closeIndex); - $tokens[$index] = new Token(';'); - - if ($tokens[$index - 1]->isWhitespace(" \t") && !$tokens[$index - 2]->isComment()) { - $tokens->clearTokenAndMergeSurroundingWhitespace($index - 1); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoUselessElseFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoUselessElseFixer.php deleted file mode 100644 index 1a3dc2d..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoUselessElseFixer.php +++ /dev/null @@ -1,132 +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\Fixer\ControlStructure; - -use PhpCsFixer\AbstractNoUselessElseFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author SpacePossum - */ -final class NoUselessElseFixer extends AbstractNoUselessElseFixer -{ - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isTokenKindFound(T_ELSE); - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'There should not be useless `else` cases.', - [ - new CodeSample(" $token) { - if (!$token->isGivenKind(T_ELSE)) { - continue; - } - - // `else if` vs. `else` and alternative syntax `else:` checks - if ($tokens[$tokens->getNextMeaningfulToken($index)]->equalsAny([':', [T_IF]])) { - continue; - } - - // clean up `else` if it is an empty statement - $this->fixEmptyElse($tokens, $index); - if ($tokens->isEmptyAt($index)) { - continue; - } - - // clean up `else` if possible - if ($this->isSuperfluousElse($tokens, $index)) { - $this->clearElse($tokens, $index); - } - } - } - - /** - * Remove tokens part of an `else` statement if not empty (i.e. no meaningful tokens inside). - * - * @param int $index T_ELSE index - */ - private function fixEmptyElse(Tokens $tokens, int $index): void - { - $next = $tokens->getNextMeaningfulToken($index); - - if ($tokens[$next]->equals('{')) { - $close = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $next); - if (1 === $close - $next) { // '{}' - $this->clearElse($tokens, $index); - } elseif ($tokens->getNextMeaningfulToken($next) === $close) { // '{/**/}' - $this->clearElse($tokens, $index); - } - - return; - } - - // short `else` - $end = $tokens->getNextTokenOfKind($index, [';', [T_CLOSE_TAG]]); - if ($next === $end) { - $this->clearElse($tokens, $index); - } - } - - /** - * @param int $index index of T_ELSE - */ - private function clearElse(Tokens $tokens, int $index): void - { - $tokens->clearTokenAndMergeSurroundingWhitespace($index); - - // clear T_ELSE and the '{' '}' if there are any - $next = $tokens->getNextMeaningfulToken($index); - - if (!$tokens[$next]->equals('{')) { - return; - } - - $tokens->clearTokenAndMergeSurroundingWhitespace($tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $next)); - $tokens->clearTokenAndMergeSurroundingWhitespace($next); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/SimplifiedIfReturnFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/SimplifiedIfReturnFixer.php deleted file mode 100644 index 2941055..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/SimplifiedIfReturnFixer.php +++ /dev/null @@ -1,142 +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\Fixer\ControlStructure; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Filippo Tessarotto - */ -final class SimplifiedIfReturnFixer extends AbstractFixer -{ - private $sequences = [ - [ - 'isNegative' => false, - 'sequence' => [ - '{', [T_RETURN], [T_STRING, 'true'], ';', '}', - [T_RETURN], [T_STRING, 'false'], ';', - ], - ], - [ - 'isNegative' => true, - 'sequence' => [ - '{', [T_RETURN], [T_STRING, 'false'], ';', '}', - [T_RETURN], [T_STRING, 'true'], ';', - ], - ], - [ - 'isNegative' => false, - 'sequence' => [ - [T_RETURN], [T_STRING, 'true'], ';', - [T_RETURN], [T_STRING, 'false'], ';', - ], - ], - [ - 'isNegative' => true, - 'sequence' => [ - [T_RETURN], [T_STRING, 'false'], ';', - [T_RETURN], [T_STRING, 'true'], ';', - ], - ], - ]; - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Simplify `if` control structures that return the boolean result of their condition.', - [new CodeSample("isAllTokenKindsFound([T_IF, T_RETURN, T_STRING]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - for ($ifIndex = $tokens->count() - 1; 0 <= $ifIndex; --$ifIndex) { - $ifToken = $tokens[$ifIndex]; - - if (!$ifToken->isGivenKind([T_IF, T_ELSEIF])) { - continue; - } - - $startParenthesisIndex = $tokens->getNextTokenOfKind($ifIndex, ['(']); - $endParenthesisIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $startParenthesisIndex); - $firstCandidateIndex = $tokens->getNextMeaningfulToken($endParenthesisIndex); - - foreach ($this->sequences as $sequenceSpec) { - $sequenceFound = $tokens->findSequence($sequenceSpec['sequence'], $firstCandidateIndex); - - if (null === $sequenceFound) { - continue; - } - - $firstSequenceIndex = key($sequenceFound); - - if ($firstSequenceIndex !== $firstCandidateIndex) { - continue; - } - - $indexesToClear = array_keys($sequenceFound); - array_pop($indexesToClear); // Preserve last semicolon - rsort($indexesToClear); - - foreach ($indexesToClear as $index) { - $tokens->clearTokenAndMergeSurroundingWhitespace($index); - } - - $newTokens = [ - new Token([T_RETURN, 'return']), - new Token([T_WHITESPACE, ' ']), - ]; - - if ($sequenceSpec['isNegative']) { - $newTokens[] = new Token('!'); - } else { - $newTokens[] = new Token([T_BOOL_CAST, '(bool)']); - } - - $tokens->overrideRange($ifIndex, $ifIndex, $newTokens); - } - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/SwitchCaseSemicolonToColonFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/SwitchCaseSemicolonToColonFixer.php deleted file mode 100644 index 51de357..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/SwitchCaseSemicolonToColonFixer.php +++ /dev/null @@ -1,129 +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\Fixer\ControlStructure; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Fixer for rules defined in PSR2 ¶5.2. - * - * @author SpacePossum - */ -final class SwitchCaseSemicolonToColonFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'A case should be followed by a colon and not a semicolon.', - [ - new CodeSample( - 'isAnyTokenKindsFound([T_CASE, T_DEFAULT]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - foreach ($tokens as $index => $token) { - if ($token->isGivenKind(T_CASE)) { - $this->fixSwitchCase($tokens, $index); - } - if ($token->isGivenKind(T_DEFAULT)) { - $this->fixSwitchDefault($tokens, $index); - } - } - } - - protected function fixSwitchCase(Tokens $tokens, int $index): void - { - $ternariesCount = 0; - do { - if ($tokens[$index]->equalsAny(['(', '{'])) { // skip constructs - $type = Tokens::detectBlockType($tokens[$index]); - $index = $tokens->findBlockEnd($type['type'], $index); - - continue; - } - - if ($tokens[$index]->equals('?')) { - ++$ternariesCount; - - continue; - } - - if ($tokens[$index]->equalsAny([':', ';'])) { - if (0 === $ternariesCount) { - break; - } - - --$ternariesCount; - } - } while (++$index); - - if ($tokens[$index]->equals(';')) { - $tokens[$index] = new Token(':'); - } - } - - protected function fixSwitchDefault(Tokens $tokens, int $index): void - { - do { - if ($tokens[$index]->equalsAny([':', ';', [T_DOUBLE_ARROW]])) { - break; - } - } while (++$index); - - if ($tokens[$index]->equals(';')) { - $tokens[$index] = new Token(':'); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/SwitchCaseSpaceFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/SwitchCaseSpaceFixer.php deleted file mode 100644 index 559ddde..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/SwitchCaseSpaceFixer.php +++ /dev/null @@ -1,95 +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\Fixer\ControlStructure; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Fixer for rules defined in PSR2 ¶5.2. - * - * @author Sullivan Senechal - */ -final class SwitchCaseSpaceFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Removes extra spaces between colon and case value.', - [ - new CodeSample( - 'isAnyTokenKindsFound([T_CASE, T_DEFAULT]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind([T_CASE, T_DEFAULT])) { - continue; - } - - $ternariesCount = 0; - for ($colonIndex = $index + 1;; ++$colonIndex) { - // We have to skip ternary case for colons. - if ($tokens[$colonIndex]->equals('?')) { - ++$ternariesCount; - } - - if ($tokens[$colonIndex]->equalsAny([':', ';'])) { - if (0 === $ternariesCount) { - break; - } - - --$ternariesCount; - } - } - - $valueIndex = $tokens->getPrevNonWhitespace($colonIndex); - // skip if there is no space between the colon and previous token or is space after comment - if ($valueIndex === $colonIndex - 1 || $tokens[$valueIndex]->isComment()) { - continue; - } - - $tokens->clearAt($valueIndex + 1); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/SwitchContinueToBreakFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/SwitchContinueToBreakFixer.php deleted file mode 100644 index b8db6a5..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/SwitchContinueToBreakFixer.php +++ /dev/null @@ -1,246 +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\Fixer\ControlStructure; - -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; - -final class SwitchContinueToBreakFixer extends AbstractFixer -{ - private $switchLevels = []; - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Switch case must not be ended with `continue` but with `break`.', - [ - new CodeSample( - ' 3) { - continue; - } - - continue 2; - } -} -' - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run after NoAlternativeSyntaxFixer. - */ - public function getPriority(): int - { - return 0; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isAllTokenKindsFound([T_SWITCH, T_CONTINUE, T_LNUMBER]) && !$tokens->hasAlternativeSyntax(); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $count = \count($tokens); - - for ($index = 1; $index < $count - 1; ++$index) { - $index = $this->doFix($tokens, $index, 0, false); - } - } - - /** - * @param int $depth >= 0 - */ - private function doFix(Tokens $tokens, int $index, int $depth, bool $isInSwitch): int - { - $token = $tokens[$index]; - - if ($token->isGivenKind([T_FOREACH, T_FOR, T_WHILE])) { - // go to first `(`, go to its close ')', go to first of '{', ';', '? >' - $index = $tokens->getNextTokenOfKind($index, ['(']); - $index = $tokens->getNextTokenOfKind($index, [')']); - $index = $tokens->getNextTokenOfKind($index, ['{', ';', [T_CLOSE_TAG]]); - - if (!$tokens[$index]->equals('{')) { - return $index; - } - - return $this->fixInLoop($tokens, $index, $depth + 1); - } - - if ($token->isGivenKind(T_DO)) { - return $this->fixInLoop($tokens, $tokens->getNextTokenOfKind($index, ['{']), $depth + 1); - } - - if ($token->isGivenKind(T_SWITCH)) { - return $this->fixInSwitch($tokens, $index, $depth + 1); - } - - if ($token->isGivenKind(T_CONTINUE)) { - return $this->fixContinueWhenActsAsBreak($tokens, $index, $isInSwitch, $depth); - } - - return $index; - } - - private function fixInSwitch(Tokens $tokens, int $switchIndex, int $depth): int - { - $this->switchLevels[] = $depth; - - // figure out where the switch starts - $openIndex = $tokens->getNextTokenOfKind($switchIndex, ['{']); - - // figure out where the switch ends - $closeIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $openIndex); - - for ($index = $openIndex + 1; $index < $closeIndex; ++$index) { - $index = $this->doFix($tokens, $index, $depth, true); - } - - array_pop($this->switchLevels); - - return $closeIndex; - } - - private function fixInLoop(Tokens $tokens, int $openIndex, int $depth): int - { - $openCount = 1; - - do { - ++$openIndex; - $token = $tokens[$openIndex]; - - if ($token->equals('{')) { - ++$openCount; - - continue; - } - - if ($token->equals('}')) { - --$openCount; - - if (0 === $openCount) { - break; - } - - continue; - } - - $openIndex = $this->doFix($tokens, $openIndex, $depth, false); - } while (true); - - return $openIndex; - } - - private function fixContinueWhenActsAsBreak(Tokens $tokens, int $continueIndex, bool $isInSwitch, int $depth): int - { - $followingContinueIndex = $tokens->getNextMeaningfulToken($continueIndex); - $followingContinueToken = $tokens[$followingContinueIndex]; - - if ($isInSwitch && $followingContinueToken->equals(';')) { - $this->replaceContinueWithBreakToken($tokens, $continueIndex); // short continue 1 notation - - return $followingContinueIndex; - } - - if (!$followingContinueToken->isGivenKind(T_LNUMBER)) { - return $followingContinueIndex; - } - - $afterFollowingContinueIndex = $tokens->getNextMeaningfulToken($followingContinueIndex); - - if (!$tokens[$afterFollowingContinueIndex]->equals(';')) { - return $afterFollowingContinueIndex; // if next not is `;` return without fixing, for example `continue 1 ? >getContent(); - $jump = str_replace('_', '', $jump); // support for numeric_literal_separator - - if (\strlen($jump) > 2 && 'x' === $jump[1]) { - $jump = hexdec($jump); // hexadecimal - 0x1 - } elseif (\strlen($jump) > 2 && 'b' === $jump[1]) { - $jump = bindec($jump); // binary - 0b1 - } elseif (\strlen($jump) > 1 && '0' === $jump[0]) { - $jump = octdec($jump); // octal 01 - } elseif (1 === Preg::match('#^\d+$#', $jump)) { // positive int - $jump = (float) $jump; // cast to float, might be a number bigger than PHP max. int value - } else { - return $afterFollowingContinueIndex; // cannot process value, ignore - } - - if ($jump > PHP_INT_MAX) { - return $afterFollowingContinueIndex; // cannot process value, ignore - } - - $jump = (int) $jump; - - if ($isInSwitch && (1 === $jump || 0 === $jump)) { - $this->replaceContinueWithBreakToken($tokens, $continueIndex); // long continue 0/1 notation - - return $afterFollowingContinueIndex; - } - - $jumpDestination = $depth - $jump + 1; - - if (\in_array($jumpDestination, $this->switchLevels, true)) { - $this->replaceContinueWithBreakToken($tokens, $continueIndex); - - return $afterFollowingContinueIndex; - } - - return $afterFollowingContinueIndex; - } - - private function replaceContinueWithBreakToken(Tokens $tokens, int $index): void - { - $tokens[$index] = new Token([T_BREAK, 'break']); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/TrailingCommaInMultilineFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/TrailingCommaInMultilineFixer.php deleted file mode 100644 index 58020fc..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/TrailingCommaInMultilineFixer.php +++ /dev/null @@ -1,220 +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\Fixer\ControlStructure; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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; -use PhpCsFixer\FixerDefinition\VersionSpecification; -use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample; -use PhpCsFixer\Tokenizer\CT; -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 - */ -final class TrailingCommaInMultilineFixer extends AbstractFixer implements ConfigurableFixerInterface -{ - /** - * @internal - */ - public const ELEMENTS_ARRAYS = 'arrays'; - - /** - * @internal - */ - public const ELEMENTS_ARGUMENTS = 'arguments'; - - /** - * @internal - */ - public const ELEMENTS_PARAMETERS = 'parameters'; - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Multi-line arrays, arguments list and parameters list must have a trailing comma.', - [ - new CodeSample(" true] - ), - new VersionSpecificCodeSample(" [self::ELEMENTS_ARGUMENTS]]), - new VersionSpecificCodeSample(" [self::ELEMENTS_PARAMETERS]]), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run after NoMultilineWhitespaceAroundDoubleArrowFixer. - */ - public function getPriority(): int - { - return 0; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isAnyTokenKindsFound([T_ARRAY, CT::T_ARRAY_SQUARE_BRACE_OPEN, '(']); - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('after_heredoc', 'Whether a trailing comma should also be placed after heredoc end.')) - ->setAllowedTypes(['bool']) - ->setDefault(false) - ->setNormalizer(static function (Options $options, $value) { - if (\PHP_VERSION_ID < 70300 && $value) { - throw new InvalidOptionsForEnvException('"after_heredoc" option can only be enabled with PHP 7.3+.'); - } - - return $value; - }) - ->getOption(), - (new FixerOptionBuilder('elements', sprintf('Where to fix multiline trailing comma (PHP >= 7.3 required for `%s`, PHP >= 8.0 for `%s`).', self::ELEMENTS_ARGUMENTS, self::ELEMENTS_PARAMETERS))) - ->setAllowedTypes(['array']) - ->setAllowedValues([new AllowedValueSubset([self::ELEMENTS_ARRAYS, self::ELEMENTS_ARGUMENTS, self::ELEMENTS_PARAMETERS])]) - ->setDefault([self::ELEMENTS_ARRAYS]) - ->setNormalizer(static function (Options $options, $value) { - if (\PHP_VERSION_ID < 70300 && \in_array(self::ELEMENTS_ARGUMENTS, $value, true)) { - throw new InvalidOptionsForEnvException(sprintf('"%s" option can only be enabled with PHP 7.3+.', self::ELEMENTS_ARGUMENTS)); - } - if (\PHP_VERSION_ID < 80000 && \in_array(self::ELEMENTS_PARAMETERS, $value, true)) { - throw new InvalidOptionsForEnvException(sprintf('"%s" option can only be enabled with PHP 8.0+.', self::ELEMENTS_PARAMETERS)); - } - - return $value; - }) - ->getOption(), - ]); - } - - /** - * {@inheritdoc} - */ - 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 = \in_array(self::ELEMENTS_PARAMETERS, $this->configuration['elements'], true); - - $tokensAnalyzer = new TokensAnalyzer($tokens); - - for ($index = $tokens->count() - 1; $index >= 0; --$index) { - $prevIndex = $tokens->getPrevMeaningfulToken($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]->equals('(')) { - continue; - } - - $prevPrevIndex = $tokens->getPrevMeaningfulToken($prevIndex); - - if ($fixArguments - && $tokens[$prevIndex]->equalsAny([']', [T_CLASS], [T_STRING], [T_VARIABLE]]) - && !$tokens[$prevPrevIndex]->isGivenKind(T_FUNCTION) - ) { - $this->fixBlock($tokens, $index); - - continue; - } - - if ( - $fixParameters - && ( - $tokens[$prevIndex]->isGivenKind(T_STRING) && $tokens[$prevPrevIndex]->isGivenKind(T_FUNCTION) - || $tokens[$prevIndex]->isGivenKind([T_FN, T_FUNCTION]) - ) - ) { - $this->fixBlock($tokens, $index); - } - } - } - - private function fixBlock(Tokens $tokens, int $startIndex): void - { - $tokensAnalyzer = new TokensAnalyzer($tokens); - if (!$tokensAnalyzer->isBlockMultiline($tokens, $startIndex)) { - return; - } - - $blockType = Tokens::detectBlockType($tokens[$startIndex]); - $endIndex = $tokens->findBlockEnd($blockType['type'], $startIndex); - - $beforeEndIndex = $tokens->getPrevMeaningfulToken($endIndex); - $beforeEndToken = $tokens[$beforeEndIndex]; - - // if there is some item between braces then add `,` after it - if ( - $startIndex !== $beforeEndIndex && !$beforeEndToken->equals(',') - && ($this->configuration['after_heredoc'] || !$beforeEndToken->isGivenKind(T_END_HEREDOC)) - ) { - $tokens->insertAt($beforeEndIndex + 1, new Token(',')); - - $endToken = $tokens[$endIndex]; - - if (!$endToken->isComment() && !$endToken->isWhitespace()) { - $tokens->ensureWhitespaceAtIndex($endIndex, 1, ' '); - } - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/YodaStyleFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/YodaStyleFixer.php deleted file mode 100644 index 9cfd7f4..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/YodaStyleFixer.php +++ /dev/null @@ -1,735 +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\Fixer\ControlStructure; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * @author Bram Gotink - * @author Dariusz Rumiński - * @author SpacePossum - */ -final class YodaStyleFixer extends AbstractFixer implements ConfigurableFixerInterface -{ - /** - * @var array - */ - private $candidatesMap; - - /** - * @var array - */ - private $candidateTypesConfiguration; - - /** - * @var array - */ - private $candidateTypes; - - /** - * {@inheritdoc} - */ - public function configure(array $configuration): void - { - parent::configure($configuration); - - $this->resolveConfiguration(); - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Write conditions in Yoda style (`true`), non-Yoda style (`[\'equal\' => false, \'identical\' => false, \'less_and_greater\' => false]`) or ignore those conditions (`null`) based on configuration.', - [ - new CodeSample( - ' 3; // less than -', - [ - 'equal' => true, - 'identical' => false, - 'less_and_greater' => null, - ] - ), - new CodeSample( - ' true, - ] - ), - new CodeSample( - ' false, - 'identical' => false, - 'less_and_greater' => false, - ] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run after IsNullFixer. - */ - public function getPriority(): int - { - return 0; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isAnyTokenKindsFound($this->candidateTypes); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $this->fixTokens($tokens); - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('equal', 'Style for equal (`==`, `!=`) statements.')) - ->setAllowedTypes(['bool', 'null']) - ->setDefault(true) - ->getOption(), - (new FixerOptionBuilder('identical', 'Style for identical (`===`, `!==`) statements.')) - ->setAllowedTypes(['bool', 'null']) - ->setDefault(true) - ->getOption(), - (new FixerOptionBuilder('less_and_greater', 'Style for less and greater than (`<`, `<=`, `>`, `>=`) statements.')) - ->setAllowedTypes(['bool', 'null']) - ->setDefault(null) - ->getOption(), - (new FixerOptionBuilder('always_move_variable', 'Whether variables should always be on non assignable side when applying Yoda style.')) - ->setAllowedTypes(['bool']) - ->setDefault(false) - ->getOption(), - ]); - } - - /** - * Finds the end of the right-hand side of the comparison at the given - * index. - * - * The right-hand side ends when an operator with a lower precedence is - * encountered or when the block level for `()`, `{}` or `[]` goes below - * zero. - * - * @param Tokens $tokens The token list - * @param int $index The index of the comparison - * - * @return int The last index of the right-hand side of the comparison - */ - private function findComparisonEnd(Tokens $tokens, int $index): int - { - ++$index; - $count = \count($tokens); - while ($index < $count) { - $token = $tokens[$index]; - if ($token->isGivenKind([T_WHITESPACE, T_COMMENT, T_DOC_COMMENT])) { - ++$index; - - continue; - } - - if ($this->isOfLowerPrecedence($token)) { - break; - } - - $block = Tokens::detectBlockType($token); - if (null === $block) { - ++$index; - - continue; - } - - if (!$block['isStart']) { - break; - } - - $index = $tokens->findBlockEnd($block['type'], $index) + 1; - } - - $prev = $tokens->getPrevMeaningfulToken($index); - - return $tokens[$prev]->isGivenKind(T_CLOSE_TAG) ? $tokens->getPrevMeaningfulToken($prev) : $prev; - } - - /** - * Finds the start of the left-hand side of the comparison at the given - * index. - * - * The left-hand side ends when an operator with a lower precedence is - * encountered or when the block level for `()`, `{}` or `[]` goes below - * zero. - * - * @param Tokens $tokens The token list - * @param int $index The index of the comparison - * - * @return int The first index of the left-hand side of the comparison - */ - private function findComparisonStart(Tokens $tokens, int $index): int - { - --$index; - $nonBlockFound = false; - - while (0 <= $index) { - $token = $tokens[$index]; - if ($token->isGivenKind([T_WHITESPACE, T_COMMENT, T_DOC_COMMENT])) { - --$index; - - continue; - } - - if ($this->isOfLowerPrecedence($token)) { - break; - } - - $block = Tokens::detectBlockType($token); - if (null === $block) { - --$index; - $nonBlockFound = true; - - continue; - } - - if ( - $block['isStart'] - || ($nonBlockFound && Tokens::BLOCK_TYPE_CURLY_BRACE === $block['type']) // closing of structure not related to the comparison - ) { - break; - } - - $index = $tokens->findBlockStart($block['type'], $index) - 1; - } - - return $tokens->getNextMeaningfulToken($index); - } - - private function fixTokens(Tokens $tokens): Tokens - { - for ($i = \count($tokens) - 1; $i > 1; --$i) { - if ($tokens[$i]->isGivenKind($this->candidateTypes)) { - $yoda = $this->candidateTypesConfiguration[$tokens[$i]->getId()]; - } elseif ( - ($tokens[$i]->equals('<') && \in_array('<', $this->candidateTypes, true)) - || ($tokens[$i]->equals('>') && \in_array('>', $this->candidateTypes, true)) - ) { - $yoda = $this->candidateTypesConfiguration[$tokens[$i]->getContent()]; - } else { - continue; - } - - $fixableCompareInfo = $this->getCompareFixableInfo($tokens, $i, $yoda); - if (null === $fixableCompareInfo) { - continue; - } - - $i = $this->fixTokensCompare( - $tokens, - $fixableCompareInfo['left']['start'], - $fixableCompareInfo['left']['end'], - $i, - $fixableCompareInfo['right']['start'], - $fixableCompareInfo['right']['end'] - ); - } - - return $tokens; - } - - /** - * Fixes the comparison at the given index. - * - * A comparison is considered fixed when - * - both sides are a variable (e.g. $a === $b) - * - neither side is a variable (e.g. self::CONST === 3) - * - only the right-hand side is a variable (e.g. 3 === self::$var) - * - * If the left-hand side and right-hand side of the given comparison are - * swapped, this function runs recursively on the previous left-hand-side. - * - * @return int a upper bound for all non-fixed comparisons - */ - private function fixTokensCompare( - Tokens $tokens, - int $startLeft, - int $endLeft, - int $compareOperatorIndex, - int $startRight, - int $endRight - ): int { - $type = $tokens[$compareOperatorIndex]->getId(); - $content = $tokens[$compareOperatorIndex]->getContent(); - if (\array_key_exists($type, $this->candidatesMap)) { - $tokens[$compareOperatorIndex] = clone $this->candidatesMap[$type]; - } elseif (\array_key_exists($content, $this->candidatesMap)) { - $tokens[$compareOperatorIndex] = clone $this->candidatesMap[$content]; - } - - $right = $this->fixTokensComparePart($tokens, $startRight, $endRight); - $left = $this->fixTokensComparePart($tokens, $startLeft, $endLeft); - - for ($i = $startRight; $i <= $endRight; ++$i) { - $tokens->clearAt($i); - } - - for ($i = $startLeft; $i <= $endLeft; ++$i) { - $tokens->clearAt($i); - } - - $tokens->insertAt($startRight, $left); - $tokens->insertAt($startLeft, $right); - - return $startLeft; - } - - private function fixTokensComparePart(Tokens $tokens, int $start, int $end): Tokens - { - $newTokens = $tokens->generatePartialCode($start, $end); - $newTokens = $this->fixTokens(Tokens::fromCode(sprintf('clearAt(\count($newTokens) - 1); - $newTokens->clearAt(0); - $newTokens->clearEmptyTokens(); - - return $newTokens; - } - - private function getCompareFixableInfo(Tokens $tokens, int $index, bool $yoda): ?array - { - $left = $this->getLeftSideCompareFixableInfo($tokens, $index); - $right = $this->getRightSideCompareFixableInfo($tokens, $index); - - if (!$yoda && $this->isOfLowerPrecedenceAssignment($tokens[$tokens->getNextMeaningfulToken($right['end'])])) { - return null; - } - - if ($this->isListStatement($tokens, $left['start'], $left['end']) || $this->isListStatement($tokens, $right['start'], $right['end'])) { - return null; // do not fix lists assignment inside statements - } - - $strict = $this->configuration['always_move_variable']; - - $leftSideIsVariable = $this->isVariable($tokens, $left['start'], $left['end'], $strict); - $rightSideIsVariable = $this->isVariable($tokens, $right['start'], $right['end'], $strict); - - if (!($leftSideIsVariable ^ $rightSideIsVariable)) { - return null; // both are (not) variables, do not touch - } - - if (!$strict) { // special handling for braces with not "always_move_variable" - $leftSideIsVariable = $leftSideIsVariable && !$tokens[$left['start']]->equals('('); - $rightSideIsVariable = $rightSideIsVariable && !$tokens[$right['start']]->equals('('); - } - - return ($yoda && !$leftSideIsVariable) || (!$yoda && !$rightSideIsVariable) - ? null - : ['left' => $left, 'right' => $right] - ; - } - - private function getLeftSideCompareFixableInfo(Tokens $tokens, int $index): array - { - return [ - 'start' => $this->findComparisonStart($tokens, $index), - 'end' => $tokens->getPrevMeaningfulToken($index), - ]; - } - - private function getRightSideCompareFixableInfo(Tokens $tokens, int $index): array - { - return [ - 'start' => $tokens->getNextMeaningfulToken($index), - 'end' => $this->findComparisonEnd($tokens, $index), - ]; - } - - private function isListStatement(Tokens $tokens, int $index, int $end): bool - { - for ($i = $index; $i <= $end; ++$i) { - if ($tokens[$i]->isGivenKind([T_LIST, CT::T_DESTRUCTURING_SQUARE_BRACE_OPEN, CT::T_DESTRUCTURING_SQUARE_BRACE_CLOSE])) { - return true; - } - } - - return false; - } - - /** - * Checks whether the given token has a lower precedence than `T_IS_EQUAL` - * or `T_IS_IDENTICAL`. - * - * @param Token $token The token to check - * - * @return bool Whether the token has a lower precedence - */ - private function isOfLowerPrecedence(Token $token): bool - { - static $tokens; - - if (null === $tokens) { - $tokens = [ - T_BOOLEAN_AND, // && - T_BOOLEAN_OR, // || - T_CASE, // case - T_DOUBLE_ARROW, // => - T_ECHO, // echo - T_GOTO, // goto - T_LOGICAL_AND, // and - T_LOGICAL_OR, // or - T_LOGICAL_XOR, // xor - T_OPEN_TAG, // isOfLowerPrecedenceAssignment($token) || $token->isGivenKind($tokens) || $token->equalsAny($otherTokens); - } - - /** - * Checks whether the given assignment token has a lower precedence than `T_IS_EQUAL` - * or `T_IS_IDENTICAL`. - */ - private function isOfLowerPrecedenceAssignment(Token $token) - { - static $tokens; - - if (null === $tokens) { - $tokens = [ - T_AND_EQUAL, // &= - T_CONCAT_EQUAL, // .= - T_DIV_EQUAL, // /= - T_MINUS_EQUAL, // -= - T_MOD_EQUAL, // %= - T_MUL_EQUAL, // *= - T_OR_EQUAL, // |= - T_PLUS_EQUAL, // += - T_POW_EQUAL, // **= - T_SL_EQUAL, // <<= - T_SR_EQUAL, // >>= - T_XOR_EQUAL, // ^= - ]; - - // @TODO: drop condition when PHP 7.4+ is required - if (\defined('T_COALESCE_EQUAL')) { - $tokens[] = T_COALESCE_EQUAL; // ??= - } - } - - return $token->equals('=') || $token->isGivenKind($tokens); - } - - /** - * Checks whether the tokens between the given start and end describe a - * variable. - * - * @param Tokens $tokens The token list - * @param int $start The first index of the possible variable - * @param int $end The last index of the possible variable - * @param bool $strict Enable strict variable detection - * - * @return bool Whether the tokens describe a variable - */ - private function isVariable(Tokens $tokens, int $start, int $end, bool $strict): bool - { - $tokenAnalyzer = new TokensAnalyzer($tokens); - - if ($start === $end) { - return $tokens[$start]->isGivenKind(T_VARIABLE); - } - - if ($tokens[$start]->equals('(')) { - return true; - } - - if ($strict) { - for ($index = $start; $index <= $end; ++$index) { - if ( - $tokens[$index]->isCast() - || $tokens[$index]->isGivenKind(T_INSTANCEOF) - || $tokens[$index]->equals('!') - || $tokenAnalyzer->isBinaryOperator($index) - ) { - return false; - } - } - } - - $index = $start; - - // handle multiple braces around statement ((($a === 1))) - while ( - $tokens[$index]->equals('(') - && $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $index) === $end - ) { - $index = $tokens->getNextMeaningfulToken($index); - $end = $tokens->getPrevMeaningfulToken($end); - } - - $expectString = false; - while ($index <= $end) { - $current = $tokens[$index]; - if ($current->isComment() || $current->isWhitespace() || $tokens->isEmptyAt($index)) { - ++$index; - - continue; - } - - // check if this is the last token - if ($index === $end) { - return $current->isGivenKind($expectString ? T_STRING : T_VARIABLE); - } - - if ($current->isGivenKind([T_LIST, CT::T_DESTRUCTURING_SQUARE_BRACE_OPEN, CT::T_DESTRUCTURING_SQUARE_BRACE_CLOSE])) { - return false; - } - - $nextIndex = $tokens->getNextMeaningfulToken($index); - $next = $tokens[$nextIndex]; - - // self:: or ClassName:: - if ($current->isGivenKind(T_STRING) && $next->isGivenKind(T_DOUBLE_COLON)) { - $index = $tokens->getNextMeaningfulToken($nextIndex); - - continue; - } - - // \ClassName - if ($current->isGivenKind(T_NS_SEPARATOR) && $next->isGivenKind(T_STRING)) { - $index = $nextIndex; - - continue; - } - - // ClassName\ - if ($current->isGivenKind(T_STRING) && $next->isGivenKind(T_NS_SEPARATOR)) { - $index = $nextIndex; - - continue; - } - - // $a-> or a-> (as in $b->a->c) - if ($current->isGivenKind([T_STRING, T_VARIABLE]) && $next->isObjectOperator()) { - $index = $tokens->getNextMeaningfulToken($nextIndex); - $expectString = true; - - continue; - } - - // $a[...], a[...] (as in $c->a[$b]), $a{...} or a{...} (as in $c->a{$b}) - if ( - $current->isGivenKind($expectString ? T_STRING : T_VARIABLE) - && $next->equalsAny(['[', [CT::T_ARRAY_INDEX_CURLY_BRACE_OPEN, '{']]) - ) { - $index = $tokens->findBlockEnd( - $next->equals('[') ? Tokens::BLOCK_TYPE_INDEX_SQUARE_BRACE : Tokens::BLOCK_TYPE_ARRAY_INDEX_CURLY_BRACE, - $nextIndex - ); - - if ($index === $end) { - return true; - } - - $index = $tokens->getNextMeaningfulToken($index); - - if (!$tokens[$index]->equalsAny(['[', [CT::T_ARRAY_INDEX_CURLY_BRACE_OPEN, '{']]) && !$tokens[$index]->isObjectOperator()) { - return false; - } - - $index = $tokens->getNextMeaningfulToken($index); - $expectString = true; - - continue; - } - - // $a(...) or $a->b(...) - if ($strict && $current->isGivenKind([T_STRING, T_VARIABLE]) && $next->equals('(')) { - return false; - } - - // {...} (as in $a->{$b}) - if ($expectString && $current->isGivenKind(CT::T_DYNAMIC_PROP_BRACE_OPEN)) { - $index = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_DYNAMIC_PROP_BRACE, $index); - if ($index === $end) { - return true; - } - - $index = $tokens->getNextMeaningfulToken($index); - - if (!$tokens[$index]->isObjectOperator()) { - return false; - } - - $index = $tokens->getNextMeaningfulToken($index); - $expectString = true; - - continue; - } - - break; - } - - return !$this->isConstant($tokens, $start, $end); - } - - private function isConstant(Tokens $tokens, int $index, int $end): bool - { - $expectArrayOnly = false; - $expectNumberOnly = false; - $expectNothing = false; - - for (; $index <= $end; ++$index) { - $token = $tokens[$index]; - - if ($token->isComment() || $token->isWhitespace()) { - continue; - } - - if ($expectNothing) { - return false; - } - - if ($expectArrayOnly) { - if ($token->equalsAny(['(', ')', [CT::T_ARRAY_SQUARE_BRACE_CLOSE]])) { - continue; - } - - return false; - } - - if ($token->isGivenKind([T_ARRAY, CT::T_ARRAY_SQUARE_BRACE_OPEN])) { - $expectArrayOnly = true; - - continue; - } - - if ($expectNumberOnly && !$token->isGivenKind([T_LNUMBER, T_DNUMBER])) { - return false; - } - - if ($token->equals('-')) { - $expectNumberOnly = true; - - continue; - } - - if ( - $token->isGivenKind([T_LNUMBER, T_DNUMBER, T_CONSTANT_ENCAPSED_STRING]) - || $token->equalsAny([[T_STRING, 'true'], [T_STRING, 'false'], [T_STRING, 'null']]) - ) { - $expectNothing = true; - - continue; - } - - return false; - } - - return true; - } - - private function resolveConfiguration(): void - { - $candidateTypes = []; - $this->candidatesMap = []; - - if (null !== $this->configuration['equal']) { - // `==`, `!=` and `<>` - $candidateTypes[T_IS_EQUAL] = $this->configuration['equal']; - $candidateTypes[T_IS_NOT_EQUAL] = $this->configuration['equal']; - } - - if (null !== $this->configuration['identical']) { - // `===` and `!==` - $candidateTypes[T_IS_IDENTICAL] = $this->configuration['identical']; - $candidateTypes[T_IS_NOT_IDENTICAL] = $this->configuration['identical']; - } - - if (null !== $this->configuration['less_and_greater']) { - // `<`, `<=`, `>` and `>=` - $candidateTypes[T_IS_SMALLER_OR_EQUAL] = $this->configuration['less_and_greater']; - $this->candidatesMap[T_IS_SMALLER_OR_EQUAL] = new Token([T_IS_GREATER_OR_EQUAL, '>=']); - - $candidateTypes[T_IS_GREATER_OR_EQUAL] = $this->configuration['less_and_greater']; - $this->candidatesMap[T_IS_GREATER_OR_EQUAL] = new Token([T_IS_SMALLER_OR_EQUAL, '<=']); - - $candidateTypes['<'] = $this->configuration['less_and_greater']; - $this->candidatesMap['<'] = new Token('>'); - - $candidateTypes['>'] = $this->configuration['less_and_greater']; - $this->candidatesMap['>'] = new Token('<'); - } - - $this->candidateTypesConfiguration = $candidateTypes; - $this->candidateTypes = array_keys($candidateTypes); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/DeprecatedFixerInterface.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/DeprecatedFixerInterface.php deleted file mode 100644 index 6d7d7e8..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/DeprecatedFixerInterface.php +++ /dev/null @@ -1,28 +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\Fixer; - -/** - * @author Kuba Werłos - */ -interface DeprecatedFixerInterface extends FixerInterface -{ - /** - * Returns names of fixers to use instead, if any. - * - * @return string[] - */ - public function getSuccessorsNames(): array; -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationArrayAssignmentFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationArrayAssignmentFixer.php deleted file mode 100644 index f2ead59..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationArrayAssignmentFixer.php +++ /dev/null @@ -1,108 +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\Fixer\DoctrineAnnotation; - -use Doctrine\Common\Annotations\DocLexer; -use PhpCsFixer\AbstractDoctrineAnnotationFixer; -use PhpCsFixer\Doctrine\Annotation\Tokens; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; - -/** - * Forces the configured operator for assignment in arrays in Doctrine Annotations. - */ -final class DoctrineAnnotationArrayAssignmentFixer extends AbstractDoctrineAnnotationFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Doctrine annotations must use configured operator for assignment in arrays.', - [ - new CodeSample( - " ':'] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run before DoctrineAnnotationSpacesFixer. - */ - public function getPriority(): int - { - return 1; - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - $options = parent::createConfigurationDefinition()->getOptions(); - - $operator = new FixerOptionBuilder('operator', 'The operator to use.'); - $options[] = $operator - ->setAllowedValues(['=', ':']) - ->setDefault('=') - ->getOption() - ; - - return new FixerConfigurationResolver($options); - } - - /** - * {@inheritdoc} - */ - protected function fixAnnotations(Tokens $doctrineAnnotationTokens): void - { - $scopes = []; - foreach ($doctrineAnnotationTokens as $token) { - if ($token->isType(DocLexer::T_OPEN_PARENTHESIS)) { - $scopes[] = 'annotation'; - - continue; - } - - if ($token->isType(DocLexer::T_OPEN_CURLY_BRACES)) { - $scopes[] = 'array'; - - continue; - } - - if ($token->isType([DocLexer::T_CLOSE_PARENTHESIS, DocLexer::T_CLOSE_CURLY_BRACES])) { - array_pop($scopes); - - continue; - } - - if ('array' === end($scopes) && $token->isType([DocLexer::T_EQUALS, DocLexer::T_COLON])) { - $token->setContent($this->configuration['operator']); - } - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationBracesFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationBracesFixer.php deleted file mode 100644 index 8ecbda4..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationBracesFixer.php +++ /dev/null @@ -1,127 +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\Fixer\DoctrineAnnotation; - -use Doctrine\Common\Annotations\DocLexer; -use PhpCsFixer\AbstractDoctrineAnnotationFixer; -use PhpCsFixer\Doctrine\Annotation\Token; -use PhpCsFixer\Doctrine\Annotation\Tokens; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; - -/** - * Adds braces to Doctrine annotations when missing. - */ -final class DoctrineAnnotationBracesFixer extends AbstractDoctrineAnnotationFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Doctrine annotations without arguments must use the configured syntax.', - [ - new CodeSample( - " 'with_braces'] - ), - ] - ); - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver(array_merge( - parent::createConfigurationDefinition()->getOptions(), - [ - (new FixerOptionBuilder('syntax', 'Whether to add or remove braces.')) - ->setAllowedValues(['with_braces', 'without_braces']) - ->setDefault('without_braces') - ->getOption(), - ] - )); - } - - /** - * {@inheritdoc} - */ - protected function fixAnnotations(Tokens $doctrineAnnotationTokens): void - { - if ('without_braces' === $this->configuration['syntax']) { - $this->removesBracesFromAnnotations($doctrineAnnotationTokens); - } else { - $this->addBracesToAnnotations($doctrineAnnotationTokens); - } - } - - private function addBracesToAnnotations(Tokens $tokens): void - { - foreach ($tokens as $index => $token) { - if (!$tokens[$index]->isType(DocLexer::T_AT)) { - continue; - } - - $braceIndex = $tokens->getNextMeaningfulToken($index + 1); - if (null !== $braceIndex && $tokens[$braceIndex]->isType(DocLexer::T_OPEN_PARENTHESIS)) { - continue; - } - - $tokens->insertAt($index + 2, new Token(DocLexer::T_OPEN_PARENTHESIS, '(')); - $tokens->insertAt($index + 3, new Token(DocLexer::T_CLOSE_PARENTHESIS, ')')); - } - } - - private function removesBracesFromAnnotations(Tokens $tokens): void - { - for ($index = 0, $max = \count($tokens); $index < $max; ++$index) { - if (!$tokens[$index]->isType(DocLexer::T_AT)) { - continue; - } - - $openBraceIndex = $tokens->getNextMeaningfulToken($index + 1); - if (null === $openBraceIndex) { - continue; - } - - if (!$tokens[$openBraceIndex]->isType(DocLexer::T_OPEN_PARENTHESIS)) { - continue; - } - - $closeBraceIndex = $tokens->getNextMeaningfulToken($openBraceIndex); - if (null === $closeBraceIndex) { - continue; - } - - if (!$tokens[$closeBraceIndex]->isType(DocLexer::T_CLOSE_PARENTHESIS)) { - continue; - } - - for ($currentIndex = $index + 2; $currentIndex <= $closeBraceIndex; ++$currentIndex) { - $tokens[$currentIndex]->clear(); - } - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationIndentationFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationIndentationFixer.php deleted file mode 100644 index 8a5f254..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationIndentationFixer.php +++ /dev/null @@ -1,193 +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\Fixer\DoctrineAnnotation; - -use Doctrine\Common\Annotations\DocLexer; -use PhpCsFixer\AbstractDoctrineAnnotationFixer; -use PhpCsFixer\Doctrine\Annotation\Tokens; -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; - -final class DoctrineAnnotationIndentationFixer extends AbstractDoctrineAnnotationFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Doctrine annotations must be indented with four spaces.', - [ - new CodeSample(" true] - ), - ] - ); - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver(array_merge( - parent::createConfigurationDefinition()->getOptions(), - [ - (new FixerOptionBuilder('indent_mixed_lines', 'Whether to indent lines that have content before closing parenthesis.')) - ->setAllowedTypes(['bool']) - ->setDefault(false) - ->getOption(), - ] - )); - } - - /** - * {@inheritdoc} - */ - protected function fixAnnotations(Tokens $doctrineAnnotationTokens): void - { - $annotationPositions = []; - for ($index = 0, $max = \count($doctrineAnnotationTokens); $index < $max; ++$index) { - if (!$doctrineAnnotationTokens[$index]->isType(DocLexer::T_AT)) { - continue; - } - - $annotationEndIndex = $doctrineAnnotationTokens->getAnnotationEnd($index); - if (null === $annotationEndIndex) { - return; - } - - $annotationPositions[] = [$index, $annotationEndIndex]; - $index = $annotationEndIndex; - } - - $indentLevel = 0; - foreach ($doctrineAnnotationTokens as $index => $token) { - if (!$token->isType(DocLexer::T_NONE) || false === strpos($token->getContent(), "\n")) { - continue; - } - - if (!$this->indentationCanBeFixed($doctrineAnnotationTokens, $index, $annotationPositions)) { - continue; - } - - $braces = $this->getLineBracesCount($doctrineAnnotationTokens, $index); - $delta = $braces[0] - $braces[1]; - $mixedBraces = 0 === $delta && $braces[0] > 0; - $extraIndentLevel = 0; - - if ($indentLevel > 0 && ($delta < 0 || $mixedBraces)) { - --$indentLevel; - - if ($this->configuration['indent_mixed_lines'] && $this->isClosingLineWithMeaningfulContent($doctrineAnnotationTokens, $index)) { - $extraIndentLevel = 1; - } - } - - $token->setContent(Preg::replace( - '/(\n( +\*)?) *$/', - '$1'.str_repeat(' ', 4 * ($indentLevel + $extraIndentLevel) + 1), - $token->getContent() - )); - - if ($delta > 0 || $mixedBraces) { - ++$indentLevel; - } - } - } - - /** - * @return int[] - */ - private function getLineBracesCount(Tokens $tokens, int $index): array - { - $opening = 0; - $closing = 0; - - while (isset($tokens[++$index])) { - $token = $tokens[$index]; - if ($token->isType(DocLexer::T_NONE) && false !== strpos($token->getContent(), "\n")) { - break; - } - - if ($token->isType([DocLexer::T_OPEN_PARENTHESIS, DocLexer::T_OPEN_CURLY_BRACES])) { - ++$opening; - - continue; - } - - if (!$token->isType([DocLexer::T_CLOSE_PARENTHESIS, DocLexer::T_CLOSE_CURLY_BRACES])) { - continue; - } - - if ($opening > 0) { - --$opening; - } else { - ++$closing; - } - } - - return [$opening, $closing]; - } - - private function isClosingLineWithMeaningfulContent(Tokens $tokens, int $index): bool - { - while (isset($tokens[++$index])) { - $token = $tokens[$index]; - if ($token->isType(DocLexer::T_NONE)) { - if (false !== strpos($token->getContent(), "\n")) { - return false; - } - - continue; - } - - return !$token->isType([DocLexer::T_CLOSE_PARENTHESIS, DocLexer::T_CLOSE_CURLY_BRACES]); - } - - return false; - } - - /** - * @param array> $annotationPositions Pairs of begin and end indexes of main annotations - */ - private function indentationCanBeFixed(Tokens $tokens, int $newLineTokenIndex, array $annotationPositions): bool - { - foreach ($annotationPositions as $position) { - if ($newLineTokenIndex >= $position[0] && $newLineTokenIndex <= $position[1]) { - return true; - } - } - - for ($index = $newLineTokenIndex + 1, $max = \count($tokens); $index < $max; ++$index) { - $token = $tokens[$index]; - - if (false !== strpos($token->getContent(), "\n")) { - return false; - } - - return $tokens[$index]->isType(DocLexer::T_AT); - } - - return false; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationSpacesFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationSpacesFixer.php deleted file mode 100644 index 50ccf7f..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationSpacesFixer.php +++ /dev/null @@ -1,301 +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\Fixer\DoctrineAnnotation; - -use Doctrine\Common\Annotations\DocLexer; -use PhpCsFixer\AbstractDoctrineAnnotationFixer; -use PhpCsFixer\Doctrine\Annotation\Token; -use PhpCsFixer\Doctrine\Annotation\Tokens; -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; - -/** - * Fixes spaces around commas and assignment operators in Doctrine annotations. - */ -final class DoctrineAnnotationSpacesFixer extends AbstractDoctrineAnnotationFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Fixes spaces in Doctrine annotations.', - [ - new CodeSample( - " false, 'before_array_assignments_equals' => false] - ), - ], - 'There must not be any space around parentheses; commas must be preceded by no space and followed by one space; there must be no space around named arguments assignment operator; there must be one space around array assignment operator.' - ); - } - - /** - * {@inheritdoc} - * - * Must run after DoctrineAnnotationArrayAssignmentFixer. - */ - public function getPriority(): int - { - return 0; - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver(array_merge( - parent::createConfigurationDefinition()->getOptions(), - [ - (new FixerOptionBuilder('around_parentheses', 'Whether to fix spaces around parentheses.')) - ->setAllowedTypes(['bool']) - ->setDefault(true) - ->getOption(), - (new FixerOptionBuilder('around_commas', 'Whether to fix spaces around commas.')) - ->setAllowedTypes(['bool']) - ->setDefault(true) - ->getOption(), - (new FixerOptionBuilder('before_argument_assignments', 'Whether to add, remove or ignore spaces before argument assignment operator.')) - ->setAllowedTypes(['null', 'bool']) - ->setDefault(false) - ->getOption(), - (new FixerOptionBuilder('after_argument_assignments', 'Whether to add, remove or ignore spaces after argument assignment operator.')) - ->setAllowedTypes(['null', 'bool']) - ->setDefault(false) - ->getOption(), - (new FixerOptionBuilder('before_array_assignments_equals', 'Whether to add, remove or ignore spaces before array `=` assignment operator.')) - ->setAllowedTypes(['null', 'bool']) - ->setDefault(true) - ->getOption(), - (new FixerOptionBuilder('after_array_assignments_equals', 'Whether to add, remove or ignore spaces after array assignment `=` operator.')) - ->setAllowedTypes(['null', 'bool']) - ->setDefault(true) - ->getOption(), - (new FixerOptionBuilder('before_array_assignments_colon', 'Whether to add, remove or ignore spaces before array `:` assignment operator.')) - ->setAllowedTypes(['null', 'bool']) - ->setDefault(true) - ->getOption(), - (new FixerOptionBuilder('after_array_assignments_colon', 'Whether to add, remove or ignore spaces after array assignment `:` operator.')) - ->setAllowedTypes(['null', 'bool']) - ->setDefault(true) - ->getOption(), - ] - )); - } - - /** - * {@inheritdoc} - */ - protected function fixAnnotations(Tokens $doctrineAnnotationTokens): void - { - if ($this->configuration['around_parentheses']) { - $this->fixSpacesAroundParentheses($doctrineAnnotationTokens); - } - - if ($this->configuration['around_commas']) { - $this->fixSpacesAroundCommas($doctrineAnnotationTokens); - } - - if ( - null !== $this->configuration['before_argument_assignments'] - || null !== $this->configuration['after_argument_assignments'] - || null !== $this->configuration['before_array_assignments_equals'] - || null !== $this->configuration['after_array_assignments_equals'] - || null !== $this->configuration['before_array_assignments_colon'] - || null !== $this->configuration['after_array_assignments_colon'] - ) { - $this->fixAroundAssignments($doctrineAnnotationTokens); - } - } - - private function fixSpacesAroundParentheses(Tokens $tokens): void - { - $inAnnotationUntilIndex = null; - - foreach ($tokens as $index => $token) { - if (null !== $inAnnotationUntilIndex) { - if ($index === $inAnnotationUntilIndex) { - $inAnnotationUntilIndex = null; - - continue; - } - } elseif ($tokens[$index]->isType(DocLexer::T_AT)) { - $endIndex = $tokens->getAnnotationEnd($index); - if (null !== $endIndex) { - $inAnnotationUntilIndex = $endIndex + 1; - } - - continue; - } - - if (null === $inAnnotationUntilIndex) { - continue; - } - - if (!$token->isType([DocLexer::T_OPEN_PARENTHESIS, DocLexer::T_CLOSE_PARENTHESIS])) { - continue; - } - - if ($token->isType(DocLexer::T_OPEN_PARENTHESIS)) { - $token = $tokens[$index - 1]; - if ($token->isType(DocLexer::T_NONE)) { - $token->clear(); - } - - $token = $tokens[$index + 1]; - } else { - $token = $tokens[$index - 1]; - } - - if ($token->isType(DocLexer::T_NONE)) { - if (false !== strpos($token->getContent(), "\n")) { - continue; - } - - $token->clear(); - } - } - } - - private function fixSpacesAroundCommas(Tokens $tokens): void - { - $inAnnotationUntilIndex = null; - - foreach ($tokens as $index => $token) { - if (null !== $inAnnotationUntilIndex) { - if ($index === $inAnnotationUntilIndex) { - $inAnnotationUntilIndex = null; - - continue; - } - } elseif ($tokens[$index]->isType(DocLexer::T_AT)) { - $endIndex = $tokens->getAnnotationEnd($index); - if (null !== $endIndex) { - $inAnnotationUntilIndex = $endIndex; - } - - continue; - } - - if (null === $inAnnotationUntilIndex) { - continue; - } - - if (!$token->isType(DocLexer::T_COMMA)) { - continue; - } - - $token = $tokens[$index - 1]; - if ($token->isType(DocLexer::T_NONE)) { - $token->clear(); - } - - if ($index < \count($tokens) - 1 && !Preg::match('/^\s/', $tokens[$index + 1]->getContent())) { - $tokens->insertAt($index + 1, new Token(DocLexer::T_NONE, ' ')); - } - } - } - - private function fixAroundAssignments(Tokens $tokens): void - { - $beforeArguments = $this->configuration['before_argument_assignments']; - $afterArguments = $this->configuration['after_argument_assignments']; - $beforeArraysEquals = $this->configuration['before_array_assignments_equals']; - $afterArraysEquals = $this->configuration['after_array_assignments_equals']; - $beforeArraysColon = $this->configuration['before_array_assignments_colon']; - $afterArraysColon = $this->configuration['after_array_assignments_colon']; - - $scopes = []; - foreach ($tokens as $index => $token) { - $endScopeType = end($scopes); - if (false !== $endScopeType && $token->isType($endScopeType)) { - array_pop($scopes); - - continue; - } - - if ($tokens[$index]->isType(DocLexer::T_AT)) { - $scopes[] = DocLexer::T_CLOSE_PARENTHESIS; - - continue; - } - - if ($tokens[$index]->isType(DocLexer::T_OPEN_CURLY_BRACES)) { - $scopes[] = DocLexer::T_CLOSE_CURLY_BRACES; - - continue; - } - - if (DocLexer::T_CLOSE_PARENTHESIS === $endScopeType && $token->isType(DocLexer::T_EQUALS)) { - $this->updateSpacesAfter($tokens, $index, $afterArguments); - $this->updateSpacesBefore($tokens, $index, $beforeArguments); - - continue; - } - - if (DocLexer::T_CLOSE_CURLY_BRACES === $endScopeType) { - if ($token->isType(DocLexer::T_EQUALS)) { - $this->updateSpacesAfter($tokens, $index, $afterArraysEquals); - $this->updateSpacesBefore($tokens, $index, $beforeArraysEquals); - - continue; - } - - if ($token->isType(DocLexer::T_COLON)) { - $this->updateSpacesAfter($tokens, $index, $afterArraysColon); - $this->updateSpacesBefore($tokens, $index, $beforeArraysColon); - } - } - } - } - - private function updateSpacesAfter(Tokens $tokens, int $index, ?bool $insert): void - { - $this->updateSpacesAt($tokens, $index + 1, $index + 1, $insert); - } - - private function updateSpacesBefore(Tokens $tokens, int $index, ?bool $insert): void - { - $this->updateSpacesAt($tokens, $index - 1, $index, $insert); - } - - private function updateSpacesAt(Tokens $tokens, int $index, int $insertIndex, ?bool $insert): void - { - if (null === $insert) { - return; - } - - $token = $tokens[$index]; - if ($insert) { - if (!$token->isType(DocLexer::T_NONE)) { - $tokens->insertAt($insertIndex, $token = new Token()); - } - - $token->setContent(' '); - } elseif ($token->isType(DocLexer::T_NONE)) { - $token->clear(); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FixerInterface.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FixerInterface.php deleted file mode 100644 index 6e79741..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FixerInterface.php +++ /dev/null @@ -1,79 +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\Fixer; - -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dariusz Rumiński - * @author Fabien Potencier - */ -interface FixerInterface -{ - /** - * Check if the fixer is a candidate for given Tokens collection. - * - * Fixer is a candidate when the collection contains tokens that may be fixed - * during fixer work. This could be considered as some kind of bloom filter. - * When this method returns true then to the Tokens collection may or may not - * need a fixing, but when this method returns false then the Tokens collection - * need no fixing for sure. - */ - public function isCandidate(Tokens $tokens): bool; - - /** - * Check if fixer is risky or not. - * - * Risky fixer could change code behavior! - */ - public function isRisky(): bool; - - /** - * Fixes a file. - * - * @param \SplFileInfo $file A \SplFileInfo instance - * @param Tokens $tokens Tokens collection - */ - public function fix(\SplFileInfo $file, Tokens $tokens): void; - - /** - * Returns the definition of the fixer. - */ - public function getDefinition(): FixerDefinitionInterface; - - /** - * Returns the name of the fixer. - * - * The name must be all lowercase and without any spaces. - * - * @return string The name of the fixer - */ - public function getName(): string; - - /** - * Returns the priority of the fixer. - * - * The default priority is 0 and higher priorities are executed first. - */ - public function getPriority(): int; - - /** - * Returns true if the file is supported by this fixer. - * - * @return bool true if the file is supported by this fixer, false otherwise - */ - public function supports(\SplFileInfo $file): bool; -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/CombineNestedDirnameFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/CombineNestedDirnameFixer.php deleted file mode 100644 index 878d50a..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/CombineNestedDirnameFixer.php +++ /dev/null @@ -1,237 +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\Fixer\FunctionNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\FixerDefinition\VersionSpecification; -use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample; -use PhpCsFixer\Tokenizer\Analyzer\FunctionsAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Gregor Harlan - */ -final class CombineNestedDirnameFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - 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.', - [ - new VersionSpecificCodeSample( - "= 70000 && $tokens->isTokenKindFound(T_STRING); - } - - /** - * {@inheritdoc} - */ - public function isRisky(): bool - { - return true; - } - - /** - * {@inheritdoc} - * - * Must run before MethodArgumentSpaceFixer, NoSpacesInsideParenthesisFixer. - * Must run after DirConstantFixer. - */ - public function getPriority(): int - { - return 35; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - for ($index = $tokens->count() - 1; 0 <= $index; --$index) { - $dirnameInfo = $this->getDirnameInfo($tokens, $index); - - if (!$dirnameInfo) { - continue; - } - - $prev = $tokens->getPrevMeaningfulToken($dirnameInfo['indexes'][0]); - - if (!$tokens[$prev]->equals('(')) { - continue; - } - - $prev = $tokens->getPrevMeaningfulToken($prev); - - $firstArgumentEnd = $dirnameInfo['end']; - - $dirnameInfoArray = [$dirnameInfo]; - - while ($dirnameInfo = $this->getDirnameInfo($tokens, $prev, $firstArgumentEnd)) { - $dirnameInfoArray[] = $dirnameInfo; - - $prev = $tokens->getPrevMeaningfulToken($dirnameInfo['indexes'][0]); - - if (!$tokens[$prev]->equals('(')) { - break; - } - - $prev = $tokens->getPrevMeaningfulToken($prev); - $firstArgumentEnd = $dirnameInfo['end']; - } - - if (\count($dirnameInfoArray) > 1) { - $this->combineDirnames($tokens, $dirnameInfoArray); - } - - $index = $prev; - } - } - - /** - * @param int $index Index of `dirname` - * @param null|int $firstArgumentEndIndex Index of last token of first argument of `dirname` call - * - * @return array|bool `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) - { - if (!$tokens[$index]->equals([T_STRING, 'dirname'], false)) { - return false; - } - - if (!(new FunctionsAnalyzer())->isGlobalFunctionCall($tokens, $index)) { - return false; - } - - $info = ['indexes' => []]; - - $prev = $tokens->getPrevMeaningfulToken($index); - - if ($tokens[$prev]->isGivenKind(T_NS_SEPARATOR)) { - $info['indexes'][] = $prev; - } - - $info['indexes'][] = $index; - - // opening parenthesis "(" - $next = $tokens->getNextMeaningfulToken($index); - $info['indexes'][] = $next; - - if (null !== $firstArgumentEndIndex) { - $next = $tokens->getNextMeaningfulToken($firstArgumentEndIndex); - } else { - $next = $tokens->getNextMeaningfulToken($next); - - if ($tokens[$next]->equals(')')) { - return false; - } - - while (!$tokens[$next]->equalsAny([',', ')'])) { - $blockType = Tokens::detectBlockType($tokens[$next]); - - if ($blockType) { - $next = $tokens->findBlockEnd($blockType['type'], $next); - } - - $next = $tokens->getNextMeaningfulToken($next); - } - } - - $info['indexes'][] = $next; - - if ($tokens[$next]->equals(',')) { - $next = $tokens->getNextMeaningfulToken($next); - $info['indexes'][] = $next; - } - - if ($tokens[$next]->equals(')')) { - $info['levels'] = 1; - $info['end'] = $next; - - return $info; - } - - if (!$tokens[$next]->isGivenKind(T_LNUMBER)) { - return false; - } - - $info['secondArgument'] = $next; - $info['levels'] = (int) $tokens[$next]->getContent(); - - $next = $tokens->getNextMeaningfulToken($next); - - if ($tokens[$next]->equals(',')) { - $info['indexes'][] = $next; - $next = $tokens->getNextMeaningfulToken($next); - } - - if (!$tokens[$next]->equals(')')) { - return false; - } - - $info['indexes'][] = $next; - $info['end'] = $next; - - return $info; - } - - private function combineDirnames(Tokens $tokens, array $dirnameInfoArray): void - { - $outerDirnameInfo = array_pop($dirnameInfoArray); - $levels = $outerDirnameInfo['levels']; - - foreach ($dirnameInfoArray as $dirnameInfo) { - $levels += $dirnameInfo['levels']; - - foreach ($dirnameInfo['indexes'] as $index) { - $tokens->removeLeadingWhitespace($index); - $tokens->clearTokenAndMergeSurroundingWhitespace($index); - } - } - - $levelsToken = new Token([T_LNUMBER, (string) $levels]); - - if (isset($outerDirnameInfo['secondArgument'])) { - $tokens[$outerDirnameInfo['secondArgument']] = $levelsToken; - } else { - $prev = $tokens->getPrevMeaningfulToken($outerDirnameInfo['end']); - $items = []; - if (!$tokens[$prev]->equals(',')) { - $items = [new Token(','), new Token([T_WHITESPACE, ' '])]; - } - $items[] = $levelsToken; - $tokens->insertAt($outerDirnameInfo['end'], $items); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/FopenFlagOrderFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/FopenFlagOrderFixer.php deleted file mode 100644 index e873ec5..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/FopenFlagOrderFixer.php +++ /dev/null @@ -1,129 +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\Fixer\FunctionNotation; - -use PhpCsFixer\AbstractFopenFlagFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author SpacePossum - */ -final class FopenFlagOrderFixer extends AbstractFopenFlagFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Order the flags in `fopen` calls, `b` and `t` must be last.', - [new CodeSample("isGivenKind([T_WHITESPACE, T_COMMENT, T_DOC_COMMENT])) { - continue; - } - - if (null !== $argumentFlagIndex) { - return; // multiple meaningful tokens found, no candidate for fixing - } - - $argumentFlagIndex = $i; - } - - // check if second argument is candidate - if (null === $argumentFlagIndex || !$tokens[$argumentFlagIndex]->isGivenKind(T_CONSTANT_ENCAPSED_STRING)) { - return; - } - - $content = $tokens[$argumentFlagIndex]->getContent(); - $contentQuote = $content[0]; // `'`, `"`, `b` or `B` - - if ('b' === $contentQuote || 'B' === $contentQuote) { - $binPrefix = $contentQuote; - $contentQuote = $content[1]; // `'` or `"` - $mode = substr($content, 2, -1); - } else { - $binPrefix = ''; - $mode = substr($content, 1, -1); - } - - $modeLength = \strlen($mode); - if ($modeLength < 2) { - return; // nothing to sort - } - - if (false === $this->isValidModeString($mode)) { - return; - } - - $split = $this->sortFlags(Preg::split('#([^\+]\+?)#', $mode, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE)); - $newContent = $binPrefix.$contentQuote.implode('', $split).$contentQuote; - - if ($content !== $newContent) { - $tokens[$argumentFlagIndex] = new Token([T_CONSTANT_ENCAPSED_STRING, $newContent]); - } - } - - /** - * @param string[] $flags - * - * @return string[] - */ - private function sortFlags(array $flags): array - { - usort( - $flags, - static function (string $flag1, string $flag2) { - if ($flag1 === $flag2) { - return 0; - } - - if ('b' === $flag1) { - return 1; - } - - if ('b' === $flag2) { - return -1; - } - - if ('t' === $flag1) { - return 1; - } - - if ('t' === $flag2) { - return -1; - } - - return $flag1 < $flag2 ? -1 : 1; - } - ); - - return $flags; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/FopenFlagsFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/FopenFlagsFixer.php deleted file mode 100644 index faf5f51..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/FopenFlagsFixer.php +++ /dev/null @@ -1,114 +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\Fixer\FunctionNotation; - -use PhpCsFixer\AbstractFopenFlagFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author SpacePossum - */ -final class FopenFlagsFixer extends AbstractFopenFlagFixer implements ConfigurableFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'The flags in `fopen` calls must omit `t`, and `b` must be omitted or included consistently.', - [ - new CodeSample(" false]), - ], - null, - 'Risky when the function `fopen` is overridden.' - ); - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('b_mode', 'The `b` flag must be used (`true`) or omitted (`false`).')) - ->setAllowedTypes(['bool']) - ->setDefault(true) - ->getOption(), - ]); - } - - protected function fixFopenFlagToken(Tokens $tokens, int $argumentStartIndex, int $argumentEndIndex): void - { - $argumentFlagIndex = null; - - for ($i = $argumentStartIndex; $i <= $argumentEndIndex; ++$i) { - if ($tokens[$i]->isGivenKind([T_WHITESPACE, T_COMMENT, T_DOC_COMMENT])) { - continue; - } - - if (null !== $argumentFlagIndex) { - return; // multiple meaningful tokens found, no candidate for fixing - } - - $argumentFlagIndex = $i; - } - - // check if second argument is candidate - if (null === $argumentFlagIndex || !$tokens[$argumentFlagIndex]->isGivenKind(T_CONSTANT_ENCAPSED_STRING)) { - return; - } - - $content = $tokens[$argumentFlagIndex]->getContent(); - $contentQuote = $content[0]; // `'`, `"`, `b` or `B` - - if ('b' === $contentQuote || 'B' === $contentQuote) { - $binPrefix = $contentQuote; - $contentQuote = $content[1]; // `'` or `"` - $mode = substr($content, 2, -1); - } else { - $binPrefix = ''; - $mode = substr($content, 1, -1); - } - - if (false === $this->isValidModeString($mode)) { - return; - } - - $mode = str_replace('t', '', $mode); - if ($this->configuration['b_mode']) { - if (false === strpos($mode, 'b')) { - $mode .= 'b'; - } - } else { - $mode = str_replace('b', '', $mode); - } - - $newContent = $binPrefix.$contentQuote.$mode.$contentQuote; - - if ($content !== $newContent) { - $tokens[$argumentFlagIndex] = new Token([T_CONSTANT_ENCAPSED_STRING, $newContent]); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/FunctionDeclarationFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/FunctionDeclarationFixer.php deleted file mode 100644 index 47e591b..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/FunctionDeclarationFixer.php +++ /dev/null @@ -1,235 +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\Fixer\FunctionNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * Fixer for rules defined in PSR2 generally (¶1 and ¶6). - * - * @author Dariusz Rumiński - */ -final class FunctionDeclarationFixer extends AbstractFixer implements ConfigurableFixerInterface -{ - /** - * @internal - */ - public const SPACING_NONE = 'none'; - - /** - * @internal - */ - public const SPACING_ONE = 'one'; - - private const SUPPORTED_SPACINGS = [self::SPACING_NONE, self::SPACING_ONE]; - - /** - * @var string - */ - private $singleLineWhitespaceOptions = " \t"; - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - if (\PHP_VERSION_ID >= 70400 && $tokens->isTokenKindFound(T_FN)) { - return true; - } - - return $tokens->isTokenKindFound(T_FUNCTION); - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Spaces should be properly placed in a function declaration.', - [ - new CodeSample( - ' self::SPACING_NONE] - ), - new VersionSpecificCodeSample( - ' null; -', - new VersionSpecification(70400), - ['closure_function_spacing' => self::SPACING_NONE] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run before MethodArgumentSpaceFixer. - * Must run after SingleSpaceAfterConstructFixer. - */ - public function getPriority(): int - { - return 31; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $tokensAnalyzer = new TokensAnalyzer($tokens); - - for ($index = $tokens->count() - 1; $index >= 0; --$index) { - $token = $tokens[$index]; - - if ( - !$token->isGivenKind(T_FUNCTION) - && (\PHP_VERSION_ID < 70400 || !$token->isGivenKind(T_FN)) - ) { - continue; - } - - $startParenthesisIndex = $tokens->getNextTokenOfKind($index, ['(', ';', [T_CLOSE_TAG]]); - if (!$tokens[$startParenthesisIndex]->equals('(')) { - continue; - } - - $endParenthesisIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $startParenthesisIndex); - $startBraceIndex = $tokens->getNextTokenOfKind($endParenthesisIndex, [';', '{', [T_DOUBLE_ARROW]]); - - // fix single-line whitespace before { or => - // eg: `function foo(){}` => `function foo() {}` - // eg: `function foo() {}` => `function foo() {}` - // eg: `fn() =>` => `fn() =>` - if ( - $tokens[$startBraceIndex]->equalsAny(['{', [T_DOUBLE_ARROW]]) - && ( - !$tokens[$startBraceIndex - 1]->isWhitespace() - || $tokens[$startBraceIndex - 1]->isWhitespace($this->singleLineWhitespaceOptions) - ) - ) { - $tokens->ensureWhitespaceAtIndex($startBraceIndex - 1, 1, ' '); - } - - $afterParenthesisIndex = $tokens->getNextNonWhitespace($endParenthesisIndex); - $afterParenthesisToken = $tokens[$afterParenthesisIndex]; - - if ($afterParenthesisToken->isGivenKind(CT::T_USE_LAMBDA)) { - // fix whitespace after CT:T_USE_LAMBDA (we might add a token, so do this before determining start and end parenthesis) - $tokens->ensureWhitespaceAtIndex($afterParenthesisIndex + 1, 0, ' '); - - $useStartParenthesisIndex = $tokens->getNextTokenOfKind($afterParenthesisIndex, ['(']); - $useEndParenthesisIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $useStartParenthesisIndex); - - // remove single-line edge whitespaces inside use parentheses - $this->fixParenthesisInnerEdge($tokens, $useStartParenthesisIndex, $useEndParenthesisIndex); - - // fix whitespace before CT::T_USE_LAMBDA - $tokens->ensureWhitespaceAtIndex($afterParenthesisIndex - 1, 1, ' '); - } - - // remove single-line edge whitespaces inside parameters list parentheses - $this->fixParenthesisInnerEdge($tokens, $startParenthesisIndex, $endParenthesisIndex); - - $isLambda = $tokensAnalyzer->isLambda($index); - - // remove whitespace before ( - // eg: `function foo () {}` => `function foo() {}` - if (!$isLambda && $tokens[$startParenthesisIndex - 1]->isWhitespace() && !$tokens[$tokens->getPrevNonWhitespace($startParenthesisIndex - 1)]->isComment()) { - $tokens->clearAt($startParenthesisIndex - 1); - } - - if ($isLambda && self::SPACING_NONE === $this->configuration['closure_function_spacing']) { - // optionally remove whitespace after T_FUNCTION of a closure - // eg: `function () {}` => `function() {}` - if ($tokens[$index + 1]->isWhitespace()) { - $tokens->clearAt($index + 1); - } - } else { - // otherwise, enforce whitespace after T_FUNCTION - // eg: `function foo() {}` => `function foo() {}` - $tokens->ensureWhitespaceAtIndex($index + 1, 0, ' '); - } - - if ($isLambda) { - $prev = $tokens->getPrevMeaningfulToken($index); - if ($tokens[$prev]->isGivenKind(T_STATIC)) { - // fix whitespace after T_STATIC - // eg: `$a = static function(){};` => `$a = static function(){};` - $tokens->ensureWhitespaceAtIndex($prev + 1, 0, ' '); - } - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('closure_function_spacing', 'Spacing to use before open parenthesis for closures.')) - ->setDefault(self::SPACING_ONE) - ->setAllowedValues(self::SUPPORTED_SPACINGS) - ->getOption(), - ]); - } - - private function fixParenthesisInnerEdge(Tokens $tokens, int $start, int $end): void - { - // remove single-line whitespace before ) - if ($tokens[$end - 1]->isWhitespace($this->singleLineWhitespaceOptions)) { - $tokens->clearAt($end - 1); - } - - // remove single-line whitespace after ( - if ($tokens[$start + 1]->isWhitespace($this->singleLineWhitespaceOptions)) { - $tokens->clearAt($start + 1); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/FunctionTypehintSpaceFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/FunctionTypehintSpaceFixer.php deleted file mode 100644 index 53a03eb..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/FunctionTypehintSpaceFixer.php +++ /dev/null @@ -1,86 +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\Fixer\FunctionNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Analyzer\Analysis\TypeAnalysis; -use PhpCsFixer\Tokenizer\Analyzer\FunctionsAnalyzer; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dariusz Rumiński - */ -final class FunctionTypehintSpaceFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Ensure single space between function\'s argument and its typehint.', - [ - new CodeSample("= 70400 && $tokens->isTokenKindFound(T_FN)) { - return true; - } - - return $tokens->isTokenKindFound(T_FUNCTION); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $functionsAnalyzer = new FunctionsAnalyzer(); - - for ($index = $tokens->count() - 1; $index >= 0; --$index) { - $token = $tokens[$index]; - - if ( - !$token->isGivenKind(T_FUNCTION) - && (\PHP_VERSION_ID < 70400 || !$token->isGivenKind(T_FN)) - ) { - continue; - } - - $arguments = $functionsAnalyzer->getFunctionArguments($tokens, $index); - - foreach (array_reverse($arguments) as $argument) { - $type = $argument->getTypeAnalysis(); - - if (!$type instanceof TypeAnalysis) { - continue; - } - - $tokens->ensureWhitespaceAtIndex($type->getEndIndex() + 1, 0, ' '); - } - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/ImplodeCallFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/ImplodeCallFixer.php deleted file mode 100644 index 166482d..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/ImplodeCallFixer.php +++ /dev/null @@ -1,151 +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\Fixer\FunctionNotation; - -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\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Kuba Werłos - */ -final class ImplodeCallFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Function `implode` must be called with 2 arguments in the documented order.', - [ - new CodeSample("isTokenKindFound(T_STRING); - } - - /** - * {@inheritdoc} - * - * Must run before MethodArgumentSpaceFixer. - * Must run after NoAliasFunctionsFixer. - */ - public function getPriority(): int - { - return 37; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $functionsAnalyzer = new FunctionsAnalyzer(); - - for ($index = \count($tokens) - 1; $index > 0; --$index) { - if (!$tokens[$index]->equals([T_STRING, 'implode'], false)) { - continue; - } - - if (!$functionsAnalyzer->isGlobalFunctionCall($tokens, $index)) { - continue; - } - - $argumentsIndices = $this->getArgumentIndices($tokens, $index); - - if (1 === \count($argumentsIndices)) { - $firstArgumentIndex = key($argumentsIndices); - $tokens->insertAt($firstArgumentIndex, [ - new Token([T_CONSTANT_ENCAPSED_STRING, "''"]), - new Token(','), - new Token([T_WHITESPACE, ' ']), - ]); - - continue; - } - - if (2 === \count($argumentsIndices)) { - [$firstArgumentIndex, $secondArgumentIndex] = array_keys($argumentsIndices); - - // If the first argument is string we have nothing to do - if ($tokens[$firstArgumentIndex]->isGivenKind(T_CONSTANT_ENCAPSED_STRING)) { - continue; - } - // If the second argument is not string we cannot make a swap - if (!$tokens[$secondArgumentIndex]->isGivenKind(T_CONSTANT_ENCAPSED_STRING)) { - continue; - } - - // collect tokens from first argument - $firstArgumentEndIndex = $argumentsIndices[key($argumentsIndices)]; - $newSecondArgumentTokens = []; - for ($i = key($argumentsIndices); $i <= $firstArgumentEndIndex; ++$i) { - $newSecondArgumentTokens[] = clone $tokens[$i]; - $tokens->clearAt($i); - } - - $tokens->insertAt($firstArgumentIndex, clone $tokens[$secondArgumentIndex]); - - // insert above increased the second argument index - ++$secondArgumentIndex; - $tokens->clearAt($secondArgumentIndex); - $tokens->insertAt($secondArgumentIndex, $newSecondArgumentTokens); - } - } - } - - /** - * @return array In the format: startIndex => endIndex - */ - private function getArgumentIndices(Tokens $tokens, int $functionNameIndex): array - { - $argumentsAnalyzer = new ArgumentsAnalyzer(); - - $openParenthesis = $tokens->getNextTokenOfKind($functionNameIndex, ['(']); - $closeParenthesis = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $openParenthesis); - - $indices = []; - - foreach ($argumentsAnalyzer->getArguments($tokens, $openParenthesis, $closeParenthesis) as $startIndexCandidate => $endIndex) { - $indices[$tokens->getNextMeaningfulToken($startIndexCandidate - 1)] = $tokens->getPrevMeaningfulToken($endIndex + 1); - } - - return $indices; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/LambdaNotUsedImportFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/LambdaNotUsedImportFixer.php deleted file mode 100644 index 926ea5b..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/LambdaNotUsedImportFixer.php +++ /dev/null @@ -1,349 +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\Fixer\FunctionNotation; - -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\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * @author SpacePossum - */ -final class LambdaNotUsedImportFixer extends AbstractFixer -{ - /** - * @var ArgumentsAnalyzer - */ - private $argumentsAnalyzer; - - /** - * @var FunctionsAnalyzer - */ - private $functionAnalyzer; - - /** - * @var TokensAnalyzer - */ - private $tokensAnalyzer; - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Lambda must not import variables it doesn\'t use.', - [new CodeSample("isAllTokenKindsFound([T_FUNCTION, CT::T_USE_LAMBDA]); - } - - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $this->argumentsAnalyzer = new ArgumentsAnalyzer(); - $this->functionAnalyzer = new FunctionsAnalyzer(); - $this->tokensAnalyzer = new TokensAnalyzer($tokens); - - for ($index = $tokens->count() - 4; $index > 0; --$index) { - $lambdaUseIndex = $this->getLambdaUseIndex($tokens, $index); - - if (false !== $lambdaUseIndex) { - $this->fixLambda($tokens, $lambdaUseIndex); - } - } - } - - private function fixLambda(Tokens $tokens, int $lambdaUseIndex): void - { - $lambdaUseOpenBraceIndex = $tokens->getNextTokenOfKind($lambdaUseIndex, ['(']); - $lambdaUseCloseBraceIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $lambdaUseOpenBraceIndex); - $arguments = $this->argumentsAnalyzer->getArguments($tokens, $lambdaUseOpenBraceIndex, $lambdaUseCloseBraceIndex); - - $imports = $this->filterArguments($tokens, $arguments); - - if (0 === \count($imports)) { - return; // no imports to remove - } - - $notUsedImports = $this->findNotUsedLambdaImports($tokens, $imports, $lambdaUseCloseBraceIndex); - $notUsedImportsCount = \count($notUsedImports); - - if (0 === $notUsedImportsCount) { - return; // no not used imports found - } - - if ($notUsedImportsCount === \count($arguments)) { - $this->clearImportsAndUse($tokens, $lambdaUseIndex, $lambdaUseCloseBraceIndex); // all imports are not used - - return; - } - - $this->clearImports($tokens, array_reverse($notUsedImports)); - } - - private function findNotUsedLambdaImports(Tokens $tokens, array $imports, int $lambdaUseCloseBraceIndex): array - { - static $riskyKinds = [ - CT::T_DYNAMIC_VAR_BRACE_OPEN, - T_EVAL, - T_INCLUDE, - T_INCLUDE_ONCE, - T_REQUIRE, - T_REQUIRE_ONCE, - ]; - - // figure out where the lambda starts ... - $lambdaOpenIndex = $tokens->getNextTokenOfKind($lambdaUseCloseBraceIndex, ['{']); - $curlyBracesLevel = 0; - - for ($index = $lambdaOpenIndex;; ++$index) { // go through the body of the lambda and keep count of the (possible) usages of the imported variables - $token = $tokens[$index]; - - if ($token->equals('{')) { - ++$curlyBracesLevel; - - continue; - } - - if ($token->equals('}')) { - --$curlyBracesLevel; - - if (0 === $curlyBracesLevel) { - break; - } - - continue; - } - - if ($token->isGivenKind(T_STRING) && 'compact' === strtolower($token->getContent()) && $this->functionAnalyzer->isGlobalFunctionCall($tokens, $index)) { - return []; // wouldn't touch it with a ten-foot pole - } - - if ($token->isGivenKind($riskyKinds)) { - return []; - } - - if ($token->equals('$')) { - $nextIndex = $tokens->getNextMeaningfulToken($index); - - if ($tokens[$nextIndex]->isGivenKind(T_VARIABLE)) { - return []; // "$$a" case - } - } - - if ($token->isGivenKind(T_VARIABLE)) { - $content = $token->getContent(); - - if (isset($imports[$content])) { - unset($imports[$content]); - - if (0 === \count($imports)) { - return $imports; - } - } - } - - if ($token->isGivenKind(T_STRING_VARNAME)) { - $content = '$'.$token->getContent(); - - if (isset($imports[$content])) { - unset($imports[$content]); - - if (0 === \count($imports)) { - return $imports; - } - } - } - - if ($token->isClassy()) { // is anonymous class - // check if used as argument in the constructor of the anonymous class - $index = $tokens->getNextTokenOfKind($index, ['(', '{']); - - if ($tokens[$index]->equals('(')) { - $closeBraceIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $index); - $arguments = $this->argumentsAnalyzer->getArguments($tokens, $index, $closeBraceIndex); - - $imports = $this->countImportsUsedAsArgument($tokens, $imports, $arguments); - - $index = $tokens->getNextTokenOfKind($closeBraceIndex, ['{']); - } - - // skip body - $index = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $index); - - continue; - } - - if ($token->isGivenKind(T_FUNCTION)) { - // check if used as argument - $lambdaUseOpenBraceIndex = $tokens->getNextTokenOfKind($index, ['(']); - $lambdaUseCloseBraceIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $lambdaUseOpenBraceIndex); - $arguments = $this->argumentsAnalyzer->getArguments($tokens, $lambdaUseOpenBraceIndex, $lambdaUseCloseBraceIndex); - - $imports = $this->countImportsUsedAsArgument($tokens, $imports, $arguments); - - // check if used as import - $index = $tokens->getNextTokenOfKind($index, [[CT::T_USE_LAMBDA], '{']); - - if ($tokens[$index]->isGivenKind(CT::T_USE_LAMBDA)) { - $lambdaUseOpenBraceIndex = $tokens->getNextTokenOfKind($index, ['(']); - $lambdaUseCloseBraceIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $lambdaUseOpenBraceIndex); - $arguments = $this->argumentsAnalyzer->getArguments($tokens, $lambdaUseOpenBraceIndex, $lambdaUseCloseBraceIndex); - - $imports = $this->countImportsUsedAsArgument($tokens, $imports, $arguments); - - $index = $tokens->getNextTokenOfKind($lambdaUseCloseBraceIndex, ['{']); - } - - // skip body - $index = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $index); - - continue; - } - } - - return $imports; - } - - private function countImportsUsedAsArgument(Tokens $tokens, array $imports, array $arguments): array - { - foreach ($arguments as $start => $end) { - $info = $this->argumentsAnalyzer->getArgumentInfo($tokens, $start, $end); - $content = $info->getName(); - - if (isset($imports[$content])) { - unset($imports[$content]); - - if (0 === \count($imports)) { - return $imports; - } - } - } - - return $imports; - } - - /** - * @return false|int - */ - private function getLambdaUseIndex(Tokens $tokens, int $index) - { - if (!$tokens[$index]->isGivenKind(T_FUNCTION) || !$this->tokensAnalyzer->isLambda($index)) { - return false; - } - - $lambdaUseIndex = $tokens->getNextMeaningfulToken($index); // we are @ '(' or '&' after this - - if ($tokens[$lambdaUseIndex]->isGivenKind(CT::T_RETURN_REF)) { - $lambdaUseIndex = $tokens->getNextMeaningfulToken($lambdaUseIndex); - } - - $lambdaUseIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $lambdaUseIndex); // we are @ ')' after this - $lambdaUseIndex = $tokens->getNextMeaningfulToken($lambdaUseIndex); - - if (!$tokens[$lambdaUseIndex]->isGivenKind(CT::T_USE_LAMBDA)) { - return false; - } - - return $lambdaUseIndex; - } - - private function filterArguments(Tokens $tokens, array $arguments): array - { - $imports = []; - - foreach ($arguments as $start => $end) { - $info = $this->argumentsAnalyzer->getArgumentInfo($tokens, $start, $end); - $argument = $info->getNameIndex(); - - if ($tokens[$tokens->getPrevMeaningfulToken($argument)]->equals('&')) { - continue; - } - - $argumentCandidate = $tokens[$argument]; - - if ('$this' === $argumentCandidate->getContent()) { - continue; - } - - if ($this->tokensAnalyzer->isSuperGlobal($argument)) { - continue; - } - - $imports[$argumentCandidate->getContent()] = $argument; - } - - return $imports; - } - - private function clearImports(Tokens $tokens, array $imports): void - { - foreach ($imports as $content => $removeIndex) { - $tokens->clearTokenAndMergeSurroundingWhitespace($removeIndex); - $previousRemoveIndex = $tokens->getPrevMeaningfulToken($removeIndex); - - if ($tokens[$previousRemoveIndex]->equals(',')) { - $tokens->clearTokenAndMergeSurroundingWhitespace($previousRemoveIndex); - } elseif ($tokens[$previousRemoveIndex]->equals('(')) { - $tokens->clearTokenAndMergeSurroundingWhitespace($tokens->getNextMeaningfulToken($removeIndex)); // next is always ',' here - } - } - } - - /** - * Remove `use` and all imported variables. - */ - private function clearImportsAndUse(Tokens $tokens, int $lambdaUseIndex, int $lambdaUseCloseBraceIndex): void - { - for ($i = $lambdaUseCloseBraceIndex; $i >= $lambdaUseIndex; --$i) { - if ($tokens[$i]->isComment()) { - continue; - } - - if ($tokens[$i]->isWhitespace()) { - $previousIndex = $tokens->getPrevNonWhitespace($i); - - if ($tokens[$previousIndex]->isComment()) { - continue; - } - } - - $tokens->clearTokenAndMergeSurroundingWhitespace($i); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/MethodArgumentSpaceFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/MethodArgumentSpaceFixer.php deleted file mode 100644 index a38de80..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/MethodArgumentSpaceFixer.php +++ /dev/null @@ -1,481 +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\Fixer\FunctionNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -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; -use PhpCsFixer\FixerDefinition\VersionSpecification; -use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use Symfony\Component\OptionsResolver\Options; - -/** - * Fixer for rules defined in PSR2 ¶4.4, ¶4.6. - * - * @author Kuanhung Chen - */ -final class MethodArgumentSpaceFixer extends AbstractFixer implements ConfigurableFixerInterface, WhitespacesAwareFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'In method arguments and method call, there MUST NOT be a space before each comma and there MUST be one space after each comma. Argument lists MAY be split across multiple lines, where each subsequent line is indented once. When doing so, the first item in the list MUST be on the next line, and there MUST be only one argument per line.', - [ - new CodeSample( - " false] - ), - new CodeSample( - " true] - ), - new CodeSample( - " 'ensure_fully_multiline'] - ), - new CodeSample( - " 'ensure_single_line'] - ), - new CodeSample( - " 'ensure_fully_multiline', - 'keep_multiple_spaces_after_comma' => true, - ] - ), - new CodeSample( - " 'ensure_fully_multiline', - 'keep_multiple_spaces_after_comma' => false, - ] - ), - new VersionSpecificCodeSample( - <<<'SAMPLE' - true] - ), - ] - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isTokenKindFound('('); - } - - public function configure(array $configuration): void - { - parent::configure($configuration); - - if (isset($configuration['ensure_fully_multiline'])) { - $this->configuration['on_multiline'] = $this->configuration['ensure_fully_multiline'] - ? 'ensure_fully_multiline' - : 'ignore'; - } - } - - /** - * {@inheritdoc} - * - * Must run before ArrayIndentationFixer. - * Must run after BracesFixer, CombineNestedDirnameFixer, FunctionDeclarationFixer, ImplodeCallFixer, MethodChainingIndentationFixer, NoUselessSprintfFixer, PowToExponentiationFixer. - */ - public function getPriority(): int - { - return 30; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $expectedTokens = [T_LIST, T_FUNCTION, CT::T_USE_LAMBDA]; - if (\PHP_VERSION_ID >= 70400) { - $expectedTokens[] = T_FN; - } - - for ($index = $tokens->count() - 1; $index > 0; --$index) { - $token = $tokens[$index]; - - if (!$token->equals('(')) { - continue; - } - - $meaningfulTokenBeforeParenthesis = $tokens[$tokens->getPrevMeaningfulToken($index)]; - if ( - $meaningfulTokenBeforeParenthesis->isKeyword() - && !$meaningfulTokenBeforeParenthesis->isGivenKind($expectedTokens) - ) { - continue; - } - - $isMultiline = $this->fixFunction($tokens, $index); - - if ( - $isMultiline - && 'ensure_fully_multiline' === $this->configuration['on_multiline'] - && !$meaningfulTokenBeforeParenthesis->isGivenKind(T_LIST) - ) { - $this->ensureFunctionFullyMultiline($tokens, $index); - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('keep_multiple_spaces_after_comma', 'Whether keep multiple spaces after comma.')) - ->setAllowedTypes(['bool']) - ->setDefault(false) - ->getOption(), - (new FixerOptionBuilder( - 'on_multiline', - 'Defines how to handle function arguments lists that contain newlines.' - )) - ->setAllowedValues(['ignore', 'ensure_single_line', 'ensure_fully_multiline']) - ->setDefault('ensure_fully_multiline') - ->getOption(), - (new FixerOptionBuilder('after_heredoc', 'Whether the whitespace between heredoc end and comma should be removed.')) - ->setAllowedTypes(['bool']) - ->setDefault(false) - ->setNormalizer(static function (Options $options, $value) { - if (\PHP_VERSION_ID < 70300 && $value) { - throw new InvalidOptionsForEnvException('"after_heredoc" option can only be enabled with PHP 7.3+.'); - } - - return $value; - }) - ->getOption(), - ]); - } - - /** - * Fix arguments spacing for given function. - * - * @param Tokens $tokens Tokens to handle - * @param int $startFunctionIndex Start parenthesis position - * - * @return bool whether the function is multiline - */ - private function fixFunction(Tokens $tokens, int $startFunctionIndex): bool - { - $endFunctionIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $startFunctionIndex); - - $isMultiline = false; - - $firstWhitespaceIndex = $this->findWhitespaceIndexAfterParenthesis($tokens, $startFunctionIndex, $endFunctionIndex); - $lastWhitespaceIndex = $this->findWhitespaceIndexAfterParenthesis($tokens, $endFunctionIndex, $startFunctionIndex); - - foreach ([$firstWhitespaceIndex, $lastWhitespaceIndex] as $index) { - if (null === $index || !Preg::match('/\R/', $tokens[$index]->getContent())) { - continue; - } - - if ('ensure_single_line' !== $this->configuration['on_multiline']) { - $isMultiline = true; - - continue; - } - - $newLinesRemoved = $this->ensureSingleLine($tokens, $index); - if (!$newLinesRemoved) { - $isMultiline = true; - } - } - - for ($index = $endFunctionIndex - 1; $index > $startFunctionIndex; --$index) { - $token = $tokens[$index]; - - if ($token->equals(')')) { - $index = $tokens->findBlockStart(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $index); - - continue; - } - - if ($token->isGivenKind(CT::T_ARRAY_SQUARE_BRACE_CLOSE)) { - $index = $tokens->findBlockStart(Tokens::BLOCK_TYPE_ARRAY_SQUARE_BRACE, $index); - - continue; - } - - if ($token->equals('}')) { - $index = $tokens->findBlockStart(Tokens::BLOCK_TYPE_CURLY_BRACE, $index); - - continue; - } - - if ($token->equals(',')) { - $this->fixSpace($tokens, $index); - if (!$isMultiline && $this->isNewline($tokens[$index + 1])) { - $isMultiline = true; - - break; - } - } - } - - return $isMultiline; - } - - private function findWhitespaceIndexAfterParenthesis(Tokens $tokens, int $startParenthesisIndex, int $endParenthesisIndex): ?int - { - $direction = $endParenthesisIndex > $startParenthesisIndex ? 1 : -1; - $startIndex = $startParenthesisIndex + $direction; - $endIndex = $endParenthesisIndex - $direction; - - for ($index = $startIndex; $index !== $endIndex; $index += $direction) { - $token = $tokens[$index]; - - if ($token->isWhitespace()) { - return $index; - } - - if (!$token->isComment()) { - break; - } - } - - return null; - } - - /** - * @return bool Whether newlines were removed from the whitespace token - */ - private function ensureSingleLine(Tokens $tokens, int $index): bool - { - $previousToken = $tokens[$index - 1]; - if ($previousToken->isComment() && 0 !== strpos($previousToken->getContent(), '/*')) { - return false; - } - - $content = Preg::replace('/\R\h*/', '', $tokens[$index]->getContent()); - if ('' !== $content) { - $tokens[$index] = new Token([T_WHITESPACE, $content]); - } else { - $tokens->clearAt($index); - } - - return true; - } - - private function ensureFunctionFullyMultiline(Tokens $tokens, int $startFunctionIndex): void - { - // find out what the indentation is - $searchIndex = $startFunctionIndex; - do { - $prevWhitespaceTokenIndex = $tokens->getPrevTokenOfKind( - $searchIndex, - [[T_WHITESPACE]] - ); - $searchIndex = $prevWhitespaceTokenIndex; - } while (null !== $prevWhitespaceTokenIndex - && false === strpos($tokens[$prevWhitespaceTokenIndex]->getContent(), "\n") - ); - - if (null === $prevWhitespaceTokenIndex) { - $existingIndentation = ''; - } else { - $existingIndentation = $tokens[$prevWhitespaceTokenIndex]->getContent(); - $lastLineIndex = strrpos($existingIndentation, "\n"); - $existingIndentation = false === $lastLineIndex - ? $existingIndentation - : substr($existingIndentation, $lastLineIndex + 1) - ; - } - - $indentation = $existingIndentation.$this->whitespacesConfig->getIndent(); - $endFunctionIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $startFunctionIndex); - - $wasWhitespaceBeforeEndFunctionAddedAsNewToken = $tokens->ensureWhitespaceAtIndex( - $tokens[$endFunctionIndex - 1]->isWhitespace() ? $endFunctionIndex - 1 : $endFunctionIndex, - 0, - $this->whitespacesConfig->getLineEnding().$existingIndentation - ); - - if ($wasWhitespaceBeforeEndFunctionAddedAsNewToken) { - ++$endFunctionIndex; - } - - for ($index = $endFunctionIndex - 1; $index > $startFunctionIndex; --$index) { - $token = $tokens[$index]; - - // skip nested method calls and arrays - if ($token->equals(')')) { - $index = $tokens->findBlockStart(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $index); - - continue; - } - - // skip nested arrays - if ($token->isGivenKind(CT::T_ARRAY_SQUARE_BRACE_CLOSE)) { - $index = $tokens->findBlockStart(Tokens::BLOCK_TYPE_ARRAY_SQUARE_BRACE, $index); - - continue; - } - - if ($token->equals('}')) { - $index = $tokens->findBlockStart(Tokens::BLOCK_TYPE_CURLY_BRACE, $index); - - continue; - } - - if ($token->equals(',') && !$tokens[$tokens->getNextMeaningfulToken($index)]->equals(')')) { - $this->fixNewline($tokens, $index, $indentation); - } - } - - $this->fixNewline($tokens, $startFunctionIndex, $indentation, false); - } - - /** - * Method to insert newline after comma or opening parenthesis. - * - * @param int $index index of a comma - * @param string $indentation the indentation that should be used - * @param bool $override whether to override the existing character or not - */ - private function fixNewline(Tokens $tokens, int $index, string $indentation, bool $override = true): void - { - if ($tokens[$index + 1]->isComment()) { - return; - } - - if ($tokens[$index + 2]->isComment()) { - $nextMeaningfulTokenIndex = $tokens->getNextMeaningfulToken($index + 2); - if (!$this->isNewline($tokens[$nextMeaningfulTokenIndex - 1])) { - $tokens->ensureWhitespaceAtIndex($nextMeaningfulTokenIndex, 0, $this->whitespacesConfig->getLineEnding().$indentation); - } - - return; - } - - $nextMeaningfulTokenIndex = $tokens->getNextMeaningfulToken($index); - if ($tokens[$nextMeaningfulTokenIndex]->equals(')')) { - return; - } - - $tokens->ensureWhitespaceAtIndex($index + 1, 0, $this->whitespacesConfig->getLineEnding().$indentation); - } - - /** - * Method to insert space after comma and remove space before comma. - */ - private function fixSpace(Tokens $tokens, int $index): void - { - // remove space before comma if exist - if ($tokens[$index - 1]->isWhitespace()) { - $prevIndex = $tokens->getPrevNonWhitespace($index - 1); - - if ( - !$tokens[$prevIndex]->equals(',') && !$tokens[$prevIndex]->isComment() - && ($this->configuration['after_heredoc'] || !$tokens[$prevIndex]->isGivenKind(T_END_HEREDOC)) - ) { - $tokens->clearAt($index - 1); - } - } - - $nextIndex = $index + 1; - $nextToken = $tokens[$nextIndex]; - - // Two cases for fix space after comma (exclude multiline comments) - // 1) multiple spaces after comma - // 2) no space after comma - if ($nextToken->isWhitespace()) { - $newContent = $nextToken->getContent(); - - if ('ensure_single_line' === $this->configuration['on_multiline']) { - $newContent = Preg::replace('/\R/', '', $newContent); - } - - if ( - (!$this->configuration['keep_multiple_spaces_after_comma'] || Preg::match('/\R/', $newContent)) - && !$this->isCommentLastLineToken($tokens, $index + 2) - ) { - $newContent = ltrim($newContent, " \t"); - } - - $tokens[$nextIndex] = new Token([T_WHITESPACE, '' === $newContent ? ' ' : $newContent]); - - return; - } - - if (!$this->isCommentLastLineToken($tokens, $index + 1)) { - $tokens->insertAt($index + 1, new Token([T_WHITESPACE, ' '])); - } - } - - /** - * Check if last item of current line is a comment. - * - * @param Tokens $tokens tokens to handle - * @param int $index index of token - */ - private function isCommentLastLineToken(Tokens $tokens, int $index): bool - { - if (!$tokens[$index]->isComment() || !$tokens[$index + 1]->isWhitespace()) { - return false; - } - - $content = $tokens[$index + 1]->getContent(); - - return $content !== ltrim($content, "\r\n"); - } - - /** - * Checks if token is new line. - */ - private function isNewline(Token $token): bool - { - return $token->isWhitespace() && false !== strpos($token->getContent(), "\n"); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/NativeFunctionInvocationFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/NativeFunctionInvocationFixer.php deleted file mode 100644 index 7da5ab1..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/NativeFunctionInvocationFixer.php +++ /dev/null @@ -1,418 +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\Fixer\FunctionNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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\NamespaceAnalysis; -use PhpCsFixer\Tokenizer\Analyzer\FunctionsAnalyzer; -use PhpCsFixer\Tokenizer\Analyzer\NamespacesAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use Symfony\Component\OptionsResolver\Exception\InvalidOptionsException; - -/** - * @author Andreas Möller - * @author SpacePossum - */ -final class NativeFunctionInvocationFixer extends AbstractFixer implements ConfigurableFixerInterface -{ - /** - * @internal - */ - public const SET_ALL = '@all'; - - /** - * Subset of SET_INTERNAL. - * - * Change function call to functions known to be optimized by the Zend engine. - * For details: - * - @see https://github.com/php/php-src/blob/php-7.2.6/Zend/zend_compile.c "zend_try_compile_special_func" - * - @see https://github.com/php/php-src/blob/php-7.2.6/ext/opcache/Optimizer/pass1_5.c - * - * @internal - */ - public const SET_COMPILER_OPTIMIZED = '@compiler_optimized'; - - /** - * @internal - */ - public const SET_INTERNAL = '@internal'; - - /** - * @var callable - */ - private $functionFilter; - - public function configure(array $configuration): void - { - parent::configure($configuration); - - $this->functionFilter = $this->getFunctionFilter(); - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Add leading `\` before function invocation to speed up resolving.', - [ - new CodeSample( - ' [ - 'json_encode', - ], - ] - ), - new CodeSample( - ' 'all'] - ), - new CodeSample( - ' 'namespaced'] - ), - new CodeSample( - ' ['myGlobalFunction']] - ), - new CodeSample( - ' ['@all']] - ), - new CodeSample( - ' ['@internal']] - ), - new CodeSample( - ' ['@compiler_optimized']] - ), - ], - null, - 'Risky when any of the functions are overridden.' - ); - } - - /** - * {@inheritdoc} - * - * Must run before GlobalNamespaceImportFixer. - * Must run after BacktickToShellExecFixer, StrictParamFixer. - */ - public function getPriority(): int - { - return 1; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isTokenKindFound(T_STRING); - } - - /** - * {@inheritdoc} - */ - public function isRisky(): bool - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - if ('all' === $this->configuration['scope']) { - $this->fixFunctionCalls($tokens, $this->functionFilter, 0, \count($tokens) - 1, false); - - return; - } - - $namespaces = (new NamespacesAnalyzer())->getDeclarations($tokens); - - // 'scope' is 'namespaced' here - /** @var NamespaceAnalysis $namespace */ - foreach (array_reverse($namespaces) as $namespace) { - $this->fixFunctionCalls($tokens, $this->functionFilter, $namespace->getScopeStartIndex(), $namespace->getScopeEndIndex(), '' === $namespace->getFullName()); - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('exclude', 'List of functions to ignore.')) - ->setAllowedTypes(['array']) - ->setAllowedValues([static function (array $value) { - foreach ($value as $functionName) { - if (!\is_string($functionName) || '' === trim($functionName) || trim($functionName) !== $functionName) { - throw new InvalidOptionsException(sprintf( - 'Each element must be a non-empty, trimmed string, got "%s" instead.', - \is_object($functionName) ? \get_class($functionName) : \gettype($functionName) - )); - } - } - - return true; - }]) - ->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']) - ->setAllowedValues([static function (array $value) { - foreach ($value as $functionName) { - if (!\is_string($functionName) || '' === trim($functionName) || trim($functionName) !== $functionName) { - throw new InvalidOptionsException(sprintf( - 'Each element must be a non-empty, trimmed string, got "%s" instead.', - \is_object($functionName) ? \get_class($functionName) : \gettype($functionName) - )); - } - - $sets = [ - self::SET_ALL, - self::SET_INTERNAL, - self::SET_COMPILER_OPTIMIZED, - ]; - - if ('@' === $functionName[0] && !\in_array($functionName, $sets, true)) { - throw new InvalidOptionsException(sprintf('Unknown set "%s", known sets are "%s".', $functionName, implode('", "', $sets))); - } - } - - return true; - }]) - ->setDefault([self::SET_COMPILER_OPTIMIZED]) - ->getOption(), - (new FixerOptionBuilder('scope', 'Only fix function calls that are made within a namespace or fix all.')) - ->setAllowedValues(['all', 'namespaced']) - ->setDefault('all') - ->getOption(), - (new FixerOptionBuilder('strict', 'Whether leading `\` of function call not meant to have it should be removed.')) - ->setAllowedTypes(['bool']) - ->setDefault(true) - ->getOption(), - ]); - } - - private function fixFunctionCalls(Tokens $tokens, callable $functionFilter, int $start, int $end, bool $tryToRemove): void - { - $functionsAnalyzer = new FunctionsAnalyzer(); - - $tokensToInsert = []; - for ($index = $start; $index < $end; ++$index) { - if (!$functionsAnalyzer->isGlobalFunctionCall($tokens, $index)) { - continue; - } - - $prevIndex = $tokens->getPrevMeaningfulToken($index); - - if (!$functionFilter($tokens[$index]->getContent()) || $tryToRemove) { - if (!$this->configuration['strict']) { - continue; - } - if ($tokens[$prevIndex]->isGivenKind(T_NS_SEPARATOR)) { - $tokens->clearTokenAndMergeSurroundingWhitespace($prevIndex); - } - - continue; - } - - if ($tokens[$prevIndex]->isGivenKind(T_NS_SEPARATOR)) { - continue; // do not bother if previous token is already namespace separator - } - - $tokensToInsert[$index] = new Token([T_NS_SEPARATOR, '\\']); - } - - $tokens->insertSlices($tokensToInsert); - } - - private function getFunctionFilter(): callable - { - $exclude = $this->normalizeFunctionNames($this->configuration['exclude']); - - if (\in_array(self::SET_ALL, $this->configuration['include'], true)) { - if (\count($exclude) > 0) { - return static function (string $functionName) use ($exclude) { - return !isset($exclude[strtolower($functionName)]); - }; - } - - return static function () { - return true; - }; - } - - $include = []; - if (\in_array(self::SET_INTERNAL, $this->configuration['include'], true)) { - $include = $this->getAllInternalFunctionsNormalized(); - } elseif (\in_array(self::SET_COMPILER_OPTIMIZED, $this->configuration['include'], true)) { - $include = $this->getAllCompilerOptimizedFunctionsNormalized(); // if `@internal` is set all compiler optimized function are already loaded - } - - foreach ($this->configuration['include'] as $additional) { - if ('@' !== $additional[0]) { - $include[strtolower($additional)] = true; - } - } - - if (\count($exclude) > 0) { - return static function (string $functionName) use ($include, $exclude) { - return isset($include[strtolower($functionName)]) && !isset($exclude[strtolower($functionName)]); - }; - } - - return static function (string $functionName) use ($include) { - return isset($include[strtolower($functionName)]); - }; - } - - /** - * @return array normalized function names of which the PHP compiler optimizes - */ - private function getAllCompilerOptimizedFunctionsNormalized(): array - { - return $this->normalizeFunctionNames([ - // @see https://github.com/php/php-src/blob/PHP-7.4/Zend/zend_compile.c "zend_try_compile_special_func" - 'array_key_exists', - 'array_slice', - 'assert', - 'boolval', - 'call_user_func', - 'call_user_func_array', - 'chr', - 'count', - 'defined', - 'doubleval', - 'floatval', - 'func_get_args', - 'func_num_args', - 'get_called_class', - 'get_class', - 'gettype', - 'in_array', - 'intval', - 'is_array', - 'is_bool', - 'is_double', - 'is_float', - 'is_int', - 'is_integer', - 'is_long', - 'is_null', - 'is_object', - 'is_real', - 'is_resource', - 'is_string', - 'ord', - 'strlen', - 'strval', - // @see https://github.com/php/php-src/blob/php-7.2.6/ext/opcache/Optimizer/pass1_5.c - 'constant', - 'define', - 'dirname', - 'extension_loaded', - 'function_exists', - 'is_callable', - ]); - } - - /** - * @return array normalized function names of all internal defined functions - */ - private function getAllInternalFunctionsNormalized(): array - { - return $this->normalizeFunctionNames(get_defined_functions()['internal']); - } - - /** - * @param string[] $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]); - } - - return $functionNames; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/NoSpacesAfterFunctionNameFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/NoSpacesAfterFunctionNameFixer.php deleted file mode 100644 index 621a3b6..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/NoSpacesAfterFunctionNameFixer.php +++ /dev/null @@ -1,187 +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\Fixer\FunctionNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Fixer for rules defined in PSR2 ¶4.6. - * - * @author Varga Bence - * @author Dariusz Rumiński - */ -final class NoSpacesAfterFunctionNameFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - 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])); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $functionyTokens = $this->getFunctionyTokenKinds(); - $languageConstructionTokens = $this->getLanguageConstructionTokenKinds(); - $braceTypes = $this->getBraceAfterVariableKinds(); - - foreach ($tokens as $index => $token) { - // looking for start brace - if (!$token->equals('(')) { - continue; - } - - // last non-whitespace token, can never be `null` always at least PHP open tag before it - $lastTokenIndex = $tokens->getPrevNonWhitespace($index); - - // check for ternary operator - $endParenthesisIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $index); - $nextNonWhiteSpace = $tokens->getNextMeaningfulToken($endParenthesisIndex); - if ( - null !== $nextNonWhiteSpace - && $tokens[$nextNonWhiteSpace]->equals('?') - && $tokens[$lastTokenIndex]->isGivenKind($languageConstructionTokens) - ) { - continue; - } - - // check if it is a function call - if ($tokens[$lastTokenIndex]->isGivenKind($functionyTokens)) { - $this->fixFunctionCall($tokens, $index); - } elseif ($tokens[$lastTokenIndex]->isGivenKind(T_STRING)) { // for real function calls or definitions - $possibleDefinitionIndex = $tokens->getPrevMeaningfulToken($lastTokenIndex); - if (!$tokens[$possibleDefinitionIndex]->isGivenKind(T_FUNCTION)) { - $this->fixFunctionCall($tokens, $index); - } - } elseif ($tokens[$lastTokenIndex]->equalsAny($braceTypes)) { - $block = Tokens::detectBlockType($tokens[$lastTokenIndex]); - if ( - Tokens::BLOCK_TYPE_ARRAY_INDEX_CURLY_BRACE === $block['type'] - || Tokens::BLOCK_TYPE_DYNAMIC_VAR_BRACE === $block['type'] - || Tokens::BLOCK_TYPE_INDEX_SQUARE_BRACE === $block['type'] - || Tokens::BLOCK_TYPE_PARENTHESIS_BRACE === $block['type'] - ) { - $this->fixFunctionCall($tokens, $index); - } - } - } - } - - /** - * Fixes whitespaces around braces of a function(y) call. - * - * @param Tokens $tokens tokens to handle - * @param int $index index of token - */ - private function fixFunctionCall(Tokens $tokens, int $index): void - { - // remove space before opening brace - if ($tokens[$index - 1]->isWhitespace()) { - $tokens->clearAt($index - 1); - } - } - - /** - * @return array - */ - private function getBraceAfterVariableKinds(): array - { - static $tokens = [ - ')', - ']', - [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 - */ - private function getFunctionyTokenKinds(): array - { - static $tokens = [ - T_ARRAY, - T_ECHO, - T_EMPTY, - T_EVAL, - T_EXIT, - T_INCLUDE, - T_INCLUDE_ONCE, - T_ISSET, - T_LIST, - T_PRINT, - T_REQUIRE, - T_REQUIRE_ONCE, - T_UNSET, - T_VARIABLE, - ]; - - return $tokens; - } - - /** - * Gets the token kinds of actually language construction. - * - * @return int[] - */ - private function getLanguageConstructionTokenKinds(): array - { - static $languageConstructionTokens = [ - T_ECHO, - T_PRINT, - T_INCLUDE, - T_INCLUDE_ONCE, - T_REQUIRE, - T_REQUIRE_ONCE, - ]; - - return $languageConstructionTokens; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/NoUnreachableDefaultArgumentValueFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/NoUnreachableDefaultArgumentValueFixer.php deleted file mode 100644 index 1c4514d..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/NoUnreachableDefaultArgumentValueFixer.php +++ /dev/null @@ -1,197 +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\Fixer\FunctionNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Mark Scherer - * @author Lucas Manzke - * @author Gregor Harlan - */ -final class NoUnreachableDefaultArgumentValueFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'In function arguments there must not be arguments with default values before non-default ones.', - [ - new CodeSample( - '= 70400 && $tokens->isTokenKindFound(T_FN)) { - return true; - } - - return $tokens->isTokenKindFound(T_FUNCTION); - } - - /** - * {@inheritdoc} - */ - public function isRisky(): bool - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - for ($i = 0, $l = $tokens->count(); $i < $l; ++$i) { - if ( - !$tokens[$i]->isGivenKind(T_FUNCTION) - && (\PHP_VERSION_ID < 70400 || !$tokens[$i]->isGivenKind(T_FN)) - ) { - continue; - } - - $startIndex = $tokens->getNextTokenOfKind($i, ['(']); - $i = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $startIndex); - - $this->fixFunctionDefinition($tokens, $startIndex, $i); - } - } - - private function fixFunctionDefinition(Tokens $tokens, int $startIndex, int $endIndex): void - { - $lastArgumentIndex = $this->getLastNonDefaultArgumentIndex($tokens, $startIndex, $endIndex); - - if (!$lastArgumentIndex) { - return; - } - - for ($i = $lastArgumentIndex; $i > $startIndex; --$i) { - $token = $tokens[$i]; - - if ($token->isGivenKind(T_VARIABLE)) { - $lastArgumentIndex = $i; - - continue; - } - - if (!$token->equals('=') || $this->isNonNullableTypehintedNullableVariable($tokens, $i)) { - continue; - } - - $endIndex = $tokens->getPrevTokenOfKind($lastArgumentIndex, [',']); - $endIndex = $tokens->getPrevMeaningfulToken($endIndex); - $this->removeDefaultArgument($tokens, $i, $endIndex); - } - } - - private function getLastNonDefaultArgumentIndex(Tokens $tokens, int $startIndex, int $endIndex): ?int - { - for ($i = $endIndex - 1; $i > $startIndex; --$i) { - $token = $tokens[$i]; - - if ($token->equals('=')) { - $i = $tokens->getPrevMeaningfulToken($i); - - continue; - } - - if ($token->isGivenKind(T_VARIABLE) && !$this->isEllipsis($tokens, $i)) { - return $i; - } - } - - return null; - } - - private function isEllipsis(Tokens $tokens, int $variableIndex): bool - { - return $tokens[$tokens->getPrevMeaningfulToken($variableIndex)]->isGivenKind(T_ELLIPSIS); - } - - private function removeDefaultArgument(Tokens $tokens, int $startIndex, int $endIndex): void - { - for ($i = $startIndex; $i <= $endIndex;) { - $tokens->clearTokenAndMergeSurroundingWhitespace($i); - $this->clearWhitespacesBeforeIndex($tokens, $i); - $i = $tokens->getNextMeaningfulToken($i); - } - } - - /** - * @param int $index Index of "=" - */ - private function isNonNullableTypehintedNullableVariable(Tokens $tokens, int $index): bool - { - $nextToken = $tokens[$tokens->getNextMeaningfulToken($index)]; - - if (!$nextToken->equals([T_STRING, 'null'], false)) { - return false; - } - - $variableIndex = $tokens->getPrevMeaningfulToken($index); - - $searchTokens = [',', '(', [T_STRING], [CT::T_ARRAY_TYPEHINT], [T_CALLABLE]]; - $typehintKinds = [T_STRING, CT::T_ARRAY_TYPEHINT, T_CALLABLE]; - - $prevIndex = $tokens->getPrevTokenOfKind($variableIndex, $searchTokens); - - if (!$tokens[$prevIndex]->isGivenKind($typehintKinds)) { - return false; - } - - return !$tokens[$tokens->getPrevMeaningfulToken($prevIndex)]->isGivenKind(CT::T_NULLABLE_TYPE); - } - - private function clearWhitespacesBeforeIndex(Tokens $tokens, int $index): void - { - $prevIndex = $tokens->getNonEmptySibling($index, -1); - if (!$tokens[$prevIndex]->isWhitespace()) { - return; - } - - $prevNonWhiteIndex = $tokens->getPrevNonWhitespace($prevIndex); - if (null === $prevNonWhiteIndex || !$tokens[$prevNonWhiteIndex]->isComment()) { - $tokens->clearTokenAndMergeSurroundingWhitespace($prevIndex); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/NoUselessSprintfFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/NoUselessSprintfFixer.php deleted file mode 100644 index d5af443..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/NoUselessSprintfFixer.php +++ /dev/null @@ -1,121 +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\Fixer\FunctionNotation; - -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\Tokens; - -final class NoUselessSprintfFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'There must be no `sprintf` calls with only the first argument.', - [ - new CodeSample( - "isTokenKindFound(T_STRING); - } - - /** - * {@inheritdoc} - */ - public function isRisky(): bool - { - return true; - } - - /** - * {@inheritdoc} - * - * Must run before MethodArgumentSpaceFixer, NativeFunctionCasingFixer, NoEmptyStatementFixer, NoExtraBlankLinesFixer, NoSpacesInsideParenthesisFixer. - */ - public function getPriority(): int - { - return 42; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $functionAnalyzer = new FunctionsAnalyzer(); - $argumentsAnalyzer = new ArgumentsAnalyzer(); - - for ($index = \count($tokens) - 1; $index > 0; --$index) { - if (!$tokens[$index]->isGivenKind(T_STRING)) { - continue; - } - - if ('sprintf' !== strtolower($tokens[$index]->getContent())) { - continue; - } - - if (!$functionAnalyzer->isGlobalFunctionCall($tokens, $index)) { - continue; - } - - $openParenthesisIndex = $tokens->getNextTokenOfKind($index, ['(']); - - if ($tokens[$tokens->getNextMeaningfulToken($openParenthesisIndex)]->isGivenKind(T_ELLIPSIS)) { - continue; - } - - $closeParenthesisIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $openParenthesisIndex); - - if (1 !== $argumentsAnalyzer->countArguments($tokens, $openParenthesisIndex, $closeParenthesisIndex)) { - continue; - } - - $tokens->clearTokenAndMergeSurroundingWhitespace($closeParenthesisIndex); - - $prevMeaningfulTokenIndex = $tokens->getPrevMeaningfulToken($closeParenthesisIndex); - - if ($tokens[$prevMeaningfulTokenIndex]->equals(',')) { - $tokens->clearTokenAndMergeSurroundingWhitespace($prevMeaningfulTokenIndex); - } - - $tokens->clearTokenAndMergeSurroundingWhitespace($openParenthesisIndex); - $tokens->clearTokenAndMergeSurroundingWhitespace($index); - - $prevMeaningfulTokenIndex = $tokens->getPrevMeaningfulToken($index); - - if ($tokens[$prevMeaningfulTokenIndex]->isGivenKind(T_NS_SEPARATOR)) { - $tokens->clearTokenAndMergeSurroundingWhitespace($prevMeaningfulTokenIndex); - } - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/NullableTypeDeclarationForDefaultNullValueFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/NullableTypeDeclarationForDefaultNullValueFixer.php deleted file mode 100644 index c4ce88a..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/NullableTypeDeclarationForDefaultNullValueFixer.php +++ /dev/null @@ -1,174 +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\Fixer\FunctionNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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\ArgumentAnalysis; -use PhpCsFixer\Tokenizer\Analyzer\FunctionsAnalyzer; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author HypeMC - */ -final class NullableTypeDeclarationForDefaultNullValueFixer extends AbstractFixer implements ConfigurableFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Adds or removes `?` before type declarations for parameters with a default `null` value.', - [ - new VersionSpecificCodeSample( - " false] - ), - ], - 'Rule is applied only in a PHP 7.1+ environment.' - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - if (\PHP_VERSION_ID < 70100) { - return false; - } - - if (!$tokens->isTokenKindFound(T_VARIABLE)) { - return false; - } - - if (\PHP_VERSION_ID >= 70400 && $tokens->isTokenKindFound(T_FN)) { - return true; - } - - return $tokens->isTokenKindFound(T_FUNCTION); - } - - /** - * {@inheritdoc} - * - * Must run before NoUnreachableDefaultArgumentValueFixer. - */ - public function getPriority(): int - { - return 1; - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('use_nullable_type_declaration', 'Whether to add or remove `?` before type declarations for parameters with a default `null` value.')) - ->setAllowedTypes(['bool']) - ->setDefault(true) - ->getOption(), - ]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $functionsAnalyzer = new FunctionsAnalyzer(); - - $tokenKinds = [T_FUNCTION]; - if (\PHP_VERSION_ID >= 70400) { - $tokenKinds[] = T_FN; - } - - for ($index = $tokens->count() - 1; $index >= 0; --$index) { - $token = $tokens[$index]; - - if (!$token->isGivenKind($tokenKinds)) { - continue; - } - - $arguments = $functionsAnalyzer->getFunctionArguments($tokens, $index); - - $this->fixFunctionParameters($tokens, $arguments); - } - } - - /** - * @param ArgumentAnalysis[] $arguments - */ - private function fixFunctionParameters(Tokens $tokens, array $arguments): void - { - foreach (array_reverse($arguments) as $argumentInfo) { - if ( - // Skip, if the parameter - // - doesn't have a type declaration - !$argumentInfo->hasTypeAnalysis() - // type is a union - || false !== strpos($argumentInfo->getTypeAnalysis()->getName(), '|') - // - a default value is not null we can continue - || !$argumentInfo->hasDefault() || 'null' !== strtolower($argumentInfo->getDefault()) - ) { - continue; - } - - $argumentTypeInfo = $argumentInfo->getTypeAnalysis(); - - if ( - \PHP_VERSION_ID >= 80000 - && false === $this->configuration['use_nullable_type_declaration'] - ) { - $visibility = $tokens[$tokens->getPrevMeaningfulToken($argumentTypeInfo->getStartIndex())]; - - if ($visibility->isGivenKind([ - CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PUBLIC, - CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PROTECTED, - CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PRIVATE, - ])) { - continue; - } - } - - if (true === $this->configuration['use_nullable_type_declaration']) { - if (!$argumentTypeInfo->isNullable() && 'mixed' !== $argumentTypeInfo->getName()) { - $tokens->insertAt($argumentTypeInfo->getStartIndex(), new Token([CT::T_NULLABLE_TYPE, '?'])); - } - } else { - if ($argumentTypeInfo->isNullable()) { - $tokens->removeTrailingWhitespace($argumentTypeInfo->getStartIndex()); - $tokens->clearTokenAndMergeSurroundingWhitespace($argumentTypeInfo->getStartIndex()); - } - } - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/PhpdocToParamTypeFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/PhpdocToParamTypeFixer.php deleted file mode 100644 index 6a1f7bd..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/PhpdocToParamTypeFixer.php +++ /dev/null @@ -1,205 +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\Fixer\FunctionNotation; - -use PhpCsFixer\AbstractPhpdocToTypeDeclarationFixer; -use PhpCsFixer\DocBlock\Annotation; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\FixerDefinition\VersionSpecification; -use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Jan Gantzert - */ -final class PhpdocToParamTypeFixer extends AbstractPhpdocToTypeDeclarationFixer -{ - private const MINIMUM_PHP_VERSION = 70000; - - /** - * @var array{int, string}[] - */ - private const EXCLUDE_FUNC_NAMES = [ - [T_STRING, '__clone'], - [T_STRING, '__destruct'], - ]; - - /** - * @var array - */ - private const SKIPPED_TYPES = [ - 'mixed' => true, - 'resource' => true, - 'static' => true, - 'void' => true, - ]; - - /** - * {@inheritdoc} - */ - 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.', - [ - new VersionSpecificCodeSample( - ' 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.' - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return \PHP_VERSION_ID >= self::MINIMUM_PHP_VERSION && $tokens->isTokenKindFound(T_FUNCTION); - } - - /** - * {@inheritdoc} - * - * Must run before NoSuperfluousPhpdocTagsFixer, PhpdocAlignFixer. - * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, PhpdocIndentFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer. - */ - public function getPriority(): int - { - return 8; - } - - protected function isSkippedType(string $type): bool - { - return isset(self::SKIPPED_TYPES[$type]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - for ($index = $tokens->count() - 1; 0 < $index; --$index) { - if (!$tokens[$index]->isGivenKind(T_FUNCTION)) { - continue; - } - - $funcName = $tokens->getNextMeaningfulToken($index); - if ($tokens[$funcName]->equalsAny(self::EXCLUDE_FUNC_NAMES, false)) { - continue; - } - - $docCommentIndex = $this->findFunctionDocComment($tokens, $index); - - if (null === $docCommentIndex) { - continue; - } - - foreach ($this->getAnnotationsFromDocComment('param', $tokens, $docCommentIndex) as $paramTypeAnnotation) { - $typeInfo = $this->getCommonTypeFromAnnotation($paramTypeAnnotation, false); - - if (null === $typeInfo) { - continue; - } - - [$paramType, $isNullable] = $typeInfo; - - $startIndex = $tokens->getNextTokenOfKind($index, ['(']); - $variableIndex = $this->findCorrectVariable($tokens, $startIndex, $paramTypeAnnotation); - - if (null === $variableIndex) { - continue; - } - - $byRefIndex = $tokens->getPrevMeaningfulToken($variableIndex); - if ($tokens[$byRefIndex]->equals('&')) { - $variableIndex = $byRefIndex; - } - - if ($this->hasParamTypeHint($tokens, $variableIndex)) { - continue; - } - - if (!$this->isValidSyntax(sprintf('insertAt($variableIndex, array_merge( - $this->createTypeDeclarationTokens($paramType, $isNullable), - [new Token([T_WHITESPACE, ' '])] - )); - } - } - } - - private function findCorrectVariable(Tokens $tokens, int $startIndex, Annotation $paramTypeAnnotation): ?int - { - $endIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $startIndex); - - for ($index = $startIndex + 1; $index < $endIndex; ++$index) { - if (!$tokens[$index]->isGivenKind(T_VARIABLE)) { - continue; - } - - $variableName = $tokens[$index]->getContent(); - if ($paramTypeAnnotation->getVariableName() === $variableName) { - return $index; - } - } - - return null; - } - - /** - * Determine whether the function already has a param type hint. - * - * @param int $index The index of the end of the function definition line, EG at { or ; - */ - private function hasParamTypeHint(Tokens $tokens, int $index): bool - { - $prevIndex = $tokens->getPrevMeaningfulToken($index); - - return !$tokens[$prevIndex]->equalsAny([',', '(']); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/PhpdocToPropertyTypeFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/PhpdocToPropertyTypeFixer.php deleted file mode 100644 index be041cd..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/PhpdocToPropertyTypeFixer.php +++ /dev/null @@ -1,242 +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\Fixer\FunctionNotation; - -use PhpCsFixer\AbstractPhpdocToTypeDeclarationFixer; -use PhpCsFixer\DocBlock\Annotation; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\FixerDefinition\VersionSpecification; -use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -final class PhpdocToPropertyTypeFixer extends AbstractPhpdocToTypeDeclarationFixer -{ - /** - * @var array - */ - private $skippedTypes = [ - 'mixed' => true, - 'resource' => true, - 'null' => true, - ]; - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'EXPERIMENTAL: Takes `@var` annotation of non-mixed types and adjusts accordingly the property signature. Requires PHP >= 7.4.', - [ - new VersionSpecificCodeSample( - ' 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.' - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return \PHP_VERSION_ID >= 70400 && $tokens->isTokenKindFound(T_DOC_COMMENT); - } - - /** - * {@inheritdoc} - * - * Must run before NoSuperfluousPhpdocTagsFixer, PhpdocAlignFixer. - * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, PhpdocIndentFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer. - */ - public function getPriority(): int - { - return 7; - } - - protected function isSkippedType(string $type): bool - { - return isset($this->skippedTypes[$type]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - for ($index = $tokens->count() - 1; 0 < $index; --$index) { - if ($tokens[$index]->isGivenKind([T_CLASS, T_TRAIT])) { - $this->fixClass($tokens, $index); - } - } - } - - private function fixClass(Tokens $tokens, int $index): void - { - $index = $tokens->getNextTokenOfKind($index, ['{']); - $classEndIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $index); - - for (; $index < $classEndIndex; ++$index) { - if ($tokens[$index]->isGivenKind(T_FUNCTION)) { - $index = $tokens->getNextTokenOfKind($index, ['{', ';']); - - if ($tokens[$index]->equals('{')) { - $index = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $index); - } - - continue; - } - - if (!$tokens[$index]->isGivenKind(T_DOC_COMMENT)) { - continue; - } - - $docCommentIndex = $index; - $propertyIndexes = $this->findNextUntypedPropertiesDeclaration($tokens, $docCommentIndex); - - if ([] === $propertyIndexes) { - continue; - } - - $typeInfo = $this->resolveAppliableType( - $propertyIndexes, - $this->getAnnotationsFromDocComment('var', $tokens, $docCommentIndex) - ); - - if (null === $typeInfo) { - continue; - } - - [$propertyType, $isNullable] = $typeInfo; - - if (\in_array($propertyType, ['void', 'callable'], true)) { - continue; - } - - $newTokens = array_merge( - $this->createTypeDeclarationTokens($propertyType, $isNullable), - [new Token([T_WHITESPACE, ' '])] - ); - - $tokens->insertAt(current($propertyIndexes), $newTokens); - - $index = max($propertyIndexes) + \count($newTokens) + 1; - $classEndIndex += \count($newTokens); - } - } - - /** - * @return array - */ - private function findNextUntypedPropertiesDeclaration(Tokens $tokens, int $index): array - { - do { - $index = $tokens->getNextMeaningfulToken($index); - } while ($tokens[$index]->isGivenKind([ - T_PRIVATE, - T_PROTECTED, - T_PUBLIC, - T_STATIC, - T_VAR, - ])); - - if (!$tokens[$index]->isGivenKind(T_VARIABLE)) { - return []; - } - - $properties = []; - while (!$tokens[$index]->equals(';')) { - if ($tokens[$index]->isGivenKind(T_VARIABLE)) { - $properties[$tokens[$index]->getContent()] = $index; - } - - $index = $tokens->getNextMeaningfulToken($index); - } - - return $properties; - } - - /** - * @param array $propertyIndexes - * @param Annotation[] $annotations - */ - private function resolveAppliableType(array $propertyIndexes, array $annotations): ?array - { - $propertyTypes = []; - - foreach ($annotations as $annotation) { - $propertyName = $annotation->getVariableName(); - - if (null === $propertyName) { - if (1 !== \count($propertyIndexes)) { - continue; - } - - $propertyName = key($propertyIndexes); - } - - if (!isset($propertyIndexes[$propertyName])) { - continue; - } - - $typeInfo = $this->getCommonTypeFromAnnotation($annotation, false); - - if (!isset($propertyTypes[$propertyName])) { - $propertyTypes[$propertyName] = []; - } elseif ($typeInfo !== $propertyTypes[$propertyName]) { - return null; - } - - $propertyTypes[$propertyName] = $typeInfo; - } - - if (\count($propertyTypes) !== \count($propertyIndexes)) { - return null; - } - - $type = array_shift($propertyTypes); - foreach ($propertyTypes as $propertyType) { - if ($propertyType !== $type) { - return null; - } - } - - return $type; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/PhpdocToReturnTypeFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/PhpdocToReturnTypeFixer.php deleted file mode 100644 index 8b85b06..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/PhpdocToReturnTypeFixer.php +++ /dev/null @@ -1,220 +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\Fixer\FunctionNotation; - -use PhpCsFixer\AbstractPhpdocToTypeDeclarationFixer; -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; - -/** - * @author Filippo Tessarotto - */ -final class PhpdocToReturnTypeFixer extends AbstractPhpdocToTypeDeclarationFixer -{ - /** - * @var array> - */ - private $excludeFuncNames = [ - [T_STRING, '__construct'], - [T_STRING, '__destruct'], - [T_STRING, '__clone'], - ]; - - /** - * @var array - */ - private $skippedTypes = [ - 'mixed' => true, - 'resource' => true, - 'null' => true, - ]; - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'EXPERIMENTAL: Takes `@return` annotation of non-mixed types and adjusts accordingly the function signature. Requires PHP >= 7.0.', - [ - new VersionSpecificCodeSample( - ' false] - ), - new VersionSpecificCodeSample( - '= 70400 && $tokens->isTokenKindFound(T_FN)) { - return true; - } - - return \PHP_VERSION_ID >= 70000 && $tokens->isTokenKindFound(T_FUNCTION); - } - - /** - * {@inheritdoc} - * - * Must run before FullyQualifiedStrictTypesFixer, NoSuperfluousPhpdocTagsFixer, PhpdocAlignFixer, ReturnTypeDeclarationFixer. - * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, PhpdocIndentFixer, PhpdocScalarFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer, PhpdocTypesFixer. - */ - public function getPriority(): int - { - return 13; - } - - protected function isSkippedType(string $type): bool - { - return isset($this->skippedTypes[$type]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - if (\PHP_VERSION_ID >= 80000) { - unset($this->skippedTypes['mixed']); - } - - for ($index = $tokens->count() - 1; 0 < $index; --$index) { - if ( - !$tokens[$index]->isGivenKind(T_FUNCTION) - && (\PHP_VERSION_ID < 70400 || !$tokens[$index]->isGivenKind(T_FN)) - ) { - continue; - } - - $funcName = $tokens->getNextMeaningfulToken($index); - - if ($tokens[$funcName]->equalsAny($this->excludeFuncNames, false)) { - continue; - } - - $docCommentIndex = $this->findFunctionDocComment($tokens, $index); - if (null === $docCommentIndex) { - continue; - } - - $returnTypeAnnotation = $this->getAnnotationsFromDocComment('return', $tokens, $docCommentIndex); - if (1 !== \count($returnTypeAnnotation)) { - continue; - } - - $typeInfo = $this->getCommonTypeFromAnnotation(current($returnTypeAnnotation), true); - - if (null === $typeInfo) { - continue; - } - - [$returnType, $isNullable] = $typeInfo; - - $startIndex = $tokens->getNextTokenOfKind($index, ['{', ';']); - - if ($this->hasReturnTypeHint($tokens, $startIndex)) { - continue; - } - - if (!$this->isValidSyntax(sprintf('getPrevTokenOfKind($startIndex, [')']); - - $tokens->insertAt( - $endFuncIndex + 1, - array_merge( - [ - new Token([CT::T_TYPE_COLON, ':']), - new Token([T_WHITESPACE, ' ']), - ], - $this->createTypeDeclarationTokens($returnType, $isNullable) - ) - ); - } - } - - /** - * Determine whether the function already has a return type hint. - * - * @param int $index The index of the end of the function definition line, EG at { or ; - */ - private function hasReturnTypeHint(Tokens $tokens, int $index): bool - { - $endFuncIndex = $tokens->getPrevTokenOfKind($index, [')']); - $nextIndex = $tokens->getNextMeaningfulToken($endFuncIndex); - - return $tokens[$nextIndex]->isGivenKind(CT::T_TYPE_COLON); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/RegularCallableCallFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/RegularCallableCallFixer.php deleted file mode 100644 index d226737..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/RegularCallableCallFixer.php +++ /dev/null @@ -1,233 +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\Fixer\FunctionNotation; - -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\Analyzer\ArgumentsAnalyzer; -use PhpCsFixer\Tokenizer\Analyzer\FunctionsAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dariusz Rumiński - */ -final class RegularCallableCallFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Callables must be called without using `call_user_func*` when possible.', - [ - new CodeSample( - ' \'baz\'])` or `call_user_func($foo, $foo = \'bar\')`.' - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isTokenKindFound(T_STRING); - } - - public function isRisky(): bool - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $functionsAnalyzer = new FunctionsAnalyzer(); - $argumentsAnalyzer = new ArgumentsAnalyzer(); - - for ($index = $tokens->count() - 1; $index > 0; --$index) { - if (!$tokens[$index]->equalsAny([[T_STRING, 'call_user_func'], [T_STRING, 'call_user_func_array']], false)) { - continue; - } - - if (!$functionsAnalyzer->isGlobalFunctionCall($tokens, $index)) { - continue; // redeclare/override - } - - $openParenthesis = $tokens->getNextMeaningfulToken($index); - $closeParenthesis = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $openParenthesis); - $arguments = $argumentsAnalyzer->getArguments($tokens, $openParenthesis, $closeParenthesis); - - if (1 > \count($arguments)) { - return; // no arguments! - } - - $this->processCall($tokens, $index, $arguments); - } - } - - private function processCall(Tokens $tokens, int $index, array $arguments): void - { - $firstArgIndex = $tokens->getNextMeaningfulToken( - $tokens->getNextMeaningfulToken($index) - ); - - /** @var Token $firstArgToken */ - $firstArgToken = $tokens[$firstArgIndex]; - - if ($firstArgToken->isGivenKind(T_CONSTANT_ENCAPSED_STRING)) { - $afterFirstArgIndex = $tokens->getNextMeaningfulToken($firstArgIndex); - if (!$tokens[$afterFirstArgIndex]->equalsAny([',', ')'])) { - return; // first argument is an expression like `call_user_func("foo"."bar", ...)`, not supported! - } - - $newCallTokens = Tokens::fromCode('getContent()), 1, -1).'();'); - $newCallTokensSize = $newCallTokens->count(); - $newCallTokens->clearAt(0); - $newCallTokens->clearRange($newCallTokensSize - 3, $newCallTokensSize - 1); - $newCallTokens->clearEmptyTokens(); - - $this->replaceCallUserFuncWithCallback($tokens, $index, $newCallTokens, $firstArgIndex, $firstArgIndex); - } elseif ($firstArgToken->isGivenKind([T_FUNCTION, T_STATIC])) { - if (\PHP_VERSION_ID >= 70000) { - $firstArgEndIndex = $tokens->findBlockEnd( - Tokens::BLOCK_TYPE_CURLY_BRACE, - $tokens->getNextTokenOfKind($firstArgIndex, ['{']) - ); - - $newCallTokens = $this->getTokensSubcollection($tokens, $firstArgIndex, $firstArgEndIndex); - $newCallTokens->insertAt($newCallTokens->count(), new Token(')')); - $newCallTokens->insertAt(0, new Token('(')); - $this->replaceCallUserFuncWithCallback($tokens, $index, $newCallTokens, $firstArgIndex, $firstArgEndIndex); - } - } elseif ($firstArgToken->isGivenKind(T_VARIABLE)) { - $firstArgEndIndex = reset($arguments); - - // check if the same variable is used multiple times and if so do not fix - - foreach ($arguments as $argumentStart => $argumentEnd) { - if ($firstArgEndIndex === $argumentEnd) { - continue; - } - - for ($i = $argumentStart; $i <= $argumentEnd; ++$i) { - if ($tokens[$i]->equals($firstArgToken)) { - return; - } - } - } - - // check if complex statement and if so wrap the call in () if on PHP 7 or up, else do not fix - - $newCallTokens = $this->getTokensSubcollection($tokens, $firstArgIndex, $firstArgEndIndex); - $complex = false; - - for ($newCallIndex = \count($newCallTokens) - 1; $newCallIndex >= 0; --$newCallIndex) { - if ($newCallTokens[$newCallIndex]->isGivenKind([T_WHITESPACE, T_COMMENT, T_DOC_COMMENT, T_VARIABLE])) { - continue; - } - - $blockType = Tokens::detectBlockType($newCallTokens[$newCallIndex]); - - if (null !== $blockType && (Tokens::BLOCK_TYPE_ARRAY_INDEX_CURLY_BRACE === $blockType['type'] || Tokens::BLOCK_TYPE_INDEX_SQUARE_BRACE === $blockType['type'])) { - $newCallIndex = $newCallTokens->findBlockStart($blockType['type'], $newCallIndex); - - continue; - } - - $complex = true; - - break; - } - - if ($complex) { - if (\PHP_VERSION_ID < 70000) { - return; - } - - $newCallTokens->insertAt($newCallTokens->count(), new Token(')')); - $newCallTokens->insertAt(0, new Token('(')); - } - $this->replaceCallUserFuncWithCallback($tokens, $index, $newCallTokens, $firstArgIndex, $firstArgEndIndex); - } - } - - private function replaceCallUserFuncWithCallback(Tokens $tokens, int $callIndex, Tokens $newCallTokens, int $firstArgStartIndex, int $firstArgEndIndex): void - { - $tokens->clearRange($firstArgStartIndex, $firstArgEndIndex); - - $afterFirstArgIndex = $tokens->getNextMeaningfulToken($firstArgEndIndex); - $afterFirstArgToken = $tokens[$afterFirstArgIndex]; - - if ($afterFirstArgToken->equals(',')) { - $useEllipsis = $tokens[$callIndex]->equals([T_STRING, 'call_user_func_array']); - - if ($useEllipsis) { - $secondArgIndex = $tokens->getNextMeaningfulToken($afterFirstArgIndex); - $tokens->insertAt($secondArgIndex, new Token([T_ELLIPSIS, '...'])); - } - - $tokens->clearAt($afterFirstArgIndex); - $tokens->removeTrailingWhitespace($afterFirstArgIndex); - } - - $tokens->overrideRange($callIndex, $callIndex, $newCallTokens); - - $prevIndex = $tokens->getPrevMeaningfulToken($callIndex); - - if ($tokens[$prevIndex]->isGivenKind(T_NS_SEPARATOR)) { - $tokens->clearTokenAndMergeSurroundingWhitespace($prevIndex); - } - } - - private function getTokensSubcollection(Tokens $tokens, int $indexStart, int $indexEnd): Tokens - { - $size = $indexEnd - $indexStart + 1; - $subcollection = new Tokens($size); - - for ($i = 0; $i < $size; ++$i) { - /** @var Token $toClone */ - $toClone = $tokens[$i + $indexStart]; - $subcollection[$i] = clone $toClone; - } - - return $subcollection; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/ReturnTypeDeclarationFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/ReturnTypeDeclarationFixer.php deleted file mode 100644 index e931e9d..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/ReturnTypeDeclarationFixer.php +++ /dev/null @@ -1,137 +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\Fixer\FunctionNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dariusz Rumiński - */ -final class ReturnTypeDeclarationFixer extends AbstractFixer implements ConfigurableFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - $versionSpecification = new VersionSpecification(70000); - - return new FixerDefinition( - 'There should be one or no space before colon, and one space after it in return type declarations, according to configuration.', - [ - new VersionSpecificCodeSample( - " 'none'] - ), - new VersionSpecificCodeSample( - " 'one'] - ), - ], - 'Rule is applied only in a PHP 7+ environment.' - ); - } - - /** - * {@inheritdoc} - * - * Must run after PhpdocToReturnTypeFixer, VoidReturnFixer. - */ - public function getPriority(): int - { - return -17; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return \PHP_VERSION_ID >= 70000 && $tokens->isTokenKindFound(CT::T_TYPE_COLON); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $oneSpaceBefore = 'one' === $this->configuration['space_before']; - - for ($index = 0, $limit = $tokens->count(); $index < $limit; ++$index) { - if (!$tokens[$index]->isGivenKind(CT::T_TYPE_COLON)) { - continue; - } - - $previousIndex = $index - 1; - $previousToken = $tokens[$previousIndex]; - - if ($previousToken->isWhitespace()) { - if (!$tokens[$tokens->getPrevNonWhitespace($index - 1)]->isComment()) { - if ($oneSpaceBefore) { - $tokens[$previousIndex] = new Token([T_WHITESPACE, ' ']); - } else { - $tokens->clearAt($previousIndex); - } - } - } elseif ($oneSpaceBefore) { - $tokenWasAdded = $tokens->ensureWhitespaceAtIndex($index, 0, ' '); - - if ($tokenWasAdded) { - ++$limit; - } - - ++$index; - } - - ++$index; - - $tokenWasAdded = $tokens->ensureWhitespaceAtIndex($index, 0, ' '); - - if ($tokenWasAdded) { - ++$limit; - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('space_before', 'Spacing to apply before colon.')) - ->setAllowedValues(['one', 'none']) - ->setDefault('none') - ->getOption(), - ]); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/SingleLineThrowFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/SingleLineThrowFixer.php deleted file mode 100644 index f8599dd..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/SingleLineThrowFixer.php +++ /dev/null @@ -1,165 +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\Fixer\FunctionNotation; - -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 Kuba Werłos - */ -final class SingleLineThrowFixer extends AbstractFixer -{ - private const REMOVE_WHITESPACE_AFTER_TOKENS = ['[']; - private const REMOVE_WHITESPACE_AROUND_TOKENS = ['(', [T_DOUBLE_COLON]]; - private const REMOVE_WHITESPACE_BEFORE_TOKENS = [')', ']', ',', ';']; - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Throwing exception must be done in single line.', - [ - new CodeSample("isTokenKindFound(T_THROW); - } - - /** - * {@inheritdoc} - * - * Must run before BracesFixer, ConcatSpaceFixer. - */ - public function getPriority(): int - { - return 36; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - for ($index = 0, $count = $tokens->count(); $index < $count; ++$index) { - if (!$tokens[$index]->isGivenKind(T_THROW)) { - continue; - } - - $endCandidateIndex = $tokens->getNextMeaningfulToken($index); - - while (!$tokens[$endCandidateIndex]->equalsAny([')', ']', ',', ';'])) { - $blockType = Tokens::detectBlockType($tokens[$endCandidateIndex]); - if (null !== $blockType) { - if (Tokens::BLOCK_TYPE_CURLY_BRACE === $blockType['type']) { - break; - } - $endCandidateIndex = $tokens->findBlockEnd($blockType['type'], $endCandidateIndex); - } - $endCandidateIndex = $tokens->getNextMeaningfulToken($endCandidateIndex); - } - - $this->trimNewLines($tokens, $index, $tokens->getPrevMeaningfulToken($endCandidateIndex)); - } - } - - private function trimNewLines(Tokens $tokens, int $startIndex, int $endIndex): void - { - for ($index = $startIndex; $index < $endIndex; ++$index) { - $content = $tokens[$index]->getContent(); - - if ($tokens[$index]->isGivenKind(T_COMMENT)) { - if (0 === strpos($content, '//')) { - $content = '/*'.substr($content, 2).' */'; - $tokens->clearAt($index + 1); - } elseif (0 === strpos($content, '#')) { - $content = '/*'.substr($content, 1).' */'; - $tokens->clearAt($index + 1); - } elseif (false !== Preg::match('/\R/', $content)) { - $content = Preg::replace('/\R/', ' ', $content); - } - - $tokens[$index] = new Token([T_COMMENT, $content]); - - continue; - } - - if (!$tokens[$index]->isGivenKind(T_WHITESPACE)) { - continue; - } - - if (0 === Preg::match('/\R/', $content)) { - continue; - } - - $prevIndex = $tokens->getNonEmptySibling($index, -1); - - if ($this->isPreviousTokenToClear($tokens[$prevIndex])) { - $tokens->clearAt($index); - - continue; - } - - $nextIndex = $tokens->getNonEmptySibling($index, 1); - - if ( - $this->isNextTokenToClear($tokens[$nextIndex]) - && !$tokens[$prevIndex]->isGivenKind(T_FUNCTION) - ) { - $tokens->clearAt($index); - - continue; - } - - $tokens[$index] = new Token([T_WHITESPACE, ' ']); - } - } - - private function isPreviousTokenToClear(Token $token): bool - { - static $tokens = null; - - if (null === $tokens) { - $tokens = array_merge(self::REMOVE_WHITESPACE_AFTER_TOKENS, self::REMOVE_WHITESPACE_AROUND_TOKENS); - } - - return $token->equalsAny($tokens) || $token->isObjectOperator(); - } - - private function isNextTokenToClear(Token $token): bool - { - static $tokens = null; - - if (null === $tokens) { - $tokens = array_merge(self::REMOVE_WHITESPACE_AROUND_TOKENS, self::REMOVE_WHITESPACE_BEFORE_TOKENS); - } - - return $token->equalsAny($tokens) || $token->isObjectOperator(); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/StaticLambdaFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/StaticLambdaFixer.php deleted file mode 100644 index c43b09e..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/StaticLambdaFixer.php +++ /dev/null @@ -1,179 +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\Fixer\FunctionNotation; - -use PhpCsFixer\AbstractFixer; -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; - -/** - * @author SpacePossum - */ -final class StaticLambdaFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Lambdas not (indirect) referencing `$this` must be declared `static`.', - [new CodeSample("bindTo` on lambdas without referencing to `$this`.' - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - if (\PHP_VERSION_ID >= 70400 && $tokens->isTokenKindFound(T_FN)) { - return true; - } - - return $tokens->isTokenKindFound(T_FUNCTION); - } - - /** - * {@inheritdoc} - */ - public function isRisky(): bool - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $analyzer = new TokensAnalyzer($tokens); - $expectedFunctionKinds = [T_FUNCTION]; - - if (\PHP_VERSION_ID >= 70400) { - $expectedFunctionKinds[] = T_FN; - } - - for ($index = $tokens->count() - 4; $index > 0; --$index) { - if (!$tokens[$index]->isGivenKind($expectedFunctionKinds) || !$analyzer->isLambda($index)) { - continue; - } - - $prev = $tokens->getPrevMeaningfulToken($index); - - if ($tokens[$prev]->isGivenKind(T_STATIC)) { - continue; // lambda is already 'static' - } - - $argumentsStartIndex = $tokens->getNextTokenOfKind($index, ['(']); - $argumentsEndIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $argumentsStartIndex); - - // figure out where the lambda starts and ends - - if ($tokens[$index]->isGivenKind(T_FUNCTION)) { - $lambdaOpenIndex = $tokens->getNextTokenOfKind($argumentsEndIndex, ['{']); - $lambdaEndIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $lambdaOpenIndex); - } else { // T_FN - $lambdaOpenIndex = $tokens->getNextTokenOfKind($argumentsEndIndex, [[T_DOUBLE_ARROW]]); - $lambdaEndIndex = $this->findExpressionEnd($tokens, $lambdaOpenIndex); - } - - if ($this->hasPossibleReferenceToThis($tokens, $lambdaOpenIndex, $lambdaEndIndex)) { - continue; - } - - // make the lambda static - $tokens->insertAt( - $index, - [ - new Token([T_STATIC, 'static']), - new Token([T_WHITESPACE, ' ']), - ] - ); - - $index -= 4; // fixed after a lambda, closes candidate is at least 4 tokens before that - } - } - - private function findExpressionEnd(Tokens $tokens, int $index): int - { - $nextIndex = $tokens->getNextMeaningfulToken($index); - - while (null !== $nextIndex) { - /** @var Token $nextToken */ - $nextToken = $tokens[$nextIndex]; - - if ($nextToken->equalsAny([',', ';', [T_CLOSE_TAG]])) { - break; - } - - /** @var null|array{isStart: bool, type: int} $blockType */ - $blockType = Tokens::detectBlockType($nextToken); - - if (null !== $blockType && $blockType['isStart']) { - $nextIndex = $tokens->findBlockEnd($blockType['type'], $nextIndex); - } - - $index = $nextIndex; - $nextIndex = $tokens->getNextMeaningfulToken($index); - } - - return $index; - } - - /** - * Returns 'true' if there is a possible reference to '$this' within the given tokens index range. - */ - private function hasPossibleReferenceToThis(Tokens $tokens, int $startIndex, int $endIndex): bool - { - for ($i = $startIndex; $i < $endIndex; ++$i) { - if ($tokens[$i]->isGivenKind(T_VARIABLE) && '$this' === strtolower($tokens[$i]->getContent())) { - return true; // directly accessing '$this' - } - - if ($tokens[$i]->isGivenKind([ - T_INCLUDE, // loading additional symbols we cannot analyze here - T_INCLUDE_ONCE, // " - T_REQUIRE, // " - T_REQUIRE_ONCE, // " - CT::T_DYNAMIC_VAR_BRACE_OPEN, // "$h = ${$g};" case - T_EVAL, // "$c = eval('return $this;');" case - ])) { - return true; - } - - if ($tokens[$i]->equals('$')) { - $nextIndex = $tokens->getNextMeaningfulToken($i); - - if ($tokens[$nextIndex]->isGivenKind(T_VARIABLE)) { - return true; // "$$a" case - } - } - - if ($tokens[$i]->equals([T_STRING, 'parent'], false)) { - return true; // parent:: case - } - } - - return false; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/UseArrowFunctionsFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/UseArrowFunctionsFixer.php deleted file mode 100644 index 6681386..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/UseArrowFunctionsFixer.php +++ /dev/null @@ -1,208 +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\Fixer\FunctionNotation; - -use PhpCsFixer\AbstractFixer; -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; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * @author Gregor Harlan - */ -final class UseArrowFunctionsFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Anonymous functions with one-liner return statement must use arrow functions.', - [ - new VersionSpecificCodeSample( - <<<'SAMPLE' -= 70400 && $tokens->isAllTokenKindsFound([T_FUNCTION, T_RETURN]); - } - - /** - * {@inheritdoc} - */ - public function isRisky(): bool - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $analyzer = new TokensAnalyzer($tokens); - - for ($index = $tokens->count() - 1; $index > 0; --$index) { - if (!$tokens[$index]->isGivenKind(T_FUNCTION) || !$analyzer->isLambda($index)) { - continue; - } - - // Find parameters end - // Abort if they are multilined - - $parametersStart = $tokens->getNextMeaningfulToken($index); - - if ($tokens[$parametersStart]->isGivenKind(CT::T_RETURN_REF)) { - $parametersStart = $tokens->getNextMeaningfulToken($parametersStart); - } - - $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 - - $next = $tokens->getNextMeaningfulToken($parametersEnd); - - $useStart = null; - $useEnd = null; - - if ($tokens[$next]->isGivenKind(CT::T_USE_LAMBDA)) { - $useStart = $next; - - if ($tokens[$useStart - 1]->isGivenKind(T_WHITESPACE)) { - --$useStart; - } - - $next = $tokens->getNextMeaningfulToken($next); - - while (!$tokens[$next]->equals(')')) { - if ($tokens[$next]->equals('&')) { - // variables used by reference are not supported by arrow functions - continue 2; - } - - $next = $tokens->getNextMeaningfulToken($next); - } - - $useEnd = $next; - $next = $tokens->getNextMeaningfulToken($next); - } - - // Find opening brace and following `return` - // Abort if there is more than whitespace between them (like comments) - - $braceOpen = $tokens[$next]->equals('{') ? $next : $tokens->getNextTokenOfKind($next, ['{']); - $return = $braceOpen + 1; - - if ($tokens[$return]->isGivenKind(T_WHITESPACE)) { - ++$return; - } - - if (!$tokens[$return]->isGivenKind(T_RETURN)) { - continue; - } - - // Find semicolon of `return` statement - - $semicolon = $tokens->getNextTokenOfKind($return, ['{', ';']); - - if (!$tokens[$semicolon]->equals(';')) { - continue; - } - - // Find closing brace - // Abort if there is more than whitespace between semicolon and closing brace - - $braceClose = $semicolon + 1; - - if ($tokens[$braceClose]->isGivenKind(T_WHITESPACE)) { - ++$braceClose; - } - - if (!$tokens[$braceClose]->equals('}')) { - 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 (false !== strpos($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, '=>'])]; - if ($tokens->getNextMeaningfulToken($return) === $semicolon) { - $tokensToInsert[] = new Token([T_WHITESPACE, ' ']); - $tokensToInsert[] = new Token([T_STRING, 'null']); - } - - $tokens->clearRange($semicolon, $braceClose); - - $tokens->clearRange($braceOpen + 1, $return); - - $tokens->overrideRange($braceOpen, $braceOpen, $tokensToInsert); - - if ($useStart) { - $tokens->clearRange($useStart, $useEnd); - } - - $tokens[$index] = new Token([T_FN, 'fn']); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/VoidReturnFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/VoidReturnFixer.php deleted file mode 100644 index 84ccdd5..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/VoidReturnFixer.php +++ /dev/null @@ -1,259 +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\Fixer\FunctionNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\DocBlock\Annotation; -use PhpCsFixer\DocBlock\DocBlock; -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; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * @author Mark Nielsen - */ -final class VoidReturnFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - 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.', - [ - new VersionSpecificCodeSample( - "= 70100 && $tokens->isTokenKindFound(T_FUNCTION); - } - - /** - * {@inheritdoc} - */ - public function isRisky(): bool - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - // These cause syntax errors. - static $excludedFunctions = [ - [T_STRING, '__construct'], - [T_STRING, '__destruct'], - [T_STRING, '__clone'], - [T_STRING, '__isset'], - [T_STRING, '__sleep'], - [T_STRING, '__serialize'], - [T_STRING, '__set_state'], - [T_STRING, '__debugInfo'], - ]; - - for ($index = $tokens->count() - 1; 0 <= $index; --$index) { - if (!$tokens[$index]->isGivenKind(T_FUNCTION)) { - continue; - } - - $functionName = $tokens->getNextMeaningfulToken($index); - if ($tokens[$functionName]->equalsAny($excludedFunctions, false)) { - continue; - } - - $startIndex = $tokens->getNextTokenOfKind($index, ['{', ';']); - - if ($this->hasReturnTypeHint($tokens, $startIndex)) { - continue; - } - - if ($tokens[$startIndex]->equals(';')) { - // No function body defined, fallback to PHPDoc. - if ($this->hasVoidReturnAnnotation($tokens, $index)) { - $this->fixFunctionDefinition($tokens, $startIndex); - } - - continue; - } - - if ($this->hasReturnAnnotation($tokens, $index)) { - continue; - } - - $endIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $startIndex); - - if ($this->hasVoidReturn($tokens, $startIndex, $endIndex)) { - $this->fixFunctionDefinition($tokens, $startIndex); - } - } - } - - /** - * Determine whether there is a non-void return annotation in the function's PHPDoc comment. - * - * @param int $index The index of the function token - */ - private function hasReturnAnnotation(Tokens $tokens, int $index): bool - { - foreach ($this->findReturnAnnotations($tokens, $index) as $return) { - if (['void'] !== $return->getTypes()) { - return true; - } - } - - return false; - } - - /** - * Determine whether there is a void return annotation in the function's PHPDoc comment. - * - * @param int $index The index of the function token - */ - private function hasVoidReturnAnnotation(Tokens $tokens, int $index): bool - { - foreach ($this->findReturnAnnotations($tokens, $index) as $return) { - if (['void'] === $return->getTypes()) { - return true; - } - } - - return false; - } - - /** - * Determine whether the function already has a return type hint. - * - * @param int $index The index of the end of the function definition line, EG at { or ; - */ - private function hasReturnTypeHint(Tokens $tokens, int $index): bool - { - $endFuncIndex = $tokens->getPrevTokenOfKind($index, [')']); - $nextIndex = $tokens->getNextMeaningfulToken($endFuncIndex); - - return $tokens[$nextIndex]->isGivenKind(CT::T_TYPE_COLON); - } - - /** - * Determine whether the function has a void return. - * - * @param int $startIndex Start of function body - * @param int $endIndex End of function body - */ - private function hasVoidReturn(Tokens $tokens, int $startIndex, int $endIndex): bool - { - $tokensAnalyzer = new TokensAnalyzer($tokens); - - for ($i = $startIndex; $i < $endIndex; ++$i) { - if ( - // skip anonymous classes - ($tokens[$i]->isGivenKind(T_CLASS) && $tokensAnalyzer->isAnonymousClass($i)) - // skip lambda functions - || ($tokens[$i]->isGivenKind(T_FUNCTION) && $tokensAnalyzer->isLambda($i)) - ) { - $i = $tokens->getNextTokenOfKind($i, ['{']); - $i = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $i); - - continue; - } - - if ($tokens[$i]->isGivenKind([T_YIELD, T_YIELD_FROM])) { - return false; // Generators cannot return void. - } - - if (!$tokens[$i]->isGivenKind(T_RETURN)) { - continue; - } - - $i = $tokens->getNextMeaningfulToken($i); - if (!$tokens[$i]->equals(';')) { - return false; - } - } - - return true; - } - - /** - * @param int $index The index of the end of the function definition line, EG at { or ; - */ - private function fixFunctionDefinition(Tokens $tokens, int $index): void - { - $endFuncIndex = $tokens->getPrevTokenOfKind($index, [')']); - $tokens->insertAt($endFuncIndex + 1, [ - new Token([CT::T_TYPE_COLON, ':']), - new Token([T_WHITESPACE, ' ']), - new Token([T_STRING, 'void']), - ]); - } - - /** - * Find all the return annotations in the function's PHPDoc comment. - * - * @param int $index The index of the function token - * - * @return Annotation[] - */ - private function findReturnAnnotations(Tokens $tokens, int $index): array - { - do { - $index = $tokens->getPrevNonWhitespace($index); - } while ($tokens[$index]->isGivenKind([ - T_ABSTRACT, - T_FINAL, - T_PRIVATE, - T_PROTECTED, - T_PUBLIC, - T_STATIC, - ])); - - if (!$tokens[$index]->isGivenKind(T_DOC_COMMENT)) { - return []; - } - - $doc = new DocBlock($tokens[$index]->getContent()); - - return $doc->getAnnotationsOfType('return'); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/FullyQualifiedStrictTypesFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/FullyQualifiedStrictTypesFixer.php deleted file mode 100644 index f03276c..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/FullyQualifiedStrictTypesFixer.php +++ /dev/null @@ -1,206 +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\Fixer\Import; - -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\Analyzer\Analysis\TypeAnalysis; -use PhpCsFixer\Tokenizer\Analyzer\FunctionsAnalyzer; -use PhpCsFixer\Tokenizer\Analyzer\NamespacesAnalyzer; -use PhpCsFixer\Tokenizer\Analyzer\NamespaceUsesAnalyzer; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Generator\NamespacedStringTokenGenerator; -use PhpCsFixer\Tokenizer\Resolver\TypeShortNameResolver; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author VeeWee - */ -final class FullyQualifiedStrictTypesFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Transforms imported FQCN parameters and return types in function arguments to short version.', - [ - new CodeSample( - 'isTokenKindFound(T_FUNCTION) && ( - \count((new NamespacesAnalyzer())->getDeclarations($tokens)) - || \count((new NamespaceUsesAnalyzer())->getDeclarationsFromTokens($tokens)) - ); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $lastIndex = $tokens->count() - 1; - - for ($index = $lastIndex; $index >= 0; --$index) { - if (!$tokens[$index]->isGivenKind(T_FUNCTION)) { - continue; - } - - // Return types are only available since PHP 7.0 - $this->fixFunctionReturnType($tokens, $index); - $this->fixFunctionArguments($tokens, $index); - } - } - - private function fixFunctionArguments(Tokens $tokens, int $index): void - { - $arguments = (new FunctionsAnalyzer())->getFunctionArguments($tokens, $index); - - foreach ($arguments as $argument) { - if (!$argument->hasTypeAnalysis()) { - continue; - } - - $this->detectAndReplaceTypeWithShortType($tokens, $argument->getTypeAnalysis()); - } - } - - private function fixFunctionReturnType(Tokens $tokens, int $index): void - { - if (\PHP_VERSION_ID < 70000) { - return; - } - - $returnType = (new FunctionsAnalyzer())->getFunctionReturnType($tokens, $index); - if (!$returnType) { - return; - } - - $this->detectAndReplaceTypeWithShortType($tokens, $returnType); - } - - private function detectAndReplaceTypeWithShortType( - Tokens $tokens, - TypeAnalysis $type - ): void { - if ($type->isReservedType()) { - return; - } - - $typeStartIndex = $type->getStartIndex(); - if ($tokens[$typeStartIndex]->isGivenKind(CT::T_NULLABLE_TYPE)) { - $typeStartIndex = $tokens->getNextMeaningfulToken($typeStartIndex); - } - - foreach ($this->getSimpleTypes($tokens, $typeStartIndex, $type->getEndIndex()) as $simpleType) { - $typeName = $tokens->generatePartialCode($simpleType['start'], $simpleType['end']); - - if (0 !== strpos($typeName, '\\')) { - continue; - } - - $shortType = (new TypeShortNameResolver())->resolve($tokens, $typeName); - if ($shortType === $typeName) { - continue; - } - - $shortType = (new NamespacedStringTokenGenerator())->generate($shortType); - - $tokens->overrideRange( - $simpleType['start'], - $simpleType['end'], - $shortType - ); - } - } - - /** - * @return \Generator> - */ - private function getSimpleTypes(Tokens $tokens, int $startIndex, int $endIndex): iterable - { - $index = $startIndex; - - while (true) { - $prevIndex = $index; - $index = $tokens->getNextMeaningfulToken($index); - - if (null === $startIndex) { - $startIndex = $index; - } - - if ($index >= $endIndex) { - yield ['start' => $startIndex, 'end' => $index]; - - break; - } - - if ($tokens[$index]->isGivenKind(CT::T_TYPE_ALTERNATION)) { - yield ['start' => $startIndex, 'end' => $prevIndex]; - $startIndex = null; - } - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/GlobalNamespaceImportFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/GlobalNamespaceImportFixer.php deleted file mode 100644 index 198ecd1..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/GlobalNamespaceImportFixer.php +++ /dev/null @@ -1,745 +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\Fixer\Import; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\DocBlock\Annotation; -use PhpCsFixer\DocBlock\DocBlock; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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\NamespaceUseAnalysis; -use PhpCsFixer\Tokenizer\Analyzer\ClassyAnalyzer; -use PhpCsFixer\Tokenizer\Analyzer\FunctionsAnalyzer; -use PhpCsFixer\Tokenizer\Analyzer\NamespacesAnalyzer; -use PhpCsFixer\Tokenizer\Analyzer\NamespaceUsesAnalyzer; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * @author Gregor Harlan - */ -final class GlobalNamespaceImportFixer extends AbstractFixer implements ConfigurableFixerInterface, WhitespacesAwareFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Imports or fully qualifies global classes/functions/constants.', - [ - new CodeSample( - ' true, 'import_constants' => true, 'import_functions' => true] - ), - new CodeSample( - ' false, 'import_constants' => false, 'import_functions' => false] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run before NoUnusedImportsFixer, OrderedImportsFixer. - * Must run after NativeConstantInvocationFixer, NativeFunctionInvocationFixer. - */ - public function getPriority(): int - { - return 0; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isAnyTokenKindsFound([T_DOC_COMMENT, T_NS_SEPARATOR, T_USE]) - && $tokens->isTokenKindFound(T_NAMESPACE) - && 1 === $tokens->countTokenKind(T_NAMESPACE) - && $tokens->isMonolithicPhp(); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $namespaceAnalyses = (new NamespacesAnalyzer())->getDeclarations($tokens); - - if (1 !== \count($namespaceAnalyses) || '' === $namespaceAnalyses[0]->getFullName()) { - return; - } - - $useDeclarations = (new NamespaceUsesAnalyzer())->getDeclarationsFromTokens($tokens); - - $newImports = []; - - if (true === $this->configuration['import_constants']) { - $newImports['const'] = $this->importConstants($tokens, $useDeclarations); - } elseif (false === $this->configuration['import_constants']) { - $this->fullyQualifyConstants($tokens, $useDeclarations); - } - - if (true === $this->configuration['import_functions']) { - $newImports['function'] = $this->importFunctions($tokens, $useDeclarations); - } elseif (false === $this->configuration['import_functions']) { - $this->fullyQualifyFunctions($tokens, $useDeclarations); - } - - if (true === $this->configuration['import_classes']) { - $newImports['class'] = $this->importClasses($tokens, $useDeclarations); - } elseif (false === $this->configuration['import_classes']) { - $this->fullyQualifyClasses($tokens, $useDeclarations); - } - - $newImports = array_filter($newImports); - - if ($newImports) { - $this->insertImports($tokens, $newImports, $useDeclarations); - } - } - - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('import_constants', 'Whether to import, not import or ignore global constants.')) - ->setDefault(null) - ->setAllowedValues([true, false, null]) - ->getOption(), - (new FixerOptionBuilder('import_functions', 'Whether to import, not import or ignore global functions.')) - ->setDefault(null) - ->setAllowedValues([true, false, null]) - ->getOption(), - (new FixerOptionBuilder('import_classes', 'Whether to import, not import or ignore global classes.')) - ->setDefault(true) - ->setAllowedValues([true, false, null]) - ->getOption(), - ]); - } - - /** - * @param NamespaceUseAnalysis[] $useDeclarations - */ - private function importConstants(Tokens $tokens, array $useDeclarations): array - { - [$global, $other] = $this->filterUseDeclarations($useDeclarations, static function (NamespaceUseAnalysis $declaration) { - return $declaration->isConstant(); - }, true); - - // find namespaced const declarations (`const FOO = 1`) - // and add them to the not importable names (already used) - for ($index = 0, $count = $tokens->count(); $index < $count; ++$index) { - $token = $tokens[$index]; - - if ($token->isClassy()) { - $index = $tokens->getNextTokenOfKind($index, ['{']); - $index = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $index); - - continue; - } - - if (!$token->isGivenKind(T_CONST)) { - continue; - } - - $index = $tokens->getNextMeaningfulToken($index); - $other[$tokens[$index]->getContent()] = true; - } - - $analyzer = new TokensAnalyzer($tokens); - - $indexes = []; - - for ($index = $tokens->count() - 1; $index >= 0; --$index) { - $token = $tokens[$index]; - - if (!$token->isGivenKind(T_STRING)) { - continue; - } - - $name = $token->getContent(); - - if (isset($other[$name])) { - continue; - } - - if (!$analyzer->isConstantInvocation($index)) { - continue; - } - - $nsSeparatorIndex = $tokens->getPrevMeaningfulToken($index); - if (!$tokens[$nsSeparatorIndex]->isGivenKind(T_NS_SEPARATOR)) { - if (!isset($global[$name])) { - // found an unqualified constant invocation - // add it to the not importable names (already used) - $other[$name] = true; - } - - continue; - } - - $prevIndex = $tokens->getPrevMeaningfulToken($nsSeparatorIndex); - if ($tokens[$prevIndex]->isGivenKind([CT::T_NAMESPACE_OPERATOR, T_STRING])) { - continue; - } - - $indexes[] = $index; - } - - return $this->prepareImports($tokens, $indexes, $global, $other, true); - } - - /** - * @param NamespaceUseAnalysis[] $useDeclarations - */ - private function importFunctions(Tokens $tokens, array $useDeclarations): array - { - [$global, $other] = $this->filterUseDeclarations($useDeclarations, static function (NamespaceUseAnalysis $declaration) { - return $declaration->isFunction(); - }, false); - - // find function declarations - // and add them to the not importable names (already used) - foreach ($this->findFunctionDeclarations($tokens, 0, $tokens->count() - 1) as $name) { - $other[strtolower($name)] = true; - } - - $analyzer = new FunctionsAnalyzer(); - - $indexes = []; - - for ($index = $tokens->count() - 1; $index >= 0; --$index) { - $token = $tokens[$index]; - - if (!$token->isGivenKind(T_STRING)) { - continue; - } - - $name = strtolower($token->getContent()); - - if (isset($other[$name])) { - continue; - } - - if (!$analyzer->isGlobalFunctionCall($tokens, $index)) { - continue; - } - - $nsSeparatorIndex = $tokens->getPrevMeaningfulToken($index); - if (!$tokens[$nsSeparatorIndex]->isGivenKind(T_NS_SEPARATOR)) { - if (!isset($global[$name])) { - $other[$name] = true; - } - - continue; - } - - $indexes[] = $index; - } - - return $this->prepareImports($tokens, $indexes, $global, $other, false); - } - - /** - * @param NamespaceUseAnalysis[] $useDeclarations - */ - private function importClasses(Tokens $tokens, array $useDeclarations): array - { - [$global, $other] = $this->filterUseDeclarations($useDeclarations, static function (NamespaceUseAnalysis $declaration) { - return $declaration->isClass(); - }, false); - - /** @var DocBlock[] $docBlocks */ - $docBlocks = []; - - // find class declarations and class usages in docblocks - // and add them to the not importable names (already used) - for ($index = 0, $count = $tokens->count(); $index < $count; ++$index) { - $token = $tokens[$index]; - - if ($token->isGivenKind(T_DOC_COMMENT)) { - $docBlocks[$index] = new DocBlock($token->getContent()); - - $this->traverseDocBlockTypes($docBlocks[$index], static function (string $type) use ($global, &$other): void { - if (false !== strpos($type, '\\')) { - return; - } - - $name = strtolower($type); - - if (!isset($global[$name])) { - $other[$name] = true; - } - }); - } - - if (!$token->isClassy()) { - continue; - } - - $index = $tokens->getNextMeaningfulToken($index); - - if ($tokens[$index]->isGivenKind(T_STRING)) { - $other[strtolower($tokens[$index]->getContent())] = true; - } - } - - $analyzer = new ClassyAnalyzer(); - - $indexes = []; - - for ($index = $tokens->count() - 1; $index >= 0; --$index) { - $token = $tokens[$index]; - - if (!$token->isGivenKind(T_STRING)) { - continue; - } - - $name = strtolower($token->getContent()); - - if (isset($other[$name])) { - continue; - } - - if (!$analyzer->isClassyInvocation($tokens, $index)) { - continue; - } - - $nsSeparatorIndex = $tokens->getPrevMeaningfulToken($index); - if (!$tokens[$nsSeparatorIndex]->isGivenKind(T_NS_SEPARATOR)) { - if (!isset($global[$name])) { - $other[$name] = true; - } - - continue; - } - - if ($tokens[$tokens->getPrevMeaningfulToken($nsSeparatorIndex)]->isGivenKind([CT::T_NAMESPACE_OPERATOR, T_STRING])) { - continue; - } - - $indexes[] = $index; - } - - $imports = []; - - foreach ($docBlocks as $index => $docBlock) { - $changed = $this->traverseDocBlockTypes($docBlock, static function (string $type) use ($global, $other, &$imports) { - if ('\\' !== $type[0]) { - return $type; - } - - $name = substr($type, 1); - $checkName = strtolower($name); - - if (false !== strpos($checkName, '\\') || isset($other[$checkName])) { - return $type; - } - - if (isset($global[$checkName])) { - return \is_string($global[$checkName]) ? $global[$checkName] : $name; - } - - $imports[$checkName] = $name; - - return $name; - }); - - if ($changed) { - $tokens[$index] = new Token([T_DOC_COMMENT, $docBlock->getContent()]); - } - } - - return $imports + $this->prepareImports($tokens, $indexes, $global, $other, false); - } - - /** - * Removes the leading slash at the given indexes (when the name is not already used). - * - * @param int[] $indexes - * - * @return array array keys contain the names that must be imported - */ - private function prepareImports(Tokens $tokens, array $indexes, array $global, array $other, bool $caseSensitive): array - { - $imports = []; - - foreach ($indexes as $index) { - $name = $tokens[$index]->getContent(); - $checkName = $caseSensitive ? $name : strtolower($name); - - if (isset($other[$checkName])) { - continue; - } - - if (!isset($global[$checkName])) { - $imports[$checkName] = $name; - } elseif (\is_string($global[$checkName])) { - $tokens[$index] = new Token([T_STRING, $global[$checkName]]); - } - - $tokens->clearAt($tokens->getPrevMeaningfulToken($index)); - } - - return $imports; - } - - /** - * @param NamespaceUseAnalysis[] $useDeclarations - */ - private function insertImports(Tokens $tokens, array $imports, array $useDeclarations): void - { - if ($useDeclarations) { - $useDeclaration = end($useDeclarations); - $index = $useDeclaration->getEndIndex() + 1; - } else { - $namespace = (new NamespacesAnalyzer())->getDeclarations($tokens)[0]; - $index = $namespace->getEndIndex() + 1; - } - - $lineEnding = $this->whitespacesConfig->getLineEnding(); - - if (!$tokens[$index]->isWhitespace() || false === strpos($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 - */ - private function fullyQualifyConstants(Tokens $tokens, array $useDeclarations): void - { - if (!$tokens->isTokenKindFound(CT::T_CONST_IMPORT)) { - return; - } - - [$global] = $this->filterUseDeclarations($useDeclarations, static function (NamespaceUseAnalysis $declaration) { - return $declaration->isConstant() && !$declaration->isAliased(); - }, true); - - if (!$global) { - return; - } - - $analyzer = new TokensAnalyzer($tokens); - - for ($index = $tokens->count() - 1; $index >= 0; --$index) { - $token = $tokens[$index]; - - if (!$token->isGivenKind(T_STRING)) { - continue; - } - - if (!isset($global[$token->getContent()])) { - continue; - } - - if ($tokens[$tokens->getPrevMeaningfulToken($index)]->isGivenKind(T_NS_SEPARATOR)) { - continue; - } - - if (!$analyzer->isConstantInvocation($index)) { - continue; - } - - $tokens->insertAt($index, new Token([T_NS_SEPARATOR, '\\'])); - } - } - - /** - * @param NamespaceUseAnalysis[] $useDeclarations - */ - private function fullyQualifyFunctions(Tokens $tokens, array $useDeclarations): void - { - if (!$tokens->isTokenKindFound(CT::T_FUNCTION_IMPORT)) { - return; - } - - [$global] = $this->filterUseDeclarations($useDeclarations, static function (NamespaceUseAnalysis $declaration) { - return $declaration->isFunction() && !$declaration->isAliased(); - }, false); - - if (!$global) { - return; - } - - $analyzer = new FunctionsAnalyzer(); - - for ($index = $tokens->count() - 1; $index >= 0; --$index) { - $token = $tokens[$index]; - - if (!$token->isGivenKind(T_STRING)) { - continue; - } - - if (!isset($global[strtolower($token->getContent())])) { - continue; - } - - if ($tokens[$tokens->getPrevMeaningfulToken($index)]->isGivenKind(T_NS_SEPARATOR)) { - continue; - } - - if (!$analyzer->isGlobalFunctionCall($tokens, $index)) { - continue; - } - - $tokens->insertAt($index, new Token([T_NS_SEPARATOR, '\\'])); - } - } - - /** - * @param NamespaceUseAnalysis[] $useDeclarations - */ - private function fullyQualifyClasses(Tokens $tokens, array $useDeclarations): void - { - if (!$tokens->isTokenKindFound(T_USE)) { - return; - } - - [$global] = $this->filterUseDeclarations($useDeclarations, static function (NamespaceUseAnalysis $declaration) { - return $declaration->isClass() && !$declaration->isAliased(); - }, false); - - if (!$global) { - return; - } - - $analyzer = new ClassyAnalyzer(); - - for ($index = $tokens->count() - 1; $index >= 0; --$index) { - $token = $tokens[$index]; - - if ($token->isGivenKind(T_DOC_COMMENT)) { - $doc = new DocBlock($token->getContent()); - - $changed = $this->traverseDocBlockTypes($doc, static function (string $type) use ($global) { - if (!isset($global[strtolower($type)])) { - return $type; - } - - return '\\'.$type; - }); - - if ($changed) { - $tokens[$index] = new Token([T_DOC_COMMENT, $doc->getContent()]); - } - - continue; - } - - if (!$token->isGivenKind(T_STRING)) { - continue; - } - - if (!isset($global[strtolower($token->getContent())])) { - continue; - } - - if ($tokens[$tokens->getPrevMeaningfulToken($index)]->isGivenKind(T_NS_SEPARATOR)) { - continue; - } - - if (!$analyzer->isClassyInvocation($tokens, $index)) { - continue; - } - - $tokens->insertAt($index, new Token([T_NS_SEPARATOR, '\\'])); - } - } - - /** - * @param NamespaceUseAnalysis[] $declarations - */ - private function filterUseDeclarations(array $declarations, callable $callback, bool $caseSensitive): array - { - $global = []; - $other = []; - - foreach ($declarations as $declaration) { - if (!$callback($declaration)) { - continue; - } - - $fullName = ltrim($declaration->getFullName(), '\\'); - - if (false !== strpos($fullName, '\\')) { - $name = $caseSensitive ? $declaration->getShortName() : strtolower($declaration->getShortName()); - $other[$name] = true; - - continue; - } - - $checkName = $caseSensitive ? $fullName : strtolower($fullName); - $alias = $declaration->getShortName(); - $global[$checkName] = $alias === $fullName ? true : $alias; - } - - return [$global, $other]; - } - - private function findFunctionDeclarations(Tokens $tokens, int $start, int $end): iterable - { - for ($index = $start; $index <= $end; ++$index) { - $token = $tokens[$index]; - - if ($token->isClassy()) { - $classStart = $tokens->getNextTokenOfKind($index, ['{']); - $classEnd = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $classStart); - - for ($index = $classStart; $index <= $classEnd; ++$index) { - if (!$tokens[$index]->isGivenKind(T_FUNCTION)) { - continue; - } - - $methodStart = $tokens->getNextTokenOfKind($index, ['{', ';']); - - if ($tokens[$methodStart]->equals(';')) { - $index = $methodStart; - - continue; - } - - $methodEnd = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $methodStart); - - foreach ($this->findFunctionDeclarations($tokens, $methodStart, $methodEnd) as $function) { - yield $function; - } - - $index = $methodEnd; - } - - continue; - } - - if (!$token->isGivenKind(T_FUNCTION)) { - continue; - } - - $index = $tokens->getNextMeaningfulToken($index); - - if ($tokens[$index]->isGivenKind(CT::T_RETURN_REF)) { - $index = $tokens->getNextMeaningfulToken($index); - } - - if ($tokens[$index]->isGivenKind(T_STRING)) { - yield $tokens[$index]->getContent(); - } - } - } - - private function traverseDocBlockTypes(DocBlock $doc, callable $callback): bool - { - $annotations = $doc->getAnnotationsOfType(Annotation::getTagsWithTypes()); - - if (!$annotations) { - return false; - } - - $changed = false; - - foreach ($annotations as $annotation) { - $types = $new = $annotation->getTypes(); - - foreach ($types as $i => $fullType) { - $newFullType = $fullType; - - Preg::matchAll('/[\\\\\w]+/', $fullType, $matches, PREG_OFFSET_CAPTURE); - - foreach (array_reverse($matches[0]) as [$type, $offset]) { - $newType = $callback($type); - - if (null !== $newType && $type !== $newType) { - $newFullType = substr_replace($newFullType, $newType, $offset, \strlen($type)); - } - } - - $new[$i] = $newFullType; - } - - if ($types !== $new) { - $annotation->setTypes($new); - $changed = true; - } - } - - return $changed; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/GroupImportFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/GroupImportFixer.php deleted file mode 100644 index 7d5e364..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/GroupImportFixer.php +++ /dev/null @@ -1,282 +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\Fixer\Import; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\FixerDefinition\VersionSpecification; -use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample; -use PhpCsFixer\Tokenizer\Analyzer\Analysis\NamespaceUseAnalysis; -use PhpCsFixer\Tokenizer\Analyzer\NamespaceUsesAnalyzer; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Volodymyr Kupriienko - */ -final class GroupImportFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'There MUST be group use for the same namespaces.', - [ - new VersionSpecificCodeSample( - "= 70000 && $tokens->isTokenKindFound(T_USE); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $useWithSameNamespaces = $this->getSameNamespaces($tokens); - - if ([] === $useWithSameNamespaces) { - return; - } - - $this->removeSingleUseStatements($useWithSameNamespaces, $tokens); - $this->addGroupUseStatements($useWithSameNamespaces, $tokens); - } - - /** - * Gets namespace use analyzers with same namespaces. - * - * @return NamespaceUseAnalysis[] - */ - private function getSameNamespaces(Tokens $tokens): array - { - $useDeclarations = (new NamespaceUsesAnalyzer())->getDeclarationsFromTokens($tokens); - - if (0 === \count($useDeclarations)) { - return []; - } - - $allNamespaceAndType = array_map( - function (NamespaceUseAnalysis $useDeclaration) { - return $this->getNamespaceNameWithSlash($useDeclaration).$useDeclaration->getType(); - }, - $useDeclarations - ); - - $sameNamespaces = array_filter(array_count_values($allNamespaceAndType), function (int $count) { - return $count > 1; - }); - $sameNamespaces = array_keys($sameNamespaces); - - $sameNamespaceAnalysis = array_filter($useDeclarations, function (NamespaceUseAnalysis $useDeclaration) use ($sameNamespaces) { - $namespaceNameAndType = $this->getNamespaceNameWithSlash($useDeclaration).$useDeclaration->getType(); - - return \in_array($namespaceNameAndType, $sameNamespaces, true); - }); - - usort($sameNamespaceAnalysis, function (NamespaceUseAnalysis $a, NamespaceUseAnalysis $b) { - $namespaceA = $this->getNamespaceNameWithSlash($a); - $namespaceB = $this->getNamespaceNameWithSlash($b); - - return \strlen($namespaceA) - \strlen($namespaceB) ?: strcmp($a->getFullName(), $b->getFullName()); - }); - - return $sameNamespaceAnalysis; - } - - /** - * @param NamespaceUseAnalysis[] $statements - */ - private function removeSingleUseStatements(array $statements, Tokens $tokens): void - { - foreach ($statements as $useDeclaration) { - $index = $useDeclaration->getStartIndex(); - $endIndex = $useDeclaration->getEndIndex(); - - $useStatementTokens = [T_USE, T_WHITESPACE, T_STRING, T_NS_SEPARATOR, T_AS, CT::T_CONST_IMPORT, CT::T_FUNCTION_IMPORT]; - - while ($index !== $endIndex) { - if ($tokens[$index]->isGivenKind($useStatementTokens)) { - $tokens->clearAt($index); - } - - ++$index; - } - - if (isset($tokens[$index]) && $tokens[$index]->equals(';')) { - $tokens->clearAt($index); - } - - ++$index; - - if (isset($tokens[$index]) && $tokens[$index]->isGivenKind(T_WHITESPACE)) { - $tokens->clearAt($index); - } - } - } - - /** - * @param NamespaceUseAnalysis[] $statements - */ - private function addGroupUseStatements(array $statements, Tokens $tokens): void - { - $currentUseDeclaration = null; - $insertIndex = \array_slice($statements, -1)[0]->getEndIndex() + 1; - - foreach ($statements as $index => $useDeclaration) { - if ($this->areDeclarationsDifferent($currentUseDeclaration, $useDeclaration)) { - $currentUseDeclaration = $useDeclaration; - $insertIndex += $this->createNewGroup( - $tokens, - $insertIndex, - $useDeclaration, - $this->getNamespaceNameWithSlash($currentUseDeclaration) - ); - } else { - $newTokens = [ - new Token(','), - new Token([T_WHITESPACE, ' ']), - ]; - - if ($useDeclaration->isAliased()) { - $tokens->insertAt($insertIndex, $newTokens); - $insertIndex += \count($newTokens); - $newTokens = []; - - $insertIndex += $this->insertToGroupUseWithAlias($tokens, $insertIndex, $useDeclaration); - } - - $newTokens[] = new Token([T_STRING, $useDeclaration->getShortName()]); - - if (!isset($statements[$index + 1]) || $this->areDeclarationsDifferent($currentUseDeclaration, $statements[$index + 1])) { - $newTokens[] = new Token([CT::T_GROUP_IMPORT_BRACE_CLOSE, '}']); - $newTokens[] = new Token(';'); - $newTokens[] = new Token([T_WHITESPACE, "\n"]); - } - - $tokens->insertAt($insertIndex, $newTokens); - $insertIndex += \count($newTokens); - } - } - } - - private function getNamespaceNameWithSlash(NamespaceUseAnalysis $useDeclaration): string - { - $position = strrpos($useDeclaration->getFullName(), '\\'); - if (false === $position || 0 === $position) { - return $useDeclaration->getFullName(); - } - - return substr($useDeclaration->getFullName(), 0, $position + 1); - } - - /** - * Insert use with alias to the group. - */ - private function insertToGroupUseWithAlias(Tokens $tokens, int $insertIndex, NamespaceUseAnalysis $useDeclaration): int - { - $newTokens = [ - new Token([T_STRING, substr($useDeclaration->getFullName(), strripos($useDeclaration->getFullName(), '\\') + 1)]), - new Token([T_WHITESPACE, ' ']), - new Token([T_AS, 'as']), - new Token([T_WHITESPACE, ' ']), - ]; - - $tokens->insertAt($insertIndex, $newTokens); - - return \count($newTokens) + 1; - } - - /** - * Creates new use statement group. - */ - private function createNewGroup(Tokens $tokens, int $insertIndex, NamespaceUseAnalysis $useDeclaration, string $currentNamespace): int - { - $insertedTokens = 0; - - if (\count($tokens) === $insertIndex) { - $tokens->setSize($insertIndex + 1); - } - - $newTokens = [ - new Token([T_USE, 'use']), - new Token([T_WHITESPACE, ' ']), - ]; - - if ($useDeclaration->isFunction() || $useDeclaration->isConstant()) { - $importStatementParams = $useDeclaration->isFunction() - ? [CT::T_FUNCTION_IMPORT, 'function'] - : [CT::T_CONST_IMPORT, 'const']; - - $newTokens[] = new Token($importStatementParams); - $newTokens[] = new Token([T_WHITESPACE, ' ']); - } - - $namespaceParts = array_filter(explode('\\', $currentNamespace)); - - foreach ($namespaceParts as $part) { - $newTokens[] = new Token([T_STRING, $part]); - $newTokens[] = new Token([T_NS_SEPARATOR, '\\']); - } - - $newTokens[] = new Token([CT::T_GROUP_IMPORT_BRACE_OPEN, '{']); - - $newTokensCount = \count($newTokens); - $tokens->insertAt($insertIndex, $newTokens); - $insertedTokens += $newTokensCount; - - $insertIndex += $newTokensCount; - - if ($useDeclaration->isAliased()) { - $inserted = $this->insertToGroupUseWithAlias($tokens, $insertIndex + 1, $useDeclaration); - $insertedTokens += $inserted; - $insertIndex += $inserted; - } - - $tokens->insertAt($insertIndex, new Token([T_STRING, $useDeclaration->getShortName()])); - ++$insertedTokens; - - return $insertedTokens; - } - - /** - * Check if namespace use analyses are different. - */ - private function areDeclarationsDifferent(?NamespaceUseAnalysis $analysis1, ?NamespaceUseAnalysis $analysis2): bool - { - if (null === $analysis1 || null === $analysis2) { - return true; - } - - $namespaceName1 = $this->getNamespaceNameWithSlash($analysis1); - $namespaceName2 = $this->getNamespaceNameWithSlash($analysis2); - - return $namespaceName1 !== $namespaceName2 || $analysis1->getType() !== $analysis2->getType(); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/NoLeadingImportSlashFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/NoLeadingImportSlashFixer.php deleted file mode 100644 index 86f5c67..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/NoLeadingImportSlashFixer.php +++ /dev/null @@ -1,99 +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\Fixer\Import; - -use PhpCsFixer\AbstractFixer; -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; - -/** - * @author Carlos Cirello - */ -final class NoLeadingImportSlashFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Remove leading slashes in `use` clauses.', - [new CodeSample("isTokenKindFound(T_USE); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $tokensAnalyzer = new TokensAnalyzer($tokens); - $usesIndexes = $tokensAnalyzer->getImportUseIndexes(); - - foreach ($usesIndexes as $idx) { - $nextTokenIdx = $tokens->getNextMeaningfulToken($idx); - $nextToken = $tokens[$nextTokenIdx]; - - if ($nextToken->isGivenKind(T_NS_SEPARATOR)) { - $this->removeLeadingImportSlash($tokens, $nextTokenIdx); - } elseif ($nextToken->isGivenKind([CT::T_FUNCTION_IMPORT, CT::T_CONST_IMPORT])) { - $nextTokenIdx = $tokens->getNextMeaningfulToken($nextTokenIdx); - if ($tokens[$nextTokenIdx]->isGivenKind(T_NS_SEPARATOR)) { - $this->removeLeadingImportSlash($tokens, $nextTokenIdx); - } - } - } - } - - private function removeLeadingImportSlash(Tokens $tokens, int $index): void - { - $previousIndex = $tokens->getPrevNonWhitespace($index); - - if ( - $previousIndex < $index - 1 - || $tokens[$previousIndex]->isComment() - ) { - $tokens->clearAt($index); - - return; - } - - $tokens[$index] = new Token([T_WHITESPACE, ' ']); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/NoUnusedImportsFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/NoUnusedImportsFixer.php deleted file mode 100644 index 9142123..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/NoUnusedImportsFixer.php +++ /dev/null @@ -1,286 +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\Fixer\Import; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Analyzer\Analysis\NamespaceAnalysis; -use PhpCsFixer\Tokenizer\Analyzer\Analysis\NamespaceUseAnalysis; -use PhpCsFixer\Tokenizer\Analyzer\GotoLabelAnalyzer; -use PhpCsFixer\Tokenizer\Analyzer\NamespacesAnalyzer; -use PhpCsFixer\Tokenizer\Analyzer\NamespaceUsesAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * @author Dariusz Rumiński - */ -final class NoUnusedImportsFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Unused `use` statements must be removed.', - [new CodeSample("isTokenKindFound(T_USE); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $useDeclarations = (new NamespaceUsesAnalyzer())->getDeclarationsFromTokens($tokens); - - if (0 === \count($useDeclarations)) { - return; - } - - foreach ((new NamespacesAnalyzer())->getDeclarations($tokens) as $namespace) { - $currentNamespaceUseDeclarations = []; - $currentNamespaceUseDeclarationIndexes = []; - - foreach ($useDeclarations as $useDeclaration) { - if ($useDeclaration->getStartIndex() >= $namespace->getScopeStartIndex() && $useDeclaration->getEndIndex() <= $namespace->getScopeEndIndex()) { - $currentNamespaceUseDeclarations[] = $useDeclaration; - $currentNamespaceUseDeclarationIndexes[$useDeclaration->getStartIndex()] = $useDeclaration->getEndIndex(); - } - } - - foreach ($currentNamespaceUseDeclarations as $useDeclaration) { - if (!$this->isImportUsed($tokens, $namespace, $useDeclaration, $currentNamespaceUseDeclarationIndexes)) { - $this->removeUseDeclaration($tokens, $useDeclaration); - } - } - - $this->removeUsesInSameNamespace($tokens, $currentNamespaceUseDeclarations, $namespace); - } - } - - /** - * @param array $ignoredIndexes indexes of the use statements themselves that should not be checked as being "used" - */ - private function isImportUsed(Tokens $tokens, NamespaceAnalysis $namespace, NamespaceUseAnalysis $import, array $ignoredIndexes): bool - { - $analyzer = new TokensAnalyzer($tokens); - $gotoLabelAnalyzer = new GotoLabelAnalyzer(); - - $tokensNotBeforeFunctionCall = [T_NEW]; - // @TODO: drop condition when PHP 8.0+ is required - if (\defined('T_ATTRIBUTE')) { - $tokensNotBeforeFunctionCall[] = T_ATTRIBUTE; - } - - $namespaceEndIndex = $namespace->getScopeEndIndex(); - for ($index = $namespace->getScopeStartIndex(); $index <= $namespaceEndIndex; ++$index) { - if (isset($ignoredIndexes[$index])) { - $index = $ignoredIndexes[$index]; - - continue; - } - - $token = $tokens[$index]; - - if ($token->isGivenKind(T_STRING)) { - if (0 !== strcasecmp($import->getShortName(), $token->getContent())) { - continue; - } - - $prevMeaningfulToken = $tokens[$tokens->getPrevMeaningfulToken($index)]; - - if ($prevMeaningfulToken->isGivenKind(T_NAMESPACE)) { - $index = $tokens->getNextTokenOfKind($index, [';', '{', [T_CLOSE_TAG]]); - - continue; - } - - if ( - $prevMeaningfulToken->isGivenKind([T_NS_SEPARATOR, T_FUNCTION, T_CONST, T_DOUBLE_COLON]) - || $prevMeaningfulToken->isObjectOperator() - ) { - continue; - } - - $nextMeaningfulIndex = $tokens->getNextMeaningfulToken($index); - - if ($gotoLabelAnalyzer->belongsToGoToLabel($tokens, $nextMeaningfulIndex)) { - continue; - } - - $nextMeaningfulToken = $tokens[$nextMeaningfulIndex]; - - if ($analyzer->isConstantInvocation($index)) { - $type = NamespaceUseAnalysis::TYPE_CONSTANT; - } elseif ($nextMeaningfulToken->equals('(') && !$prevMeaningfulToken->isGivenKind($tokensNotBeforeFunctionCall)) { - $type = NamespaceUseAnalysis::TYPE_FUNCTION; - } else { - $type = NamespaceUseAnalysis::TYPE_CLASS; - } - - if ($import->getType() === $type) { - return true; - } - - continue; - } - - if ($token->isComment() - && Preg::match( - '/(?getShortName().'(?![[:alnum:]])/i', - $token->getContent() - ) - ) { - return true; - } - } - - return false; - } - - private function removeUseDeclaration(Tokens $tokens, NamespaceUseAnalysis $useDeclaration): void - { - for ($index = $useDeclaration->getEndIndex() - 1; $index >= $useDeclaration->getStartIndex(); --$index) { - if ($tokens[$index]->isComment()) { - continue; - } - - if (!$tokens[$index]->isWhitespace() || false === strpos($tokens[$index]->getContent(), "\n")) { - $tokens->clearTokenAndMergeSurroundingWhitespace($index); - - continue; - } - - // when multi line white space keep the line feed if the previous token is a comment - $prevIndex = $tokens->getPrevNonWhitespace($index); - if ($tokens[$prevIndex]->isComment()) { - $content = $tokens[$index]->getContent(); - $tokens[$index] = new Token([T_WHITESPACE, substr($content, strrpos($content, "\n"))]); // preserve indent only - } else { - $tokens->clearTokenAndMergeSurroundingWhitespace($index); - } - } - - if ($tokens[$useDeclaration->getEndIndex()]->equals(';')) { // do not remove `? >` - $tokens->clearAt($useDeclaration->getEndIndex()); - } - - // remove white space above and below where the `use` statement was - - $prevIndex = $useDeclaration->getStartIndex() - 1; - $prevToken = $tokens[$prevIndex]; - - if ($prevToken->isWhitespace()) { - $content = rtrim($prevToken->getContent(), " \t"); - - if ('' === $content) { - $tokens->clearAt($prevIndex); - } else { - $tokens[$prevIndex] = new Token([T_WHITESPACE, $content]); - } - - $prevToken = $tokens[$prevIndex]; - } - - if (!isset($tokens[$useDeclaration->getEndIndex() + 1])) { - return; - } - - $nextIndex = $tokens->getNonEmptySibling($useDeclaration->getEndIndex(), 1); - if (null === $nextIndex) { - return; - } - - $nextToken = $tokens[$nextIndex]; - - if ($nextToken->isWhitespace()) { - $content = Preg::replace( - "#^\r\n|^\n#", - '', - ltrim($nextToken->getContent(), " \t"), - 1 - ); - - if ('' !== $content) { - $tokens[$nextIndex] = new Token([T_WHITESPACE, $content]); - } else { - $tokens->clearAt($nextIndex); - } - - $nextToken = $tokens[$nextIndex]; - } - - if ($prevToken->isWhitespace() && $nextToken->isWhitespace()) { - $content = $prevToken->getContent().$nextToken->getContent(); - - if ('' !== $content) { - $tokens[$nextIndex] = new Token([T_WHITESPACE, $content]); - } else { - $tokens->clearAt($nextIndex); - } - - $tokens->clearAt($prevIndex); - } - } - - 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 (0 !== strpos($useDeclarationFullName, $namespace.'\\')) { - continue; - } - - $partName = substr($useDeclarationFullName, $nsLength); - - if (false === strpos($partName, '\\')) { - $this->removeUseDeclaration($tokens, $useDeclaration); - } - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/OrderedImportsFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/OrderedImportsFixer.php deleted file mode 100644 index 29b68c5..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/OrderedImportsFixer.php +++ /dev/null @@ -1,536 +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\Fixer\Import; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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\FixerDefinition\VersionSpecification; -use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; -use Symfony\Component\OptionsResolver\Exception\InvalidOptionsException; - -/** - * @author Sebastiaan Stok - * @author Dariusz Rumiński - * @author SpacePossum - * @author Darius Matulionis - * @author Adriano Pilger - */ -final class OrderedImportsFixer extends AbstractFixer implements ConfigurableFixerInterface, WhitespacesAwareFixerInterface -{ - /** - * @internal - */ - public const IMPORT_TYPE_CLASS = 'class'; - - /** - * @internal - */ - public const IMPORT_TYPE_CONST = 'const'; - - /** - * @internal - */ - public const IMPORT_TYPE_FUNCTION = 'function'; - - /** - * @internal - */ - public const SORT_ALPHA = 'alpha'; - - /** - * @internal - */ - public const SORT_LENGTH = 'length'; - - /** - * @internal - */ - public const SORT_NONE = 'none'; - - /** - * Array of supported sort types in configuration. - * - * @var string[] - */ - 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[] - */ - private const SUPPORTED_SORT_ALGORITHMS = [self::SORT_ALPHA, self::SORT_LENGTH, self::SORT_NONE]; - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Ordering `use` statements.', - [ - new CodeSample(" self::SORT_LENGTH] - ), - new VersionSpecificCodeSample( - " self::SORT_LENGTH, - 'imports_order' => [ - self::IMPORT_TYPE_CONST, - self::IMPORT_TYPE_CLASS, - self::IMPORT_TYPE_FUNCTION, - ], - ] - ), - new VersionSpecificCodeSample( - ' self::SORT_ALPHA, - 'imports_order' => [ - self::IMPORT_TYPE_CONST, - self::IMPORT_TYPE_CLASS, - self::IMPORT_TYPE_FUNCTION, - ], - ] - ), - new VersionSpecificCodeSample( - ' self::SORT_NONE, - 'imports_order' => [ - self::IMPORT_TYPE_CONST, - self::IMPORT_TYPE_CLASS, - self::IMPORT_TYPE_FUNCTION, - ], - ] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run after GlobalNamespaceImportFixer, NoLeadingImportSlashFixer. - */ - public function getPriority(): int - { - return -30; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isTokenKindFound(T_USE); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $tokensAnalyzer = new TokensAnalyzer($tokens); - $namespacesImports = $tokensAnalyzer->getImportUseIndexes(true); - - if (0 === \count($namespacesImports)) { - return; - } - - $usesOrder = []; - foreach ($namespacesImports as $uses) { - $usesOrder[] = $this->getNewOrder(array_reverse($uses), $tokens); - } - $usesOrder = array_replace(...$usesOrder); - - $usesOrder = array_reverse($usesOrder, true); - $mapStartToEnd = []; - - foreach ($usesOrder as $use) { - $mapStartToEnd[$use['startIndex']] = $use['endIndex']; - } - - // Now insert the new tokens, starting from the end - foreach ($usesOrder as $index => $use) { - $declarationTokens = Tokens::fromCode( - sprintf( - 'clearRange(0, 2); // clear `clearAt(\count($declarationTokens) - 1); // clear `;` - $declarationTokens->clearEmptyTokens(); - - $tokens->overrideRange($index, $mapStartToEnd[$index], $declarationTokens); - if ($use['group']) { - // a group import must start with `use` and cannot be part of comma separated import list - $prev = $tokens->getPrevMeaningfulToken($index); - if ($tokens[$prev]->equals(',')) { - $tokens[$prev] = new Token(';'); - $tokens->insertAt($prev + 1, new Token([T_USE, 'use'])); - - if (!$tokens[$prev + 2]->isWhitespace()) { - $tokens->insertAt($prev + 2, new Token([T_WHITESPACE, ' '])); - } - } - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - $supportedSortTypes = self::SUPPORTED_SORT_TYPES; - - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('sort_algorithm', 'whether the statements should be sorted alphabetically or by length, or not sorted')) - ->setAllowedValues(self::SUPPORTED_SORT_ALGORITHMS) - ->setDefault(self::SORT_ALPHA) - ->getOption(), - (new FixerOptionBuilder('imports_order', 'Defines the order of import types.')) - ->setAllowedTypes(['array', 'null']) - ->setAllowedValues([static function (?array $value) use ($supportedSortTypes) { - if (null !== $value) { - $missing = array_diff($supportedSortTypes, $value); - if (\count($missing)) { - throw new InvalidOptionsException(sprintf( - 'Missing sort %s "%s".', - 1 === \count($missing) ? 'type' : 'types', - implode('", "', $missing) - )); - } - - $unknown = array_diff($value, $supportedSortTypes); - if (\count($unknown)) { - throw new InvalidOptionsException(sprintf( - 'Unknown sort %s "%s".', - 1 === \count($unknown) ? 'type' : 'types', - implode('", "', $unknown) - )); - } - } - - return true; - }]) - ->setDefault(null) - ->getOption(), - ]); - } - - /** - * This method is used for sorting the uses in a namespace. - * - * @param array $first - * @param array $second - * - * @internal - */ - 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'])); - - return strcasecmp($firstNamespace, $secondNamespace); - } - - /** - * This method is used for sorting the uses statements in a namespace by length. - * - * @param array $first - * @param array $second - * - * @internal - */ - private function sortByLength(array $first, array $second): int - { - $firstNamespace = (self::IMPORT_TYPE_CLASS === $first['importType'] ? '' : $first['importType'].' ').$this->prepareNamespace($first['namespace']); - $secondNamespace = (self::IMPORT_TYPE_CLASS === $second['importType'] ? '' : $second['importType'].' ').$this->prepareNamespace($second['namespace']); - - $firstNamespaceLength = \strlen($firstNamespace); - $secondNamespaceLength = \strlen($secondNamespace); - - if ($firstNamespaceLength === $secondNamespaceLength) { - $sortResult = strcasecmp($firstNamespace, $secondNamespace); - } else { - $sortResult = $firstNamespaceLength > $secondNamespaceLength ? 1 : -1; - } - - return $sortResult; - } - - private function prepareNamespace(string $namespace): string - { - return trim(Preg::replace('%/\*(.*)\*/%s', '', $namespace)); - } - - /** - * @param int[] $uses - */ - private function getNewOrder(array $uses, Tokens $tokens): array - { - $indexes = []; - $originalIndexes = []; - $lineEnding = $this->whitespacesConfig->getLineEnding(); - - for ($i = \count($uses) - 1; $i >= 0; --$i) { - $index = $uses[$i]; - - $startIndex = $tokens->getTokenNotOfKindsSibling($index + 1, 1, [T_WHITESPACE]); - $endIndex = $tokens->getNextTokenOfKind($startIndex, [';', [T_CLOSE_TAG]]); - $previous = $tokens->getPrevMeaningfulToken($endIndex); - - $group = $tokens[$previous]->isGivenKind(CT::T_GROUP_IMPORT_BRACE_CLOSE); - if ($tokens[$startIndex]->isGivenKind(CT::T_CONST_IMPORT)) { - $type = self::IMPORT_TYPE_CONST; - $index = $tokens->getNextNonWhitespace($startIndex); - } elseif ($tokens[$startIndex]->isGivenKind(CT::T_FUNCTION_IMPORT)) { - $type = self::IMPORT_TYPE_FUNCTION; - $index = $tokens->getNextNonWhitespace($startIndex); - } else { - $type = self::IMPORT_TYPE_CLASS; - $index = $startIndex; - } - - $namespaceTokens = []; - - while ($index <= $endIndex) { - $token = $tokens[$index]; - - if ($index === $endIndex || (!$group && $token->equals(','))) { - if ($group && self::SORT_NONE !== $this->configuration['sort_algorithm']) { - // if group import, sort the items within the group definition - - // figure out where the list of namespace parts within the group def. starts - $namespaceTokensCount = \count($namespaceTokens) - 1; - $namespace = ''; - for ($k = 0; $k < $namespaceTokensCount; ++$k) { - if ($namespaceTokens[$k]->isGivenKind(CT::T_GROUP_IMPORT_BRACE_OPEN)) { - $namespace .= '{'; - - break; - } - - $namespace .= $namespaceTokens[$k]->getContent(); - } - - // fetch all parts, split up in an array of strings, move comments to the end - $parts = []; - $firstIndent = ''; - $separator = ', '; - $lastIndent = ''; - $hasGroupTrailingComma = false; - - for ($k1 = $k + 1; $k1 < $namespaceTokensCount; ++$k1) { - $comment = ''; - $namespacePart = ''; - for ($k2 = $k1;; ++$k2) { - if ($namespaceTokens[$k2]->equalsAny([',', [CT::T_GROUP_IMPORT_BRACE_CLOSE]])) { - break; - } - - if ($namespaceTokens[$k2]->isComment()) { - $comment .= $namespaceTokens[$k2]->getContent(); - - continue; - } - - // if there is any line ending inside the group import, it should be indented properly - if ( - '' === $firstIndent - && $namespaceTokens[$k2]->isWhitespace() - && false !== strpos($namespaceTokens[$k2]->getContent(), $lineEnding) - ) { - $lastIndent = $lineEnding; - $firstIndent = $lineEnding.$this->whitespacesConfig->getIndent(); - $separator = ','.$firstIndent; - } - - $namespacePart .= $namespaceTokens[$k2]->getContent(); - } - - $namespacePart = trim($namespacePart); - if ('' === $namespacePart) { - $hasGroupTrailingComma = true; - - continue; - } - - $comment = trim($comment); - if ('' !== $comment) { - $namespacePart .= ' '.$comment; - } - - $parts[] = $namespacePart; - - $k1 = $k2; - } - - $sortedParts = $parts; - sort($parts); - - // check if the order needs to be updated, otherwise don't touch as we might change valid CS (to other valid CS). - if ($sortedParts === $parts) { - $namespace = Tokens::fromArray($namespaceTokens)->generateCode(); - } else { - $namespace .= $firstIndent.implode($separator, $parts).($hasGroupTrailingComma ? ',' : '').$lastIndent.'}'; - } - } else { - $namespace = Tokens::fromArray($namespaceTokens)->generateCode(); - } - - $indexes[$startIndex] = [ - 'namespace' => $namespace, - 'startIndex' => $startIndex, - 'endIndex' => $index - 1, - 'importType' => $type, - 'group' => $group, - ]; - - $originalIndexes[] = $startIndex; - - if ($index === $endIndex) { - break; - } - - $namespaceTokens = []; - $nextPartIndex = $tokens->getTokenNotOfKindSibling($index, 1, [[','], [T_WHITESPACE]]); - $startIndex = $nextPartIndex; - $index = $nextPartIndex; - - continue; - } - - $namespaceTokens[] = $token; - ++$index; - } - } - - // Is sort types provided, sorting by groups and each group by algorithm - if (null !== $this->configuration['imports_order']) { - // Grouping indexes by import type. - $groupedByTypes = []; - foreach ($indexes as $startIndex => $item) { - $groupedByTypes[$item['importType']][$startIndex] = $item; - } - - // Sorting each group by algorithm. - foreach ($groupedByTypes as $type => $indexes) { - $groupedByTypes[$type] = $this->sortByAlgorithm($indexes); - } - - // Ordering groups - $sortedGroups = []; - foreach ($this->configuration['imports_order'] as $type) { - if (isset($groupedByTypes[$type]) && !empty($groupedByTypes[$type])) { - foreach ($groupedByTypes[$type] as $startIndex => $item) { - $sortedGroups[$startIndex] = $item; - } - } - } - $indexes = $sortedGroups; - } else { - // Sorting only by algorithm - $indexes = $this->sortByAlgorithm($indexes); - } - - $index = -1; - $usesOrder = []; - - // Loop trough the index but use original index order - foreach ($indexes as $v) { - $usesOrder[$originalIndexes[++$index]] = $v; - } - - return $usesOrder; - } - - /** - * @param array[] $indexes - */ - private function sortByAlgorithm(array $indexes): array - { - if (self::SORT_ALPHA === $this->configuration['sort_algorithm']) { - uasort($indexes, [$this, 'sortAlphabetically']); - } elseif (self::SORT_LENGTH === $this->configuration['sort_algorithm']) { - uasort($indexes, [$this, 'sortByLength']); - } - - return $indexes; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/SingleImportPerStatementFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/SingleImportPerStatementFixer.php deleted file mode 100644 index 36fb2f5..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/SingleImportPerStatementFixer.php +++ /dev/null @@ -1,240 +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\Fixer\Import; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Analyzer\WhitespacesAnalyzer; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * Fixer for rules defined in PSR2 ¶3. - * - * @author Dariusz Rumiński - * @author SpacePossum - */ -final class SingleImportPerStatementFixer extends AbstractFixer implements WhitespacesAwareFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'There MUST be one use keyword per declaration.', - [new CodeSample("isTokenKindFound(T_USE); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $tokensAnalyzer = new TokensAnalyzer($tokens); - - foreach (array_reverse($tokensAnalyzer->getImportUseIndexes()) as $index) { - $endIndex = $tokens->getNextTokenOfKind($index, [';', [T_CLOSE_TAG]]); - $groupClose = $tokens->getPrevMeaningfulToken($endIndex); - - if ($tokens[$groupClose]->isGivenKind(CT::T_GROUP_IMPORT_BRACE_CLOSE)) { - $this->fixGroupUse($tokens, $index, $endIndex); - } else { - $this->fixMultipleUse($tokens, $index, $endIndex); - } - } - } - - private function getGroupDeclaration(Tokens $tokens, int $index): array - { - $groupPrefix = ''; - $comment = ''; - $groupOpenIndex = null; - - for ($i = $index + 1;; ++$i) { - if ($tokens[$i]->isGivenKind(CT::T_GROUP_IMPORT_BRACE_OPEN)) { - $groupOpenIndex = $i; - - break; - } - - if ($tokens[$i]->isComment()) { - $comment .= $tokens[$i]->getContent(); - if (!$tokens[$i - 1]->isWhitespace() && !$tokens[$i + 1]->isWhitespace()) { - $groupPrefix .= ' '; - } - - continue; - } - - if ($tokens[$i]->isWhitespace()) { - $groupPrefix .= ' '; - - continue; - } - - $groupPrefix .= $tokens[$i]->getContent(); - } - - return [ - rtrim($groupPrefix), - $groupOpenIndex, - $tokens->findBlockEnd(Tokens::BLOCK_TYPE_GROUP_IMPORT_BRACE, $groupOpenIndex), - $comment, - ]; - } - - /** - * @return string[] - */ - private function getGroupStatements(Tokens $tokens, string $groupPrefix, int $groupOpenIndex, int $groupCloseIndex, string $comment): array - { - $statements = []; - $statement = $groupPrefix; - - for ($i = $groupOpenIndex + 1; $i <= $groupCloseIndex; ++$i) { - $token = $tokens[$i]; - - if ($token->equals(',') && $tokens[$tokens->getNextMeaningfulToken($i)]->equals([CT::T_GROUP_IMPORT_BRACE_CLOSE])) { - continue; - } - - if ($token->equalsAny([',', [CT::T_GROUP_IMPORT_BRACE_CLOSE]])) { - $statements[] = 'use'.$statement.';'; - $statement = $groupPrefix; - - continue; - } - - if ($token->isWhitespace()) { - $j = $tokens->getNextMeaningfulToken($i); - - if ($tokens[$j]->equals([T_AS])) { - $statement .= ' as '; - $i += 2; - } elseif ($tokens[$j]->equals([T_FUNCTION])) { - $statement = ' function'.$statement; - $i += 2; - } elseif ($tokens[$j]->equals([T_CONST])) { - $statement = ' const'.$statement; - $i += 2; - } - - if ($token->isWhitespace(" \t") || '//' !== substr($tokens[$i - 1]->getContent(), 0, 2)) { - continue; - } - } - - $statement .= $token->getContent(); - } - - if ('' !== $comment) { - $statements[0] .= ' '.$comment; - } - - return $statements; - } - - 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); - } - - $ending = $this->whitespacesConfig->getLineEnding(); - $importTokens = Tokens::fromCode('clearAt(0); - $importTokens->clearEmptyTokens(); - - $tokens->insertAt($index, $importTokens); - } - - private function fixMultipleUse(Tokens $tokens, int $index, int $endIndex): void - { - $nextTokenIndex = $tokens->getNextMeaningfulToken($index); - - if ($tokens[$nextTokenIndex]->isGivenKind(CT::T_FUNCTION_IMPORT)) { - $leadingTokens = [ - new Token([CT::T_FUNCTION_IMPORT, 'function']), - new Token([T_WHITESPACE, ' ']), - ]; - } elseif ($tokens[$nextTokenIndex]->isGivenKind(CT::T_CONST_IMPORT)) { - $leadingTokens = [ - new Token([CT::T_CONST_IMPORT, 'const']), - new Token([T_WHITESPACE, ' ']), - ]; - } else { - $leadingTokens = []; - } - - $ending = $this->whitespacesConfig->getLineEnding(); - - for ($i = $endIndex - 1; $i > $index; --$i) { - if (!$tokens[$i]->equals(',')) { - continue; - } - - $tokens[$i] = new Token(';'); - $i = $tokens->getNextMeaningfulToken($i); - - $tokens->insertAt($i, new Token([T_USE, 'use'])); - $tokens->insertAt($i + 1, new Token([T_WHITESPACE, ' '])); - - foreach ($leadingTokens as $offset => $leadingToken) { - $tokens->insertAt($i + 2 + $offset, clone $leadingTokens[$offset]); - } - - $indent = WhitespacesAnalyzer::detectIndent($tokens, $index); - - if ($tokens[$i - 1]->isWhitespace()) { - $tokens[$i - 1] = new Token([T_WHITESPACE, $ending.$indent]); - } elseif (false === strpos($tokens[$i - 1]->getContent(), "\n")) { - $tokens->insertAt($i, new Token([T_WHITESPACE, $ending.$indent])); - } - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/SingleLineAfterImportsFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/SingleLineAfterImportsFixer.php deleted file mode 100644 index 7ef368c..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/SingleLineAfterImportsFixer.php +++ /dev/null @@ -1,161 +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\Fixer\Import; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; -use PhpCsFixer\Utils; - -/** - * Fixer for rules defined in PSR2 ¶3. - * - * @author Ceeram - * @author Graham Campbell - */ -final class SingleLineAfterImportsFixer extends AbstractFixer implements WhitespacesAwareFixerInterface -{ - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isTokenKindFound(T_USE); - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Each namespace use MUST go on its own line and there MUST be one blank line after the use statements block.', - [ - new CodeSample( - 'whitespacesConfig->getLineEnding(); - $tokensAnalyzer = new TokensAnalyzer($tokens); - - $added = 0; - foreach ($tokensAnalyzer->getImportUseIndexes() as $index) { - $index += $added; - $indent = ''; - - // if previous line ends with comment and current line starts with whitespace, use current indent - if ($tokens[$index - 1]->isWhitespace(" \t") && $tokens[$index - 2]->isGivenKind(T_COMMENT)) { - $indent = $tokens[$index - 1]->getContent(); - } elseif ($tokens[$index - 1]->isWhitespace()) { - $indent = Utils::calculateTrailingWhitespaceIndent($tokens[$index - 1]); - } - - $semicolonIndex = $tokens->getNextTokenOfKind($index, [';', [T_CLOSE_TAG]]); // Handle insert index for inline T_COMMENT with whitespace after semicolon - $insertIndex = $semicolonIndex; - - if ($tokens[$semicolonIndex]->isGivenKind(T_CLOSE_TAG)) { - if ($tokens[$insertIndex - 1]->isWhitespace()) { - --$insertIndex; - } - - $tokens->insertAt($insertIndex, new Token(';')); - ++$added; - } - - if ($semicolonIndex === \count($tokens) - 1) { - $tokens->insertAt($insertIndex + 1, new Token([T_WHITESPACE, $ending.$ending.$indent])); - ++$added; - } else { - $newline = $ending; - $tokens[$semicolonIndex]->isGivenKind(T_CLOSE_TAG) ? --$insertIndex : ++$insertIndex; - if ($tokens[$insertIndex]->isWhitespace(" \t") && $tokens[$insertIndex + 1]->isComment()) { - ++$insertIndex; - } - - // Increment insert index for inline T_COMMENT or T_DOC_COMMENT - if ($tokens[$insertIndex]->isComment()) { - ++$insertIndex; - } - - $afterSemicolon = $tokens->getNextMeaningfulToken($semicolonIndex); - if (null === $afterSemicolon || !$tokens[$afterSemicolon]->isGivenKind(T_USE)) { - $newline .= $ending; - } - - if ($tokens[$insertIndex]->isWhitespace()) { - $nextToken = $tokens[$insertIndex]; - if (2 === substr_count($nextToken->getContent(), "\n")) { - continue; - } - $nextMeaningfulAfterUseIndex = $tokens->getNextMeaningfulToken($insertIndex); - if (null !== $nextMeaningfulAfterUseIndex && $tokens[$nextMeaningfulAfterUseIndex]->isGivenKind(T_USE)) { - if (substr_count($nextToken->getContent(), "\n") < 1) { - $tokens[$insertIndex] = new Token([T_WHITESPACE, $newline.$indent.ltrim($nextToken->getContent())]); - } - } else { - $tokens[$insertIndex] = new Token([T_WHITESPACE, $newline.$indent.ltrim($nextToken->getContent())]); - } - } else { - $tokens->insertAt($insertIndex, new Token([T_WHITESPACE, $newline.$indent])); - ++$added; - } - } - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/ClassKeywordRemoveFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/ClassKeywordRemoveFixer.php deleted file mode 100644 index dd7b824..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/ClassKeywordRemoveFixer.php +++ /dev/null @@ -1,253 +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\Fixer\LanguageConstruct; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\DeprecatedFixerInterface; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Analyzer\NamespacesAnalyzer; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * @deprecated - * - * @author Sullivan Senechal - */ -final class ClassKeywordRemoveFixer extends AbstractFixer implements DeprecatedFixerInterface -{ - /** - * @var string[] - */ - private $imports = []; - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Converts `::class` keywords to FQCN strings.', - [ - new CodeSample( - 'isTokenKindFound(CT::T_CLASS_CONSTANT); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $namespacesAnalyzer = new NamespacesAnalyzer(); - - $previousNamespaceScopeEndIndex = 0; - foreach ($namespacesAnalyzer->getDeclarations($tokens) as $declaration) { - $this->replaceClassKeywordsSection($tokens, '', $previousNamespaceScopeEndIndex, $declaration->getStartIndex()); - $this->replaceClassKeywordsSection($tokens, $declaration->getFullName(), $declaration->getStartIndex(), $declaration->getScopeEndIndex()); - $previousNamespaceScopeEndIndex = $declaration->getScopeEndIndex(); - } - - $this->replaceClassKeywordsSection($tokens, '', $previousNamespaceScopeEndIndex, $tokens->count() - 1); - } - - private function storeImports(Tokens $tokens, int $startIndex, int $endIndex): void - { - $tokensAnalyzer = new TokensAnalyzer($tokens); - $this->imports = []; - - /** @var int $index */ - foreach ($tokensAnalyzer->getImportUseIndexes() as $index) { - if ($index < $startIndex || $index > $endIndex) { - continue; - } - - $import = ''; - while ($index = $tokens->getNextMeaningfulToken($index)) { - if ($tokens[$index]->equalsAny([';', [CT::T_GROUP_IMPORT_BRACE_OPEN]]) || $tokens[$index]->isGivenKind(T_AS)) { - break; - } - - $import .= $tokens[$index]->getContent(); - } - - // Imports group (PHP 7 spec) - if ($tokens[$index]->isGivenKind(CT::T_GROUP_IMPORT_BRACE_OPEN)) { - $groupEndIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_GROUP_IMPORT_BRACE, $index); - $groupImports = array_map( - static function (string $import) { - return trim($import); - }, - explode(',', $tokens->generatePartialCode($index + 1, $groupEndIndex - 1)) - ); - foreach ($groupImports as $groupImport) { - $groupImportParts = array_map(static function (string $import) { - return trim($import); - }, explode(' as ', $groupImport)); - if (2 === \count($groupImportParts)) { - $this->imports[$groupImportParts[1]] = $import.$groupImportParts[0]; - } else { - $this->imports[] = $import.$groupImport; - } - } - } elseif ($tokens[$index]->isGivenKind(T_AS)) { - $aliasIndex = $tokens->getNextMeaningfulToken($index); - $alias = $tokens[$aliasIndex]->getContent(); - $this->imports[$alias] = $import; - } else { - $this->imports[] = $import; - } - } - } - - private function replaceClassKeywordsSection(Tokens $tokens, string $namespace, int $startIndex, int $endIndex): void - { - if ($endIndex - $startIndex < 3) { - return; - } - - $this->storeImports($tokens, $startIndex, $endIndex); - - $ctClassTokens = $tokens->findGivenKind(CT::T_CLASS_CONSTANT, $startIndex, $endIndex); - foreach (array_reverse(array_keys($ctClassTokens)) as $classIndex) { - $this->replaceClassKeyword($tokens, $namespace, $classIndex); - } - } - - private function replaceClassKeyword(Tokens $tokens, string $namespacePrefix, int $classIndex): void - { - $classEndIndex = $tokens->getPrevMeaningfulToken($classIndex); - $classEndIndex = $tokens->getPrevMeaningfulToken($classEndIndex); - - if (!$tokens[$classEndIndex]->isGivenKind(T_STRING)) { - return; - } - - if ($tokens[$classEndIndex]->equalsAny([[T_STRING, 'self'], [T_STATIC, 'static'], [T_STRING, 'parent']], false)) { - return; - } - - $classBeginIndex = $classEndIndex; - while (true) { - $prev = $tokens->getPrevMeaningfulToken($classBeginIndex); - if (!$tokens[$prev]->isGivenKind([T_NS_SEPARATOR, T_STRING])) { - break; - } - - $classBeginIndex = $prev; - } - - $classString = $tokens->generatePartialCode( - $tokens[$classBeginIndex]->isGivenKind(T_NS_SEPARATOR) - ? $tokens->getNextMeaningfulToken($classBeginIndex) - : $classBeginIndex, - $classEndIndex - ); - - $classImport = false; - if ($tokens[$classBeginIndex]->isGivenKind(T_NS_SEPARATOR)) { - $namespacePrefix = ''; - } else { - foreach ($this->imports as $alias => $import) { - if ($classString === $alias) { - $classImport = $import; - - break; - } - - $classStringArray = explode('\\', $classString); - $namespaceToTest = $classStringArray[0]; - - if (0 === strcmp($namespaceToTest, substr($import, -\strlen($namespaceToTest)))) { - $classImport = $import; - - break; - } - } - } - - for ($i = $classBeginIndex; $i <= $classIndex; ++$i) { - if (!$tokens[$i]->isComment() && !($tokens[$i]->isWhitespace() && false !== strpos($tokens[$i]->getContent(), "\n"))) { - $tokens->clearAt($i); - } - } - - $tokens->insertAt($classBeginIndex, new Token([ - T_CONSTANT_ENCAPSED_STRING, - "'".$this->makeClassFQN($namespacePrefix, $classImport, $classString)."'", - ])); - } - - /** - * @param false|string $classImport - */ - private function makeClassFQN(string $namespacePrefix, $classImport, string $classString): string - { - if (false === $classImport) { - return ('' !== $namespacePrefix ? ($namespacePrefix.'\\') : '').$classString; - } - - $classStringArray = explode('\\', $classString); - $classStringLength = \count($classStringArray); - $classImportArray = explode('\\', $classImport); - $classImportLength = \count($classImportArray); - - if (1 === $classStringLength) { - return $classImport; - } - - return implode('\\', array_merge( - \array_slice($classImportArray, 0, $classImportLength - $classStringLength + 1), - $classStringArray - )); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/CombineConsecutiveIssetsFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/CombineConsecutiveIssetsFixer.php deleted file mode 100644 index cf7063e..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/CombineConsecutiveIssetsFixer.php +++ /dev/null @@ -1,175 +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\Fixer\LanguageConstruct; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author SpacePossum - */ -final class CombineConsecutiveIssetsFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Using `isset($var) &&` multiple times should be done in one call.', - [new CodeSample("isAllTokenKindsFound([T_ISSET, T_BOOLEAN_AND]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $tokenCount = $tokens->count(); - - for ($index = 1; $index < $tokenCount; ++$index) { - if (!$tokens[$index]->isGivenKind(T_ISSET) - || !$tokens[$tokens->getPrevMeaningfulToken($index)]->equalsAny(['(', '{', ';', '=', [T_OPEN_TAG], [T_BOOLEAN_AND], [T_BOOLEAN_OR]])) { - continue; - } - - $issetInfo = $this->getIssetInfo($tokens, $index); - $issetCloseBraceIndex = end($issetInfo); // ')' token - $insertLocation = prev($issetInfo) + 1; // one index after the previous meaningful of ')' - - $booleanAndTokenIndex = $tokens->getNextMeaningfulToken($issetCloseBraceIndex); - - while ($tokens[$booleanAndTokenIndex]->isGivenKind(T_BOOLEAN_AND)) { - $issetIndex = $tokens->getNextMeaningfulToken($booleanAndTokenIndex); - if (!$tokens[$issetIndex]->isGivenKind(T_ISSET)) { - $index = $issetIndex; - - break; - } - - // fetch info about the 'isset' statement that we're merging - $nextIssetInfo = $this->getIssetInfo($tokens, $issetIndex); - - $nextMeaningfulTokenIndex = $tokens->getNextMeaningfulToken(end($nextIssetInfo)); - $nextMeaningfulToken = $tokens[$nextMeaningfulTokenIndex]; - - if (!$nextMeaningfulToken->equalsAny([')', '}', ';', [T_CLOSE_TAG], [T_BOOLEAN_AND], [T_BOOLEAN_OR]])) { - $index = $nextMeaningfulTokenIndex; - - break; - } - - // clone what we want to move, do not clone '(' and ')' of the 'isset' statement we're merging - $clones = $this->getTokenClones($tokens, \array_slice($nextIssetInfo, 1, -1)); - - // clean up no the tokens of the 'isset' statement we're merging - $this->clearTokens($tokens, array_merge($nextIssetInfo, [$issetIndex, $booleanAndTokenIndex])); - - // insert the tokens to create the new statement - array_unshift($clones, new Token(','), new Token([T_WHITESPACE, ' '])); - $tokens->insertAt($insertLocation, $clones); - - // correct some counts and offset based on # of tokens inserted - $numberOfTokensInserted = \count($clones); - $tokenCount += $numberOfTokensInserted; - $issetCloseBraceIndex += $numberOfTokensInserted; - $insertLocation += $numberOfTokensInserted; - - $booleanAndTokenIndex = $tokens->getNextMeaningfulToken($issetCloseBraceIndex); - } - } - } - - /** - * @param int[] $indexes - */ - private function clearTokens(Tokens $tokens, array $indexes): void - { - foreach ($indexes as $index) { - $tokens->clearTokenAndMergeSurroundingWhitespace($index); - } - } - - /** - * @param int $index of T_ISSET - * - * @return int[] indexes of meaningful tokens belonging to the isset statement - */ - private function getIssetInfo(Tokens $tokens, int $index): array - { - $openIndex = $tokens->getNextMeaningfulToken($index); - - $braceOpenCount = 1; - $meaningfulTokenIndexes = [$openIndex]; - - for ($i = $openIndex + 1;; ++$i) { - if ($tokens[$i]->isWhitespace() || $tokens[$i]->isComment()) { - continue; - } - - $meaningfulTokenIndexes[] = $i; - - if ($tokens[$i]->equals(')')) { - --$braceOpenCount; - if (0 === $braceOpenCount) { - break; - } - } elseif ($tokens[$i]->equals('(')) { - ++$braceOpenCount; - } - } - - return $meaningfulTokenIndexes; - } - - /** - * @param int[] $indexes - * - * @return Token[] - */ - private function getTokenClones(Tokens $tokens, array $indexes): array - { - $clones = []; - - foreach ($indexes as $i) { - $clones[] = clone $tokens[$i]; - } - - return $clones; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/CombineConsecutiveUnsetsFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/CombineConsecutiveUnsetsFixer.php deleted file mode 100644 index 007550f..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/CombineConsecutiveUnsetsFixer.php +++ /dev/null @@ -1,191 +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\Fixer\LanguageConstruct; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author SpacePossum - */ -final class CombineConsecutiveUnsetsFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Calling `unset` on multiple items should be done in one call.', - [new CodeSample("isTokenKindFound(T_UNSET); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - for ($index = $tokens->count() - 1; $index >= 0; --$index) { - if (!$tokens[$index]->isGivenKind(T_UNSET)) { - continue; - } - - $previousUnsetCall = $this->getPreviousUnsetCall($tokens, $index); - if (\is_int($previousUnsetCall)) { - $index = $previousUnsetCall; - - continue; - } - - [$previousUnset, , $previousUnsetBraceEnd] = $previousUnsetCall; - - // Merge the tokens inside the 'unset' call into the previous one 'unset' call. - $tokensAddCount = $this->moveTokens( - $tokens, - $nextUnsetContentStart = $tokens->getNextTokenOfKind($index, ['(']), - $nextUnsetContentEnd = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $nextUnsetContentStart), - $previousUnsetBraceEnd - 1 - ); - - if (!$tokens[$previousUnsetBraceEnd]->isWhitespace()) { - $tokens->insertAt($previousUnsetBraceEnd, new Token([T_WHITESPACE, ' '])); - ++$tokensAddCount; - } - - $tokens->insertAt($previousUnsetBraceEnd, new Token(',')); - ++$tokensAddCount; - - // Remove 'unset', '(', ')' and (possibly) ';' from the merged 'unset' call. - $this->clearOffsetTokens($tokens, $tokensAddCount, [$index, $nextUnsetContentStart, $nextUnsetContentEnd]); - - $nextUnsetSemicolon = $tokens->getNextMeaningfulToken($nextUnsetContentEnd); - if (null !== $nextUnsetSemicolon && $tokens[$nextUnsetSemicolon]->equals(';')) { - $tokens->clearTokenAndMergeSurroundingWhitespace($nextUnsetSemicolon); - } - - $index = $previousUnset + 1; - } - } - - /** - * @param int[] $indices - */ - private function clearOffsetTokens(Tokens $tokens, int $offset, array $indices): void - { - foreach ($indices as $index) { - $tokens->clearTokenAndMergeSurroundingWhitespace($index + $offset); - } - } - - /** - * Find a previous call to unset directly before the index. - * - * Returns an array with - * * unset index - * * opening brace index - * * closing brace index - * * end semicolon index - * - * Or the index to where the method looked for an call. - * - * @return int|int[] - */ - private function getPreviousUnsetCall(Tokens $tokens, int $index) - { - $previousUnsetSemicolon = $tokens->getPrevMeaningfulToken($index); - if (null === $previousUnsetSemicolon) { - return $index; - } - - if (!$tokens[$previousUnsetSemicolon]->equals(';')) { - return $previousUnsetSemicolon; - } - - $previousUnsetBraceEnd = $tokens->getPrevMeaningfulToken($previousUnsetSemicolon); - if (null === $previousUnsetBraceEnd) { - return $index; - } - - if (!$tokens[$previousUnsetBraceEnd]->equals(')')) { - return $previousUnsetBraceEnd; - } - - $previousUnsetBraceStart = $tokens->findBlockStart(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $previousUnsetBraceEnd); - $previousUnset = $tokens->getPrevMeaningfulToken($previousUnsetBraceStart); - if (null === $previousUnset) { - return $index; - } - - if (!$tokens[$previousUnset]->isGivenKind(T_UNSET)) { - return $previousUnset; - } - - return [ - $previousUnset, - $previousUnsetBraceStart, - $previousUnsetBraceEnd, - $previousUnsetSemicolon, - ]; - } - - /** - * @param int $start Index previous of the first token to move - * @param int $end Index of the last token to move - * @param int $to Upper boundary index - * - * @return int Number of tokens inserted - */ - private function moveTokens(Tokens $tokens, int $start, int $end, int $to): int - { - $added = 0; - for ($i = $start + 1; $i < $end; $i += 2) { - if ($tokens[$i]->isWhitespace() && $tokens[$to + 1]->isWhitespace()) { - $tokens[$to + 1] = new Token([T_WHITESPACE, $tokens[$to + 1]->getContent().$tokens[$i]->getContent()]); - } else { - $tokens->insertAt(++$to, clone $tokens[$i]); - ++$end; - ++$added; - } - - $tokens->clearAt($i + 1); - } - - return $added; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/DeclareEqualNormalizeFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/DeclareEqualNormalizeFixer.php deleted file mode 100644 index 2546e7a..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/DeclareEqualNormalizeFixer.php +++ /dev/null @@ -1,144 +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\Fixer\LanguageConstruct; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dariusz Rumiński - * @author SpacePossum - */ -final class DeclareEqualNormalizeFixer extends AbstractFixer implements ConfigurableFixerInterface -{ - /** - * @var string - */ - private $callback; - - /** - * {@inheritdoc} - */ - public function configure(array $configuration): void - { - parent::configure($configuration); - - $this->callback = 'none' === $this->configuration['space'] ? 'removeWhitespaceAroundToken' : 'ensureWhitespaceAroundToken'; - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Equal sign in declare statement should be surrounded by spaces or not following configuration.', - [ - new CodeSample(" 'single']), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run after DeclareStrictTypesFixer. - */ - public function getPriority(): int - { - return 0; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isTokenKindFound(T_DECLARE); - } - - /** - * {@inheritdoc} - */ - 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; - } - - while (!$tokens[++$index]->equals('=')); - - $this->{$callback}($tokens, $index); - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('space', 'Spacing to apply around the equal sign.')) - ->setAllowedValues(['single', 'none']) - ->setDefault('none') - ->getOption(), - ]); - } - - /** - * @param int $index of `=` token - */ - private function ensureWhitespaceAroundToken(Tokens $tokens, int $index): void - { - if ($tokens[$index + 1]->isWhitespace()) { - if (' ' !== $tokens[$index + 1]->getContent()) { - $tokens[$index + 1] = new Token([T_WHITESPACE, ' ']); - } - } else { - $tokens->insertAt($index + 1, new Token([T_WHITESPACE, ' '])); - } - - if ($tokens[$index - 1]->isWhitespace()) { - if (' ' !== $tokens[$index - 1]->getContent() && !$tokens[$tokens->getPrevNonWhitespace($index - 1)]->isComment()) { - $tokens[$index - 1] = new Token([T_WHITESPACE, ' ']); - } - } else { - $tokens->insertAt($index, new Token([T_WHITESPACE, ' '])); - } - } - - /** - * @param int $index of `=` token - */ - private function removeWhitespaceAroundToken(Tokens $tokens, int $index): void - { - if (!$tokens[$tokens->getPrevNonWhitespace($index)]->isComment()) { - $tokens->removeLeadingWhitespace($index); - } - - $tokens->removeTrailingWhitespace($index); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/DeclareParenthesesFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/DeclareParenthesesFixer.php deleted file mode 100644 index e387973..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/DeclareParenthesesFixer.php +++ /dev/null @@ -1,56 +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\Fixer\LanguageConstruct; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Tokens; - -final class DeclareParenthesesFixer extends AbstractFixer -{ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'There must not be spaces around `declare` statement parentheses.', - [new CodeSample("isTokenKindFound(T_DECLARE); - } - - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - for ($index = $tokens->count() - 1; 0 <= $index; --$index) { - $token = $tokens[$index]; - - if (!$token->isGivenKind(T_DECLARE)) { - continue; - } - - $tokens->removeTrailingWhitespace($index); - - $startParenthesisIndex = $tokens->getNextTokenOfKind($index, ['(']); - $tokens->removeTrailingWhitespace($startParenthesisIndex); - - $endParenthesisIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $startParenthesisIndex); - $tokens->removeLeadingWhitespace($endParenthesisIndex); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/DirConstantFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/DirConstantFixer.php deleted file mode 100644 index 96e0293..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/DirConstantFixer.php +++ /dev/null @@ -1,134 +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\Fixer\LanguageConstruct; - -use PhpCsFixer\AbstractFunctionReferenceFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Vladimir Reznichenko - */ -final class DirConstantFixer extends AbstractFunctionReferenceFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Replaces `dirname(__FILE__)` expression with equivalent `__DIR__` constant.', - [new CodeSample("isTokenKindFound(T_FILE); - } - - /** - * {@inheritdoc} - * - * Must run before CombineNestedDirnameFixer. - */ - public function getPriority(): int - { - return 40; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $currIndex = 0; - while (null !== $currIndex) { - $boundaries = $this->find('dirname', $tokens, $currIndex, $tokens->count() - 1); - if (null === $boundaries) { - return; - } - - [$functionNameIndex, $openParenthesis, $closeParenthesis] = $boundaries; - - // analysing cursor shift, so nested expressions kept processed - $currIndex = $openParenthesis; - - // ensure __FILE__ is in between (...) - - $fileCandidateRightIndex = $tokens->getPrevMeaningfulToken($closeParenthesis); - $trailingCommaIndex = null; - if ($tokens[$fileCandidateRightIndex]->equals(',')) { - $trailingCommaIndex = $fileCandidateRightIndex; - $fileCandidateRightIndex = $tokens->getPrevMeaningfulToken($fileCandidateRightIndex); - } - - $fileCandidateRight = $tokens[$fileCandidateRightIndex]; - if (!$fileCandidateRight->isGivenKind(T_FILE)) { - continue; - } - - $fileCandidateLeftIndex = $tokens->getNextMeaningfulToken($openParenthesis); - $fileCandidateLeft = $tokens[$fileCandidateLeftIndex]; - - if (!$fileCandidateLeft->isGivenKind(T_FILE)) { - continue; - } - - // get rid of root namespace when it used - $namespaceCandidateIndex = $tokens->getPrevMeaningfulToken($functionNameIndex); - $namespaceCandidate = $tokens[$namespaceCandidateIndex]; - if ($namespaceCandidate->isGivenKind(T_NS_SEPARATOR)) { - $tokens->removeTrailingWhitespace($namespaceCandidateIndex); - $tokens->clearAt($namespaceCandidateIndex); - } - - if (null !== $trailingCommaIndex) { - if (!$tokens[$tokens->getNextNonWhitespace($trailingCommaIndex)]->isComment()) { - $tokens->removeTrailingWhitespace($trailingCommaIndex); - } - - $tokens->clearTokenAndMergeSurroundingWhitespace($trailingCommaIndex); - } - - // closing parenthesis removed with leading spaces - if (!$tokens[$tokens->getNextNonWhitespace($closeParenthesis)]->isComment()) { - $tokens->removeLeadingWhitespace($closeParenthesis); - } - - $tokens->clearTokenAndMergeSurroundingWhitespace($closeParenthesis); - - // opening parenthesis removed with trailing and leading spaces - if (!$tokens[$tokens->getNextNonWhitespace($openParenthesis)]->isComment()) { - $tokens->removeLeadingWhitespace($openParenthesis); - } - - $tokens->removeTrailingWhitespace($openParenthesis); - $tokens->clearTokenAndMergeSurroundingWhitespace($openParenthesis); - - // replace constant and remove function name - $tokens[$fileCandidateLeftIndex] = new Token([T_DIR, '__DIR__']); - $tokens->clearTokenAndMergeSurroundingWhitespace($functionNameIndex); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/ErrorSuppressionFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/ErrorSuppressionFixer.php deleted file mode 100644 index df2d1f7..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/ErrorSuppressionFixer.php +++ /dev/null @@ -1,185 +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\Fixer\LanguageConstruct; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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\FunctionsAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Jules Pietri - * @author Kuba Werłos - */ -final class ErrorSuppressionFixer extends AbstractFixer implements ConfigurableFixerInterface -{ - /** - * @internal - */ - public const OPTION_MUTE_DEPRECATION_ERROR = 'mute_deprecation_error'; - - /** - * @internal - */ - public const OPTION_NOISE_REMAINING_USAGES = 'noise_remaining_usages'; - - /** - * @internal - */ - public const OPTION_NOISE_REMAINING_USAGES_EXCLUDE = 'noise_remaining_usages_exclude'; - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Error control operator should be added to deprecation notices and/or removed from other cases.', - [ - new CodeSample(" true] - ), - new CodeSample( - " true, - self::OPTION_NOISE_REMAINING_USAGES_EXCLUDE => ['unlink'], - ] - ), - ], - null, - 'Risky because adding/removing `@` might cause changes to code behaviour or if `trigger_error` function is overridden.' - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isAnyTokenKindsFound(['@', T_STRING]); - } - - /** - * {@inheritdoc} - */ - public function isRisky(): bool - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder(self::OPTION_MUTE_DEPRECATION_ERROR, 'Whether to add `@` in deprecation notices.')) - ->setAllowedTypes(['bool']) - ->setDefault(true) - ->getOption(), - (new FixerOptionBuilder(self::OPTION_NOISE_REMAINING_USAGES, 'Whether to remove `@` in remaining usages.')) - ->setAllowedTypes(['bool']) - ->setDefault(false) - ->getOption(), - (new FixerOptionBuilder(self::OPTION_NOISE_REMAINING_USAGES_EXCLUDE, 'List of global functions to exclude from removing `@`')) - ->setAllowedTypes(['array']) - ->setDefault([]) - ->getOption(), - ]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $functionsAnalyzer = new FunctionsAnalyzer(); - $excludedFunctions = array_map(static function (string $function) { - return strtolower($function); - }, $this->configuration[self::OPTION_NOISE_REMAINING_USAGES_EXCLUDE]); - - for ($index = $tokens->count() - 1; $index >= 0; --$index) { - $token = $tokens[$index]; - - if ($this->configuration[self::OPTION_NOISE_REMAINING_USAGES] && $token->equals('@')) { - $tokens->clearAt($index); - - continue; - } - - if (!$functionsAnalyzer->isGlobalFunctionCall($tokens, $index)) { - continue; - } - - $functionIndex = $index; - $startIndex = $index; - $prevIndex = $tokens->getPrevMeaningfulToken($index); - if ($tokens[$prevIndex]->isGivenKind(T_NS_SEPARATOR)) { - $startIndex = $prevIndex; - $prevIndex = $tokens->getPrevMeaningfulToken($startIndex); - } - - $index = $prevIndex; - - if ($this->isDeprecationErrorCall($tokens, $functionIndex)) { - if (!$this->configuration[self::OPTION_MUTE_DEPRECATION_ERROR]) { - continue; - } - - if ($tokens[$prevIndex]->equals('@')) { - continue; - } - - $tokens->insertAt($startIndex, new Token('@')); - - continue; - } - - if (!$tokens[$prevIndex]->equals('@')) { - continue; - } - - if ($this->configuration[self::OPTION_NOISE_REMAINING_USAGES] && !\in_array($tokens[$functionIndex]->getContent(), $excludedFunctions, true)) { - $tokens->clearAt($index); - } - } - } - - private function isDeprecationErrorCall(Tokens $tokens, int $index): bool - { - if ('trigger_error' !== strtolower($tokens[$index]->getContent())) { - return false; - } - - $endBraceIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $tokens->getNextTokenOfKind($index, [T_STRING, '('])); - - $prevIndex = $tokens->getPrevMeaningfulToken($endBraceIndex); - if ($tokens[$prevIndex]->equals(',')) { - $prevIndex = $tokens->getPrevMeaningfulToken($prevIndex); - } - - return $tokens[$prevIndex]->equals([T_STRING, 'E_USER_DEPRECATED']); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/ExplicitIndirectVariableFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/ExplicitIndirectVariableFixer.php deleted file mode 100644 index d63355c..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/ExplicitIndirectVariableFixer.php +++ /dev/null @@ -1,94 +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\Fixer\LanguageConstruct; - -use PhpCsFixer\AbstractFixer; -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; - -/** - * @author Filippo Tessarotto - */ -final class ExplicitIndirectVariableFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Add curly braces to indirect variables to make them clear to understand. Requires PHP >= 7.0.', - [ - new VersionSpecificCodeSample( - <<<'EOT' -$bar['baz']; -echo $foo->$callback($baz); - -EOT -, - new VersionSpecification(70000) - ), - ] - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return \PHP_VERSION_ID >= 70000 && $tokens->isTokenKindFound(T_VARIABLE); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - for ($index = $tokens->count() - 1; $index > 1; --$index) { - $token = $tokens[$index]; - if (!$token->isGivenKind(T_VARIABLE)) { - continue; - } - - $prevIndex = $tokens->getPrevMeaningfulToken($index); - $prevToken = $tokens[$prevIndex]; - if (!$prevToken->equals('$') && !$prevToken->isObjectOperator()) { - continue; - } - - $openingBrace = CT::T_DYNAMIC_VAR_BRACE_OPEN; - $closingBrace = CT::T_DYNAMIC_VAR_BRACE_CLOSE; - if ($prevToken->isObjectOperator()) { - $openingBrace = CT::T_DYNAMIC_PROP_BRACE_OPEN; - $closingBrace = CT::T_DYNAMIC_PROP_BRACE_CLOSE; - } - - $tokens->overrideRange($index, $index, [ - new Token([$openingBrace, '{']), - new Token([T_VARIABLE, $token->getContent()]), - new Token([$closingBrace, '}']), - ]); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/FunctionToConstantFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/FunctionToConstantFixer.php deleted file mode 100644 index ba315bf..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/FunctionToConstantFixer.php +++ /dev/null @@ -1,303 +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\Fixer\LanguageConstruct; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -use PhpCsFixer\FixerConfiguration\AllowedValueSubset; -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\FunctionsAnalyzer; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author SpacePossum - */ -final class FunctionToConstantFixer extends AbstractFixer implements ConfigurableFixerInterface -{ - /** - * @var array - */ - private static $availableFunctions; - - /** - * @var array - */ - private $functionsFixMap; - - public function __construct() - { - if (null === self::$availableFunctions) { - self::$availableFunctions = [ - 'get_called_class' => [ - new Token([T_STATIC, 'static']), - new Token([T_DOUBLE_COLON, '::']), - new Token([CT::T_CLASS_CONSTANT, 'class']), - ], - 'get_class' => [new Token([T_CLASS_C, '__CLASS__'])], - 'get_class_this' => [ - new Token([T_STATIC, 'static']), - new Token([T_DOUBLE_COLON, '::']), - new Token([CT::T_CLASS_CONSTANT, 'class']), - ], - 'php_sapi_name' => [new Token([T_STRING, 'PHP_SAPI'])], - 'phpversion' => [new Token([T_STRING, 'PHP_VERSION'])], - 'pi' => [new Token([T_STRING, 'M_PI'])], - ]; - } - - parent::__construct(); - } - - /** - * {@inheritdoc} - */ - public function configure(array $configuration): void - { - parent::configure($configuration); - - $this->functionsFixMap = []; - foreach ($this->configuration['functions'] as $key) { - $this->functionsFixMap[$key] = self::$availableFunctions[$key]; - } - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Replace core functions calls returning constants with the constants.', - [ - new CodeSample( - " ['get_called_class', 'get_class_this', 'phpversion']] - ), - ], - null, - 'Risky when any of the configured functions to replace are overridden.' - ); - } - - /** - * {@inheritdoc} - * - * Must run before NativeFunctionCasingFixer, NoExtraBlankLinesFixer, NoSinglelineWhitespaceBeforeSemicolonsFixer, NoTrailingWhitespaceFixer, NoWhitespaceInBlankLineFixer, SelfStaticAccessorFixer. - * Must run after NoSpacesAfterFunctionNameFixer, NoSpacesInsideParenthesisFixer. - */ - public function getPriority(): int - { - return 1; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isTokenKindFound(T_STRING); - } - - /** - * {@inheritdoc} - */ - public function isRisky(): bool - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $functionAnalyzer = new FunctionsAnalyzer(); - - for ($index = $tokens->count() - 4; $index > 0; --$index) { - $candidate = $this->getReplaceCandidate($tokens, $functionAnalyzer, $index); - if (null === $candidate) { - continue; - } - - $this->fixFunctionCallToConstant( - $tokens, - $index, - $candidate[0], // brace open - $candidate[1], // brace close - $candidate[2] // replacement - ); - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - $functionNames = array_keys(self::$availableFunctions); - - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('functions', 'List of function names to fix.')) - ->setAllowedTypes(['array']) - ->setAllowedValues([new AllowedValueSubset($functionNames)]) - ->setDefault([ - 'get_called_class', - 'get_class', - 'get_class_this', - 'php_sapi_name', - 'phpversion', - 'pi', - ]) - ->getOption(), - ]); - } - - /** - * @param Token[] $replacements - */ - private function fixFunctionCallToConstant(Tokens $tokens, int $index, int $braceOpenIndex, int $braceCloseIndex, array $replacements): void - { - for ($i = $braceCloseIndex; $i >= $braceOpenIndex; --$i) { - if ($tokens[$i]->isGivenKind([T_WHITESPACE, T_COMMENT, T_DOC_COMMENT])) { - continue; - } - - $tokens->clearTokenAndMergeSurroundingWhitespace($i); - } - - if ($replacements[0]->isGivenKind([T_CLASS_C, T_STATIC])) { - $prevIndex = $tokens->getPrevMeaningfulToken($index); - $prevToken = $tokens[$prevIndex]; - if ($prevToken->isGivenKind(T_NS_SEPARATOR)) { - $tokens->clearAt($prevIndex); - } - } - - $tokens->clearAt($index); - $tokens->insertAt($index, $replacements); - } - - private function getReplaceCandidate( - Tokens $tokens, - FunctionsAnalyzer $functionAnalyzer, - int $index - ): ?array { - if (!$tokens[$index]->isGivenKind(T_STRING)) { - return null; - } - - $lowerContent = strtolower($tokens[$index]->getContent()); - - if ('get_class' === $lowerContent) { - return $this->fixGetClassCall($tokens, $functionAnalyzer, $index); - } - - if (!isset($this->functionsFixMap[$lowerContent])) { - return null; - } - - if (!$functionAnalyzer->isGlobalFunctionCall($tokens, $index)) { - return null; - } - - // test if function call without parameters - $braceOpenIndex = $tokens->getNextMeaningfulToken($index); - if (!$tokens[$braceOpenIndex]->equals('(')) { - return null; - } - - $braceCloseIndex = $tokens->getNextMeaningfulToken($braceOpenIndex); - if (!$tokens[$braceCloseIndex]->equals(')')) { - return null; - } - - return $this->getReplacementTokenClones($lowerContent, $braceOpenIndex, $braceCloseIndex); - } - - private function fixGetClassCall( - Tokens $tokens, - FunctionsAnalyzer $functionAnalyzer, - int $index - ): ?array { - if (!isset($this->functionsFixMap['get_class']) && !isset($this->functionsFixMap['get_class_this'])) { - return null; - } - - if (!$functionAnalyzer->isGlobalFunctionCall($tokens, $index)) { - return null; - } - - $braceOpenIndex = $tokens->getNextMeaningfulToken($index); - $braceCloseIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $braceOpenIndex); - - if ($braceCloseIndex === $tokens->getNextMeaningfulToken($braceOpenIndex)) { // no arguments passed - if (isset($this->functionsFixMap['get_class'])) { - return $this->getReplacementTokenClones('get_class', $braceOpenIndex, $braceCloseIndex); - } - } elseif (isset($this->functionsFixMap['get_class_this'])) { - $isThis = false; - - for ($i = $braceOpenIndex + 1; $i < $braceCloseIndex; ++$i) { - if ($tokens[$i]->equalsAny([[T_WHITESPACE], [T_COMMENT], [T_DOC_COMMENT], ')'])) { - continue; - } - - if ($tokens[$i]->isGivenKind(T_VARIABLE) && '$this' === strtolower($tokens[$i]->getContent())) { - $isThis = true; - - continue; - } - - if (false === $isThis && $tokens[$i]->equals('(')) { - continue; - } - - $isThis = false; - - break; - } - - if ($isThis) { - return $this->getReplacementTokenClones('get_class_this', $braceOpenIndex, $braceCloseIndex); - } - } - - return null; - } - - private function getReplacementTokenClones(string $lowerContent, int $braceOpenIndex, int $braceCloseIndex): array - { - $clones = []; - foreach ($this->functionsFixMap[$lowerContent] as $token) { - $clones[] = clone $token; - } - - return [ - $braceOpenIndex, - $braceCloseIndex, - $clones, - ]; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/IsNullFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/IsNullFixer.php deleted file mode 100644 index 747347f..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/IsNullFixer.php +++ /dev/null @@ -1,176 +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\Fixer\LanguageConstruct; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Analyzer\FunctionsAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Vladimir Reznichenko - */ -final class IsNullFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Replaces `is_null($var)` expression with `null === $var`.', - [ - new CodeSample("isTokenKindFound(T_STRING); - } - - /** - * {@inheritdoc} - */ - public function isRisky(): bool - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - static $sequenceNeeded = [[T_STRING, 'is_null'], '(']; - $functionsAnalyzer = new FunctionsAnalyzer(); - - $currIndex = 0; - while (null !== $currIndex) { - $matches = $tokens->findSequence($sequenceNeeded, $currIndex, $tokens->count() - 1, false); - - // stop looping if didn't find any new matches - if (null === $matches) { - break; - } - - // 0 and 1 accordingly are "is_null", "(" tokens - $matches = array_keys($matches); - - // move the cursor just after the sequence - [$isNullIndex, $currIndex] = $matches; - - if (!$functionsAnalyzer->isGlobalFunctionCall($tokens, $matches[0])) { - continue; - } - - $next = $tokens->getNextMeaningfulToken($currIndex); - if ($tokens[$next]->equals(')')) { - continue; - } - - $prevTokenIndex = $tokens->getPrevMeaningfulToken($matches[0]); - - // handle function references with namespaces - if ($tokens[$prevTokenIndex]->isGivenKind(T_NS_SEPARATOR)) { - $tokens->removeTrailingWhitespace($prevTokenIndex); - $tokens->clearAt($prevTokenIndex); - - $prevTokenIndex = $tokens->getPrevMeaningfulToken($prevTokenIndex); - } - - // check if inversion being used, text comparison is due to not existing constant - $isInvertedNullCheck = false; - if ($tokens[$prevTokenIndex]->equals('!')) { - $isInvertedNullCheck = true; - - // get rid of inverting for proper transformations - $tokens->removeTrailingWhitespace($prevTokenIndex); - $tokens->clearAt($prevTokenIndex); - } - - // before getting rind of `()` around a parameter, ensure it's not assignment/ternary invariant - $referenceEnd = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $matches[1]); - $isContainingDangerousConstructs = false; - for ($paramTokenIndex = $matches[1]; $paramTokenIndex <= $referenceEnd; ++$paramTokenIndex) { - if (\in_array($tokens[$paramTokenIndex]->getContent(), ['?', '?:', '=', '??'], true)) { - $isContainingDangerousConstructs = true; - - break; - } - } - - // edge cases: is_null() followed/preceded by ==, ===, !=, !==, <> - $parentLeftToken = $tokens[$tokens->getPrevMeaningfulToken($isNullIndex)]; - $parentRightToken = $tokens[$tokens->getNextMeaningfulToken($referenceEnd)]; - $parentOperations = [T_IS_EQUAL, T_IS_NOT_EQUAL, T_IS_IDENTICAL, T_IS_NOT_IDENTICAL]; - $wrapIntoParentheses = $parentLeftToken->isGivenKind($parentOperations) || $parentRightToken->isGivenKind($parentOperations); - - // possible trailing comma removed - $prevIndex = $tokens->getPrevMeaningfulToken($referenceEnd); - if ($tokens[$prevIndex]->equals(',')) { - $tokens->clearTokenAndMergeSurroundingWhitespace($prevIndex); - } - - if (!$isContainingDangerousConstructs) { - // closing parenthesis removed with leading spaces - $tokens->removeLeadingWhitespace($referenceEnd); - $tokens->clearAt($referenceEnd); - - // opening parenthesis removed with trailing spaces - $tokens->removeLeadingWhitespace($matches[1]); - $tokens->removeTrailingWhitespace($matches[1]); - $tokens->clearAt($matches[1]); - } - - // sequence which we'll use as a replacement - $replacement = [ - new Token([T_STRING, 'null']), - new Token([T_WHITESPACE, ' ']), - new Token($isInvertedNullCheck ? [T_IS_NOT_IDENTICAL, '!=='] : [T_IS_IDENTICAL, '===']), - new Token([T_WHITESPACE, ' ']), - ]; - - if ($wrapIntoParentheses) { - array_unshift($replacement, new Token('(')); - $tokens->insertAt($referenceEnd + 1, new Token(')')); - } - - $tokens->overrideRange($isNullIndex, $isNullIndex, $replacement); - - // nested is_null calls support - $currIndex = $isNullIndex; - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/NoUnsetOnPropertyFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/NoUnsetOnPropertyFixer.php deleted file mode 100644 index 2728274..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/NoUnsetOnPropertyFixer.php +++ /dev/null @@ -1,224 +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\Fixer\LanguageConstruct; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Analyzer\ArgumentsAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Gert de Pagter - */ -final class NoUnsetOnPropertyFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - '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.' - ); - } - - /** - * {@inheritdoc} - */ - public function isRisky(): bool - { - return true; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isTokenKindFound(T_UNSET) - && $tokens->isAnyTokenKindsFound([T_OBJECT_OPERATOR, T_PAAMAYIM_NEKUDOTAYIM]); - } - - /** - * {@inheritdoc} - * - * Must run before CombineConsecutiveUnsetsFixer. - */ - public function getPriority(): int - { - return 25; - } - - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - for ($index = $tokens->count() - 1; $index >= 0; --$index) { - if (!$tokens[$index]->isGivenKind(T_UNSET)) { - continue; - } - - $unsetsInfo = $this->getUnsetsInfo($tokens, $index); - - if (!$this->isAnyUnsetToTransform($unsetsInfo)) { - continue; - } - - $isLastUnset = true; // yes, last - we reverse the array below - foreach (array_reverse($unsetsInfo) as $unsetInfo) { - $this->updateTokens($tokens, $unsetInfo, $isLastUnset); - $isLastUnset = false; - } - } - } - - /** - * @return array> - */ - private function getUnsetsInfo(Tokens $tokens, int $index): array - { - $argumentsAnalyzer = new ArgumentsAnalyzer(); - - $unsetStart = $tokens->getNextTokenOfKind($index, ['(']); - $unsetEnd = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $unsetStart); - $isFirst = true; - - $unsets = []; - foreach ($argumentsAnalyzer->getArguments($tokens, $unsetStart, $unsetEnd) as $startIndex => $endIndex) { - $startIndex = $tokens->getNextMeaningfulToken($startIndex - 1); - $endIndex = $tokens->getPrevMeaningfulToken($endIndex + 1); - $unsets[] = [ - 'startIndex' => $startIndex, - 'endIndex' => $endIndex, - 'isToTransform' => $this->isProperty($tokens, $startIndex, $endIndex), - 'isFirst' => $isFirst, - ]; - $isFirst = false; - } - - return $unsets; - } - - private function isProperty(Tokens $tokens, int $index, int $endIndex): bool - { - if ($tokens[$index]->isGivenKind(T_VARIABLE)) { - $nextIndex = $tokens->getNextMeaningfulToken($index); - if (null === $nextIndex || !$tokens[$nextIndex]->isGivenKind(T_OBJECT_OPERATOR)) { - return false; - } - $nextIndex = $tokens->getNextMeaningfulToken($nextIndex); - $nextNextIndex = $tokens->getNextMeaningfulToken($nextIndex); - if (null !== $nextNextIndex && $nextNextIndex < $endIndex) { - return false; - } - - return null !== $nextIndex && $tokens[$nextIndex]->isGivenKind(T_STRING); - } - - if ($tokens[$index]->isGivenKind([T_NS_SEPARATOR, T_STRING])) { - $nextIndex = $tokens->getTokenNotOfKindsSibling($index, 1, [T_DOUBLE_COLON, T_NS_SEPARATOR, T_STRING]); - $nextNextIndex = $tokens->getNextMeaningfulToken($nextIndex); - if (null !== $nextNextIndex && $nextNextIndex < $endIndex) { - return false; - } - - return null !== $nextIndex && $tokens[$nextIndex]->isGivenKind(T_VARIABLE); - } - - return false; - } - - /** - * @param array> $unsetsInfo - */ - private function isAnyUnsetToTransform(array $unsetsInfo): bool - { - foreach ($unsetsInfo as $unsetInfo) { - if ($unsetInfo['isToTransform']) { - return true; - } - } - - return false; - } - - /** - * @param array $unsetInfo - */ - private function updateTokens(Tokens $tokens, array $unsetInfo, bool $isLastUnset): void - { - // if entry is first and to be transform we remove leading "unset(" - if ($unsetInfo['isFirst'] && $unsetInfo['isToTransform']) { - $braceIndex = $tokens->getPrevTokenOfKind($unsetInfo['startIndex'], ['(']); - $unsetIndex = $tokens->getPrevTokenOfKind($braceIndex, [[T_UNSET]]); - $tokens->clearTokenAndMergeSurroundingWhitespace($braceIndex); - $tokens->clearTokenAndMergeSurroundingWhitespace($unsetIndex); - } - - // if entry is last and to be transformed we remove trailing ")" - if ($isLastUnset && $unsetInfo['isToTransform']) { - $braceIndex = $tokens->getNextTokenOfKind($unsetInfo['endIndex'], [')']); - $previousIndex = $tokens->getPrevMeaningfulToken($braceIndex); - if ($tokens[$previousIndex]->equals(',')) { - $tokens->clearTokenAndMergeSurroundingWhitespace($previousIndex); // trailing ',' in function call (PHP 7.3) - } - - $tokens->clearTokenAndMergeSurroundingWhitespace($braceIndex); - } - - // if entry is not last we replace comma with semicolon (last entry already has semicolon - from original unset) - if (!$isLastUnset) { - $commaIndex = $tokens->getNextTokenOfKind($unsetInfo['endIndex'], [',']); - $tokens[$commaIndex] = new Token(';'); - } - - // if entry is to be unset and is not last we add trailing ")" - if (!$unsetInfo['isToTransform'] && !$isLastUnset) { - $tokens->insertAt($unsetInfo['endIndex'] + 1, new Token(')')); - } - - // if entry is to be unset and is not first we add leading "unset(" - if (!$unsetInfo['isToTransform'] && !$unsetInfo['isFirst']) { - $tokens->insertAt( - $unsetInfo['startIndex'], - [ - new Token([T_UNSET, 'unset']), - new Token('('), - ] - ); - } - - // and finally - // if entry is to be transformed we add trailing " = null" - if ($unsetInfo['isToTransform']) { - $tokens->insertAt( - $unsetInfo['endIndex'] + 1, - [ - new Token([T_WHITESPACE, ' ']), - new Token('='), - new Token([T_WHITESPACE, ' ']), - new Token([T_STRING, 'null']), - ] - ); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/SingleSpaceAfterConstructFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/SingleSpaceAfterConstructFixer.php deleted file mode 100644 index 5bd6290..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/SingleSpaceAfterConstructFixer.php +++ /dev/null @@ -1,335 +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\Fixer\LanguageConstruct; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -use PhpCsFixer\FixerConfiguration\AllowedValueSubset; -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\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Andreas Möller - */ -final class SingleSpaceAfterConstructFixer extends AbstractFixer implements ConfigurableFixerInterface -{ - /** - * @var array - */ - private static $tokenMap = [ - 'abstract' => T_ABSTRACT, - 'as' => T_AS, - 'attribute' => CT::T_ATTRIBUTE_CLOSE, - 'break' => T_BREAK, - 'case' => T_CASE, - 'catch' => T_CATCH, - 'class' => T_CLASS, - 'clone' => T_CLONE, - 'comment' => T_COMMENT, - 'const' => T_CONST, - 'const_import' => CT::T_CONST_IMPORT, - 'continue' => T_CONTINUE, - 'do' => T_DO, - 'echo' => T_ECHO, - 'else' => T_ELSE, - 'elseif' => T_ELSEIF, - 'extends' => T_EXTENDS, - 'final' => T_FINAL, - 'finally' => T_FINALLY, - 'for' => T_FOR, - 'foreach' => T_FOREACH, - 'function' => T_FUNCTION, - 'function_import' => CT::T_FUNCTION_IMPORT, - 'global' => T_GLOBAL, - 'goto' => T_GOTO, - 'if' => T_IF, - 'implements' => T_IMPLEMENTS, - 'include' => T_INCLUDE, - 'include_once' => T_INCLUDE_ONCE, - 'instanceof' => T_INSTANCEOF, - 'insteadof' => T_INSTEADOF, - 'interface' => T_INTERFACE, - 'match' => null, - 'named_argument' => CT::T_NAMED_ARGUMENT_COLON, - 'namespace' => T_NAMESPACE, - 'new' => T_NEW, - 'open_tag_with_echo' => T_OPEN_TAG_WITH_ECHO, - 'php_doc' => T_DOC_COMMENT, - 'php_open' => T_OPEN_TAG, - 'print' => T_PRINT, - 'private' => T_PRIVATE, - 'protected' => T_PROTECTED, - 'public' => T_PUBLIC, - 'require' => T_REQUIRE, - 'require_once' => T_REQUIRE_ONCE, - 'return' => T_RETURN, - 'static' => T_STATIC, - 'throw' => T_THROW, - 'trait' => T_TRAIT, - 'try' => T_TRY, - 'use' => T_USE, - 'use_lambda' => CT::T_USE_LAMBDA, - 'use_trait' => CT::T_USE_TRAIT, - 'var' => T_VAR, - 'while' => T_WHILE, - 'yield' => T_YIELD, - 'yield_from' => T_YIELD_FROM, - ]; - - /** - * @var array - */ - private $fixTokenMap = []; - - /** - * {@inheritdoc} - */ - public function configure(array $configuration): void - { - parent::configure($configuration); - - // @TODO: drop condition when PHP 8.0+ is required - if (\defined('T_MATCH')) { - self::$tokenMap['match'] = T_MATCH; - } - - $this->fixTokenMap = []; - - foreach ($this->configuration['constructs'] as $key) { - $this->fixTokenMap[$key] = self::$tokenMap[$key]; - } - - if (isset($this->fixTokenMap['public'])) { - $this->fixTokenMap['constructor_public'] = CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PUBLIC; - } - - if (isset($this->fixTokenMap['protected'])) { - $this->fixTokenMap['constructor_protected'] = CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PROTECTED; - } - - if (isset($this->fixTokenMap['private'])) { - $this->fixTokenMap['constructor_private'] = CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PRIVATE; - } - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Ensures a single space after language constructs.', - [ - new CodeSample( - ' [ - 'echo', - ], - ] - ), - new VersionSpecificCodeSample( - ' [ - 'yield_from', - ], - ] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run before BracesFixer, FunctionDeclarationFixer. - */ - public function getPriority(): int - { - return 36; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isAnyTokenKindsFound(array_values($this->fixTokenMap)) && !$tokens->hasAlternativeSyntax(); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $tokenKinds = array_values($this->fixTokenMap); - - for ($index = $tokens->count() - 2; $index >= 0; --$index) { - $token = $tokens[$index]; - - if (!$token->isGivenKind($tokenKinds)) { - continue; - } - - $whitespaceTokenIndex = $index + 1; - - if ($tokens[$whitespaceTokenIndex]->equalsAny([',', ';', ')', [CT::T_ARRAY_SQUARE_BRACE_CLOSE]])) { - continue; - } - - if ( - $token->isGivenKind(T_STATIC) - && !$tokens[$tokens->getNextMeaningfulToken($index)]->isGivenKind([T_FUNCTION, T_VARIABLE]) - ) { - continue; - } - - if ($token->isGivenKind(T_OPEN_TAG)) { - if ($tokens[$whitespaceTokenIndex]->equals([T_WHITESPACE]) && false === strpos($token->getContent(), "\n")) { - $tokens->clearAt($whitespaceTokenIndex); - } - - continue; - } - - if ($token->isGivenKind(T_CLASS) && $tokens[$tokens->getNextMeaningfulToken($index)]->equals('(')) { - continue; - } - - if ($token->isGivenKind([T_EXTENDS, T_IMPLEMENTS]) && $this->isMultilineExtendsOrImplementsWithMoreThanOneAncestor($tokens, $index)) { - continue; - } - - if ($token->isGivenKind(T_RETURN) && $this->isMultiLineReturn($tokens, $index)) { - continue; - } - - if ($token->isComment() || $token->isGivenKind(CT::T_ATTRIBUTE_CLOSE)) { - if ($tokens[$whitespaceTokenIndex]->equals([T_WHITESPACE]) && false !== strpos($tokens[$whitespaceTokenIndex]->getContent(), "\n")) { - continue; - } - } - - if ($tokens[$whitespaceTokenIndex]->equals([T_WHITESPACE])) { - $tokens[$whitespaceTokenIndex] = new Token([T_WHITESPACE, ' ']); - } else { - $tokens->insertAt($whitespaceTokenIndex, new Token([T_WHITESPACE, ' '])); - } - - if ( - 70000 <= \PHP_VERSION_ID - && $token->isGivenKind(T_YIELD_FROM) - && 'yield from' !== strtolower($token->getContent()) - ) { - $tokens[$index] = new Token([T_YIELD_FROM, Preg::replace( - '/\s+/', - ' ', - $token->getContent() - )]); - } - } - } - - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('constructs', 'List of constructs which must be followed by a single space.')) - ->setAllowedTypes(['array']) - ->setAllowedValues([new AllowedValueSubset(array_keys(self::$tokenMap))]) - ->setDefault(array_keys(self::$tokenMap)) - ->getOption(), - ]); - } - - private function isMultiLineReturn(Tokens $tokens, int $index): bool - { - ++$index; - $tokenFollowingReturn = $tokens[$index]; - - if ( - !$tokenFollowingReturn->isGivenKind(T_WHITESPACE) - || false === strpos($tokenFollowingReturn->getContent(), "\n") - ) { - return false; - } - - $nestedCount = 0; - - for ($indexEnd = \count($tokens) - 1, ++$index; $index < $indexEnd; ++$index) { - if (false !== strpos($tokens[$index]->getContent(), "\n")) { - return true; - } - - if ($tokens[$index]->equals('{')) { - ++$nestedCount; - } elseif ($tokens[$index]->equals('}')) { - --$nestedCount; - } elseif (0 === $nestedCount && $tokens[$index]->equalsAny([';', [T_CLOSE_TAG]])) { - break; - } - } - - return false; - } - - private function isMultilineExtendsOrImplementsWithMoreThanOneAncestor(Tokens $tokens, int $index): bool - { - $hasMoreThanOneAncestor = false; - - while (++$index) { - $token = $tokens[$index]; - - if ($token->equals(',')) { - $hasMoreThanOneAncestor = true; - - continue; - } - - if ($token->equals('{')) { - return false; - } - - if ($hasMoreThanOneAncestor && false !== strpos($token->getContent(), "\n")) { - return true; - } - } - - return false; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ListNotation/ListSyntaxFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ListNotation/ListSyntaxFixer.php deleted file mode 100644 index a7bd701..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ListNotation/ListSyntaxFixer.php +++ /dev/null @@ -1,150 +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\Fixer\ListNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\ConfigurationException\InvalidFixerConfigurationException; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author SpacePossum - */ -final class ListSyntaxFixer extends AbstractFixer implements ConfigurableFixerInterface -{ - /** - * @var null|int - */ - private $candidateTokenKind; - - /** - * Use 'syntax' => 'long'|'short'. - * - * @param array $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; - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'List (`array` destructuring) assignment should be declared using the configured syntax. Requires PHP >= 7.1.', - [ - new VersionSpecificCodeSample( - " 'long'] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run before BinaryOperatorSpacesFixer, TernaryOperatorSpacesFixer. - */ - public function getPriority(): int - { - return 1; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return \PHP_VERSION_ID >= 70100 && $tokens->isTokenKindFound($this->candidateTokenKind); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - for ($index = $tokens->count() - 1; 0 <= $index; --$index) { - if ($tokens[$index]->isGivenKind($this->candidateTokenKind)) { - if (T_LIST === $this->candidateTokenKind) { - $this->fixToShortSyntax($tokens, $index); - } else { - $this->fixToLongSyntax($tokens, $index); - } - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('syntax', 'Whether to use the `long` or `short` `list` syntax.')) - ->setAllowedValues(['long', 'short']) - ->setDefault('short') - ->getOption(), - ]); - } - - private function fixToLongSyntax(Tokens $tokens, int $index): void - { - static $typesOfInterest = [ - [CT::T_DESTRUCTURING_SQUARE_BRACE_CLOSE], - '[', // [CT::T_ARRAY_SQUARE_BRACE_OPEN], - ]; - - $closeIndex = $tokens->getNextTokenOfKind($index, $typesOfInterest); - if (!$tokens[$closeIndex]->isGivenKind(CT::T_DESTRUCTURING_SQUARE_BRACE_CLOSE)) { - return; - } - - $tokens[$index] = new Token('('); - $tokens[$closeIndex] = new Token(')'); - $tokens->insertAt($index, new Token([T_LIST, 'list'])); - } - - private function fixToShortSyntax(Tokens $tokens, int $index): void - { - $openIndex = $tokens->getNextTokenOfKind($index, ['(']); - $closeIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $openIndex); - - $tokens[$openIndex] = new Token([CT::T_DESTRUCTURING_SQUARE_BRACE_OPEN, '[']); - $tokens[$closeIndex] = new Token([CT::T_DESTRUCTURING_SQUARE_BRACE_CLOSE, ']']); - - $tokens->clearTokenAndMergeSurroundingWhitespace($index); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/NamespaceNotation/BlankLineAfterNamespaceFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/NamespaceNotation/BlankLineAfterNamespaceFixer.php deleted file mode 100644 index 3ef3651..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/NamespaceNotation/BlankLineAfterNamespaceFixer.php +++ /dev/null @@ -1,136 +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\Fixer\NamespaceNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Fixer for rules defined in PSR2 ¶3. - * - * @author Dariusz Rumiński - */ -final class BlankLineAfterNamespaceFixer extends AbstractFixer implements WhitespacesAwareFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'There MUST be one blank line after the namespace declaration.', - [ - new CodeSample("isTokenKindFound(T_NAMESPACE); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $lastIndex = $tokens->count() - 1; - - for ($index = $lastIndex; $index >= 0; --$index) { - $token = $tokens[$index]; - - if (!$token->isGivenKind(T_NAMESPACE)) { - continue; - } - - $semicolonIndex = $tokens->getNextTokenOfKind($index, [';', '{', [T_CLOSE_TAG]]); - $semicolonToken = $tokens[$semicolonIndex]; - - if (!$semicolonToken->equals(';')) { - continue; - } - - $indexToEnsureBlankLineAfter = $this->getIndexToEnsureBlankLineAfter($tokens, $semicolonIndex); - $indexToEnsureBlankLine = $tokens->getNonEmptySibling($indexToEnsureBlankLineAfter, 1); - - if (null !== $indexToEnsureBlankLine && $tokens[$indexToEnsureBlankLine]->isWhitespace()) { - $tokens[$indexToEnsureBlankLine] = $this->getTokenToInsert($tokens[$indexToEnsureBlankLine]->getContent(), $indexToEnsureBlankLine === $lastIndex); - } else { - $tokens->insertAt($indexToEnsureBlankLineAfter + 1, $this->getTokenToInsert('', $indexToEnsureBlankLineAfter === $lastIndex)); - } - } - } - - private function getIndexToEnsureBlankLineAfter(Tokens $tokens, int $index): int - { - $indexToEnsureBlankLine = $index; - $nextIndex = $tokens->getNonEmptySibling($indexToEnsureBlankLine, 1); - - while (null !== $nextIndex) { - $token = $tokens[$nextIndex]; - - if ($token->isWhitespace()) { - if (1 === Preg::match('/\R/', $token->getContent())) { - break; - } - $nextNextIndex = $tokens->getNonEmptySibling($nextIndex, 1); - - if (!$tokens[$nextNextIndex]->isComment()) { - break; - } - } - - if (!$token->isWhitespace() && !$token->isComment()) { - break; - } - - $indexToEnsureBlankLine = $nextIndex; - $nextIndex = $tokens->getNonEmptySibling($indexToEnsureBlankLine, 1); - } - - return $indexToEnsureBlankLine; - } - - private function getTokenToInsert(string $currentContent, bool $isLastIndex): Token - { - $ending = $this->whitespacesConfig->getLineEnding(); - - $emptyLines = $isLastIndex ? $ending : $ending.$ending; - $indent = 1 === Preg::match('/^.*\R( *)$/s', $currentContent, $matches) ? $matches[1] : ''; - - return new Token([T_WHITESPACE, $emptyLines.$indent]); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/NamespaceNotation/CleanNamespaceFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/NamespaceNotation/CleanNamespaceFixer.php deleted file mode 100644 index c4795f5..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/NamespaceNotation/CleanNamespaceFixer.php +++ /dev/null @@ -1,107 +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\Fixer\NamespaceNotation; - -use PhpCsFixer\AbstractLinesBeforeNamespaceFixer; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\FixerDefinition\VersionSpecification; -use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample; -use PhpCsFixer\Tokenizer\Tokens; - -final class CleanNamespaceFixer extends AbstractLinesBeforeNamespaceFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - $samples = []; - - foreach (['namespace Foo \\ Bar;', 'echo foo /* comment */ \\ bar();'] as $sample) { - $samples[] = new VersionSpecificCodeSample( - "isTokenKindFound(T_NS_SEPARATOR); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $count = $tokens->count(); - - for ($index = 0; $index < $count; ++$index) { - if ($tokens[$index]->isGivenKind(T_NS_SEPARATOR)) { - $previousIndex = $tokens->getPrevMeaningfulToken($index); - - $index = $this->fixNamespace( - $tokens, - $tokens[$previousIndex]->isGivenKind(T_STRING) ? $previousIndex : $index - ); - } - } - } - - /** - * @param int $index start of namespace - */ - private function fixNamespace(Tokens $tokens, int $index): int - { - $tillIndex = $index; - - // go to the end of the namespace - while ($tokens[$tillIndex]->isGivenKind([T_NS_SEPARATOR, T_STRING])) { - $tillIndex = $tokens->getNextMeaningfulToken($tillIndex); - } - - $tillIndex = $tokens->getPrevMeaningfulToken($tillIndex); - - $spaceIndexes = []; - - for (; $index <= $tillIndex; ++$index) { - if ($tokens[$index]->isGivenKind(T_WHITESPACE)) { - $spaceIndexes[] = $index; - } elseif ($tokens[$index]->isComment()) { - $tokens->clearAt($index); - } - } - - if ($tokens[$index - 1]->isWhitespace()) { - array_pop($spaceIndexes); - } - - foreach ($spaceIndexes as $i) { - $tokens->clearAt($i); - } - - return $index; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/NamespaceNotation/NoBlankLinesBeforeNamespaceFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/NamespaceNotation/NoBlankLinesBeforeNamespaceFixer.php deleted file mode 100644 index 9a88263..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/NamespaceNotation/NoBlankLinesBeforeNamespaceFixer.php +++ /dev/null @@ -1,76 +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\Fixer\NamespaceNotation; - -use PhpCsFixer\AbstractLinesBeforeNamespaceFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Graham Campbell - */ -final class NoBlankLinesBeforeNamespaceFixer extends AbstractLinesBeforeNamespaceFixer -{ - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isTokenKindFound(T_NAMESPACE); - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'There should be no blank lines before a namespace declaration.', - [ - new CodeSample( - "count(); $index < $limit; ++$index) { - $token = $tokens[$index]; - - if (!$token->isGivenKind(T_NAMESPACE)) { - continue; - } - - $this->fixLinesBeforeNamespace($tokens, $index, 0, 1); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/NamespaceNotation/NoLeadingNamespaceWhitespaceFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/NamespaceNotation/NoLeadingNamespaceWhitespaceFixer.php deleted file mode 100644 index 6a038c8..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/NamespaceNotation/NoLeadingNamespaceWhitespaceFixer.php +++ /dev/null @@ -1,104 +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\Fixer\NamespaceNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Bram Gotink - * @author Dariusz Rumiński - */ -final class NoLeadingNamespaceWhitespaceFixer extends AbstractFixer implements WhitespacesAwareFixerInterface -{ - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isTokenKindFound(T_NAMESPACE); - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'The namespace declaration line shouldn\'t contain leading whitespace.', - [ - new CodeSample( - 'isGivenKind(T_NAMESPACE)) { - continue; - } - - $beforeNamespaceIndex = $index - 1; - $beforeNamespace = $tokens[$beforeNamespaceIndex]; - - if (!$beforeNamespace->isWhitespace()) { - if (!self::endsWithWhitespace($beforeNamespace->getContent())) { - $tokens->insertAt($index, new Token([T_WHITESPACE, $this->whitespacesConfig->getLineEnding()])); - } - - continue; - } - - $lastNewline = strrpos($beforeNamespace->getContent(), "\n"); - - if (false === $lastNewline) { - $beforeBeforeNamespace = $tokens[$index - 2]; - - if (self::endsWithWhitespace($beforeBeforeNamespace->getContent())) { - $tokens->clearAt($beforeNamespaceIndex); - } else { - $tokens[$beforeNamespaceIndex] = new Token([T_WHITESPACE, ' ']); - } - } else { - $tokens[$beforeNamespaceIndex] = new Token([T_WHITESPACE, substr($beforeNamespace->getContent(), 0, $lastNewline + 1)]); - } - } - } - - private static function endsWithWhitespace(string $str): bool - { - if ('' === $str) { - return false; - } - - return '' === trim(substr($str, -1)); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/NamespaceNotation/SingleBlankLineBeforeNamespaceFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/NamespaceNotation/SingleBlankLineBeforeNamespaceFixer.php deleted file mode 100644 index f3d46ce..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/NamespaceNotation/SingleBlankLineBeforeNamespaceFixer.php +++ /dev/null @@ -1,71 +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\Fixer\NamespaceNotation; - -use PhpCsFixer\AbstractLinesBeforeNamespaceFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Graham Campbell - */ -final class SingleBlankLineBeforeNamespaceFixer extends AbstractLinesBeforeNamespaceFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'There should be exactly one blank line before a namespace declaration.', - [ - new CodeSample("isTokenKindFound(T_NAMESPACE); - } - - /** - * {@inheritdoc} - */ - public function getPriority(): int - { - return -21; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - for ($index = $tokens->count() - 1; $index >= 0; --$index) { - $token = $tokens[$index]; - - if ($token->isGivenKind(T_NAMESPACE)) { - $this->fixLinesBeforeNamespace($tokens, $index, 2, 2); - } - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Naming/NoHomoglyphNamesFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Naming/NoHomoglyphNamesFixer.php deleted file mode 100644 index 0f16b07..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Naming/NoHomoglyphNamesFixer.php +++ /dev/null @@ -1,245 +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\Fixer\Naming; - -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 Fred Cox - * @author Dariusz Rumiński - */ -final class NoHomoglyphNamesFixer extends AbstractFixer -{ - /** - * Used the program https://github.com/mcfedr/homoglyph-download - * to generate this list from - * http://homoglyphs.net/?text=abcdefghijklmnopqrstuvwxyz&lang=en&exc7=1&exc8=1&exc13=1&exc14=1. - * - * Symbols replaced include - * - Latin homoglyphs - * - IPA extensions - * - Greek and Coptic - * - Cyrillic - * - Cyrillic Supplement - * - Letterlike Symbols - * - Latin Numbers - * - Fullwidth Latin - * - * This is not the complete list of unicode homographs, but limited - * to those you are more likely to have typed/copied by accident - * - * @var array - */ - private static $replacements = [ - 'O' => '0', - '0' => '0', - 'I' => '1', - '1' => '1', - '2' => '2', - '3' => '3', - '4' => '4', - '5' => '5', - '6' => '6', - '7' => '7', - '8' => '8', - '9' => '9', - 'Α' => 'A', - 'А' => 'A', - 'A' => 'A', - 'ʙ' => 'B', - 'Β' => 'B', - 'В' => 'B', - 'B' => 'B', - 'Ϲ' => 'C', - 'С' => 'C', - 'Ⅽ' => 'C', - 'C' => 'C', - 'Ⅾ' => 'D', - 'D' => 'D', - 'Ε' => 'E', - 'Е' => 'E', - 'E' => 'E', - 'Ϝ' => 'F', - 'F' => 'F', - 'ɢ' => 'G', - 'Ԍ' => 'G', - 'G' => 'G', - 'ʜ' => 'H', - 'Η' => 'H', - 'Н' => 'H', - 'H' => 'H', - 'l' => 'I', - 'Ι' => 'I', - 'І' => 'I', - 'Ⅰ' => 'I', - 'I' => 'I', - 'Ј' => 'J', - 'J' => 'J', - 'Κ' => 'K', - 'К' => 'K', - 'K' => 'K', - 'K' => 'K', - 'ʟ' => 'L', - 'Ⅼ' => 'L', - 'L' => 'L', - 'Μ' => 'M', - 'М' => 'M', - 'Ⅿ' => 'M', - 'M' => 'M', - 'ɴ' => 'N', - 'Ν' => 'N', - 'N' => 'N', - 'Ο' => 'O', - 'О' => 'O', - 'O' => 'O', - 'Ρ' => 'P', - 'Р' => 'P', - 'P' => 'P', - 'Q' => 'Q', - 'ʀ' => 'R', - 'R' => 'R', - 'Ѕ' => 'S', - 'S' => 'S', - 'Τ' => 'T', - 'Т' => 'T', - 'T' => 'T', - 'U' => 'U', - 'Ѵ' => 'V', - 'Ⅴ' => 'V', - 'V' => 'V', - 'W' => 'W', - 'Χ' => 'X', - 'Х' => 'X', - 'Ⅹ' => 'X', - 'X' => 'X', - 'ʏ' => 'Y', - 'Υ' => 'Y', - 'Ү' => 'Y', - 'Y' => 'Y', - 'Ζ' => 'Z', - 'Z' => 'Z', - '_' => '_', - 'ɑ' => 'a', - 'а' => 'a', - 'a' => 'a', - 'Ь' => 'b', - 'b' => 'b', - 'ϲ' => 'c', - 'с' => 'c', - 'ⅽ' => 'c', - 'c' => 'c', - 'ԁ' => 'd', - 'ⅾ' => 'd', - 'd' => 'd', - 'е' => 'e', - 'e' => 'e', - 'f' => 'f', - 'ɡ' => 'g', - 'g' => 'g', - 'һ' => 'h', - 'h' => 'h', - 'ɩ' => 'i', - 'і' => 'i', - 'ⅰ' => 'i', - 'i' => 'i', - 'ј' => 'j', - 'j' => 'j', - 'k' => 'k', - 'ⅼ' => 'l', - 'l' => 'l', - 'ⅿ' => 'm', - 'm' => 'm', - 'n' => 'n', - 'ο' => 'o', - 'о' => 'o', - 'o' => 'o', - 'р' => 'p', - 'p' => 'p', - 'q' => 'q', - 'r' => 'r', - 'ѕ' => 's', - 's' => 's', - 't' => 't', - 'u' => 'u', - 'ν' => 'v', - 'ѵ' => 'v', - 'ⅴ' => 'v', - 'v' => 'v', - 'ѡ' => 'w', - 'w' => 'w', - 'х' => 'x', - 'ⅹ' => 'x', - 'x' => 'x', - 'у' => 'y', - 'y' => 'y', - 'z' => 'z', - ]; - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Replace accidental usage of homoglyphs (non ascii characters) in names.', - [new CodeSample("isAnyTokenKindsFound([T_VARIABLE, T_STRING]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind([T_VARIABLE, T_STRING])) { - continue; - } - - $replaced = Preg::replaceCallback('/[^[:ascii:]]/u', static function (array $matches) { - return self::$replacements[$matches[0]] ?? $matches[0] - ; - }, $token->getContent(), -1, $count); - - if ($count) { - $tokens->offsetSet($index, new Token([$token->getId(), $replaced])); - } - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/BinaryOperatorSpacesFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/BinaryOperatorSpacesFixer.php deleted file mode 100644 index 8ea85fc..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/BinaryOperatorSpacesFixer.php +++ /dev/null @@ -1,756 +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\Fixer\Operator; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; -use Symfony\Component\OptionsResolver\Exception\InvalidOptionsException; - -/** - * @author Dariusz Rumiński - * @author SpacePossum - */ -final class BinaryOperatorSpacesFixer extends AbstractFixer implements ConfigurableFixerInterface -{ - /** - * @internal - */ - public const SINGLE_SPACE = 'single_space'; - - /** - * @internal - */ - public const NO_SPACE = 'no_space'; - - /** - * @internal - */ - public const ALIGN = 'align'; - - /** - * @internal - */ - public const ALIGN_SINGLE_SPACE = 'align_single_space'; - - /** - * @internal - */ - public const ALIGN_SINGLE_SPACE_MINIMAL = 'align_single_space_minimal'; - - /** - * @internal - * @const Placeholder used as anchor for right alignment. - */ - public const ALIGN_PLACEHOLDER = "\x2 ALIGNABLE%d \x3"; - - /** - * @var string[] - */ - private const SUPPORTED_OPERATORS = [ - '=', - '*', - '/', - '%', - '<', - '>', - '|', - '^', - '+', - '-', - '&', - '&=', - '&&', - '||', - '.=', - '/=', - '=>', - '==', - '>=', - '===', - '!=', - '<>', - '!==', - '<=', - 'and', - 'or', - 'xor', - '-=', - '%=', - '*=', - '|=', - '+=', - '<<', - '<<=', - '>>', - '>>=', - '^=', - '**', - '**=', - '<=>', - '??', - '??=', - ]; - - /** - * Keep track of the deepest level ever achieved while - * parsing the code. Used later to replace alignment - * placeholders with spaces. - * - * @var int - */ - private $deepestLevel; - - /** - * Level counter of the current nest level. - * So one level alignments are not mixed with - * other level ones. - * - * @var int - */ - private $currentLevel; - - private static $allowedValues = [ - self::ALIGN, - self::ALIGN_SINGLE_SPACE, - self::ALIGN_SINGLE_SPACE_MINIMAL, - self::SINGLE_SPACE, - self::NO_SPACE, - null, - ]; - - /** - * @var TokensAnalyzer - */ - private $tokensAnalyzer; - - /** - * @var array - */ - private $alignOperatorTokens = []; - - /** - * @var array - */ - private $operators = []; - - /** - * {@inheritdoc} - */ - public function configure(array $configuration): void - { - parent::configure($configuration); - - $this->operators = $this->resolveOperatorsFromConfig(); - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Binary operators should be surrounded by space as configured.', - [ - new CodeSample( - " ['=' => 'align', 'xor' => null]] - ), - new CodeSample( - ' ['+=' => 'align_single_space']] - ), - new CodeSample( - ' ['===' => 'align_single_space_minimal']] - ), - new CodeSample( - ' ['|' => 'no_space']] - ), - new CodeSample( - ' 1, - "baaaaaaaaaaar" => 11, -]; -', - ['operators' => ['=>' => 'single_space']] - ), - new CodeSample( - ' 12, - "baaaaaaaaaaar" => 13, -]; -', - ['operators' => ['=>' => 'align']] - ), - new CodeSample( - ' 12, - "baaaaaaaaaaar" => 13, -]; -', - ['operators' => ['=>' => 'align_single_space']] - ), - new CodeSample( - ' 12, - "baaaaaaaaaaar" => 13, -]; -', - ['operators' => ['=>' => 'align_single_space_minimal']] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run after ArrayIndentationFixer, ArraySyntaxFixer, ListSyntaxFixer, NoMultilineWhitespaceAroundDoubleArrowFixer, NoUnsetCastFixer, PowToExponentiationFixer, StandardizeNotEqualsFixer, StrictComparisonFixer. - */ - public function getPriority(): int - { - return -32; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $this->tokensAnalyzer = new TokensAnalyzer($tokens); - - // last and first tokens cannot be an operator - for ($index = $tokens->count() - 2; $index > 0; --$index) { - if (!$this->tokensAnalyzer->isBinaryOperator($index)) { - continue; - } - - if ('=' === $tokens[$index]->getContent()) { - $isDeclare = $this->isEqualPartOfDeclareStatement($tokens, $index); - if (false === $isDeclare) { - $this->fixWhiteSpaceAroundOperator($tokens, $index); - } else { - $index = $isDeclare; // skip `declare(foo ==bar)`, see `declare_equal_normalize` - } - } else { - $this->fixWhiteSpaceAroundOperator($tokens, $index); - } - - // previous of binary operator is now never an operator / previous of declare statement cannot be an operator - --$index; - } - - if (\count($this->alignOperatorTokens)) { - $this->fixAlignment($tokens, $this->alignOperatorTokens); - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('default', 'Default fix strategy.')) - ->setDefault(self::SINGLE_SPACE) - ->setAllowedValues(self::$allowedValues) - ->getOption(), - (new FixerOptionBuilder('operators', 'Dictionary of `binary operator` => `fix strategy` values that differ from the default strategy.')) - ->setAllowedTypes(['array']) - ->setAllowedValues([static function (array $option) { - foreach ($option as $operator => $value) { - if (!\in_array($operator, self::SUPPORTED_OPERATORS, true)) { - throw new InvalidOptionsException( - sprintf( - 'Unexpected "operators" key, expected any of "%s", got "%s".', - implode('", "', self::SUPPORTED_OPERATORS), - \gettype($operator).'#'.$operator - ) - ); - } - - if (!\in_array($value, self::$allowedValues, true)) { - throw new InvalidOptionsException( - sprintf( - 'Unexpected value for operator "%s", expected any of "%s", got "%s".', - $operator, - implode('", "', self::$allowedValues), - \is_object($value) ? \get_class($value) : (null === $value ? 'null' : \gettype($value).'#'.$value) - ) - ); - } - } - - return true; - }]) - ->setDefault([]) - ->getOption(), - ]); - } - - private function fixWhiteSpaceAroundOperator(Tokens $tokens, int $index): void - { - $tokenContent = strtolower($tokens[$index]->getContent()); - - if (!\array_key_exists($tokenContent, $this->operators)) { - return; // not configured to be changed - } - - if (self::SINGLE_SPACE === $this->operators[$tokenContent]) { - $this->fixWhiteSpaceAroundOperatorToSingleSpace($tokens, $index); - - return; - } - - if (self::NO_SPACE === $this->operators[$tokenContent]) { - $this->fixWhiteSpaceAroundOperatorToNoSpace($tokens, $index); - - return; - } - - // schedule for alignment - $this->alignOperatorTokens[$tokenContent] = $this->operators[$tokenContent]; - - if (self::ALIGN === $this->operators[$tokenContent]) { - return; - } - - // fix white space after operator - if ($tokens[$index + 1]->isWhitespace()) { - if (self::ALIGN_SINGLE_SPACE_MINIMAL === $this->operators[$tokenContent]) { - $tokens[$index + 1] = new Token([T_WHITESPACE, ' ']); - } - - return; - } - - $tokens->insertAt($index + 1, new Token([T_WHITESPACE, ' '])); - } - - private function fixWhiteSpaceAroundOperatorToSingleSpace(Tokens $tokens, int $index): void - { - // fix white space after operator - if ($tokens[$index + 1]->isWhitespace()) { - $content = $tokens[$index + 1]->getContent(); - if (' ' !== $content && false === strpos($content, "\n") && !$tokens[$tokens->getNextNonWhitespace($index + 1)]->isComment()) { - $tokens[$index + 1] = new Token([T_WHITESPACE, ' ']); - } - } else { - $tokens->insertAt($index + 1, new Token([T_WHITESPACE, ' '])); - } - - // fix white space before operator - if ($tokens[$index - 1]->isWhitespace()) { - $content = $tokens[$index - 1]->getContent(); - if (' ' !== $content && false === strpos($content, "\n") && !$tokens[$tokens->getPrevNonWhitespace($index - 1)]->isComment()) { - $tokens[$index - 1] = new Token([T_WHITESPACE, ' ']); - } - } else { - $tokens->insertAt($index, new Token([T_WHITESPACE, ' '])); - } - } - - private function fixWhiteSpaceAroundOperatorToNoSpace(Tokens $tokens, int $index): void - { - // fix white space after operator - if ($tokens[$index + 1]->isWhitespace()) { - $content = $tokens[$index + 1]->getContent(); - if (false === strpos($content, "\n") && !$tokens[$tokens->getNextNonWhitespace($index + 1)]->isComment()) { - $tokens->clearAt($index + 1); - } - } - - // fix white space before operator - if ($tokens[$index - 1]->isWhitespace()) { - $content = $tokens[$index - 1]->getContent(); - if (false === strpos($content, "\n") && !$tokens[$tokens->getPrevNonWhitespace($index - 1)]->isComment()) { - $tokens->clearAt($index - 1); - } - } - } - - /** - * @return false|int index of T_DECLARE where the `=` belongs to or `false` - */ - private function isEqualPartOfDeclareStatement(Tokens $tokens, int $index) - { - $prevMeaningfulIndex = $tokens->getPrevMeaningfulToken($index); - if ($tokens[$prevMeaningfulIndex]->isGivenKind(T_STRING)) { - $prevMeaningfulIndex = $tokens->getPrevMeaningfulToken($prevMeaningfulIndex); - if ($tokens[$prevMeaningfulIndex]->equals('(')) { - $prevMeaningfulIndex = $tokens->getPrevMeaningfulToken($prevMeaningfulIndex); - if ($tokens[$prevMeaningfulIndex]->isGivenKind(T_DECLARE)) { - return $prevMeaningfulIndex; - } - } - } - - return false; - } - - /** - * @return array - */ - private function resolveOperatorsFromConfig(): array - { - $operators = []; - - if (null !== $this->configuration['default']) { - foreach (self::SUPPORTED_OPERATORS as $operator) { - $operators[$operator] = $this->configuration['default']; - } - } - - foreach ($this->configuration['operators'] as $operator => $value) { - if (null === $value) { - unset($operators[$operator]); - } else { - $operators[$operator] = $value; - } - } - - // @TODO: drop condition when PHP 7.4+ is required - if (!\defined('T_COALESCE_EQUAL')) { - unset($operators['??=']); - } - - return $operators; - } - - // Alignment logic related methods - - /** - * @param array $toAlign - */ - private function fixAlignment(Tokens $tokens, array $toAlign): void - { - $this->deepestLevel = 0; - $this->currentLevel = 0; - - foreach ($toAlign as $tokenContent => $alignStrategy) { - // This fixer works partially on Tokens and partially on string representation of code. - // During the process of fixing internal state of single Token may be affected by injecting ALIGN_PLACEHOLDER to its content. - // The placeholder will be resolved by `replacePlaceholders` method by removing placeholder or changing it into spaces. - // That way of fixing the code causes disturbances in marking Token as changed - if code is perfectly valid then placeholder - // still be injected and removed, which will cause the `changed` flag to be set. - // To handle that unwanted behavior we work on clone of Tokens collection and then override original collection with fixed collection. - $tokensClone = clone $tokens; - - if ('=>' === $tokenContent) { - $this->injectAlignmentPlaceholdersForArrow($tokensClone, 0, \count($tokens)); - } else { - $this->injectAlignmentPlaceholders($tokensClone, 0, \count($tokens), $tokenContent); - } - - // for all tokens that should be aligned but do not have anything to align with, fix spacing if needed - if (self::ALIGN_SINGLE_SPACE === $alignStrategy || self::ALIGN_SINGLE_SPACE_MINIMAL === $alignStrategy) { - if ('=>' === $tokenContent) { - for ($index = $tokens->count() - 2; $index > 0; --$index) { - if ($tokens[$index]->isGivenKind(T_DOUBLE_ARROW)) { // always binary operator, never part of declare statement - $this->fixWhiteSpaceBeforeOperator($tokensClone, $index, $alignStrategy); - } - } - } elseif ('=' === $tokenContent) { - for ($index = $tokens->count() - 2; $index > 0; --$index) { - if ('=' === $tokens[$index]->getContent() && !$this->isEqualPartOfDeclareStatement($tokens, $index) && $this->tokensAnalyzer->isBinaryOperator($index)) { - $this->fixWhiteSpaceBeforeOperator($tokensClone, $index, $alignStrategy); - } - } - } else { - for ($index = $tokens->count() - 2; $index > 0; --$index) { - $content = $tokens[$index]->getContent(); - if (strtolower($content) === $tokenContent && $this->tokensAnalyzer->isBinaryOperator($index)) { // never part of declare statement - $this->fixWhiteSpaceBeforeOperator($tokensClone, $index, $alignStrategy); - } - } - } - } - - $tokens->setCode($this->replacePlaceholders($tokensClone, $alignStrategy)); - } - } - - private function injectAlignmentPlaceholders(Tokens $tokens, int $startAt, int $endAt, string $tokenContent): void - { - for ($index = $startAt; $index < $endAt; ++$index) { - $token = $tokens[$index]; - - $content = $token->getContent(); - if ( - strtolower($content) === $tokenContent - && $this->tokensAnalyzer->isBinaryOperator($index) - && ('=' !== $content || !$this->isEqualPartOfDeclareStatement($tokens, $index)) - ) { - $tokens[$index] = new Token(sprintf(self::ALIGN_PLACEHOLDER, $this->deepestLevel).$content); - - continue; - } - - if ($token->isGivenKind(T_FUNCTION)) { - ++$this->deepestLevel; - - continue; - } - - if ($token->equals('(')) { - $index = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $index); - - continue; - } - - if ($token->equals('[')) { - $index = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_INDEX_SQUARE_BRACE, $index); - - continue; - } - - if ($token->isGivenKind(CT::T_ARRAY_SQUARE_BRACE_OPEN)) { - $index = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_ARRAY_SQUARE_BRACE, $index); - - continue; - } - } - } - - private function injectAlignmentPlaceholdersForArrow(Tokens $tokens, int $startAt, int $endAt): void - { - for ($index = $startAt; $index < $endAt; ++$index) { - $token = $tokens[$index]; - - if ($token->isGivenKind([T_FOREACH, T_FOR, T_WHILE, T_IF, T_SWITCH])) { - $index = $tokens->getNextMeaningfulToken($index); - $index = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $index); - - continue; - } - - if ($token->isGivenKind(T_ARRAY)) { // don't use "$tokens->isArray()" here, short arrays are handled in the next case - $from = $tokens->getNextMeaningfulToken($index); - $until = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $from); - $index = $until; - - $this->injectArrayAlignmentPlaceholders($tokens, $from + 1, $until - 1); - - continue; - } - - if ($token->isGivenKind(CT::T_ARRAY_SQUARE_BRACE_OPEN)) { - $from = $index; - $until = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_ARRAY_SQUARE_BRACE, $from); - $index = $until; - - $this->injectArrayAlignmentPlaceholders($tokens, $from + 1, $until - 1); - - continue; - } - - if ($token->isGivenKind(T_DOUBLE_ARROW)) { // no need to analyze for `isBinaryOperator` (always true), nor if part of declare statement (not valid PHP) - $tokenContent = sprintf(self::ALIGN_PLACEHOLDER, $this->currentLevel).$token->getContent(); - - $nextToken = $tokens[$index + 1]; - if (!$nextToken->isWhitespace()) { - $tokenContent .= ' '; - } elseif ($nextToken->isWhitespace(" \t")) { - $tokens[$index + 1] = new Token([T_WHITESPACE, ' ']); - } - - $tokens[$index] = new Token([T_DOUBLE_ARROW, $tokenContent]); - - continue; - } - - if ($token->equals(';')) { - ++$this->deepestLevel; - ++$this->currentLevel; - - continue; - } - - if ($token->equals(',')) { - for ($i = $index; $i < $endAt - 1; ++$i) { - if (false !== strpos($tokens[$i - 1]->getContent(), "\n")) { - break; - } - - if ($tokens[$i + 1]->isGivenKind([T_ARRAY, CT::T_ARRAY_SQUARE_BRACE_OPEN])) { - $arrayStartIndex = $tokens[$i + 1]->isGivenKind(T_ARRAY) - ? $tokens->getNextMeaningfulToken($i + 1) - : $i + 1 - ; - $blockType = Tokens::detectBlockType($tokens[$arrayStartIndex]); - $arrayEndIndex = $tokens->findBlockEnd($blockType['type'], $arrayStartIndex); - - if ($tokens->isPartialCodeMultiline($arrayStartIndex, $arrayEndIndex)) { - break; - } - } - - ++$index; - } - } - } - } - - private function injectArrayAlignmentPlaceholders(Tokens $tokens, int $from, int $until): void - { - // Only inject placeholders for multi-line arrays - if ($tokens->isPartialCodeMultiline($from, $until)) { - ++$this->deepestLevel; - ++$this->currentLevel; - $this->injectAlignmentPlaceholdersForArrow($tokens, $from, $until); - --$this->currentLevel; - } - } - - private function fixWhiteSpaceBeforeOperator(Tokens $tokens, int $index, string $alignStrategy): void - { - // fix white space after operator is not needed as BinaryOperatorSpacesFixer took care of this (if strategy is _not_ ALIGN) - if (!$tokens[$index - 1]->isWhitespace()) { - $tokens->insertAt($index, new Token([T_WHITESPACE, ' '])); - - return; - } - - if (self::ALIGN_SINGLE_SPACE_MINIMAL !== $alignStrategy || $tokens[$tokens->getPrevNonWhitespace($index - 1)]->isComment()) { - return; - } - - $content = $tokens[$index - 1]->getContent(); - if (' ' !== $content && false === strpos($content, "\n")) { - $tokens[$index - 1] = new Token([T_WHITESPACE, ' ']); - } - } - - /** - * Look for group of placeholders and provide vertical alignment. - */ - private function replacePlaceholders(Tokens $tokens, string $alignStrategy): string - { - $tmpCode = $tokens->generateCode(); - - for ($j = 0; $j <= $this->deepestLevel; ++$j) { - $placeholder = sprintf(self::ALIGN_PLACEHOLDER, $j); - - if (false === strpos($tmpCode, $placeholder)) { - continue; - } - - $lines = explode("\n", $tmpCode); - $groups = []; - $groupIndex = 0; - $groups[$groupIndex] = []; - - foreach ($lines as $index => $line) { - if (substr_count($line, $placeholder) > 0) { - $groups[$groupIndex][] = $index; - } else { - ++$groupIndex; - $groups[$groupIndex] = []; - } - } - - foreach ($groups as $group) { - if (\count($group) < 1) { - continue; - } - - if (self::ALIGN !== $alignStrategy) { - // move place holders to match strategy - foreach ($group as $index) { - $currentPosition = strpos($lines[$index], $placeholder); - $before = substr($lines[$index], 0, $currentPosition); - - if (self::ALIGN_SINGLE_SPACE === $alignStrategy) { - if (1 > \strlen($before) || ' ' !== substr($before, -1)) { // if last char of before-content is not ' '; add it - $before .= ' '; - } - } elseif (self::ALIGN_SINGLE_SPACE_MINIMAL === $alignStrategy) { - if (1 !== Preg::match('/^\h+$/', $before)) { // if indent; do not move, leave to other fixer - $before = rtrim($before).' '; - } - } - - $lines[$index] = $before.substr($lines[$index], $currentPosition); - } - } - - $rightmostSymbol = 0; - foreach ($group as $index) { - $rightmostSymbol = max($rightmostSymbol, strpos(utf8_decode($lines[$index]), $placeholder)); - } - - foreach ($group as $index) { - $line = $lines[$index]; - $currentSymbol = strpos(utf8_decode($line), $placeholder); - $delta = abs($rightmostSymbol - $currentSymbol); - - if ($delta > 0) { - $line = str_replace($placeholder, str_repeat(' ', $delta).$placeholder, $line); - $lines[$index] = $line; - } - } - } - - $tmpCode = str_replace($placeholder, '', implode("\n", $lines)); - } - - return $tmpCode; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/ConcatSpaceFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/ConcatSpaceFixer.php deleted file mode 100644 index afb2cb9..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/ConcatSpaceFixer.php +++ /dev/null @@ -1,168 +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\Fixer\Operator; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dariusz Rumiński - * @author SpacePossum - */ -final class ConcatSpaceFixer extends AbstractFixer implements ConfigurableFixerInterface -{ - /** - * @var null|string - */ - private $fixCallback; - - /** - * {@inheritdoc} - */ - public function configure(array $configuration): void - { - parent::configure($configuration); - - if ('one' === $this->configuration['spacing']) { - $this->fixCallback = 'fixConcatenationToSingleSpace'; - } else { - $this->fixCallback = 'fixConcatenationToNoSpace'; - } - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Concatenation should be spaced according configuration.', - [ - new CodeSample( - " 'none'] - ), - new CodeSample( - " 'one'] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run after SingleLineThrowFixer. - */ - public function getPriority(): int - { - return 0; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isTokenKindFound('.'); - } - - /** - * {@inheritdoc} - */ - 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); - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('spacing', 'Spacing to apply around concatenation operator.')) - ->setAllowedValues(['one', 'none']) - ->setDefault('none') - ->getOption(), - ]); - } - - /** - * @param int $index index of concatenation '.' token - */ - private function fixConcatenationToNoSpace(Tokens $tokens, int $index): void - { - $prevNonWhitespaceToken = $tokens[$tokens->getPrevNonWhitespace($index)]; - if (!$prevNonWhitespaceToken->isGivenKind([T_LNUMBER, T_COMMENT, T_DOC_COMMENT]) || '/*' === substr($prevNonWhitespaceToken->getContent(), 0, 2)) { - $tokens->removeLeadingWhitespace($index, " \t"); - } - - if (!$tokens[$tokens->getNextNonWhitespace($index)]->isGivenKind([T_LNUMBER, T_COMMENT, T_DOC_COMMENT])) { - $tokens->removeTrailingWhitespace($index, " \t"); - } - } - - /** - * @param int $index index of concatenation '.' token - */ - private function fixConcatenationToSingleSpace(Tokens $tokens, int $index): void - { - $this->fixWhiteSpaceAroundConcatToken($tokens, $index, 1); - $this->fixWhiteSpaceAroundConcatToken($tokens, $index, -1); - } - - /** - * @param int $index index of concatenation '.' token - * @param int $offset 1 or -1 - */ - private function fixWhiteSpaceAroundConcatToken(Tokens $tokens, int $index, int $offset): void - { - $offsetIndex = $index + $offset; - - if (!$tokens[$offsetIndex]->isWhitespace()) { - $tokens->insertAt($index + (1 === $offset ?: 0), new Token([T_WHITESPACE, ' '])); - - return; - } - - if (false !== strpos($tokens[$offsetIndex]->getContent(), "\n")) { - return; - } - - if ($tokens[$index + $offset * 2]->isComment()) { - return; - } - - $tokens[$offsetIndex] = new Token([T_WHITESPACE, ' ']); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/IncrementStyleFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/IncrementStyleFixer.php deleted file mode 100644 index a74db84..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/IncrementStyleFixer.php +++ /dev/null @@ -1,173 +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\Fixer\Operator; - -use PhpCsFixer\Fixer\AbstractIncrementOperatorFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * @author Gregor Harlan - * @author Kuba Werłos - */ -final class IncrementStyleFixer extends AbstractIncrementOperatorFixer implements ConfigurableFixerInterface -{ - /** - * @internal - */ - public const STYLE_PRE = 'pre'; - - /** - * @internal - */ - public const STYLE_POST = 'post'; - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Pre- or post-increment and decrement operators should be used if possible.', - [ - new CodeSample(" self::STYLE_POST] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run after StandardizeIncrementFixer. - */ - public function getPriority(): int - { - return 0; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isAnyTokenKindsFound([T_INC, T_DEC]); - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('style', 'Whether to use pre- or post-increment and decrement operators.')) - ->setAllowedValues([self::STYLE_PRE, self::STYLE_POST]) - ->setDefault(self::STYLE_PRE) - ->getOption(), - ]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $tokensAnalyzer = new TokensAnalyzer($tokens); - - for ($index = $tokens->count() - 1; 0 <= $index; --$index) { - $token = $tokens[$index]; - - if (!$token->isGivenKind([T_INC, T_DEC])) { - continue; - } - - if (self::STYLE_PRE === $this->configuration['style'] && $tokensAnalyzer->isUnarySuccessorOperator($index)) { - $nextToken = $tokens[$tokens->getNextMeaningfulToken($index)]; - if (!$nextToken->equalsAny([';', ')'])) { - continue; - } - - $startIndex = $this->findStart($tokens, $index); - - $prevToken = $tokens[$tokens->getPrevMeaningfulToken($startIndex)]; - if ($prevToken->equalsAny([';', '{', '}', [T_OPEN_TAG], ')'])) { - $tokens->clearAt($index); - $tokens->insertAt($startIndex, clone $token); - } - } elseif (self::STYLE_POST === $this->configuration['style'] && $tokensAnalyzer->isUnaryPredecessorOperator($index)) { - $prevToken = $tokens[$tokens->getPrevMeaningfulToken($index)]; - if (!$prevToken->equalsAny([';', '{', '}', [T_OPEN_TAG], ')'])) { - continue; - } - - $endIndex = $this->findEnd($tokens, $index); - - $nextToken = $tokens[$tokens->getNextMeaningfulToken($endIndex)]; - if ($nextToken->equalsAny([';', ')'])) { - $tokens->clearAt($index); - $tokens->insertAt($tokens->getNextNonWhitespace($endIndex), clone $token); - } - } - } - } - - private function findEnd(Tokens $tokens, int $index): int - { - $nextIndex = $tokens->getNextMeaningfulToken($index); - $nextToken = $tokens[$nextIndex]; - - while ($nextToken->equalsAny([ - '$', - '(', - '[', - [CT::T_DYNAMIC_PROP_BRACE_OPEN], - [CT::T_DYNAMIC_VAR_BRACE_OPEN], - [CT::T_ARRAY_INDEX_CURLY_BRACE_OPEN], - [T_NS_SEPARATOR], - [T_STATIC], - [T_STRING], - [T_VARIABLE], - ])) { - $blockType = Tokens::detectBlockType($nextToken); - if (null !== $blockType) { - $nextIndex = $tokens->findBlockEnd($blockType['type'], $nextIndex); - } - $index = $nextIndex; - $nextIndex = $tokens->getNextMeaningfulToken($nextIndex); - $nextToken = $tokens[$nextIndex]; - } - - if ($nextToken->isObjectOperator()) { - return $this->findEnd($tokens, $nextIndex); - } - - if ($nextToken->isGivenKind(T_PAAMAYIM_NEKUDOTAYIM)) { - return $this->findEnd($tokens, $tokens->getNextMeaningfulToken($nextIndex)); - } - - return $index; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/LogicalOperatorsFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/LogicalOperatorsFixer.php deleted file mode 100644 index 583e2a9..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/LogicalOperatorsFixer.php +++ /dev/null @@ -1,79 +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\Fixer\Operator; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Haralan Dobrev - */ -final class LogicalOperatorsFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Use `&&` and `||` logical operators instead of `and` and `or`.', - [ - new CodeSample( - 'isAnyTokenKindsFound([T_LOGICAL_AND, T_LOGICAL_OR]); - } - - /** - * {@inheritdoc} - */ - public function isRisky(): bool - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - foreach ($tokens as $index => $token) { - if ($token->isGivenKind(T_LOGICAL_AND)) { - $tokens[$index] = new Token([T_BOOLEAN_AND, '&&']); - } elseif ($token->isGivenKind(T_LOGICAL_OR)) { - $tokens[$index] = new Token([T_BOOLEAN_OR, '||']); - } - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/NewWithBracesFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/NewWithBracesFixer.php deleted file mode 100644 index ebbe728..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/NewWithBracesFixer.php +++ /dev/null @@ -1,147 +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\Fixer\Operator; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dariusz Rumiński - */ -final class NewWithBracesFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'All instances created with new keyword must be followed by braces.', - [new CodeSample("isTokenKindFound(T_NEW); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - static $nextTokenKinds = null; - - if (null === $nextTokenKinds) { - $nextTokenKinds = [ - '?', - ';', - ',', - '(', - ')', - '[', - ']', - ':', - '<', - '>', - '+', - '-', - '*', - '/', - '%', - '&', - '^', - '|', - [T_CLASS], - [T_IS_SMALLER_OR_EQUAL], - [T_IS_GREATER_OR_EQUAL], - [T_IS_EQUAL], - [T_IS_NOT_EQUAL], - [T_IS_IDENTICAL], - [T_IS_NOT_IDENTICAL], - [T_CLOSE_TAG], - [T_LOGICAL_AND], - [T_LOGICAL_OR], - [T_LOGICAL_XOR], - [T_BOOLEAN_AND], - [T_BOOLEAN_OR], - [T_SL], - [T_SR], - [T_INSTANCEOF], - [T_AS], - [T_DOUBLE_ARROW], - [T_POW], - [T_SPACESHIP], - [CT::T_ARRAY_SQUARE_BRACE_OPEN], - [CT::T_ARRAY_SQUARE_BRACE_CLOSE], - [CT::T_BRACE_CLASS_INSTANTIATION_OPEN], - [CT::T_BRACE_CLASS_INSTANTIATION_CLOSE], - ]; - } - - for ($index = $tokens->count() - 3; $index > 0; --$index) { - $token = $tokens[$index]; - - if (!$token->isGivenKind(T_NEW)) { - continue; - } - - $nextIndex = $tokens->getNextTokenOfKind($index, $nextTokenKinds); - $nextToken = $tokens[$nextIndex]; - - // new anonymous class definition - if ($nextToken->isGivenKind(T_CLASS)) { - if (!$tokens[$tokens->getNextMeaningfulToken($nextIndex)]->equals('(')) { - $this->insertBracesAfter($tokens, $nextIndex); - } - - continue; - } - - // entrance into array index syntax - need to look for exit - while ($nextToken->equals('[') || $nextToken->isGivenKind(CT::T_ARRAY_INDEX_CURLY_BRACE_OPEN)) { - $nextIndex = $tokens->findBlockEnd($tokens->detectBlockType($nextToken)['type'], $nextIndex) + 1; - $nextToken = $tokens[$nextIndex]; - } - - // new statement has a gap in it - advance to the next token - if ($nextToken->isWhitespace()) { - $nextIndex = $tokens->getNextNonWhitespace($nextIndex); - $nextToken = $tokens[$nextIndex]; - } - - // new statement with () - nothing to do - if ($nextToken->equals('(') || $nextToken->isObjectOperator()) { - continue; - } - - $this->insertBracesAfter($tokens, $tokens->getPrevMeaningfulToken($nextIndex)); - } - } - - private function insertBracesAfter(Tokens $tokens, int $index): void - { - $tokens->insertAt(++$index, [new Token('('), new Token(')')]); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/NotOperatorWithSpaceFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/NotOperatorWithSpaceFixer.php deleted file mode 100644 index 8431356..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/NotOperatorWithSpaceFixer.php +++ /dev/null @@ -1,84 +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\Fixer\Operator; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Javier Spagnoletti - */ -final class NotOperatorWithSpaceFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Logical NOT operators (`!`) should have leading and trailing whitespaces.', - [new CodeSample( - 'isTokenKindFound('!'); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - for ($index = $tokens->count() - 1; $index >= 0; --$index) { - $token = $tokens[$index]; - - if ($token->equals('!')) { - if (!$tokens[$index + 1]->isWhitespace()) { - $tokens->insertAt($index + 1, new Token([T_WHITESPACE, ' '])); - } - - if (!$tokens[$index - 1]->isWhitespace()) { - $tokens->insertAt($index, new Token([T_WHITESPACE, ' '])); - } - } - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/NotOperatorWithSuccessorSpaceFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/NotOperatorWithSuccessorSpaceFixer.php deleted file mode 100644 index ca10dc4..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/NotOperatorWithSuccessorSpaceFixer.php +++ /dev/null @@ -1,82 +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\Fixer\Operator; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Javier Spagnoletti - */ -final class NotOperatorWithSuccessorSpaceFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Logical NOT operators (`!`) should have one trailing whitespace.', - [new CodeSample( - 'isTokenKindFound('!'); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - for ($index = $tokens->count() - 1; $index >= 0; --$index) { - $token = $tokens[$index]; - - if ($token->equals('!')) { - if (!$tokens[$index + 1]->isWhitespace()) { - $tokens->insertAt($index + 1, new Token([T_WHITESPACE, ' '])); - } else { - $tokens[$index + 1] = new Token([T_WHITESPACE, ' ']); - } - } - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/ObjectOperatorWithoutWhitespaceFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/ObjectOperatorWithoutWhitespaceFixer.php deleted file mode 100644 index 71e4cd6..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/ObjectOperatorWithoutWhitespaceFixer.php +++ /dev/null @@ -1,71 +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\Fixer\Operator; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Fabien Potencier - * @author Dariusz Rumiński - */ -final class ObjectOperatorWithoutWhitespaceFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'There should not be space before or after object operators `->` and `?->`.', - [new CodeSample(" b;\n")] - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isAnyTokenKindsFound(Token::getObjectOperatorKinds()); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - // [Structure] there should not be space before or after "->" or "?->" - foreach ($tokens as $index => $token) { - if (!$token->isObjectOperator()) { - continue; - } - - // clear whitespace before -> - if ($tokens[$index - 1]->isWhitespace(" \t") && !$tokens[$index - 2]->isComment()) { - $tokens->clearAt($index - 1); - } - - // clear whitespace after -> - if ($tokens[$index + 1]->isWhitespace(" \t") && !$tokens[$index + 2]->isComment()) { - $tokens->clearAt($index + 1); - } - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/OperatorLinebreakFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/OperatorLinebreakFixer.php deleted file mode 100644 index 38cc50f..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/OperatorLinebreakFixer.php +++ /dev/null @@ -1,321 +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\Fixer\Operator; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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\CaseAnalysis; -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 - */ -final class OperatorLinebreakFixer extends AbstractFixer implements ConfigurableFixerInterface -{ - private const BOOLEAN_OPERATORS = [[T_BOOLEAN_AND], [T_BOOLEAN_OR], [T_LOGICAL_AND], [T_LOGICAL_OR], [T_LOGICAL_XOR]]; - - /** - * @var string - */ - private $position = 'beginning'; - - /** - * @var array|string> - */ - private $operators = []; - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Operators - when multiline - must always be at the beginning or at the end of the line.', - [ - new CodeSample(' 'end'] - ), - ] - ); - } - - /** - * {@inheritdoc} - */ - public function configure(array $configuration): void - { - parent::configure($configuration); - - $this->operators = self::BOOLEAN_OPERATORS; - if (!$this->configuration['only_booleans']) { - $this->operators = array_merge($this->operators, self::getNonBooleanOperators()); - if (\PHP_VERSION_ID >= 70000) { - $this->operators[] = [T_COALESCE]; - $this->operators[] = [T_SPACESHIP]; - } - } - $this->position = $this->configuration['position']; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('only_booleans', 'whether to limit operators to only boolean ones')) - ->setAllowedTypes(['bool']) - ->setDefault(false) - ->getOption(), - (new FixerOptionBuilder('position', 'whether to place operators at the beginning or at the end of the line')) - ->setAllowedValues(['beginning', 'end']) - ->setDefault($this->position) - ->getOption(), - ]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $referenceAnalyzer = new ReferenceAnalyzer(); - $gotoLabelAnalyzer = new GotoLabelAnalyzer(); - - $excludedIndices = $this->getExcludedIndices($tokens); - - $index = $tokens->count(); - while ($index > 1) { - --$index; - - if (!$tokens[$index]->equalsAny($this->operators, false)) { - continue; - } - - if ($gotoLabelAnalyzer->belongsToGoToLabel($tokens, $index)) { - continue; - } - - if ($referenceAnalyzer->isReference($tokens, $index)) { - continue; - } - - if (\in_array($index, $excludedIndices, true)) { - continue; - } - - $operatorIndices = [$index]; - if ($tokens[$index]->equals(':')) { - /** @var int $prevIndex */ - $prevIndex = $tokens->getPrevMeaningfulToken($index); - if ($tokens[$prevIndex]->equals('?')) { - $operatorIndices = [$prevIndex, $index]; - $index = $prevIndex; - } - } - - $this->fixOperatorLinebreak($tokens, $operatorIndices); - } - } - - /** - * Currently only colons from "switch". - * - * @return int[] - */ - private function getExcludedIndices(Tokens $tokens): array - { - $indices = []; - for ($index = $tokens->count() - 1; $index > 0; --$index) { - if ($tokens[$index]->isGivenKind(T_SWITCH)) { - $indices = array_merge($indices, $this->getCasesColonsForSwitch($tokens, $index)); - } - } - - return $indices; - } - - /** - * @return int[] - */ - private function getCasesColonsForSwitch(Tokens $tokens, int $switchIndex): array - { - return array_map( - static function (CaseAnalysis $caseAnalysis) { - return $caseAnalysis->getColonIndex(); - }, - (new SwitchAnalyzer())->getSwitchAnalysis($tokens, $switchIndex)->getCases() - ); - } - - /** - * @param int[] $operatorIndices - */ - private function fixOperatorLinebreak(Tokens $tokens, array $operatorIndices): void - { - /** @var int $prevIndex */ - $prevIndex = $tokens->getPrevMeaningfulToken(min($operatorIndices)); - $indexStart = $prevIndex + 1; - - /** @var int $nextIndex */ - $nextIndex = $tokens->getNextMeaningfulToken(max($operatorIndices)); - $indexEnd = $nextIndex - 1; - - if (!$this->isMultiline($tokens, $indexStart, $indexEnd)) { - return; // operator is not surrounded by multiline whitespaces, do not touch it - } - - if ('beginning' === $this->position) { - if (!$this->isMultiline($tokens, max($operatorIndices), $indexEnd)) { - return; // operator already is placed correctly - } - $this->fixMoveToTheBeginning($tokens, $operatorIndices); - - return; - } - - if (!$this->isMultiline($tokens, $indexStart, min($operatorIndices))) { - return; // operator already is placed correctly - } - $this->fixMoveToTheEnd($tokens, $operatorIndices); - } - - /** - * @param int[] $operatorIndices - */ - private function fixMoveToTheBeginning(Tokens $tokens, array $operatorIndices): void - { - /** @var int $prevIndex */ - $prevIndex = $tokens->getNonEmptySibling(min($operatorIndices), -1); - - /** @var int $nextIndex */ - $nextIndex = $tokens->getNextMeaningfulToken(max($operatorIndices)); - - for ($i = $nextIndex - 1; $i > max($operatorIndices); --$i) { - if ($tokens[$i]->isWhitespace() && 1 === Preg::match('/\R/u', $tokens[$i]->getContent())) { - $isWhitespaceBefore = $tokens[$prevIndex]->isWhitespace(); - $inserts = $this->getReplacementsAndClear($tokens, $operatorIndices, -1); - if ($isWhitespaceBefore) { - $inserts[] = new Token([T_WHITESPACE, ' ']); - } - $tokens->insertAt($nextIndex, $inserts); - - break; - } - } - } - - /** - * @param int[] $operatorIndices - */ - private function fixMoveToTheEnd(Tokens $tokens, array $operatorIndices): void - { - /** @var int $prevIndex */ - $prevIndex = $tokens->getPrevMeaningfulToken(min($operatorIndices)); - - /** @var int $nextIndex */ - $nextIndex = $tokens->getNonEmptySibling(max($operatorIndices), 1); - - for ($i = $prevIndex + 1; $i < max($operatorIndices); ++$i) { - if ($tokens[$i]->isWhitespace() && 1 === Preg::match('/\R/u', $tokens[$i]->getContent())) { - $isWhitespaceAfter = $tokens[$nextIndex]->isWhitespace(); - $inserts = $this->getReplacementsAndClear($tokens, $operatorIndices, 1); - if ($isWhitespaceAfter) { - array_unshift($inserts, new Token([T_WHITESPACE, ' '])); - } - $tokens->insertAt($prevIndex + 1, $inserts); - - break; - } - } - } - - /** - * @param int[] $indices - * - * @return Token[] - */ - private function getReplacementsAndClear(Tokens $tokens, array $indices, int $direction): array - { - return array_map( - static function (int $index) use ($tokens, $direction) { - $clone = $tokens[$index]; - if ($tokens[$index + $direction]->isWhitespace()) { - $tokens->clearAt($index + $direction); - } - $tokens->clearAt($index); - - return $clone; - }, - $indices - ); - } - - private function isMultiline(Tokens $tokens, int $indexStart, int $indexEnd): bool - { - for ($index = $indexStart; $index <= $indexEnd; ++$index) { - if (false !== strpos($tokens[$index]->getContent(), "\n")) { - return true; - } - } - - return false; - } - - private static function getNonBooleanOperators(): array - { - return array_merge( - [ - '%', '&', '*', '+', '-', '.', '/', ':', '<', '=', '>', '?', '^', '|', - [T_AND_EQUAL], [T_CONCAT_EQUAL], [T_DIV_EQUAL], [T_DOUBLE_ARROW], [T_IS_EQUAL], [T_IS_GREATER_OR_EQUAL], - [T_IS_IDENTICAL], [T_IS_NOT_EQUAL], [T_IS_NOT_IDENTICAL], [T_IS_SMALLER_OR_EQUAL], [T_MINUS_EQUAL], - [T_MOD_EQUAL], [T_MUL_EQUAL], [T_OR_EQUAL], [T_PAAMAYIM_NEKUDOTAYIM], [T_PLUS_EQUAL], [T_POW], - [T_POW_EQUAL], [T_SL], [T_SL_EQUAL], [T_SR], [T_SR_EQUAL], [T_XOR_EQUAL], - ], - array_map(function ($id) { return [$id]; }, Token::getObjectOperatorKinds()) - ); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/StandardizeIncrementFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/StandardizeIncrementFixer.php deleted file mode 100644 index 3142b8e..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/StandardizeIncrementFixer.php +++ /dev/null @@ -1,130 +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\Fixer\Operator; - -use PhpCsFixer\Fixer\AbstractIncrementOperatorFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author ntzm - */ -final class StandardizeIncrementFixer extends AbstractIncrementOperatorFixer -{ - private const EXPRESSION_END_TOKENS = [ - ';', - ')', - ']', - ',', - ':', - [CT::T_DYNAMIC_PROP_BRACE_CLOSE], - [CT::T_DYNAMIC_VAR_BRACE_CLOSE], - [T_CLOSE_TAG], - ]; - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Increment and decrement operators should be used if possible.', - [ - new CodeSample("isAnyTokenKindsFound([T_PLUS_EQUAL, T_MINUS_EQUAL]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - for ($index = $tokens->count() - 1; $index > 0; --$index) { - $expressionEnd = $tokens[$index]; - if (!$expressionEnd->equalsAny(self::EXPRESSION_END_TOKENS)) { - continue; - } - - $numberIndex = $tokens->getPrevMeaningfulToken($index); - $number = $tokens[$numberIndex]; - if (!$number->isGivenKind(T_LNUMBER) || '1' !== $number->getContent()) { - continue; - } - - $operatorIndex = $tokens->getPrevMeaningfulToken($numberIndex); - $operator = $tokens[$operatorIndex]; - if (!$operator->isGivenKind([T_PLUS_EQUAL, T_MINUS_EQUAL])) { - continue; - } - - $startIndex = $this->findStart($tokens, $operatorIndex); - - $this->clearRangeLeaveComments( - $tokens, - $tokens->getPrevMeaningfulToken($operatorIndex) + 1, - $numberIndex - ); - - $tokens->insertAt( - $startIndex, - new Token($operator->isGivenKind(T_PLUS_EQUAL) ? [T_INC, '++'] : [T_DEC, '--']) - ); - } - } - - /** - * Clear tokens in the given range unless they are comments. - */ - private function clearRangeLeaveComments(Tokens $tokens, int $indexStart, int $indexEnd): void - { - for ($i = $indexStart; $i <= $indexEnd; ++$i) { - $token = $tokens[$i]; - - if ($token->isComment()) { - continue; - } - - if ($token->isWhitespace("\n\r")) { - continue; - } - - $tokens->clearAt($i); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/StandardizeNotEqualsFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/StandardizeNotEqualsFixer.php deleted file mode 100644 index fe5a73e..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/StandardizeNotEqualsFixer.php +++ /dev/null @@ -1,69 +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\Fixer\Operator; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dariusz Rumiński - */ -final class StandardizeNotEqualsFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Replace all `<>` with `!=`.', - [new CodeSample(" \$c;\n")] - ); - } - - /** - * {@inheritdoc} - * - * Must run before BinaryOperatorSpacesFixer. - */ - public function getPriority(): int - { - return 0; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isTokenKindFound(T_IS_NOT_EQUAL); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - foreach ($tokens as $index => $token) { - if ($token->isGivenKind(T_IS_NOT_EQUAL)) { - $tokens[$index] = new Token([T_IS_NOT_EQUAL, '!=']); - } - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/TernaryOperatorSpacesFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/TernaryOperatorSpacesFixer.php deleted file mode 100644 index fe49cac..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/TernaryOperatorSpacesFixer.php +++ /dev/null @@ -1,180 +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\Fixer\Operator; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Analyzer\Analysis\CaseAnalysis; -use PhpCsFixer\Tokenizer\Analyzer\GotoLabelAnalyzer; -use PhpCsFixer\Tokenizer\Analyzer\SwitchAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dariusz Rumiński - */ -final class TernaryOperatorSpacesFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Standardize spaces around ternary operator.', - [new CodeSample("isAllTokenKindsFound(['?', ':']); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $gotoLabelAnalyzer = new GotoLabelAnalyzer(); - $ternaryOperatorIndices = []; - $excludedIndices = []; - - foreach ($tokens as $index => $token) { - if ($token->isGivenKind(T_SWITCH)) { - $excludedIndices = array_merge($excludedIndices, $this->getColonIndicesForSwitch($tokens, $index)); - - continue; - } - - if (!$token->equalsAny(['?', ':'])) { - continue; - } - - if (\in_array($index, $excludedIndices, true)) { - continue; - } - - if ($this->belongsToAlternativeSyntax($tokens, $index)) { - continue; - } - - if ($gotoLabelAnalyzer->belongsToGoToLabel($tokens, $index)) { - continue; - } - - $ternaryOperatorIndices[] = $index; - } - - foreach (array_reverse($ternaryOperatorIndices) as $index) { - $token = $tokens[$index]; - - if ($token->equals('?')) { - $nextNonWhitespaceIndex = $tokens->getNextNonWhitespace($index); - - if ($tokens[$nextNonWhitespaceIndex]->equals(':')) { - // for `$a ?: $b` remove spaces between `?` and `:` - $tokens->ensureWhitespaceAtIndex($index + 1, 0, ''); - } else { - // for `$a ? $b : $c` ensure space after `?` - $this->ensureWhitespaceExistence($tokens, $index + 1, true); - } - - // for `$a ? $b : $c` ensure space before `?` - $this->ensureWhitespaceExistence($tokens, $index - 1, false); - - continue; - } - - if ($token->equals(':')) { - // for `$a ? $b : $c` ensure space after `:` - $this->ensureWhitespaceExistence($tokens, $index + 1, true); - - $prevNonWhitespaceToken = $tokens[$tokens->getPrevNonWhitespace($index)]; - - if (!$prevNonWhitespaceToken->equals('?')) { - // for `$a ? $b : $c` ensure space before `:` - $this->ensureWhitespaceExistence($tokens, $index - 1, false); - } - } - } - } - - private function belongsToAlternativeSyntax(Tokens $tokens, int $index): bool - { - if (!$tokens[$index]->equals(':')) { - return false; - } - - $closeParenthesisIndex = $tokens->getPrevMeaningfulToken($index); - if ($tokens[$closeParenthesisIndex]->isGivenKind(T_ELSE)) { - return true; - } - if (!$tokens[$closeParenthesisIndex]->equals(')')) { - return false; - } - - $openParenthesisIndex = $tokens->findBlockStart(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $closeParenthesisIndex); - - $alternativeControlStructureIndex = $tokens->getPrevMeaningfulToken($openParenthesisIndex); - - return $tokens[$alternativeControlStructureIndex]->isGivenKind([T_DECLARE, T_ELSEIF, T_FOR, T_FOREACH, T_IF, T_SWITCH, T_WHILE]); - } - - /** - * @return int[] - */ - private function getColonIndicesForSwitch(Tokens $tokens, int $switchIndex): array - { - return array_map( - static function (CaseAnalysis $caseAnalysis) { - return $caseAnalysis->getColonIndex(); - }, - (new SwitchAnalyzer())->getSwitchAnalysis($tokens, $switchIndex)->getCases() - ); - } - - private function ensureWhitespaceExistence(Tokens $tokens, int $index, bool $after): void - { - if ($tokens[$index]->isWhitespace()) { - if ( - false === strpos($tokens[$index]->getContent(), "\n") - && !$tokens[$index - 1]->isComment() - ) { - $tokens[$index] = new Token([T_WHITESPACE, ' ']); - } - - return; - } - - $index += $after ? 0 : 1; - $tokens->insertAt($index, new Token([T_WHITESPACE, ' '])); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/TernaryToElvisOperatorFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/TernaryToElvisOperatorFixer.php deleted file mode 100644 index 44d8527..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/TernaryToElvisOperatorFixer.php +++ /dev/null @@ -1,262 +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\Fixer\Operator; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author SpacePossum - */ -final class TernaryToElvisOperatorFixer extends AbstractFixer -{ - /** - * Lower precedence and other valid preceding tokens. - * - * Ordered by most common types first. - * - * @var array - */ - private const VALID_BEFORE_ENDTYPES = [ - '=', - [T_OPEN_TAG], - [T_OPEN_TAG_WITH_ECHO], - '(', - ',', - ';', - '[', - '{', - '}', - [CT::T_ARRAY_INDEX_CURLY_BRACE_OPEN], - [T_AND_EQUAL], // &= - [T_CONCAT_EQUAL], // .= - [T_DIV_EQUAL], // /= - [T_MINUS_EQUAL], // -= - [T_MOD_EQUAL], // %= - [T_MUL_EQUAL], // *= - [T_OR_EQUAL], // |= - [T_PLUS_EQUAL], // += - [T_POW_EQUAL], // **= - [T_SL_EQUAL], // <<= - [T_SR_EQUAL], // >>= - [T_XOR_EQUAL], // ^= - ]; - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Use the Elvis operator `?:` where possible.', - [ - new CodeSample( - "isTokenKindFound('?'); - } - - /** - * {@inheritdoc} - */ - public function isRisky(): bool - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $blockEdgeDefinitions = Tokens::getBlockEdgeDefinitions(); - - for ($index = \count($tokens) - 5; $index > 1; --$index) { - if (!$tokens[$index]->equals('?')) { - continue; - } - - $nextIndex = $tokens->getNextMeaningfulToken($index); - - if ($tokens[$nextIndex]->equals(':')) { - continue; // Elvis is alive! - } - - // get and check what is before the `?` operator - - $beforeOperator = $this->getBeforeOperator($tokens, $index, $blockEdgeDefinitions); - - if (null === $beforeOperator) { - continue; // contains something we cannot fix because of priorities - } - - // get what is after the `?` token - - $afterOperator = $this->getAfterOperator($tokens, $index); - - // if before and after the `?` operator are the same (in meaningful matter), clear after - - if ($this->rangeEqualsRange($tokens, $beforeOperator, $afterOperator)) { - $this->clearMeaningfulFromRange($tokens, $afterOperator); - } - } - } - - /** - * @return null|array null if contains ++/-- operator - */ - private function getBeforeOperator(Tokens $tokens, int $index, array $blockEdgeDefinitions): ?array - { - $index = $tokens->getPrevMeaningfulToken($index); - $before = ['end' => $index]; - - while (!$tokens[$index]->equalsAny(self::VALID_BEFORE_ENDTYPES)) { - if ($tokens[$index]->isGivenKind([T_INC, T_DEC])) { - return null; - } - - $blockType = Tokens::detectBlockType($tokens[$index]); - - if (null === $blockType || $blockType['isStart']) { - $before['start'] = $index; - $index = $tokens->getPrevMeaningfulToken($index); - - continue; - } - - $blockType = $blockEdgeDefinitions[$blockType['type']]; - $openCount = 1; - - do { - $index = $tokens->getPrevMeaningfulToken($index); - - if ($tokens[$index]->isGivenKind([T_INC, T_DEC])) { - return null; - } - - if ($tokens[$index]->equals($blockType['start'])) { - ++$openCount; - - continue; - } - - if ($tokens[$index]->equals($blockType['end'])) { - --$openCount; - } - } while (1 >= $openCount); - - $before['start'] = $index; - $index = $tokens->getPrevMeaningfulToken($index); - } - - if (!isset($before['start'])) { - return null; - } - - return $before; - } - - private function getAfterOperator(Tokens $tokens, int $index): array - { - $index = $tokens->getNextMeaningfulToken($index); - $after = ['start' => $index]; - - while (!$tokens[$index]->equals(':')) { - $blockType = Tokens::detectBlockType($tokens[$index]); - - if (null !== $blockType) { - $index = $tokens->findBlockEnd($blockType['type'], $index); - } - - $after['end'] = $index; - $index = $tokens->getNextMeaningfulToken($index); - } - - return $after; - } - - /** - * Meaningful compare of tokens within ranges. - */ - private function rangeEqualsRange(Tokens $tokens, array $range1, array $range2): bool - { - $leftStart = $range1['start']; - $leftEnd = $range1['end']; - - while ($tokens[$leftStart]->equals('(') && $tokens[$leftEnd]->equals(')')) { - $leftStart = $tokens->getNextMeaningfulToken($leftStart); - $leftEnd = $tokens->getPrevMeaningfulToken($leftEnd); - } - - $rightStart = $range2['start']; - $rightEnd = $range2['end']; - - while ($tokens[$rightStart]->equals('(') && $tokens[$rightEnd]->equals(')')) { - $rightStart = $tokens->getNextMeaningfulToken($rightStart); - $rightEnd = $tokens->getPrevMeaningfulToken($rightEnd); - } - - while ($leftStart <= $leftEnd && $rightStart <= $rightEnd) { - if ( - !$tokens[$leftStart]->equals($tokens[$rightStart]) - && !($tokens[$leftStart]->equalsAny(['[', [CT::T_ARRAY_INDEX_CURLY_BRACE_OPEN]]) && $tokens[$rightStart]->equalsAny(['[', [CT::T_ARRAY_INDEX_CURLY_BRACE_OPEN]])) - && !($tokens[$leftStart]->equalsAny([']', [CT::T_ARRAY_INDEX_CURLY_BRACE_CLOSE]]) && $tokens[$rightStart]->equalsAny([']', [CT::T_ARRAY_INDEX_CURLY_BRACE_CLOSE]])) - ) { - return false; - } - - $leftStart = $tokens->getNextMeaningfulToken($leftStart); - $rightStart = $tokens->getNextMeaningfulToken($rightStart); - } - - return $leftStart > $leftEnd && $rightStart > $rightEnd; - } - - private function clearMeaningfulFromRange(Tokens $tokens, array $range): void - { - // $range['end'] must be meaningful! - for ($i = $range['end']; $i >= $range['start']; $i = $tokens->getPrevMeaningfulToken($i)) { - $tokens->clearTokenAndMergeSurroundingWhitespace($i); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/TernaryToNullCoalescingFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/TernaryToNullCoalescingFixer.php deleted file mode 100644 index d0b5ce4..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/TernaryToNullCoalescingFixer.php +++ /dev/null @@ -1,212 +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\Fixer\Operator; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\FixerDefinition\VersionSpecification; -use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Filippo Tessarotto - */ -final class TernaryToNullCoalescingFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Use `null` coalescing operator `??` where possible. Requires PHP >= 7.0.', - [ - new VersionSpecificCodeSample( - "= 70000 && $tokens->isTokenKindFound(T_ISSET); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $issetIndexes = array_keys($tokens->findGivenKind(T_ISSET)); - while ($issetIndex = array_pop($issetIndexes)) { - $this->fixIsset($tokens, $issetIndex); - } - } - - /** - * @param int $index of `T_ISSET` token - */ - private function fixIsset(Tokens $tokens, int $index): void - { - $prevTokenIndex = $tokens->getPrevMeaningfulToken($index); - if ($this->isHigherPrecedenceAssociativityOperator($tokens[$prevTokenIndex])) { - return; - } - - $startBraceIndex = $tokens->getNextTokenOfKind($index, ['(']); - $endBraceIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $startBraceIndex); - - $ternaryQuestionMarkIndex = $tokens->getNextMeaningfulToken($endBraceIndex); - if (!$tokens[$ternaryQuestionMarkIndex]->equals('?')) { - return; // we are not in a ternary operator - } - - // search what is inside the isset() - $issetTokens = $this->getMeaningfulSequence($tokens, $startBraceIndex, $endBraceIndex); - if ($this->hasChangingContent($issetTokens)) { - return; // some weird stuff inside the isset - } - - // search what is inside the middle argument of ternary operator - $ternaryColonIndex = $tokens->getNextTokenOfKind($ternaryQuestionMarkIndex, [':']); - $ternaryFirstOperandTokens = $this->getMeaningfulSequence($tokens, $ternaryQuestionMarkIndex, $ternaryColonIndex); - - if ($issetTokens->generateCode() !== $ternaryFirstOperandTokens->generateCode()) { - return; // regardless of non-meaningful tokens, the operands are different - } - - $ternaryFirstOperandIndex = $tokens->getNextMeaningfulToken($ternaryQuestionMarkIndex); - - // preserve comments and spaces - $comments = []; - $commentStarted = false; - for ($loopIndex = $index; $loopIndex < $ternaryFirstOperandIndex; ++$loopIndex) { - if ($tokens[$loopIndex]->isComment()) { - $comments[] = $tokens[$loopIndex]; - $commentStarted = true; - } elseif ($commentStarted) { - if ($tokens[$loopIndex]->isWhitespace()) { - $comments[] = $tokens[$loopIndex]; - } - - $commentStarted = false; - } - } - - $tokens[$ternaryColonIndex] = new Token([T_COALESCE, '??']); - $tokens->overrideRange($index, $ternaryFirstOperandIndex - 1, $comments); - } - - /** - * Get the sequence of meaningful tokens and returns a new Tokens instance. - * - * @param int $start start index - * @param int $end end index - */ - private function getMeaningfulSequence(Tokens $tokens, int $start, int $end): Tokens - { - $sequence = []; - $index = $start; - while ($index < $end) { - $index = $tokens->getNextMeaningfulToken($index); - if ($index >= $end || null === $index) { - break; - } - - $sequence[] = $tokens[$index]; - } - - return Tokens::fromArray($sequence); - } - - /** - * Check if the requested token is an operator computed - * before the ternary operator along with the `isset()`. - */ - private function isHigherPrecedenceAssociativityOperator(Token $token): bool - { - static $operatorsPerId = [ - T_ARRAY_CAST => true, - T_BOOLEAN_AND => true, - T_BOOLEAN_OR => true, - T_BOOL_CAST => true, - T_COALESCE => true, - T_DEC => true, - T_DOUBLE_CAST => true, - T_INC => true, - T_INT_CAST => true, - T_IS_EQUAL => true, - T_IS_GREATER_OR_EQUAL => true, - T_IS_IDENTICAL => true, - T_IS_NOT_EQUAL => true, - T_IS_NOT_IDENTICAL => true, - T_IS_SMALLER_OR_EQUAL => true, - T_OBJECT_CAST => true, - T_POW => true, - T_SL => true, - T_SPACESHIP => true, - T_SR => true, - T_STRING_CAST => true, - T_UNSET_CAST => true, - ]; - - static $operatorsPerContent = [ - '!', - '%', - '&', - '*', - '+', - '-', - '/', - ':', - '^', - '|', - '~', - '.', - ]; - - return isset($operatorsPerId[$token->getId()]) || $token->equalsAny($operatorsPerContent); - } - - /** - * Check if the `isset()` content may change if called multiple times. - * - * @param Tokens $tokens The original token list - */ - private function hasChangingContent(Tokens $tokens): bool - { - static $operatorsPerId = [ - T_DEC, - T_INC, - T_YIELD, - T_YIELD_FROM, - ]; - - foreach ($tokens as $token) { - if ($token->isGivenKind($operatorsPerId) || $token->equals('(')) { - return true; - } - } - - return false; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/UnaryOperatorSpacesFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/UnaryOperatorSpacesFixer.php deleted file mode 100644 index c1558d7..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/UnaryOperatorSpacesFixer.php +++ /dev/null @@ -1,81 +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\Fixer\Operator; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * @author Gregor Harlan - */ -final class UnaryOperatorSpacesFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Unary operators should be placed adjacent to their operands.', - [new CodeSample("count() - 1; $index >= 0; --$index) { - if ($tokensAnalyzer->isUnarySuccessorOperator($index)) { - if (!$tokens[$tokens->getPrevNonWhitespace($index)]->isComment()) { - $tokens->removeLeadingWhitespace($index); - } - - continue; - } - - if ($tokensAnalyzer->isUnaryPredecessorOperator($index)) { - $tokens->removeTrailingWhitespace($index); - - continue; - } - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/BlankLineAfterOpeningTagFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/BlankLineAfterOpeningTagFixer.php deleted file mode 100644 index 81a3817..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/BlankLineAfterOpeningTagFixer.php +++ /dev/null @@ -1,101 +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\Fixer\PhpTag; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Ceeram - */ -final class BlankLineAfterOpeningTagFixer extends AbstractFixer implements WhitespacesAwareFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Ensure there is no code on the same line as the PHP open tag and it is followed by a blank line.', - [new CodeSample("isTokenKindFound(T_OPEN_TAG); - } - - /** - * {@inheritdoc} - */ - 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() && false !== strpos($token->getContent(), "\n")) { - $newlineFound = true; - - break; - } - } - - // ignore one-line files - if (!$newlineFound) { - return; - } - - $token = $tokens[0]; - - if (false === strpos($token->getContent(), "\n")) { - $tokens[0] = new Token([$token->getId(), rtrim($token->getContent()).$lineEnding]); - } - - if (false === strpos($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])); - } - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/EchoTagSyntaxFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/EchoTagSyntaxFixer.php deleted file mode 100644 index 8f5b645..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/EchoTagSyntaxFixer.php +++ /dev/null @@ -1,270 +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\Fixer\PhpTag; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Michele Locati - */ -final class EchoTagSyntaxFixer extends AbstractFixer implements ConfigurableFixerInterface -{ - /** @internal */ - public const OPTION_FORMAT = 'format'; - - /** @internal */ - public const OPTION_SHORTEN_SIMPLE_STATEMENTS_ONLY = 'shorten_simple_statements_only'; - - /** @internal */ - public const OPTION_LONG_FUNCTION = 'long_function'; - - /** @internal */ - public const FORMAT_SHORT = 'short'; - - /** @internal */ - public const FORMAT_LONG = 'long'; - - /** @internal */ - public const LONG_FUNCTION_ECHO = 'echo'; - - /** @internal */ - public const LONG_FUNCTION_PRINT = 'print'; - - private const SUPPORTED_FORMAT_OPTIONS = [ - self::FORMAT_LONG, - self::FORMAT_SHORT, - ]; - - private const SUPPORTED_LONGFUNCTION_OPTIONS = [ - self::LONG_FUNCTION_ECHO, - self::LONG_FUNCTION_PRINT, - ]; - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - $sample = <<<'EOT' - - - - - -EOT - ; - - return new FixerDefinition( - 'Replaces short-echo ` self::FORMAT_LONG]), - new CodeSample($sample, [self::OPTION_FORMAT => self::FORMAT_LONG, self::OPTION_LONG_FUNCTION => self::LONG_FUNCTION_PRINT]), - new CodeSample($sample, [self::OPTION_FORMAT => self::FORMAT_SHORT]), - new CodeSample($sample, [self::OPTION_FORMAT => self::FORMAT_SHORT, self::OPTION_SHORTEN_SIMPLE_STATEMENTS_ONLY => false]), - ], - null - ); - } - - /** - * {@inheritdoc} - * - * Must run before NoMixedEchoPrintFixer. - */ - public function getPriority(): int - { - return 0; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - if (self::FORMAT_SHORT === $this->configuration[self::OPTION_FORMAT]) { - return $tokens->isAnyTokenKindsFound([T_ECHO, T_PRINT]); - } - - return $tokens->isTokenKindFound(T_OPEN_TAG_WITH_ECHO); - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder(self::OPTION_FORMAT, 'The desired language construct.')) - ->setAllowedValues(self::SUPPORTED_FORMAT_OPTIONS) - ->setDefault(self::FORMAT_LONG) - ->getOption(), - (new FixerOptionBuilder(self::OPTION_LONG_FUNCTION, 'The function to be used to expand the short echo tags')) - ->setAllowedValues(self::SUPPORTED_LONGFUNCTION_OPTIONS) - ->setDefault(self::LONG_FUNCTION_ECHO) - ->getOption(), - (new FixerOptionBuilder(self::OPTION_SHORTEN_SIMPLE_STATEMENTS_ONLY, 'Render short-echo tags only in case of simple code')) - ->setAllowedTypes(['bool']) - ->setDefault(true) - ->getOption(), - ]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - if (self::FORMAT_SHORT === $this->configuration[self::OPTION_FORMAT]) { - $this->longToShort($tokens); - } else { - $this->shortToLong($tokens); - } - } - - private function longToShort(Tokens $tokens): void - { - $skipWhenComplexCode = $this->configuration[self::OPTION_SHORTEN_SIMPLE_STATEMENTS_ONLY]; - $count = $tokens->count(); - - for ($index = 0; $index < $count; ++$index) { - if (!$tokens[$index]->isGivenKind(T_OPEN_TAG)) { - continue; - } - - $nextMeaningful = $tokens->getNextMeaningfulToken($index); - - if (null === $nextMeaningful) { - return; - } - - if (!$tokens[$nextMeaningful]->isGivenKind([T_ECHO, T_PRINT])) { - $index = $nextMeaningful; - - continue; - } - - if ($skipWhenComplexCode && $this->isComplexCode($tokens, $nextMeaningful + 1)) { - $index = $nextMeaningful; - - continue; - } - - $newTokens = $this->buildLongToShortTokens($tokens, $index, $nextMeaningful); - $tokens->overrideRange($index, $nextMeaningful, $newTokens); - $count = $tokens->count(); - } - } - - private function shortToLong(Tokens $tokens): void - { - if (self::LONG_FUNCTION_PRINT === $this->configuration[self::OPTION_LONG_FUNCTION]) { - $echoToken = [T_PRINT, 'print']; - } else { - $echoToken = [T_ECHO, 'echo']; - } - - $index = -1; - - while (true) { - $index = $tokens->getNextTokenOfKind($index, [[T_OPEN_TAG_WITH_ECHO]]); - - if (null === $index) { - return; - } - - $replace = [new Token([T_OPEN_TAG, 'isWhitespace()) { - $replace[] = new Token([T_WHITESPACE, ' ']); - } - - $tokens->overrideRange($index, $index, $replace); - ++$index; - } - } - - /** - * Check if $tokens, starting at $index, contains "complex code", that is, the content - * of the echo tag contains more than a simple "echo something". - * - * This is done by a very quick test: if the tag contains non-whitespace tokens after - * a semicolon, we consider it as "complex". - * - * @example `` is false (not complex) - * @example `` is false (not "complex") - * @example `` is true ("complex") - */ - private function isComplexCode(Tokens $tokens, int $index): bool - { - $semicolonFound = false; - - for ($count = $tokens->count(); $index < $count; ++$index) { - $token = $tokens[$index]; - - if ($token->isGivenKind(T_CLOSE_TAG)) { - return false; - } - - if (';' === $token->getContent()) { - $semicolonFound = true; - } elseif ($semicolonFound && !$token->isWhitespace()) { - return true; - } - } - - return false; - } - - /** - * Builds the list of tokens that replace a long echo sequence. - * - * @return Token[] - */ - private function buildLongToShortTokens(Tokens $tokens, int $openTagIndex, int $echoTagIndex): array - { - $result = [new Token([T_OPEN_TAG_WITH_ECHO, 'getNextNonWhitespace($openTagIndex); - - if ($start === $echoTagIndex) { - // No non-whitespace tokens between $openTagIndex and $echoTagIndex - return $result; - } - - // Find the last non-whitespace index before $echoTagIndex - $end = $echoTagIndex - 1; - - while ($tokens[$end]->isWhitespace()) { - --$end; - } - - // Copy the non-whitespace tokens between $openTagIndex and $echoTagIndex - for ($index = $start; $index <= $end; ++$index) { - $result[] = clone $tokens[$index]; - } - - return $result; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/FullOpeningTagFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/FullOpeningTagFixer.php deleted file mode 100644 index c1e60f0..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/FullOpeningTagFixer.php +++ /dev/null @@ -1,134 +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\Fixer\PhpTag; - -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; - -/** - * Fixer for rules defined in PSR1 ¶2.1. - * - * @author Dariusz Rumiński - */ -final class FullOpeningTagFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'PHP code must use the long `generateCode(); - - // replace all echo ' echo ' $token) { - if ($token->isGivenKind(T_OPEN_TAG)) { - $tokenContent = $token->getContent(); - - if ('isGivenKind([T_COMMENT, T_DOC_COMMENT, T_CONSTANT_ENCAPSED_STRING, T_ENCAPSED_AND_WHITESPACE, T_STRING])) { - $tokenContent = ''; - $tokenContentLength = 0; - $parts = explode('getContent()); - $iLast = \count($parts) - 1; - - foreach ($parts as $i => $part) { - $tokenContent .= $part; - $tokenContentLength += \strlen($part); - - if ($i !== $iLast) { - $originalTokenContent = substr($content, $tokensOldContentLength + $tokenContentLength, 5); - if ('getId(), $tokenContent]); - $token = $newTokens[$index]; - } - - $tokensOldContentLength += \strlen($token->getContent()); - } - - $tokens->overrideRange(0, $tokens->count() - 1, $newTokens); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/LinebreakAfterOpeningTagFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/LinebreakAfterOpeningTagFixer.php deleted file mode 100644 index aaacb4f..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/LinebreakAfterOpeningTagFixer.php +++ /dev/null @@ -1,80 +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\Fixer\PhpTag; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Ceeram - */ -final class LinebreakAfterOpeningTagFixer extends AbstractFixer implements WhitespacesAwareFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Ensure there is no code on the same line as the PHP open tag.', - [new CodeSample("isTokenKindFound(T_OPEN_TAG); - } - - /** - * {@inheritdoc} - */ - 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; - } - - // ignore if linebreak already present - if (false !== strpos($tokens[0]->getContent(), "\n")) { - return; - } - - $newlineFound = false; - foreach ($tokens as $token) { - if ($token->isWhitespace() && false !== strpos($token->getContent(), "\n")) { - $newlineFound = true; - - break; - } - } - - // ignore one-line files - if (!$newlineFound) { - return; - } - - $tokens[0] = new Token([T_OPEN_TAG, rtrim($tokens[0]->getContent()).$this->whitespacesConfig->getLineEnding()]); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/NoClosingTagFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/NoClosingTagFixer.php deleted file mode 100644 index ff1e00b..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/NoClosingTagFixer.php +++ /dev/null @@ -1,72 +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\Fixer\PhpTag; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Fixer for rules defined in PSR2 ¶2.2. - * - * @author Dariusz Rumiński - */ -final class NoClosingTagFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'The closing `?>` tag MUST be omitted from files containing only PHP.', - [new CodeSample("\n")] - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isTokenKindFound(T_CLOSE_TAG); - } - - /** - * {@inheritdoc} - */ - 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); - - if (isset($tokens[$index - 1]) && $tokens[$index - 1]->isWhitespace()) { - $tokens->clearAt($index - 1); - } - $tokens->clearAt($index); - - $prevIndex = $tokens->getPrevMeaningfulToken($index); - if (!$tokens[$prevIndex]->equalsAny([';', '}', [T_OPEN_TAG]])) { - $tokens->insertAt($prevIndex + 1, new Token(';')); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitConstructFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitConstructFixer.php deleted file mode 100644 index b6aaafe..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitConstructFixer.php +++ /dev/null @@ -1,206 +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\Fixer\PhpUnit; - -use PhpCsFixer\Fixer\AbstractPhpUnitFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -use PhpCsFixer\FixerConfiguration\AllowedValueSubset; -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\FunctionsAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dariusz Rumiński - */ -final class PhpUnitConstructFixer extends AbstractPhpUnitFixer implements ConfigurableFixerInterface -{ - private static $assertionFixers = [ - 'assertSame' => 'fixAssertPositive', - 'assertEquals' => 'fixAssertPositive', - 'assertNotEquals' => 'fixAssertNegative', - 'assertNotSame' => 'fixAssertNegative', - ]; - - /** - * {@inheritdoc} - */ - public function isRisky(): bool - { - return true; - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'PHPUnit assertion method calls like `->assertSame(true, $foo)` should be written with dedicated method like `->assertTrue($foo)`.', - [ - new CodeSample( - 'assertEquals(false, $b); - $this->assertSame(true, $a); - $this->assertNotEquals(null, $c); - $this->assertNotSame(null, $d); - } -} -' - ), - new CodeSample( - 'assertEquals(false, $b); - $this->assertSame(true, $a); - $this->assertNotEquals(null, $c); - $this->assertNotSame(null, $d); - } -} -', - ['assertions' => ['assertSame', 'assertNotSame']] - ), - ], - null, - 'Fixer could be risky if one is overriding PHPUnit\'s native methods.' - ); - } - - /** - * {@inheritdoc} - * - * Must run before PhpUnitDedicateAssertFixer. - */ - public function getPriority(): int - { - return -10; - } - - /** - * {@inheritdoc} - */ - protected function applyPhpUnitClassFix(Tokens $tokens, int $startIndex, int $endIndex): void - { - // no assertions to be fixed - fast return - if (empty($this->configuration['assertions'])) { - return; - } - - foreach ($this->configuration['assertions'] as $assertionMethod) { - $assertionFixer = self::$assertionFixers[$assertionMethod]; - - for ($index = $startIndex; $index < $endIndex; ++$index) { - $index = $this->{$assertionFixer}($tokens, $index, $assertionMethod); - - if (null === $index) { - break; - } - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - 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', - ]) - ->getOption(), - ]); - } - - private function fixAssertNegative(Tokens $tokens, int $index, string $method): ?int - { - static $map = [ - 'false' => 'assertNotFalse', - 'null' => 'assertNotNull', - 'true' => 'assertNotTrue', - ]; - - return $this->fixAssert($map, $tokens, $index, $method); - } - - private function fixAssertPositive(Tokens $tokens, int $index, string $method): ?int - { - static $map = [ - 'false' => 'assertFalse', - 'null' => 'assertNull', - 'true' => 'assertTrue', - ]; - - return $this->fixAssert($map, $tokens, $index, $method); - } - - /** - * @param array $map - */ - private function fixAssert(array $map, Tokens $tokens, int $index, string $method): ?int - { - $functionsAnalyzer = new FunctionsAnalyzer(); - - $sequence = $tokens->findSequence( - [ - [T_STRING, $method], - '(', - ], - $index - ); - - if (null === $sequence) { - return null; - } - - $sequenceIndexes = array_keys($sequence); - if (!$functionsAnalyzer->isTheSameClassCall($tokens, $sequenceIndexes[0])) { - return null; - } - - $sequenceIndexes[2] = $tokens->getNextMeaningfulToken($sequenceIndexes[1]); - $firstParameterToken = $tokens[$sequenceIndexes[2]]; - - if (!$firstParameterToken->isNativeConstant()) { - return $sequenceIndexes[2]; - } - - $sequenceIndexes[3] = $tokens->getNextMeaningfulToken($sequenceIndexes[2]); - - // return if first method argument is an expression, not value - if (!$tokens[$sequenceIndexes[3]]->equals(',')) { - return $sequenceIndexes[3]; - } - - $tokens[$sequenceIndexes[0]] = new Token([T_STRING, $map[strtolower($firstParameterToken->getContent())]]); - $tokens->clearRange($sequenceIndexes[2], $tokens->getNextNonWhitespace($sequenceIndexes[3]) - 1); - - return $sequenceIndexes[3]; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitDedicateAssertFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitDedicateAssertFixer.php deleted file mode 100644 index 9d554be..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitDedicateAssertFixer.php +++ /dev/null @@ -1,407 +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\Fixer\PhpUnit; - -use PhpCsFixer\Fixer\AbstractPhpUnitFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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\FunctionsAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author SpacePossum - * @author Dariusz Rumiński - */ -final class PhpUnitDedicateAssertFixer extends AbstractPhpUnitFixer implements ConfigurableFixerInterface -{ - private static $fixMap = [ - 'array_key_exists' => ['assertArrayNotHasKey', 'assertArrayHasKey'], - 'empty' => ['assertNotEmpty', 'assertEmpty'], - 'file_exists' => ['assertFileNotExists', 'assertFileExists'], - 'is_array' => true, - 'is_bool' => true, - 'is_callable' => true, - 'is_dir' => ['assertDirectoryNotExists', 'assertDirectoryExists'], - 'is_double' => true, - 'is_float' => true, - 'is_infinite' => ['assertFinite', 'assertInfinite'], - 'is_int' => true, - 'is_integer' => true, - 'is_long' => true, - 'is_nan' => [false, 'assertNan'], - 'is_null' => ['assertNotNull', 'assertNull'], - 'is_numeric' => true, - 'is_object' => true, - 'is_readable' => ['assertNotIsReadable', 'assertIsReadable'], - 'is_real' => true, - 'is_resource' => true, - 'is_scalar' => true, - 'is_string' => true, - 'is_writable' => ['assertNotIsWritable', 'assertIsWritable'], - ]; - - /** - * @var string[] - */ - private $functions = []; - - /** - * {@inheritdoc} - */ - public function configure(array $configuration): void - { - parent::configure($configuration); - - // assertions added in 3.0: assertArrayNotHasKey assertArrayHasKey assertFileNotExists assertFileExists assertNotNull, assertNull - $this->functions = [ - 'array_key_exists', - 'file_exists', - 'is_null', - ]; - - if (PhpUnitTargetVersion::fulfills($this->configuration['target'], PhpUnitTargetVersion::VERSION_3_5)) { - // assertions added in 3.5: assertInternalType assertNotEmpty assertEmpty - $this->functions = array_merge($this->functions, [ - 'empty', - 'is_array', - 'is_bool', - 'is_boolean', - 'is_callable', - 'is_double', - 'is_float', - 'is_int', - 'is_integer', - 'is_long', - 'is_numeric', - 'is_object', - 'is_real', - 'is_resource', - 'is_scalar', - 'is_string', - ]); - } - - if (PhpUnitTargetVersion::fulfills($this->configuration['target'], PhpUnitTargetVersion::VERSION_5_0)) { - // assertions added in 5.0: assertFinite assertInfinite assertNan - $this->functions = array_merge($this->functions, [ - 'is_infinite', - 'is_nan', - ]); - } - - if (PhpUnitTargetVersion::fulfills($this->configuration['target'], PhpUnitTargetVersion::VERSION_5_6)) { - // assertions added in 5.6: assertDirectoryExists assertDirectoryNotExists assertIsReadable assertNotIsReadable assertIsWritable assertNotIsWritable - $this->functions = array_merge($this->functions, [ - 'is_dir', - 'is_readable', - 'is_writable', - ]); - } - } - - /** - * {@inheritdoc} - */ - public function isRisky(): bool - { - return true; - } - - /** - * {@inheritdoc} - */ - 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 PhpUnitDedicateAssertInternalTypeFixer. - * Must run after NoAliasFunctionsFixer, PhpUnitConstructFixer. - */ - public function getPriority(): int - { - return -15; - } - - /** - * {@inheritdoc} - */ - protected function applyPhpUnitClassFix(Tokens $tokens, int $startIndex, int $endIndex): void - { - foreach ($this->getPreviousAssertCall($tokens, $startIndex, $endIndex) as $assertCall) { - // test and fix for assertTrue/False to dedicated asserts - if ('asserttrue' === $assertCall['loweredName'] || 'assertfalse' === $assertCall['loweredName']) { - $this->fixAssertTrueFalse($tokens, $assertCall); - - continue; - } - - if ( - 'assertsame' === $assertCall['loweredName'] - || 'assertnotsame' === $assertCall['loweredName'] - || 'assertequals' === $assertCall['loweredName'] - || 'assertnotequals' === $assertCall['loweredName'] - ) { - $this->fixAssertSameEquals($tokens, $assertCall); - - continue; - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('target', 'Target version of PHPUnit.')) - ->setAllowedTypes(['string']) - ->setAllowedValues([ - PhpUnitTargetVersion::VERSION_3_0, - PhpUnitTargetVersion::VERSION_3_5, - PhpUnitTargetVersion::VERSION_5_0, - PhpUnitTargetVersion::VERSION_5_6, - PhpUnitTargetVersion::VERSION_NEWEST, - ]) - ->setDefault(PhpUnitTargetVersion::VERSION_NEWEST) - ->getOption(), - ]); - } - - private function fixAssertTrueFalse(Tokens $tokens, array $assertCall): void - { - $testDefaultNamespaceTokenIndex = false; - $testIndex = $tokens->getNextMeaningfulToken($assertCall['openBraceIndex']); - - if (!$tokens[$testIndex]->isGivenKind([T_EMPTY, T_STRING])) { - if (!$tokens[$testIndex]->isGivenKind(T_NS_SEPARATOR)) { - return; - } - - $testDefaultNamespaceTokenIndex = $testIndex; - $testIndex = $tokens->getNextMeaningfulToken($testIndex); - } - - $testOpenIndex = $tokens->getNextMeaningfulToken($testIndex); - if (!$tokens[$testOpenIndex]->equals('(')) { - return; - } - - $testCloseIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $testOpenIndex); - - $assertCallCloseIndex = $tokens->getNextMeaningfulToken($testCloseIndex); - if (!$tokens[$assertCallCloseIndex]->equalsAny([')', ','])) { - return; - } - - $isPositive = 'asserttrue' === $assertCall['loweredName']; - - $content = strtolower($tokens[$testIndex]->getContent()); - if (!\in_array($content, $this->functions, true)) { - return; - } - - if (\is_array(self::$fixMap[$content])) { - if (false !== self::$fixMap[$content][$isPositive]) { - $tokens[$assertCall['index']] = new Token([T_STRING, self::$fixMap[$content][$isPositive]]); - $this->removeFunctionCall($tokens, $testDefaultNamespaceTokenIndex, $testIndex, $testOpenIndex, $testCloseIndex); - } - - return; - } - - $type = substr($content, 3); - - $tokens[$assertCall['index']] = new Token([T_STRING, $isPositive ? 'assertInternalType' : 'assertNotInternalType']); - $tokens[$testIndex] = new Token([T_CONSTANT_ENCAPSED_STRING, "'".$type."'"]); - $tokens[$testOpenIndex] = new Token(','); - - $tokens->clearTokenAndMergeSurroundingWhitespace($testCloseIndex); - $commaIndex = $tokens->getPrevMeaningfulToken($testCloseIndex); - if ($tokens[$commaIndex]->equals(',')) { - $tokens->removeTrailingWhitespace($commaIndex); - $tokens->clearAt($commaIndex); - } - - if (!$tokens[$testOpenIndex + 1]->isWhitespace()) { - $tokens->insertAt($testOpenIndex + 1, new Token([T_WHITESPACE, ' '])); - } - - if (false !== $testDefaultNamespaceTokenIndex) { - $tokens->clearTokenAndMergeSurroundingWhitespace($testDefaultNamespaceTokenIndex); - } - } - - private function fixAssertSameEquals(Tokens $tokens, array $assertCall): void - { - // @ $this->/self::assertEquals/Same([$nextIndex]) - $expectedIndex = $tokens->getNextMeaningfulToken($assertCall['openBraceIndex']); - - // do not fix - // let $a = [1,2]; $b = "2"; - // "$this->assertEquals("2", count($a)); $this->assertEquals($b, count($a)); $this->assertEquals(2.1, count($a));" - - if (!$tokens[$expectedIndex]->isGivenKind(T_LNUMBER)) { - return; - } - - // @ $this->/self::assertEquals/Same([$nextIndex,$commaIndex]) - $commaIndex = $tokens->getNextMeaningfulToken($expectedIndex); - if (!$tokens[$commaIndex]->equals(',')) { - return; - } - - // @ $this->/self::assertEquals/Same([$nextIndex,$commaIndex,$countCallIndex]) - $countCallIndex = $tokens->getNextMeaningfulToken($commaIndex); - if ($tokens[$countCallIndex]->isGivenKind(T_NS_SEPARATOR)) { - $defaultNamespaceTokenIndex = $countCallIndex; - $countCallIndex = $tokens->getNextMeaningfulToken($countCallIndex); - } else { - $defaultNamespaceTokenIndex = false; - } - - if (!$tokens[$countCallIndex]->isGivenKind(T_STRING)) { - return; - } - - $lowerContent = strtolower($tokens[$countCallIndex]->getContent()); - if ('count' !== $lowerContent && 'sizeof' !== $lowerContent) { - return; // not a call to "count" or "sizeOf" - } - - // @ $this->/self::assertEquals/Same([$nextIndex,$commaIndex,[$defaultNamespaceTokenIndex,]$countCallIndex,$countCallOpenBraceIndex]) - $countCallOpenBraceIndex = $tokens->getNextMeaningfulToken($countCallIndex); - if (!$tokens[$countCallOpenBraceIndex]->equals('(')) { - return; - } - - $countCallCloseBraceIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $countCallOpenBraceIndex); - - $afterCountCallCloseBraceIndex = $tokens->getNextMeaningfulToken($countCallCloseBraceIndex); - if (!$tokens[$afterCountCallCloseBraceIndex]->equalsAny([')', ','])) { - return; - } - - $this->removeFunctionCall( - $tokens, - $defaultNamespaceTokenIndex, - $countCallIndex, - $countCallOpenBraceIndex, - $countCallCloseBraceIndex - ); - - $tokens[$assertCall['index']] = new Token([ - T_STRING, - false === strpos($assertCall['loweredName'], 'not', 6) ? 'assertCount' : 'assertNotCount', - ]); - } - - 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 ('assert' !== substr($loweredContent, 0, 6)) { - 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), - ]; - } - } - - /** - * @param false|int $callNSIndex - */ - private function removeFunctionCall(Tokens $tokens, $callNSIndex, int $callIndex, int $openIndex, int $closeIndex): void - { - $tokens->clearTokenAndMergeSurroundingWhitespace($callIndex); - if (false !== $callNSIndex) { - $tokens->clearTokenAndMergeSurroundingWhitespace($callNSIndex); - } - - $tokens->clearTokenAndMergeSurroundingWhitespace($openIndex); - $commaIndex = $tokens->getPrevMeaningfulToken($closeIndex); - if ($tokens[$commaIndex]->equals(',')) { - $tokens->removeTrailingWhitespace($commaIndex); - $tokens->clearAt($commaIndex); - } - - $tokens->clearTokenAndMergeSurroundingWhitespace($closeIndex); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitDedicateAssertInternalTypeFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitDedicateAssertInternalTypeFixer.php deleted file mode 100644 index 39d6db8..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitDedicateAssertInternalTypeFixer.php +++ /dev/null @@ -1,202 +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\Fixer\PhpUnit; - -use PhpCsFixer\Fixer\AbstractPhpUnitFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * @author Filippo Tessarotto - */ -final class PhpUnitDedicateAssertInternalTypeFixer extends AbstractPhpUnitFixer implements ConfigurableFixerInterface -{ - /** - * @var array - */ - private $typeToDedicatedAssertMap = [ - 'array' => 'assertIsArray', - 'boolean' => 'assertIsBool', - 'bool' => 'assertIsBool', - 'double' => 'assertIsFloat', - 'float' => 'assertIsFloat', - 'integer' => 'assertIsInt', - 'int' => 'assertIsInt', - 'null' => 'assertNull', - 'numeric' => 'assertIsNumeric', - 'object' => 'assertIsObject', - 'real' => 'assertIsFloat', - 'resource' => 'assertIsResource', - 'string' => 'assertIsString', - 'scalar' => 'assertIsScalar', - 'callable' => 'assertIsCallable', - 'iterable' => 'assertIsIterable', - ]; - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'PHPUnit assertions like `assertIsArray` should be used over `assertInternalType`.', - [ - new CodeSample( - 'assertInternalType("array", $var); - $this->assertInternalType("boolean", $var); - } -} -' - ), - new CodeSample( - 'assertInternalType("array", $var); - $this->assertInternalType("boolean", $var); - } -} -', - ['target' => PhpUnitTargetVersion::VERSION_7_5] - ), - ], - null, - 'Risky when PHPUnit methods are overridden or when project has PHPUnit incompatibilities.' - ); - } - - /** - * {@inheritdoc} - */ - public function isRisky(): bool - { - return true; - } - - /** - * {@inheritdoc} - * - * Must run after PhpUnitDedicateAssertFixer. - */ - public function getPriority(): int - { - return -16; - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('target', 'Target version of PHPUnit.')) - ->setAllowedTypes(['string']) - ->setAllowedValues([PhpUnitTargetVersion::VERSION_7_5, PhpUnitTargetVersion::VERSION_NEWEST]) - ->setDefault(PhpUnitTargetVersion::VERSION_NEWEST) - ->getOption(), - ]); - } - - /** - * {@inheritdoc} - */ - protected function applyPhpUnitClassFix(Tokens $tokens, int $startIndex, int $endIndex): void - { - $anonymousClassIndexes = []; - $tokenAnalyzer = new TokensAnalyzer($tokens); - for ($index = $startIndex; $index < $endIndex; ++$index) { - if (!$tokens[$index]->isClassy() || !$tokenAnalyzer->isAnonymousClass($index)) { - continue; - } - - $openingBraceIndex = $tokens->getNextTokenOfKind($index, ['{']); - $closingBraceIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $openingBraceIndex); - - $anonymousClassIndexes[$closingBraceIndex] = $openingBraceIndex; - } - - for ($index = $endIndex - 1; $index > $startIndex; --$index) { - if (isset($anonymousClassIndexes[$index])) { - $index = $anonymousClassIndexes[$index]; - - continue; - } - - if (!$tokens[$index]->isGivenKind(T_STRING)) { - continue; - } - - $functionName = strtolower($tokens[$index]->getContent()); - - if ('assertinternaltype' !== $functionName && 'assertnotinternaltype' !== $functionName) { - continue; - } - - $bracketTokenIndex = $tokens->getNextMeaningfulToken($index); - - if (!$tokens[$bracketTokenIndex]->equals('(')) { - continue; - } - - $expectedTypeTokenIndex = $tokens->getNextMeaningfulToken($bracketTokenIndex); - $expectedTypeToken = $tokens[$expectedTypeTokenIndex]; - - if (!$expectedTypeToken->equals([T_CONSTANT_ENCAPSED_STRING])) { - continue; - } - - $expectedType = trim($expectedTypeToken->getContent(), '\'"'); - - if (!isset($this->typeToDedicatedAssertMap[$expectedType])) { - continue; - } - - $commaTokenIndex = $tokens->getNextMeaningfulToken($expectedTypeTokenIndex); - - if (!$tokens[$commaTokenIndex]->equals(',')) { - continue; - } - - $newAssertion = $this->typeToDedicatedAssertMap[$expectedType]; - - if ('assertnotinternaltype' === $functionName) { - $newAssertion = str_replace('Is', 'IsNot', $newAssertion); - $newAssertion = str_replace('Null', 'NotNull', $newAssertion); - } - - $nextMeaningfulTokenIndex = $tokens->getNextMeaningfulToken($commaTokenIndex); - - $tokens->overrideRange($index, $nextMeaningfulTokenIndex - 1, [ - new Token([T_STRING, $newAssertion]), - new Token('('), - ]); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitExpectationFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitExpectationFixer.php deleted file mode 100644 index 4bb8001..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitExpectationFixer.php +++ /dev/null @@ -1,289 +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\Fixer\PhpUnit; - -use PhpCsFixer\Fixer\AbstractPhpUnitFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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\Tokenizer\Analyzer\ArgumentsAnalyzer; -use PhpCsFixer\Tokenizer\Analyzer\WhitespacesAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dariusz Rumiński - */ -final class PhpUnitExpectationFixer extends AbstractPhpUnitFixer implements ConfigurableFixerInterface, WhitespacesAwareFixerInterface -{ - /** - * @var array - */ - private $methodMap = []; - - /** - * {@inheritdoc} - */ - 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'; - } - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Usages of `->setExpectedException*` methods MUST be replaced by `->expectException*` methods.', - [ - new CodeSample( - 'setExpectedException("RuntimeException", "Msg", 123); - foo(); - } - - public function testBar() - { - $this->setExpectedExceptionRegExp("RuntimeException", "/Msg.*/", 123); - bar(); - } -} -' - ), - new CodeSample( - 'setExpectedException("RuntimeException", null, 123); - foo(); - } - - public function testBar() - { - $this->setExpectedExceptionRegExp("RuntimeException", "/Msg.*/", 123); - bar(); - } -} -', - ['target' => PhpUnitTargetVersion::VERSION_8_4] - ), - new CodeSample( - 'setExpectedException("RuntimeException", null, 123); - foo(); - } - - public function testBar() - { - $this->setExpectedExceptionRegExp("RuntimeException", "/Msg.*/", 123); - bar(); - } -} -', - ['target' => PhpUnitTargetVersion::VERSION_5_6] - ), - new CodeSample( - 'setExpectedException("RuntimeException", "Msg", 123); - foo(); - } - - public function testBar() - { - $this->setExpectedExceptionRegExp("RuntimeException", "/Msg.*/", 123); - bar(); - } -} -', - ['target' => PhpUnitTargetVersion::VERSION_5_2] - ), - ], - null, - 'Risky when PHPUnit classes are overridden or not accessible, or when project has PHPUnit incompatibilities.' - ); - } - - /** - * {@inheritdoc} - * - * Must run after PhpUnitNoExpectationAnnotationFixer. - */ - public function getPriority(): int - { - return 0; - } - - /** - * {@inheritdoc} - */ - public function isRisky(): bool - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('target', 'Target version of PHPUnit.')) - ->setAllowedTypes(['string']) - ->setAllowedValues([PhpUnitTargetVersion::VERSION_5_2, PhpUnitTargetVersion::VERSION_5_6, PhpUnitTargetVersion::VERSION_8_4, PhpUnitTargetVersion::VERSION_NEWEST]) - ->setDefault(PhpUnitTargetVersion::VERSION_NEWEST) - ->getOption(), - ]); - } - - /** - * {@inheritdoc} - */ - protected function applyPhpUnitClassFix(Tokens $tokens, int $startIndex, int $endIndex): void - { - foreach (Token::getObjectOperatorKinds() as $objectOperator) { - $this->applyPhpUnitClassFixWithObjectOperator($tokens, $startIndex, $endIndex, $objectOperator); - } - } - - private function applyPhpUnitClassFixWithObjectOperator(Tokens $tokens, int $startIndex, int $endIndex, int $objectOperator): void - { - $argumentsAnalyzer = new ArgumentsAnalyzer(); - - $oldMethodSequence = [ - [T_VARIABLE, '$this'], - [$objectOperator], - [T_STRING], - ]; - - for ($index = $startIndex; $startIndex < $endIndex; ++$index) { - $match = $tokens->findSequence($oldMethodSequence, $index); - - if (null === $match) { - return; - } - - [$thisIndex, , $index] = array_keys($match); - - if (!isset($this->methodMap[$tokens[$index]->getContent()])) { - continue; - } - - $openIndex = $tokens->getNextTokenOfKind($index, ['(']); - $closeIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $openIndex); - $commaIndex = $tokens->getPrevMeaningfulToken($closeIndex); - if ($tokens[$commaIndex]->equals(',')) { - $tokens->removeTrailingWhitespace($commaIndex); - $tokens->clearAt($commaIndex); - } - - $arguments = $argumentsAnalyzer->getArguments($tokens, $openIndex, $closeIndex); - $argumentsCnt = \count($arguments); - - $argumentsReplacements = ['expectException', $this->methodMap[$tokens[$index]->getContent()], 'expectExceptionCode']; - - $indent = $this->whitespacesConfig->getLineEnding().WhitespacesAnalyzer::detectIndent($tokens, $thisIndex); - - $isMultilineWhitespace = false; - - for ($cnt = $argumentsCnt - 1; $cnt >= 1; --$cnt) { - $argStart = array_keys($arguments)[$cnt]; - $argBefore = $tokens->getPrevMeaningfulToken($argStart); - - if ('expectExceptionMessage' === $argumentsReplacements[$cnt]) { - $paramIndicatorIndex = $tokens->getNextMeaningfulToken($argBefore); - $afterParamIndicatorIndex = $tokens->getNextMeaningfulToken($paramIndicatorIndex); - - if ( - $tokens[$paramIndicatorIndex]->equals([T_STRING, 'null'], false) - && $tokens[$afterParamIndicatorIndex]->equals(')') - ) { - if ($tokens[$argBefore + 1]->isWhitespace()) { - $tokens->clearTokenAndMergeSurroundingWhitespace($argBefore + 1); - } - $tokens->clearTokenAndMergeSurroundingWhitespace($argBefore); - $tokens->clearTokenAndMergeSurroundingWhitespace($paramIndicatorIndex); - - continue; - } - } - - $isMultilineWhitespace = $isMultilineWhitespace || ($tokens[$argStart]->isWhitespace() && !$tokens[$argStart]->isWhitespace(" \t")); - $tokensOverrideArgStart = [ - new Token([T_WHITESPACE, $indent]), - new Token([T_VARIABLE, '$this']), - new Token([T_OBJECT_OPERATOR, '->']), - new Token([T_STRING, $argumentsReplacements[$cnt]]), - new Token('('), - ]; - $tokensOverrideArgBefore = [ - new Token(')'), - new Token(';'), - ]; - - if ($isMultilineWhitespace) { - $tokensOverrideArgStart[] = new Token([T_WHITESPACE, $indent.$this->whitespacesConfig->getIndent()]); - array_unshift($tokensOverrideArgBefore, new Token([T_WHITESPACE, $indent])); - } - - if ($tokens[$argStart]->isWhitespace()) { - $tokens->overrideRange($argStart, $argStart, $tokensOverrideArgStart); - } else { - $tokens->insertAt($argStart, $tokensOverrideArgStart); - } - - $tokens->overrideRange($argBefore, $argBefore, $tokensOverrideArgBefore); - } - - $methodName = 'expectException'; - if ('expectExceptionMessageRegExp' === $tokens[$index]->getContent()) { - $methodName = $this->methodMap[$tokens[$index]->getContent()]; - } - $tokens[$index] = new Token([T_STRING, $methodName]); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitFqcnAnnotationFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitFqcnAnnotationFixer.php deleted file mode 100644 index dd440ec..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitFqcnAnnotationFixer.php +++ /dev/null @@ -1,92 +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\Fixer\PhpUnit; - -use PhpCsFixer\Fixer\AbstractPhpUnitFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Roland Franssen - */ -final class PhpUnitFqcnAnnotationFixer extends AbstractPhpUnitFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'PHPUnit annotations should be a FQCNs including a root namespace.', - [new CodeSample( - 'getPrevTokenOfKind($startIndex, [[T_DOC_COMMENT]]); - - if (null !== $prevDocCommentIndex) { - $startIndex = $prevDocCommentIndex; - } - - $this->fixPhpUnitClass($tokens, $startIndex, $endIndex); - } - - private function fixPhpUnitClass(Tokens $tokens, int $startIndex, int $endIndex): void - { - for ($index = $startIndex; $index < $endIndex; ++$index) { - 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', - $tokens[$index]->getContent() - )]); - } - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitInternalClassFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitInternalClassFixer.php deleted file mode 100644 index b05f052..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitInternalClassFixer.php +++ /dev/null @@ -1,165 +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\Fixer\PhpUnit; - -use PhpCsFixer\DocBlock\DocBlock; -use PhpCsFixer\DocBlock\Line; -use PhpCsFixer\Fixer\AbstractPhpUnitFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerConfiguration\AllowedValueSubset; -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\WhitespacesAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Gert de Pagter - */ -final class PhpUnitInternalClassFixer extends AbstractPhpUnitFixer implements WhitespacesAwareFixerInterface, ConfigurableFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'All PHPUnit test classes should be marked as internal.', - [ - new CodeSample(" ['final']] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run before FinalInternalClassFixer. - */ - public function getPriority(): int - { - return 68; - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - $types = ['normal', 'final', 'abstract']; - - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('types', 'What types of classes to mark as internal')) - ->setAllowedValues([(new AllowedValueSubset($types))]) - ->setAllowedTypes(['array']) - ->setDefault(['normal', 'final']) - ->getOption(), - ]); - } - - /** - * {@inheritdoc} - */ - protected function applyPhpUnitClassFix(Tokens $tokens, int $startIndex, int $endIndex): void - { - $classIndex = $tokens->getPrevTokenOfKind($startIndex, [[T_CLASS]]); - - if (!$this->isAllowedByConfiguration($tokens, $classIndex)) { - return; - } - - $docBlockIndex = $this->getDocBlockIndex($tokens, $classIndex); - - if ($this->isPHPDoc($tokens, $docBlockIndex)) { - $this->updateDocBlockIfNeeded($tokens, $docBlockIndex); - } else { - $this->createDocBlock($tokens, $docBlockIndex); - } - } - - private function isAllowedByConfiguration(Tokens $tokens, int $i): bool - { - $typeIndex = $tokens->getPrevMeaningfulToken($i); - if ($tokens[$typeIndex]->isGivenKind(T_FINAL)) { - return \in_array('final', $this->configuration['types'], true); - } - - if ($tokens[$typeIndex]->isGivenKind(T_ABSTRACT)) { - return \in_array('abstract', $this->configuration['types'], true); - } - - return \in_array('normal', $this->configuration['types'], true); - } - - private function createDocBlock(Tokens $tokens, int $docBlockIndex): void - { - $lineEnd = $this->whitespacesConfig->getLineEnding(); - $originalIndent = WhitespacesAnalyzer::detectIndent($tokens, $tokens->getNextNonWhitespace($docBlockIndex)); - $toInsert = [ - new Token([T_DOC_COMMENT, '/**'.$lineEnd."{$originalIndent} * @internal".$lineEnd."{$originalIndent} */"]), - new Token([T_WHITESPACE, $lineEnd.$originalIndent]), - ]; - $index = $tokens->getNextMeaningfulToken($docBlockIndex); - $tokens->insertAt($index, $toInsert); - } - - private function updateDocBlockIfNeeded(Tokens $tokens, int $docBlockIndex): void - { - $doc = new DocBlock($tokens[$docBlockIndex]->getContent()); - if (!empty($doc->getAnnotationsOfType('internal'))) { - return; - } - $doc = $this->makeDocBlockMultiLineIfNeeded($doc, $tokens, $docBlockIndex); - $lines = $this->addInternalAnnotation($doc, $tokens, $docBlockIndex); - $lines = implode('', $lines); - - $tokens[$docBlockIndex] = new Token([T_DOC_COMMENT, $lines]); - } - - /** - * @return Line[] - */ - private function addInternalAnnotation(DocBlock $docBlock, Tokens $tokens, int $docBlockIndex): array - { - $lines = $docBlock->getLines(); - $originalIndent = WhitespacesAnalyzer::detectIndent($tokens, $docBlockIndex); - $lineEnd = $this->whitespacesConfig->getLineEnding(); - array_splice($lines, -1, 0, $originalIndent.' *'.$lineEnd.$originalIndent.' * @internal'.$lineEnd); - - return $lines; - } - - private function makeDocBlockMultiLineIfNeeded(DocBlock $doc, Tokens $tokens, int $docBlockIndex): DocBlock - { - $lines = $doc->getLines(); - if (1 === \count($lines) && empty($doc->getAnnotationsOfType('internal'))) { - $indent = WhitespacesAnalyzer::detectIndent($tokens, $tokens->getNextNonWhitespace($docBlockIndex)); - $doc->makeMultiLine($indent, $this->whitespacesConfig->getLineEnding()); - - return $doc; - } - - return $doc; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitMethodCasingFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitMethodCasingFixer.php deleted file mode 100644 index 5dbf6f0..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitMethodCasingFixer.php +++ /dev/null @@ -1,213 +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\Fixer\PhpUnit; - -use PhpCsFixer\DocBlock\DocBlock; -use PhpCsFixer\DocBlock\Line; -use PhpCsFixer\Fixer\AbstractPhpUnitFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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; -use PhpCsFixer\Tokenizer\TokensAnalyzer; -use PhpCsFixer\Utils; - -/** - * @author Filippo Tessarotto - */ -final class PhpUnitMethodCasingFixer extends AbstractPhpUnitFixer implements ConfigurableFixerInterface -{ - /** - * @internal - */ - public const CAMEL_CASE = 'camel_case'; - - /** - * @internal - */ - public const SNAKE_CASE = 'snake_case'; - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Enforce camel (or snake) case for PHPUnit test methods, following configuration.', - [ - new CodeSample( - ' self::SNAKE_CASE] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run after PhpUnitTestAnnotationFixer. - */ - public function getPriority(): int - { - return 0; - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('case', 'Apply camel or snake case to test methods')) - ->setAllowedValues([self::CAMEL_CASE, self::SNAKE_CASE]) - ->setDefault(self::CAMEL_CASE) - ->getOption(), - ]); - } - - /** - * {@inheritdoc} - */ - protected function applyPhpUnitClassFix(Tokens $tokens, int $startIndex, int $endIndex): void - { - for ($index = $endIndex - 1; $index > $startIndex; --$index) { - if (!$this->isTestMethod($tokens, $index)) { - continue; - } - - $functionNameIndex = $tokens->getNextMeaningfulToken($index); - $functionName = $tokens[$functionNameIndex]->getContent(); - $newFunctionName = $this->updateMethodCasing($functionName); - - if ($newFunctionName !== $functionName) { - $tokens[$functionNameIndex] = new Token([T_STRING, $newFunctionName]); - } - - $docBlockIndex = $this->getDocBlockIndex($tokens, $index); - - if ($this->isPHPDoc($tokens, $docBlockIndex)) { - $this->updateDocBlock($tokens, $docBlockIndex); - } - } - } - - private function updateMethodCasing(string $functionName): string - { - $parts = explode('::', $functionName); - - $functionNamePart = array_pop($parts); - - if (self::CAMEL_CASE === $this->configuration['case']) { - $newFunctionNamePart = $functionNamePart; - $newFunctionNamePart = ucwords($newFunctionNamePart, '_'); - $newFunctionNamePart = str_replace('_', '', $newFunctionNamePart); - $newFunctionNamePart = lcfirst($newFunctionNamePart); - } else { - $newFunctionNamePart = Utils::camelCaseToUnderscore($functionNamePart); - } - - $parts[] = $newFunctionNamePart; - - return implode('::', $parts); - } - - private function isTestMethod(Tokens $tokens, int $index): bool - { - // Check if we are dealing with a (non abstract, non lambda) function - if (!$this->isMethod($tokens, $index)) { - return false; - } - - // if the function name starts with test it's a test - $functionNameIndex = $tokens->getNextMeaningfulToken($index); - $functionName = $tokens[$functionNameIndex]->getContent(); - - if ($this->startsWith('test', $functionName)) { - return true; - } - - $docBlockIndex = $this->getDocBlockIndex($tokens, $index); - - return - $this->isPHPDoc($tokens, $docBlockIndex) // If the function doesn't have test in its name, and no doc block, it's not a test - && false !== strpos($tokens[$docBlockIndex]->getContent(), '@test') - ; - } - - private function isMethod(Tokens $tokens, int $index): bool - { - $tokensAnalyzer = new TokensAnalyzer($tokens); - - return $tokens[$index]->isGivenKind(T_FUNCTION) && !$tokensAnalyzer->isLambda($index); - } - - private function startsWith(string $needle, string $haystack): bool - { - return substr($haystack, 0, \strlen($needle)) === $needle; - } - - private function updateDocBlock(Tokens $tokens, int $docBlockIndex): void - { - $doc = new DocBlock($tokens[$docBlockIndex]->getContent()); - $lines = $doc->getLines(); - - $docBlockNeedsUpdate = false; - for ($inc = 0; $inc < \count($lines); ++$inc) { - $lineContent = $lines[$inc]->getContent(); - if (false === strpos($lineContent, '@depends')) { - continue; - } - - $newLineContent = Preg::replaceCallback('/(@depends\s+)(.+)(\b)/', function (array $matches) { - return sprintf( - '%s%s%s', - $matches[1], - $this->updateMethodCasing($matches[2]), - $matches[3] - ); - }, $lineContent); - - if ($newLineContent !== $lineContent) { - $lines[$inc] = new Line($newLineContent); - $docBlockNeedsUpdate = true; - } - } - - if ($docBlockNeedsUpdate) { - $lines = implode('', $lines); - $tokens[$docBlockIndex] = new Token([T_DOC_COMMENT, $lines]); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitMockFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitMockFixer.php deleted file mode 100644 index 8c5794e..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitMockFixer.php +++ /dev/null @@ -1,142 +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\Fixer\PhpUnit; - -use PhpCsFixer\Fixer\AbstractPhpUnitFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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\ArgumentsAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dariusz Rumiński - */ -final class PhpUnitMockFixer extends AbstractPhpUnitFixer implements ConfigurableFixerInterface -{ - /** - * @var bool - */ - private $fixCreatePartialMock; - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Usages of `->getMock` and `->getMockWithoutInvokingTheOriginalConstructor` methods MUST be replaced by `->createMock` or `->createPartialMock` methods.', - [ - new CodeSample( - 'getMockWithoutInvokingTheOriginalConstructor("Foo"); - $mock1 = $this->getMock("Foo"); - $mock1 = $this->getMock("Bar", ["aaa"]); - $mock1 = $this->getMock("Baz", ["aaa"], ["argument"]); // version with more than 2 params is not supported - } -} -' - ), - new CodeSample( - 'getMock("Foo"); - $mock1 = $this->getMock("Bar", ["aaa"]); // version with multiple params is not supported - } -} -', - ['target' => PhpUnitTargetVersion::VERSION_5_4] - ), - ], - null, - 'Risky when PHPUnit classes are overridden or not accessible, or when project has PHPUnit incompatibilities.' - ); - } - - /** - * {@inheritdoc} - */ - public function isRisky(): bool - { - return true; - } - - /** - * {@inheritdoc} - */ - public function configure(array $configuration): void - { - parent::configure($configuration); - - $this->fixCreatePartialMock = PhpUnitTargetVersion::fulfills($this->configuration['target'], PhpUnitTargetVersion::VERSION_5_5); - } - - /** - * {@inheritdoc} - */ - protected function applyPhpUnitClassFix(Tokens $tokens, int $startIndex, int $endIndex): void - { - $argumentsAnalyzer = new ArgumentsAnalyzer(); - - for ($index = $startIndex; $index < $endIndex; ++$index) { - if (!$tokens[$index]->isObjectOperator()) { - continue; - } - - $index = $tokens->getNextMeaningfulToken($index); - - if ($tokens[$index]->equals([T_STRING, 'getMockWithoutInvokingTheOriginalConstructor'], false)) { - $tokens[$index] = new Token([T_STRING, 'createMock']); - } elseif ($tokens[$index]->equals([T_STRING, 'getMock'], false)) { - $openingParenthesis = $tokens->getNextMeaningfulToken($index); - $closingParenthesis = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $openingParenthesis); - - $argumentsCount = $argumentsAnalyzer->countArguments($tokens, $openingParenthesis, $closingParenthesis); - - if (1 === $argumentsCount) { - $tokens[$index] = new Token([T_STRING, 'createMock']); - } elseif (2 === $argumentsCount && true === $this->fixCreatePartialMock) { - $tokens[$index] = new Token([T_STRING, 'createPartialMock']); - } - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('target', 'Target version of PHPUnit.')) - ->setAllowedTypes(['string']) - ->setAllowedValues([PhpUnitTargetVersion::VERSION_5_4, PhpUnitTargetVersion::VERSION_5_5, PhpUnitTargetVersion::VERSION_NEWEST]) - ->setDefault(PhpUnitTargetVersion::VERSION_NEWEST) - ->getOption(), - ]); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitMockShortWillReturnFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitMockShortWillReturnFixer.php deleted file mode 100644 index dab8655..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitMockShortWillReturnFixer.php +++ /dev/null @@ -1,124 +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\Fixer\PhpUnit; - -use PhpCsFixer\Fixer\AbstractPhpUnitFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Analyzer\FunctionsAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Michał Adamski - * @author Kuba Werłos - */ -final class PhpUnitMockShortWillReturnFixer extends AbstractPhpUnitFixer -{ - private const RETURN_METHODS_MAP = [ - 'returnargument' => 'willReturnArgument', - 'returncallback' => 'willReturnCallback', - 'returnself' => 'willReturnSelf', - 'returnvalue' => 'willReturn', - 'returnvaluemap' => 'willReturnMap', - ]; - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Usage of PHPUnit\'s mock e.g. `->will($this->returnValue(..))` must be replaced by its shorter equivalent such as `->willReturn(...)`.', - [ - new CodeSample('createMock(Some::class); - $someMock->method("some")->will($this->returnSelf()); - $someMock->method("some")->will($this->returnValue("example")); - $someMock->method("some")->will($this->returnArgument(2)); - $someMock->method("some")->will($this->returnCallback("str_rot13")); - $someMock->method("some")->will($this->returnValueMap(["a","b","c"])); - } -} -'), - ], - null, - 'Risky when PHPUnit classes are overridden or not accessible, or when project has PHPUnit incompatibilities.' - ); - } - - /** - * {@inheritdoc} - */ - public function isRisky(): bool - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyPhpUnitClassFix(Tokens $tokens, int $startIndex, int $endIndex): void - { - $functionsAnalyzer = new FunctionsAnalyzer(); - - for ($index = $startIndex; $index < $endIndex; ++$index) { - if (!$tokens[$index]->isObjectOperator()) { - continue; - } - - $functionToReplaceIndex = $tokens->getNextMeaningfulToken($index); - if (!$tokens[$functionToReplaceIndex]->equals([T_STRING, 'will'], false)) { - continue; - } - - $functionToReplaceOpeningBraceIndex = $tokens->getNextMeaningfulToken($functionToReplaceIndex); - if (!$tokens[$functionToReplaceOpeningBraceIndex]->equals('(')) { - continue; - } - - $classReferenceIndex = $tokens->getNextMeaningfulToken($functionToReplaceOpeningBraceIndex); - $objectOperatorIndex = $tokens->getNextMeaningfulToken($classReferenceIndex); - $functionToRemoveIndex = $tokens->getNextMeaningfulToken($objectOperatorIndex); - - if (!$functionsAnalyzer->isTheSameClassCall($tokens, $functionToRemoveIndex)) { - continue; - } - - if (!\array_key_exists(strtolower($tokens[$functionToRemoveIndex]->getContent()), self::RETURN_METHODS_MAP)) { - continue; - } - - $openingBraceIndex = $tokens->getNextMeaningfulToken($functionToRemoveIndex); - if (!$tokens[$openingBraceIndex]->equals('(')) { - continue; - } - - $closingBraceIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $openingBraceIndex); - - $tokens[$functionToReplaceIndex] = new Token([T_STRING, self::RETURN_METHODS_MAP[strtolower($tokens[$functionToRemoveIndex]->getContent())]]); - $tokens->clearTokenAndMergeSurroundingWhitespace($classReferenceIndex); - $tokens->clearTokenAndMergeSurroundingWhitespace($objectOperatorIndex); - $tokens->clearTokenAndMergeSurroundingWhitespace($functionToRemoveIndex); - $tokens->clearTokenAndMergeSurroundingWhitespace($openingBraceIndex); - $tokens->clearTokenAndMergeSurroundingWhitespace($closingBraceIndex); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitNamespacedFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitNamespacedFixer.php deleted file mode 100644 index 3b5b11a..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitNamespacedFixer.php +++ /dev/null @@ -1,229 +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\Fixer\PhpUnit; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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 Dariusz Rumiński - */ -final class PhpUnitNamespacedFixer extends AbstractFixer implements ConfigurableFixerInterface -{ - /** - * @var string - */ - private $originalClassRegEx; - - /** - * Class Mappings. - * - * * [original classname => new classname] Some classes which match the - * original class regular expression do not have a same-compound name- - * space class and need a dedicated translation table. This trans- - * lation table is defined in @see configure. - * - * @var array|string[] Class Mappings - */ - private $classMap; - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - $codeSample = ' PhpUnitTargetVersion::VERSION_4_8]), - ], - "PHPUnit v6 has finally fully switched to namespaces.\n" - ."You could start preparing the upgrade by switching from non-namespaced TestCase to namespaced one.\n" - .'Forward compatibility layer (`\PHPUnit\Framework\TestCase` class) was backported to PHPUnit v4.8.35 and PHPUnit v5.4.0.'."\n" - .'Extended forward compatibility layer (`PHPUnit\Framework\Assert`, `PHPUnit\Framework\BaseTestListener`, `PHPUnit\Framework\TestListener` classes) was introduced in v5.7.0.'."\n", - 'Risky when PHPUnit classes are overridden or not accessible, or when project has PHPUnit incompatibilities.' - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isTokenKindFound(T_STRING); - } - - /** - * {@inheritdoc} - */ - public function isRisky(): bool - { - return true; - } - - /** - * {@inheritdoc} - */ - public function configure(array $configuration): void - { - parent::configure($configuration); - - if (PhpUnitTargetVersion::fulfills($this->configuration['target'], PhpUnitTargetVersion::VERSION_6_0)) { - $this->originalClassRegEx = '/^PHPUnit_\w+$/i'; - // @noinspection ClassConstantCanBeUsedInspection - $this->classMap = [ - 'PHPUnit_Extensions_PhptTestCase' => 'PHPUnit\Runner\PhptTestCase', - 'PHPUnit_Framework_Constraint' => 'PHPUnit\Framework\Constraint\Constraint', - 'PHPUnit_Framework_Constraint_StringMatches' => 'PHPUnit\Framework\Constraint\StringMatchesFormatDescription', - 'PHPUnit_Framework_Constraint_JsonMatches_ErrorMessageProvider' => 'PHPUnit\Framework\Constraint\JsonMatchesErrorMessageProvider', - 'PHPUnit_Framework_Constraint_PCREMatch' => 'PHPUnit\Framework\Constraint\RegularExpression', - 'PHPUnit_Framework_Constraint_ExceptionMessageRegExp' => 'PHPUnit\Framework\Constraint\ExceptionMessageRegularExpression', - 'PHPUnit_Framework_Constraint_And' => 'PHPUnit\Framework\Constraint\LogicalAnd', - 'PHPUnit_Framework_Constraint_Or' => 'PHPUnit\Framework\Constraint\LogicalOr', - 'PHPUnit_Framework_Constraint_Not' => 'PHPUnit\Framework\Constraint\LogicalNot', - 'PHPUnit_Framework_Constraint_Xor' => 'PHPUnit\Framework\Constraint\LogicalXor', - 'PHPUnit_Framework_Error' => 'PHPUnit\Framework\Error\Error', - 'PHPUnit_Framework_TestSuite_DataProvider' => 'PHPUnit\Framework\DataProviderTestSuite', - 'PHPUnit_Framework_MockObject_Invocation_Static' => 'PHPUnit\Framework\MockObject\Invocation\StaticInvocation', - 'PHPUnit_Framework_MockObject_Invocation_Object' => 'PHPUnit\Framework\MockObject\Invocation\ObjectInvocation', - 'PHPUnit_Framework_MockObject_Stub_Return' => 'PHPUnit\Framework\MockObject\Stub\ReturnStub', - 'PHPUnit_Runner_Filter_Group_Exclude' => 'PHPUnit\Runner\Filter\ExcludeGroupFilterIterator', - 'PHPUnit_Runner_Filter_Group_Include' => 'PHPUnit\Runner\Filter\IncludeGroupFilterIterator', - 'PHPUnit_Runner_Filter_Test' => 'PHPUnit\Runner\Filter\NameFilterIterator', - 'PHPUnit_Util_PHP' => 'PHPUnit\Util\PHP\AbstractPhpProcess', - 'PHPUnit_Util_PHP_Default' => 'PHPUnit\Util\PHP\DefaultPhpProcess', - 'PHPUnit_Util_PHP_Windows' => 'PHPUnit\Util\PHP\WindowsPhpProcess', - 'PHPUnit_Util_Regex' => 'PHPUnit\Util\RegularExpression', - 'PHPUnit_Util_TestDox_ResultPrinter_XML' => 'PHPUnit\Util\TestDox\XmlResultPrinter', - 'PHPUnit_Util_TestDox_ResultPrinter_HTML' => 'PHPUnit\Util\TestDox\HtmlResultPrinter', - 'PHPUnit_Util_TestDox_ResultPrinter_Text' => 'PHPUnit\Util\TestDox\TextResultPrinter', - 'PHPUnit_Util_TestSuiteIterator' => 'PHPUnit\Framework\TestSuiteIterator', - 'PHPUnit_Util_XML' => 'PHPUnit\Util\Xml', - ]; - } elseif (PhpUnitTargetVersion::fulfills($this->configuration['target'], PhpUnitTargetVersion::VERSION_5_7)) { - $this->originalClassRegEx = '/^PHPUnit_Framework_TestCase|PHPUnit_Framework_Assert|PHPUnit_Framework_BaseTestListener|PHPUnit_Framework_TestListener$/i'; - $this->classMap = []; - } else { - $this->originalClassRegEx = '/^PHPUnit_Framework_TestCase$/i'; - $this->classMap = []; - } - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $importedOriginalClassesMap = []; - $currIndex = 0; - - while (null !== $currIndex) { - $currIndex = $tokens->getNextTokenOfKind($currIndex, [[T_STRING]]); - - if (null === $currIndex) { - break; - } - - $prevIndex = $tokens->getPrevMeaningfulToken($currIndex); - if ($tokens[$prevIndex]->isGivenKind([T_CONST, T_DOUBLE_COLON])) { - continue; - } - - $originalClass = $tokens[$currIndex]->getContent(); - - if (1 !== Preg::match($this->originalClassRegEx, $originalClass)) { - ++$currIndex; - - continue; - } - - $substituteTokens = $this->generateReplacement($originalClass); - - $tokens->clearAt($currIndex); - $tokens->insertAt( - $currIndex, - isset($importedOriginalClassesMap[$originalClass]) ? $substituteTokens[$substituteTokens->getSize() - 1] : $substituteTokens - ); - - $prevIndex = $tokens->getPrevMeaningfulToken($currIndex); - if ($tokens[$prevIndex]->isGivenKind(T_USE)) { - $importedOriginalClassesMap[$originalClass] = true; - } elseif ($tokens[$prevIndex]->isGivenKind(T_NS_SEPARATOR)) { - $prevIndex = $tokens->getPrevMeaningfulToken($prevIndex); - - if ($tokens[$prevIndex]->isGivenKind(T_USE)) { - $importedOriginalClassesMap[$originalClass] = true; - } - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('target', 'Target version of PHPUnit.')) - ->setAllowedTypes(['string']) - ->setAllowedValues([PhpUnitTargetVersion::VERSION_4_8, PhpUnitTargetVersion::VERSION_5_7, PhpUnitTargetVersion::VERSION_6_0, PhpUnitTargetVersion::VERSION_NEWEST]) - ->setDefault(PhpUnitTargetVersion::VERSION_NEWEST) - ->getOption(), - ]); - } - - private function generateReplacement(string $originalClassName): Tokens - { - $delimiter = '_'; - $string = $originalClassName; - - if (isset($this->classMap[$originalClassName])) { - $delimiter = '\\'; - $string = $this->classMap[$originalClassName]; - } - - $parts = explode($delimiter, $string); - - $tokensArray = []; - while (!empty($parts)) { - $tokensArray[] = new Token([T_STRING, array_shift($parts)]); - if (!empty($parts)) { - $tokensArray[] = new Token([T_NS_SEPARATOR, '\\']); - } - } - - return Tokens::fromArray($tokensArray); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitNoExpectationAnnotationFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitNoExpectationAnnotationFixer.php deleted file mode 100644 index e468536..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitNoExpectationAnnotationFixer.php +++ /dev/null @@ -1,275 +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\Fixer\PhpUnit; - -use PhpCsFixer\DocBlock\Annotation; -use PhpCsFixer\DocBlock\DocBlock; -use PhpCsFixer\Fixer\AbstractPhpUnitFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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\WhitespacesAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * @author Dariusz Rumiński - */ -final class PhpUnitNoExpectationAnnotationFixer extends AbstractPhpUnitFixer implements ConfigurableFixerInterface, WhitespacesAwareFixerInterface -{ - /** - * @var bool - */ - private $fixMessageRegExp; - - /** - * {@inheritdoc} - */ - public function configure(array $configuration): void - { - parent::configure($configuration); - - $this->fixMessageRegExp = PhpUnitTargetVersion::fulfills($this->configuration['target'], PhpUnitTargetVersion::VERSION_4_3); - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Usages of `@expectedException*` annotations MUST be replaced by `->setExpectedException*` methods.', - [ - new CodeSample( - ' PhpUnitTargetVersion::VERSION_3_2] - ), - ], - null, - 'Risky when PHPUnit classes are overridden or not accessible, or when project has PHPUnit incompatibilities.' - ); - } - - /** - * {@inheritdoc} - * - * Must run before NoEmptyPhpdocFixer, PhpUnitExpectationFixer. - */ - public function getPriority(): int - { - return 10; - } - - /** - * {@inheritdoc} - */ - public function isRisky(): bool - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('target', 'Target version of PHPUnit.')) - ->setAllowedTypes(['string']) - ->setAllowedValues([PhpUnitTargetVersion::VERSION_3_2, PhpUnitTargetVersion::VERSION_4_3, PhpUnitTargetVersion::VERSION_NEWEST]) - ->setDefault(PhpUnitTargetVersion::VERSION_NEWEST) - ->getOption(), - (new FixerOptionBuilder('use_class_const', 'Use ::class notation.')) - ->setAllowedTypes(['bool']) - ->setDefault(true) - ->getOption(), - ]); - } - - /** - * {@inheritdoc} - */ - protected function applyPhpUnitClassFix(Tokens $tokens, int $startIndex, int $endIndex): void - { - $tokensAnalyzer = new TokensAnalyzer($tokens); - - for ($i = $endIndex - 1; $i > $startIndex; --$i) { - if (!$tokens[$i]->isGivenKind(T_FUNCTION) || $tokensAnalyzer->isLambda($i)) { - continue; - } - - $functionIndex = $i; - $docBlockIndex = $i; - - // ignore abstract functions - $braceIndex = $tokens->getNextTokenOfKind($functionIndex, [';', '{']); - if (!$tokens[$braceIndex]->equals('{')) { - continue; - } - - do { - $docBlockIndex = $tokens->getPrevNonWhitespace($docBlockIndex); - } while ($tokens[$docBlockIndex]->isGivenKind([T_PUBLIC, T_PROTECTED, T_PRIVATE, T_FINAL, T_ABSTRACT, T_COMMENT])); - - if (!$tokens[$docBlockIndex]->isGivenKind(T_DOC_COMMENT)) { - continue; - } - - $doc = new DocBlock($tokens[$docBlockIndex]->getContent()); - $annotations = []; - - foreach ($doc->getAnnotationsOfType([ - 'expectedException', - 'expectedExceptionCode', - 'expectedExceptionMessage', - 'expectedExceptionMessageRegExp', - ]) as $annotation) { - $tag = $annotation->getTag()->getName(); - $content = $this->extractContentFromAnnotation($annotation); - $annotations[$tag] = $content; - $annotation->remove(); - } - - if (!isset($annotations['expectedException'])) { - continue; - } - if (!$this->fixMessageRegExp && isset($annotations['expectedExceptionMessageRegExp'])) { - continue; - } - - $originalIndent = WhitespacesAnalyzer::detectIndent($tokens, $docBlockIndex); - - $paramList = $this->annotationsToParamList($annotations); - - $newMethodsCode = '' - .(isset($annotations['expectedExceptionMessageRegExp']) ? 'setExpectedExceptionRegExp' : 'setExpectedException') - .'(' - .implode(', ', $paramList) - .');'; - $newMethods = Tokens::fromCode($newMethodsCode); - $newMethods[0] = new Token([ - T_WHITESPACE, - $this->whitespacesConfig->getLineEnding().$originalIndent.$this->whitespacesConfig->getIndent(), - ]); - - // apply changes - $docContent = $doc->getContent(); - if ('' === $docContent) { - $docContent = '/** */'; - } - $tokens[$docBlockIndex] = new Token([T_DOC_COMMENT, $docContent]); - $tokens->insertAt($braceIndex + 1, $newMethods); - - $whitespaceIndex = $braceIndex + $newMethods->getSize() + 1; - $tokens[$whitespaceIndex] = new Token([ - T_WHITESPACE, - $this->whitespacesConfig->getLineEnding().$tokens[$whitespaceIndex]->getContent(), - ]); - - $i = $docBlockIndex; - } - } - - private function extractContentFromAnnotation(Annotation $annotation): string - { - $tag = $annotation->getTag()->getName(); - - if (1 !== Preg::match('/@'.$tag.'\s+(.+)$/s', $annotation->getContent(), $matches)) { - return ''; - } - - $content = Preg::replace('/\*+\/$/', '', $matches[1]); - - if (Preg::match('/\R/u', $content)) { - $content = Preg::replace('/\s*\R+\s*\*\s*/u', ' ', $content); - } - - return rtrim($content); - } - - private function annotationsToParamList(array $annotations): array - { - $params = []; - $exceptionClass = ltrim($annotations['expectedException'], '\\'); - if (false !== strpos($exceptionClass, '*')) { - $exceptionClass = substr($exceptionClass, 0, strpos($exceptionClass, '*')); - } - $exceptionClass = trim($exceptionClass); - - if ($this->configuration['use_class_const']) { - $params[] = "\\{$exceptionClass}::class"; - } else { - $params[] = "'{$exceptionClass}'"; - } - - if (isset($annotations['expectedExceptionMessage'])) { - $params[] = var_export($annotations['expectedExceptionMessage'], true); - } elseif (isset($annotations['expectedExceptionMessageRegExp'])) { - $params[] = var_export($annotations['expectedExceptionMessageRegExp'], true); - } elseif (isset($annotations['expectedExceptionCode'])) { - $params[] = 'null'; - } - - if (isset($annotations['expectedExceptionCode'])) { - $params[] = $annotations['expectedExceptionCode']; - } - - return $params; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitSetUpTearDownVisibilityFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitSetUpTearDownVisibilityFixer.php deleted file mode 100644 index 3db4a3e..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitSetUpTearDownVisibilityFixer.php +++ /dev/null @@ -1,117 +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\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; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * @author Gert de Pagter - */ -final class PhpUnitSetUpTearDownVisibilityFixer extends AbstractPhpUnitFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Changes the visibility of the `setUp()` and `tearDown()` functions of PHPUnit to `protected`, to match the PHPUnit TestCase.', - [ - new CodeSample( - 'hello = "hello"; - } - - public function tearDown() - { - $this->hello = null; - } -} -' - ), - ], - null, - 'This fixer may change functions named `setUp()` or `tearDown()` outside of PHPUnit tests, '. - 'when a class is wrongly seen as a PHPUnit test.' - ); - } - - /** - * {@inheritdoc} - */ - public function isRisky(): bool - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyPhpUnitClassFix(Tokens $tokens, int $startIndex, int $endIndex): void - { - $counter = 0; - $tokensAnalyzer = new TokensAnalyzer($tokens); - - for ($i = $endIndex - 1; $i > $startIndex; --$i) { - if (2 === $counter) { - break; // we've seen both method we are interested in, so stop analyzing this class - } - - if (!$this->isSetupOrTearDownMethod($tokens, $i)) { - continue; - } - - ++$counter; - $visibility = $tokensAnalyzer->getMethodAttributes($i)['visibility']; - - if (T_PUBLIC === $visibility) { - $index = $tokens->getPrevTokenOfKind($i, [[T_PUBLIC]]); - $tokens[$index] = new Token([T_PROTECTED, 'protected']); - - continue; - } - - if (null === $visibility) { - $tokens->insertAt($i, [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; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitSizeClassFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitSizeClassFixer.php deleted file mode 100644 index 04bf421..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitSizeClassFixer.php +++ /dev/null @@ -1,197 +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\Fixer\PhpUnit; - -use PhpCsFixer\DocBlock\Annotation; -use PhpCsFixer\DocBlock\DocBlock; -use PhpCsFixer\DocBlock\Line; -use PhpCsFixer\Fixer\AbstractPhpUnitFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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\Tokenizer\Analyzer\WhitespacesAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Jefersson Nathan - */ -final class PhpUnitSizeClassFixer extends AbstractPhpUnitFixer implements WhitespacesAwareFixerInterface, ConfigurableFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'All PHPUnit test cases should have `@small`, `@medium` or `@large` annotation to enable run time limits.', - [ - new CodeSample(" 'medium']), - ], - 'The special groups [small, medium, large] provides a way to identify tests that are taking long to be executed.' - ); - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('group', 'Define a specific group to be used in case no group is already in use')) - ->setAllowedValues(['small', 'medium', 'large']) - ->setDefault('small') - ->getOption(), - ]); - } - - /** - * {@inheritdoc} - */ - protected function applyPhpUnitClassFix(Tokens $tokens, int $startIndex, int $endIndex): void - { - $classIndex = $tokens->getPrevTokenOfKind($startIndex, [[T_CLASS]]); - - if ($this->isAbstractClass($tokens, $classIndex)) { - return; - } - - $docBlockIndex = $this->getDocBlockIndex($tokens, $classIndex); - - if ($this->isPHPDoc($tokens, $docBlockIndex)) { - $this->updateDocBlockIfNeeded($tokens, $docBlockIndex); - } else { - $this->createDocBlock($tokens, $docBlockIndex); - } - } - - private function isAbstractClass(Tokens $tokens, int $i): bool - { - $typeIndex = $tokens->getPrevMeaningfulToken($i); - - return $tokens[$typeIndex]->isGivenKind(T_ABSTRACT); - } - - private function createDocBlock(Tokens $tokens, int $docBlockIndex): void - { - $lineEnd = $this->whitespacesConfig->getLineEnding(); - $originalIndent = WhitespacesAnalyzer::detectIndent($tokens, $tokens->getNextNonWhitespace($docBlockIndex)); - $group = $this->configuration['group']; - $toInsert = [ - new Token([T_DOC_COMMENT, '/**'.$lineEnd."{$originalIndent} * @".$group.$lineEnd."{$originalIndent} */"]), - new Token([T_WHITESPACE, $lineEnd.$originalIndent]), - ]; - $index = $tokens->getNextMeaningfulToken($docBlockIndex); - $tokens->insertAt($index, $toInsert); - } - - private function updateDocBlockIfNeeded(Tokens $tokens, int $docBlockIndex): void - { - $doc = new DocBlock($tokens[$docBlockIndex]->getContent()); - if (!empty($this->filterDocBlock($doc))) { - return; - } - $doc = $this->makeDocBlockMultiLineIfNeeded($doc, $tokens, $docBlockIndex); - $lines = $this->addSizeAnnotation($doc, $tokens, $docBlockIndex); - $lines = implode('', $lines); - - $tokens[$docBlockIndex] = new Token([T_DOC_COMMENT, $lines]); - } - - /** - * @return Line[] - */ - private function addSizeAnnotation(DocBlock $docBlock, Tokens $tokens, int $docBlockIndex): array - { - $lines = $docBlock->getLines(); - $originalIndent = WhitespacesAnalyzer::detectIndent($tokens, $docBlockIndex); - $lineEnd = $this->whitespacesConfig->getLineEnding(); - $group = $this->configuration['group']; - array_splice($lines, -1, 0, $originalIndent.' *'.$lineEnd.$originalIndent.' * @'.$group.$lineEnd); - - return $lines; - } - - private function makeDocBlockMultiLineIfNeeded(DocBlock $doc, Tokens $tokens, int $docBlockIndex): DocBlock - { - $lines = $doc->getLines(); - if (1 === \count($lines) && empty($this->filterDocBlock($doc))) { - $lines = $this->splitUpDocBlock($lines, $tokens, $docBlockIndex); - - return new DocBlock(implode('', $lines)); - } - - return $doc; - } - - /** - * Take a one line doc block, and turn it into a multi line doc block. - * - * @param Line[] $lines - * - * @return Line[] - */ - private function splitUpDocBlock(array $lines, Tokens $tokens, int $docBlockIndex): array - { - $lineContent = $this->getSingleLineDocBlockEntry($lines[0]); - $lineEnd = $this->whitespacesConfig->getLineEnding(); - $originalIndent = WhitespacesAnalyzer::detectIndent($tokens, $tokens->getNextNonWhitespace($docBlockIndex)); - - return [ - new Line('/**'.$lineEnd), - new Line($originalIndent.' * '.$lineContent.$lineEnd), - new Line($originalIndent.' */'), - ]; - } - - /** - * @todo check whether it's doable to use \PhpCsFixer\DocBlock\DocBlock::getSingleLineDocBlockEntry instead - */ - private function getSingleLineDocBlockEntry(Line $line): string - { - $line = $line->getContent(); - $line = str_replace('*/', '', $line); - $line = trim($line); - $line = str_split($line); - $i = \count($line); - do { - --$i; - } while ('*' !== $line[$i] && '*' !== $line[$i - 1] && '/' !== $line[$i - 2]); - if (' ' === $line[$i]) { - ++$i; - } - $line = \array_slice($line, $i); - - return implode('', $line); - } - - /** - * @return Annotation[][] - */ - private function filterDocBlock(DocBlock $doc): array - { - return array_filter([ - $doc->getAnnotationsOfType('small'), - $doc->getAnnotationsOfType('large'), - $doc->getAnnotationsOfType('medium'), - ]); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitStrictFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitStrictFixer.php deleted file mode 100644 index 3449e92..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitStrictFixer.php +++ /dev/null @@ -1,150 +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\Fixer\PhpUnit; - -use PhpCsFixer\Fixer\AbstractPhpUnitFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -use PhpCsFixer\FixerConfiguration\AllowedValueSubset; -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\ArgumentsAnalyzer; -use PhpCsFixer\Tokenizer\Analyzer\FunctionsAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dariusz Rumiński - */ -final class PhpUnitStrictFixer extends AbstractPhpUnitFixer implements ConfigurableFixerInterface -{ - private static $assertionMap = [ - 'assertAttributeEquals' => 'assertAttributeSame', - 'assertAttributeNotEquals' => 'assertAttributeNotSame', - 'assertEquals' => 'assertSame', - 'assertNotEquals' => 'assertNotSame', - ]; - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'PHPUnit methods like `assertSame` should be used instead of `assertEquals`.', - [ - new CodeSample( - 'assertAttributeEquals(a(), b()); - $this->assertAttributeNotEquals(a(), b()); - $this->assertEquals(a(), b()); - $this->assertNotEquals(a(), b()); - } -} -' - ), - new CodeSample( - 'assertAttributeEquals(a(), b()); - $this->assertAttributeNotEquals(a(), b()); - $this->assertEquals(a(), b()); - $this->assertNotEquals(a(), b()); - } -} -', - ['assertions' => ['assertEquals']] - ), - ], - null, - 'Risky when any of the functions are overridden or when testing object equality.' - ); - } - - /** - * {@inheritdoc} - */ - public function isRisky(): bool - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyPhpUnitClassFix(Tokens $tokens, int $startIndex, int $endIndex): void - { - $argumentsAnalyzer = new ArgumentsAnalyzer(); - $functionsAnalyzer = new FunctionsAnalyzer(); - - foreach ($this->configuration['assertions'] as $methodBefore) { - $methodAfter = self::$assertionMap[$methodBefore]; - - for ($index = $startIndex; $index < $endIndex; ++$index) { - $methodIndex = $tokens->getNextTokenOfKind($index, [[T_STRING, $methodBefore]]); - - if (null === $methodIndex) { - break; - } - - if (!$functionsAnalyzer->isTheSameClassCall($tokens, $methodIndex)) { - continue; - } - - $openingParenthesisIndex = $tokens->getNextMeaningfulToken($methodIndex); - $argumentsCount = $argumentsAnalyzer->countArguments( - $tokens, - $openingParenthesisIndex, - $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $openingParenthesisIndex) - ); - - if (2 === $argumentsCount || 3 === $argumentsCount) { - $tokens[$methodIndex] = new Token([T_STRING, $methodAfter]); - } - - $index = $methodIndex; - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('assertions', 'List of assertion methods to fix.')) - ->setAllowedTypes(['array']) - ->setAllowedValues([new AllowedValueSubset(array_keys(self::$assertionMap))]) - ->setDefault([ - 'assertAttributeEquals', - 'assertAttributeNotEquals', - 'assertEquals', - 'assertNotEquals', - ]) - ->getOption(), - ]); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitTargetVersion.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitTargetVersion.php deleted file mode 100644 index c8122c6..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitTargetVersion.php +++ /dev/null @@ -1,58 +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\Fixer\PhpUnit; - -use Composer\Semver\Comparator; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -final class PhpUnitTargetVersion -{ - public const VERSION_3_0 = '3.0'; - public const VERSION_3_2 = '3.2'; - public const VERSION_3_5 = '3.5'; - public const VERSION_4_3 = '4.3'; - public const VERSION_4_8 = '4.8'; - public const VERSION_5_0 = '5.0'; - public const VERSION_5_2 = '5.2'; - public const VERSION_5_4 = '5.4'; - public const VERSION_5_5 = '5.5'; - public const VERSION_5_6 = '5.6'; - public const VERSION_5_7 = '5.7'; - public const VERSION_6_0 = '6.0'; - public const VERSION_7_5 = '7.5'; - public const VERSION_8_4 = '8.4'; - public const VERSION_NEWEST = 'newest'; - - 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)); - } - - if (self::VERSION_NEWEST === $candidate) { - return true; - } - - return Comparator::greaterThanOrEqualTo($candidate, $target); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitTestAnnotationFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitTestAnnotationFixer.php deleted file mode 100644 index e8d890c..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitTestAnnotationFixer.php +++ /dev/null @@ -1,416 +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\Fixer\PhpUnit; - -use PhpCsFixer\DocBlock\DocBlock; -use PhpCsFixer\DocBlock\Line; -use PhpCsFixer\Fixer\AbstractPhpUnitFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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\WhitespacesAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * @author Gert de Pagter - */ -final class PhpUnitTestAnnotationFixer extends AbstractPhpUnitFixer implements ConfigurableFixerInterface, WhitespacesAwareFixerInterface -{ - /** - * {@inheritdoc} - */ - public function isRisky(): bool - { - return true; - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - '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.' - ); - } - - /** - * {@inheritdoc} - * - * Must run before NoEmptyPhpdocFixer, PhpUnitMethodCasingFixer, PhpdocTrimFixer. - */ - public function getPriority(): int - { - return 10; - } - - /** - * {@inheritdoc} - */ - protected function applyPhpUnitClassFix(Tokens $tokens, int $startIndex, int $endIndex): void - { - if ('annotation' === $this->configuration['style']) { - $this->applyTestAnnotation($tokens, $startIndex, $endIndex); - } else { - $this->applyTestPrefix($tokens, $startIndex, $endIndex); - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('style', 'Whether to use the @test annotation or not.')) - ->setAllowedValues(['prefix', 'annotation']) - ->setDefault('prefix') - ->getOption(), - ]); - } - - private function applyTestAnnotation(Tokens $tokens, int $startIndex, int $endIndex): void - { - for ($i = $endIndex - 1; $i > $startIndex; --$i) { - if (!$this->isTestMethod($tokens, $i)) { - continue; - } - - $functionNameIndex = $tokens->getNextMeaningfulToken($i); - $functionName = $tokens[$functionNameIndex]->getContent(); - - if ($this->hasTestPrefix($functionName) && !$this->hasProperTestAnnotation($tokens, $i)) { - $newFunctionName = $this->removeTestPrefix($functionName); - $tokens[$functionNameIndex] = new Token([T_STRING, $newFunctionName]); - } - - $docBlockIndex = $this->getDocBlockIndex($tokens, $i); - - if ($this->isPHPDoc($tokens, $docBlockIndex)) { - $lines = $this->updateDocBlock($tokens, $docBlockIndex); - $lines = $this->addTestAnnotation($lines, $tokens, $docBlockIndex); - $lines = implode('', $lines); - - $tokens[$docBlockIndex] = new Token([T_DOC_COMMENT, $lines]); - } else { - // Create a new docblock if it didn't have one before; - $this->createDocBlock($tokens, $docBlockIndex); - } - } - } - - private function applyTestPrefix(Tokens $tokens, int $startIndex, int $endIndex): void - { - for ($i = $endIndex - 1; $i > $startIndex; --$i) { - // We explicitly check again if the function has a doc block to save some time. - if (!$this->isTestMethod($tokens, $i)) { - continue; - } - - $docBlockIndex = $this->getDocBlockIndex($tokens, $i); - - if (!$this->isPHPDoc($tokens, $docBlockIndex)) { - continue; - } - - $lines = $this->updateDocBlock($tokens, $docBlockIndex); - $lines = implode('', $lines); - $tokens[$docBlockIndex] = new Token([T_DOC_COMMENT, $lines]); - - $functionNameIndex = $tokens->getNextMeaningfulToken($i); - $functionName = $tokens[$functionNameIndex]->getContent(); - - if ($this->hasTestPrefix($functionName)) { - continue; - } - - $newFunctionName = $this->addTestPrefix($functionName); - $tokens[$functionNameIndex] = new Token([T_STRING, $newFunctionName]); - } - } - - /** - * @param int$index - */ - private function isTestMethod(Tokens $tokens, int $index): bool - { - // Check if we are dealing with a (non abstract, non lambda) function - if (!$this->isMethod($tokens, $index)) { - return false; - } - - // if the function name starts with test its a test - $functionNameIndex = $tokens->getNextMeaningfulToken($index); - $functionName = $tokens[$functionNameIndex]->getContent(); - - if ($this->hasTestPrefix($functionName)) { - return true; - } - - $docBlockIndex = $this->getDocBlockIndex($tokens, $index); - - // If the function doesn't have test in its name, and no doc block, its not a test - return - $this->isPHPDoc($tokens, $docBlockIndex) - && false !== strpos($tokens[$docBlockIndex]->getContent(), '@test') - ; - } - - private function isMethod(Tokens $tokens, int $index): bool - { - $tokensAnalyzer = new TokensAnalyzer($tokens); - - return $tokens[$index]->isGivenKind(T_FUNCTION) && !$tokensAnalyzer->isLambda($index); - } - - private function hasTestPrefix(string $functionName): bool - { - return 0 === strpos($functionName, 'test'); - } - - private function hasProperTestAnnotation(Tokens $tokens, int $index): bool - { - $docBlockIndex = $this->getDocBlockIndex($tokens, $index); - $doc = $tokens[$docBlockIndex]->getContent(); - - return 1 === Preg::match('/\*\s+@test\b/', $doc); - } - - private function removeTestPrefix(string $functionName): string - { - $remainder = Preg::replace('/^test(?=[A-Z_])_?/', '', $functionName); - - if ('' === $remainder) { - return $functionName; - } - - return lcfirst($remainder); - } - - private function addTestPrefix(string $functionName): string - { - return 'test'.ucfirst($functionName); - } - - private function createDocBlock(Tokens $tokens, int $docBlockIndex): void - { - $lineEnd = $this->whitespacesConfig->getLineEnding(); - $originalIndent = WhitespacesAnalyzer::detectIndent($tokens, $tokens->getNextNonWhitespace($docBlockIndex)); - $toInsert = [ - new Token([T_DOC_COMMENT, '/**'.$lineEnd."{$originalIndent} * @test".$lineEnd."{$originalIndent} */"]), - new Token([T_WHITESPACE, $lineEnd.$originalIndent]), - ]; - $index = $tokens->getNextMeaningfulToken($docBlockIndex); - $tokens->insertAt($index, $toInsert); - } - - /** - * @return Line[] - */ - private function updateDocBlock(Tokens $tokens, int $docBlockIndex): array - { - $doc = new DocBlock($tokens[$docBlockIndex]->getContent()); - $lines = $doc->getLines(); - - return $this->updateLines($lines, $tokens, $docBlockIndex); - } - - /** - * @param Line[] $lines - * - * @return Line[] - */ - private function updateLines(array $lines, Tokens $tokens, int $docBlockIndex): array - { - $needsAnnotation = 'annotation' === $this->configuration['style']; - - $doc = new DocBlock($tokens[$docBlockIndex]->getContent()); - for ($i = 0; $i < \count($lines); ++$i) { - // If we need to add test annotation and it is a single line comment we need to deal with that separately - if ($needsAnnotation && ($lines[$i]->isTheStart() && $lines[$i]->isTheEnd())) { - if (!$this->doesDocBlockContainTest($doc)) { - $lines = $this->splitUpDocBlock($lines, $tokens, $docBlockIndex); - - return $this->updateLines($lines, $tokens, $docBlockIndex); - } - // One we split it up, we run the function again, so we deal with other things in a proper way - } - - if (!$needsAnnotation - && false !== strpos($lines[$i]->getContent(), ' @test') - && false === strpos($lines[$i]->getContent(), '@testWith') - && false === strpos($lines[$i]->getContent(), '@testdox') - ) { - // We remove @test from the doc block - $lines[$i] = new Line(str_replace(' @test', '', $lines[$i]->getContent())); - } - // ignore the line if it isn't @depends - if (false === strpos($lines[$i]->getContent(), '@depends')) { - continue; - } - - $lines[$i] = $this->updateDependsAnnotation($lines[$i]); - } - - return $lines; - } - - /** - * Take a one line doc block, and turn it into a multi line doc block. - * - * @param Line[] $lines - * - * @return Line[] - */ - private function splitUpDocBlock(array $lines, Tokens $tokens, int $docBlockIndex): array - { - $lineContent = $this->getSingleLineDocBlockEntry($lines); - $lineEnd = $this->whitespacesConfig->getLineEnding(); - $originalIndent = WhitespacesAnalyzer::detectIndent($tokens, $tokens->getNextNonWhitespace($docBlockIndex)); - - return [ - new Line('/**'.$lineEnd), - new Line($originalIndent.' * '.$lineContent.$lineEnd), - new Line($originalIndent.' */'), - ]; - } - - /** - * @todo check whether it's doable to use \PhpCsFixer\DocBlock\DocBlock::getSingleLineDocBlockEntry instead - * - * @param Line[] $lines - */ - private function getSingleLineDocBlockEntry(array $lines): string - { - $line = $lines[0]; - $line = str_replace('*/', '', $line->getContent()); - $line = trim($line); - $line = str_split($line); - $i = \count($line); - do { - --$i; - } while ('*' !== $line[$i] && '*' !== $line[$i - 1] && '/' !== $line[$i - 2]); - if (' ' === $line[$i]) { - ++$i; - } - $line = \array_slice($line, $i); - - return implode('', $line); - } - - /** - * Updates the depends tag on the current doc block. - */ - private function updateDependsAnnotation(Line $line): Line - { - if ('annotation' === $this->configuration['style']) { - return $this->removeTestPrefixFromDependsAnnotation($line); - } - - return $this->addTestPrefixToDependsAnnotation($line); - } - - private function removeTestPrefixFromDependsAnnotation(Line $line): Line - { - $line = str_split($line->getContent()); - - $dependsIndex = $this->findWhereDependsFunctionNameStarts($line); - $dependsFunctionName = implode('', \array_slice($line, $dependsIndex)); - - if ($this->hasTestPrefix($dependsFunctionName)) { - $dependsFunctionName = $this->removeTestPrefix($dependsFunctionName); - } - array_splice($line, $dependsIndex); - - return new Line(implode('', $line).$dependsFunctionName); - } - - private function addTestPrefixToDependsAnnotation(Line $line): Line - { - $line = str_split($line->getContent()); - $dependsIndex = $this->findWhereDependsFunctionNameStarts($line); - $dependsFunctionName = implode('', \array_slice($line, $dependsIndex)); - - if (!$this->hasTestPrefix($dependsFunctionName)) { - $dependsFunctionName = $this->addTestPrefix($dependsFunctionName); - } - - array_splice($line, $dependsIndex); - - return new Line(implode('', $line).$dependsFunctionName); - } - - /** - * Helps to find where the function name in the doc block starts. - */ - private function findWhereDependsFunctionNameStarts(array $line): int - { - $counter = \count($line); - - do { - --$counter; - } while (' ' !== $line[$counter]); - - return $counter + 1; - } - - /** - * @param Line[] $lines - * - * @return Line[] - */ - private function addTestAnnotation(array $lines, Tokens $tokens, int $docBlockIndex): array - { - $doc = new DocBlock($tokens[$docBlockIndex]->getContent()); - - if (!$this->doesDocBlockContainTest($doc)) { - $originalIndent = WhitespacesAnalyzer::detectIndent($tokens, $docBlockIndex); - $lineEnd = $this->whitespacesConfig->getLineEnding(); - - array_splice($lines, -1, 0, $originalIndent.' *'.$lineEnd.$originalIndent.' * @test'.$lineEnd); - } - - return $lines; - } - - private function doesDocBlockContainTest(DocBlock $doc): bool - { - return !empty($doc->getAnnotationsOfType('test')); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitTestCaseStaticMethodCallsFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitTestCaseStaticMethodCallsFixer.php deleted file mode 100644 index 7eb05e0..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitTestCaseStaticMethodCallsFixer.php +++ /dev/null @@ -1,474 +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\Fixer\PhpUnit; - -use PhpCsFixer\Fixer\AbstractPhpUnitFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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\FunctionsAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; -use Symfony\Component\OptionsResolver\Exception\InvalidOptionsException; - -/** - * @author Filippo Tessarotto - */ -final class PhpUnitTestCaseStaticMethodCallsFixer extends AbstractPhpUnitFixer implements ConfigurableFixerInterface -{ - /** - * @internal - */ - public const CALL_TYPE_THIS = 'this'; - - /** - * @internal - */ - public const CALL_TYPE_SELF = 'self'; - - /** - * @internal - */ - public const CALL_TYPE_STATIC = 'static'; - - private $allowedValues = [ - self::CALL_TYPE_THIS => true, - self::CALL_TYPE_SELF => true, - self::CALL_TYPE_STATIC => true, - ]; - - private $staticMethods = [ - // Assert methods - 'anything' => true, - 'arrayHasKey' => true, - 'assertArrayHasKey' => true, - 'assertArrayNotHasKey' => true, - 'assertArraySubset' => true, - 'assertAttributeContains' => true, - 'assertAttributeContainsOnly' => true, - 'assertAttributeCount' => true, - 'assertAttributeEmpty' => true, - 'assertAttributeEquals' => true, - 'assertAttributeGreaterThan' => true, - 'assertAttributeGreaterThanOrEqual' => true, - 'assertAttributeInstanceOf' => true, - 'assertAttributeInternalType' => true, - 'assertAttributeLessThan' => true, - 'assertAttributeLessThanOrEqual' => true, - 'assertAttributeNotContains' => true, - 'assertAttributeNotContainsOnly' => true, - 'assertAttributeNotCount' => true, - 'assertAttributeNotEmpty' => true, - 'assertAttributeNotEquals' => true, - 'assertAttributeNotInstanceOf' => true, - 'assertAttributeNotInternalType' => true, - 'assertAttributeNotSame' => true, - 'assertAttributeSame' => true, - 'assertClassHasAttribute' => true, - 'assertClassHasStaticAttribute' => true, - 'assertClassNotHasAttribute' => true, - 'assertClassNotHasStaticAttribute' => true, - 'assertContains' => true, - 'assertContainsEquals' => true, - 'assertContainsOnly' => true, - 'assertContainsOnlyInstancesOf' => true, - 'assertCount' => true, - 'assertDirectoryDoesNotExist' => true, - 'assertDirectoryExists' => true, - 'assertDirectoryIsNotReadable' => true, - 'assertDirectoryIsNotWritable' => true, - 'assertDirectoryIsReadable' => true, - 'assertDirectoryIsWritable' => true, - 'assertDirectoryNotExists' => true, - 'assertDirectoryNotIsReadable' => true, - 'assertDirectoryNotIsWritable' => true, - 'assertDoesNotMatchRegularExpression' => true, - 'assertEmpty' => true, - 'assertEqualXMLStructure' => true, - 'assertEquals' => true, - 'assertEqualsCanonicalizing' => true, - 'assertEqualsIgnoringCase' => true, - 'assertEqualsWithDelta' => true, - 'assertFalse' => true, - 'assertFileDoesNotExist' => true, - 'assertFileEquals' => true, - 'assertFileEqualsCanonicalizing' => true, - 'assertFileEqualsIgnoringCase' => true, - 'assertFileExists' => true, - 'assertFileIsNotReadable' => true, - 'assertFileIsNotWritable' => true, - 'assertFileIsReadable' => true, - 'assertFileIsWritable' => true, - 'assertFileNotEquals' => true, - 'assertFileNotEqualsCanonicalizing' => true, - 'assertFileNotEqualsIgnoringCase' => true, - 'assertFileNotExists' => true, - 'assertFileNotIsReadable' => true, - 'assertFileNotIsWritable' => true, - 'assertFinite' => true, - 'assertGreaterThan' => true, - 'assertGreaterThanOrEqual' => true, - 'assertInfinite' => true, - 'assertInstanceOf' => true, - 'assertInternalType' => true, - 'assertIsArray' => true, - 'assertIsBool' => true, - 'assertIsCallable' => true, - 'assertIsClosedResource' => true, - 'assertIsFloat' => true, - 'assertIsInt' => true, - 'assertIsIterable' => true, - 'assertIsNotArray' => true, - 'assertIsNotBool' => true, - 'assertIsNotCallable' => true, - 'assertIsNotClosedResource' => true, - 'assertIsNotFloat' => true, - 'assertIsNotInt' => true, - 'assertIsNotIterable' => true, - 'assertIsNotNumeric' => true, - 'assertIsNotObject' => true, - 'assertIsNotReadable' => true, - 'assertIsNotResource' => true, - 'assertIsNotScalar' => true, - 'assertIsNotString' => true, - 'assertIsNotWritable' => true, - 'assertIsNumeric' => true, - 'assertIsObject' => true, - 'assertIsReadable' => true, - 'assertIsResource' => true, - 'assertIsScalar' => true, - 'assertIsString' => true, - 'assertIsWritable' => true, - 'assertJson' => true, - 'assertJsonFileEqualsJsonFile' => true, - 'assertJsonFileNotEqualsJsonFile' => true, - 'assertJsonStringEqualsJsonFile' => true, - 'assertJsonStringEqualsJsonString' => true, - 'assertJsonStringNotEqualsJsonFile' => true, - 'assertJsonStringNotEqualsJsonString' => true, - 'assertLessThan' => true, - 'assertLessThanOrEqual' => true, - 'assertMatchesRegularExpression' => true, - 'assertNan' => true, - 'assertNotContains' => true, - 'assertNotContainsEquals' => true, - 'assertNotContainsOnly' => true, - 'assertNotCount' => true, - 'assertNotEmpty' => true, - 'assertNotEquals' => true, - 'assertNotEqualsCanonicalizing' => true, - 'assertNotEqualsIgnoringCase' => true, - 'assertNotEqualsWithDelta' => true, - 'assertNotFalse' => true, - 'assertNotInstanceOf' => true, - 'assertNotInternalType' => true, - 'assertNotIsReadable' => true, - 'assertNotIsWritable' => true, - 'assertNotNull' => true, - 'assertNotRegExp' => true, - 'assertNotSame' => true, - 'assertNotSameSize' => true, - 'assertNotTrue' => true, - 'assertNull' => true, - 'assertObjectEquals' => true, - 'assertObjectHasAttribute' => true, - 'assertObjectNotHasAttribute' => true, - 'assertRegExp' => true, - 'assertSame' => true, - 'assertSameSize' => true, - 'assertStringContainsString' => true, - 'assertStringContainsStringIgnoringCase' => true, - 'assertStringEndsNotWith' => true, - 'assertStringEndsWith' => true, - 'assertStringEqualsFile' => true, - 'assertStringEqualsFileCanonicalizing' => true, - 'assertStringEqualsFileIgnoringCase' => true, - 'assertStringMatchesFormat' => true, - 'assertStringMatchesFormatFile' => true, - 'assertStringNotContainsString' => true, - 'assertStringNotContainsStringIgnoringCase' => true, - 'assertStringNotEqualsFile' => true, - 'assertStringNotEqualsFileCanonicalizing' => true, - 'assertStringNotEqualsFileIgnoringCase' => true, - 'assertStringNotMatchesFormat' => true, - 'assertStringNotMatchesFormatFile' => true, - 'assertStringStartsNotWith' => true, - 'assertStringStartsWith' => true, - 'assertThat' => true, - 'assertTrue' => true, - 'assertXmlFileEqualsXmlFile' => true, - 'assertXmlFileNotEqualsXmlFile' => true, - 'assertXmlStringEqualsXmlFile' => true, - 'assertXmlStringEqualsXmlString' => true, - 'assertXmlStringNotEqualsXmlFile' => true, - 'assertXmlStringNotEqualsXmlString' => true, - 'attribute' => true, - 'attributeEqualTo' => true, - 'callback' => true, - 'classHasAttribute' => true, - 'classHasStaticAttribute' => true, - 'contains' => true, - 'containsEqual' => true, - 'containsIdentical' => true, - 'containsOnly' => true, - 'containsOnlyInstancesOf' => true, - 'countOf' => true, - 'directoryExists' => true, - 'equalTo' => true, - 'equalToCanonicalizing' => true, - 'equalToIgnoringCase' => true, - 'equalToWithDelta' => true, - 'fail' => true, - 'fileExists' => true, - 'getCount' => true, - 'getObjectAttribute' => true, - 'getStaticAttribute' => true, - 'greaterThan' => true, - 'greaterThanOrEqual' => true, - 'identicalTo' => true, - 'isEmpty' => true, - 'isFalse' => true, - 'isFinite' => true, - 'isInfinite' => true, - 'isInstanceOf' => true, - 'isJson' => true, - 'isNan' => true, - 'isNull' => true, - 'isReadable' => true, - 'isTrue' => true, - 'isType' => true, - 'isWritable' => true, - 'lessThan' => true, - 'lessThanOrEqual' => true, - 'logicalAnd' => true, - 'logicalNot' => true, - 'logicalOr' => true, - 'logicalXor' => true, - 'markTestIncomplete' => true, - 'markTestSkipped' => true, - 'matches' => true, - 'matchesRegularExpression' => true, - 'objectEquals' => true, - 'objectHasAttribute' => true, - 'readAttribute' => true, - 'resetCount' => true, - 'stringContains' => true, - 'stringEndsWith' => true, - 'stringStartsWith' => true, - - // TestCase methods - 'any' => true, - 'at' => true, - 'atLeast' => true, - 'atLeastOnce' => true, - 'atMost' => true, - 'exactly' => true, - 'never' => true, - 'once' => true, - 'onConsecutiveCalls' => true, - 'returnArgument' => true, - 'returnCallback' => true, - 'returnSelf' => true, - 'returnValue' => true, - 'returnValueMap' => true, - 'setUpBeforeClass' => true, - 'tearDownAfterClass' => true, - 'throwException' => true, - ]; - - private $conversionMap = [ - self::CALL_TYPE_THIS => [[T_OBJECT_OPERATOR, '->'], [T_VARIABLE, '$this']], - self::CALL_TYPE_SELF => [[T_DOUBLE_COLON, '::'], [T_STRING, 'self']], - self::CALL_TYPE_STATIC => [[T_DOUBLE_COLON, '::'], [T_STATIC, 'static']], - ]; - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - $codeSample = 'assertSame(1, 2); - self::assertSame(1, 2); - static::assertSame(1, 2); - } -} -'; - - return new FixerDefinition( - 'Calls to `PHPUnit\Framework\TestCase` static methods must all be of the same type, either `$this->`, `self::` or `static::`.', - [ - new CodeSample($codeSample), - new CodeSample($codeSample, ['call_type' => self::CALL_TYPE_THIS]), - ], - null, - 'Risky when PHPUnit methods are overridden or not accessible, or when project has PHPUnit incompatibilities.' - ); - } - - /** - * {@inheritdoc} - * - * Must run before SelfStaticAccessorFixer. - */ - public function getPriority(): int - { - return 0; - } - - /** - * {@inheritdoc} - */ - public function isRisky(): bool - { - return true; - } - - /** - * {@inheritdoc} - */ - 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') - ->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) { - foreach ($option as $method => $value) { - if (!isset($thisFixer->staticMethods[$method])) { - throw new InvalidOptionsException( - sprintf( - 'Unexpected "methods" key, expected any of "%s", got "%s".', - implode('", "', array_keys($thisFixer->staticMethods)), - \gettype($method).'#'.$method - ) - ); - } - - if (!isset($thisFixer->allowedValues[$value])) { - throw new InvalidOptionsException( - sprintf( - 'Unexpected value for method "%s", expected any of "%s", got "%s".', - $method, - implode('", "', array_keys($thisFixer->allowedValues)), - \is_object($value) ? \get_class($value) : (null === $value ? 'null' : \gettype($value).'#'.$value) - ) - ); - } - } - - return true; - }]) - ->setDefault([]) - ->getOption(), - ]); - } - - /** - * {@inheritdoc} - */ - protected function applyPhpUnitClassFix(Tokens $tokens, int $startIndex, int $endIndex): void - { - $analyzer = new TokensAnalyzer($tokens); - - for ($index = $startIndex; $index < $endIndex; ++$index) { - // skip anonymous classes - if ($tokens[$index]->isGivenKind(T_CLASS)) { - $index = $this->findEndOfNextBlock($tokens, $index); - - continue; - } - - $callType = $this->configuration['call_type']; - - if ($tokens[$index]->isGivenKind(T_FUNCTION)) { - // skip lambda - if ($analyzer->isLambda($index)) { - $index = $this->findEndOfNextBlock($tokens, $index); - - continue; - } - - // do not change `self` to `this` in static methods - if ('this' === $callType) { - $attributes = $analyzer->getMethodAttributes($index); - if (false !== $attributes['static']) { - $index = $this->findEndOfNextBlock($tokens, $index); - - continue; - } - } - } - - if (!$tokens[$index]->isGivenKind(T_STRING) || !isset($this->staticMethods[$tokens[$index]->getContent()])) { - continue; - } - - $nextIndex = $tokens->getNextMeaningfulToken($index); - if (!$tokens[$nextIndex]->equals('(')) { - $index = $nextIndex; - - continue; - } - - $methodName = $tokens[$index]->getContent(); - - if (isset($this->configuration['methods'][$methodName])) { - $callType = $this->configuration['methods'][$methodName]; - } - - $operatorIndex = $tokens->getPrevMeaningfulToken($index); - $referenceIndex = $tokens->getPrevMeaningfulToken($operatorIndex); - if (!$this->needsConversion($tokens, $index, $referenceIndex, $callType)) { - continue; - } - - $tokens[$operatorIndex] = new Token($this->conversionMap[$callType][0]); - $tokens[$referenceIndex] = new Token($this->conversionMap[$callType][1]); - } - } - - private function needsConversion(Tokens $tokens, int $index, int $referenceIndex, string $callType): bool - { - $functionsAnalyzer = new FunctionsAnalyzer(); - - return $functionsAnalyzer->isTheSameClassCall($tokens, $index) - && !$tokens[$referenceIndex]->equals($this->conversionMap[$callType][1], false); - } - - private function findEndOfNextBlock(Tokens $tokens, int $index): int - { - $nextIndex = $tokens->getNextTokenOfKind($index, [';', '{']); - - return $tokens[$nextIndex]->equals('{') - ? $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $nextIndex) - : $nextIndex; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitTestClassRequiresCoversFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitTestClassRequiresCoversFixer.php deleted file mode 100644 index 4323a74..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitTestClassRequiresCoversFixer.php +++ /dev/null @@ -1,135 +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\Fixer\PhpUnit; - -use PhpCsFixer\DocBlock\DocBlock; -use PhpCsFixer\DocBlock\Line; -use PhpCsFixer\Fixer\AbstractPhpUnitFixer; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dariusz Rumiński - */ -final class PhpUnitTestClassRequiresCoversFixer extends AbstractPhpUnitFixer implements WhitespacesAwareFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Adds a default `@coversNothing` annotation to PHPUnit test classes that have no `@covers*` annotation.', - [ - new CodeSample( - 'assertSame(a(), b()); - } -} -' - ), - ] - ); - } - - /** - * {@inheritdoc} - */ - protected function applyPhpUnitClassFix(Tokens $tokens, int $startIndex, int $endIndex): void - { - $classIndex = $tokens->getPrevTokenOfKind($startIndex, [[T_CLASS]]); - $prevIndex = $tokens->getPrevMeaningfulToken($classIndex); - - // don't add `@covers` annotation for abstract base classes - if ($tokens[$prevIndex]->isGivenKind(T_ABSTRACT)) { - return; - } - - $index = $tokens[$prevIndex]->isGivenKind(T_FINAL) ? $prevIndex : $classIndex; - - $indent = $tokens[$index - 1]->isGivenKind(T_WHITESPACE) - ? Preg::replace('/^.*\R*/', '', $tokens[$index - 1]->getContent()) - : ''; - - $prevIndex = $tokens->getPrevNonWhitespace($index); - - if ($tokens[$prevIndex]->isGivenKind(T_DOC_COMMENT)) { - $docIndex = $prevIndex; - $docContent = $tokens[$docIndex]->getContent(); - - // ignore one-line phpdocs like `/** foo */`, as there is no place to put new annotations - if (false === strpos($docContent, "\n")) { - return; - } - - $doc = new DocBlock($docContent); - - // skip if already has annotation - if (!empty($doc->getAnnotationsOfType([ - 'covers', - 'coversDefaultClass', - 'coversNothing', - ]))) { - return; - } - } else { - $docIndex = $index; - $tokens->insertAt($docIndex, [ - new Token([T_DOC_COMMENT, sprintf('/**%s%s */', $this->whitespacesConfig->getLineEnding(), $indent)]), - new Token([T_WHITESPACE, sprintf('%s%s', $this->whitespacesConfig->getLineEnding(), $indent)]), - ]); - - if (!$tokens[$docIndex - 1]->isGivenKind(T_WHITESPACE)) { - $extraNewLines = $this->whitespacesConfig->getLineEnding(); - - if (!$tokens[$docIndex - 1]->isGivenKind(T_OPEN_TAG)) { - $extraNewLines .= $this->whitespacesConfig->getLineEnding(); - } - - $tokens->insertAt($docIndex, [ - new Token([T_WHITESPACE, $extraNewLines.$indent]), - ]); - ++$docIndex; - } - - $doc = new DocBlock($tokens[$docIndex]->getContent()); - } - - $lines = $doc->getLines(); - array_splice( - $lines, - \count($lines) - 1, - 0, - [ - new Line(sprintf( - '%s * @coversNothing%s', - $indent, - $this->whitespacesConfig->getLineEnding() - )), - ] - ); - - $tokens[$docIndex] = new Token([T_DOC_COMMENT, implode('', $lines)]); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/AlignMultilineCommentFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/AlignMultilineCommentFixer.php deleted file mode 100644 index e23fb5e..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/AlignMultilineCommentFixer.php +++ /dev/null @@ -1,179 +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\Fixer\Phpdoc; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Filippo Tessarotto - * @author Julien Falque - */ -final class AlignMultilineCommentFixer extends AbstractFixer implements ConfigurableFixerInterface, WhitespacesAwareFixerInterface -{ - /** - * @var null|int[] - */ - private $tokenKinds; - - /** - * {@inheritdoc} - */ - 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; - } - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Each line of multi-line DocComments must have an asterisk [PSR-5] and must be aligned with the first one.', - [ - new CodeSample( - ' 'phpdocs_like'] - ), - new CodeSample( - ' 'all_multiline'] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run before CommentToPhpdocFixer, GeneralPhpdocAnnotationRemoveFixer, GeneralPhpdocTagRenameFixer, NoBlankLinesAfterPhpdocFixer, NoEmptyPhpdocFixer, NoSuperfluousPhpdocTagsFixer, PhpdocAddMissingParamAnnotationFixer, PhpdocAlignFixer, PhpdocAnnotationWithoutDotFixer, PhpdocInlineTagNormalizerFixer, PhpdocLineSpanFixer, PhpdocNoAccessFixer, PhpdocNoAliasTagFixer, PhpdocNoEmptyReturnFixer, PhpdocNoPackageFixer, PhpdocNoUselessInheritdocFixer, PhpdocOrderByValueFixer, PhpdocOrderFixer, PhpdocReturnSelfReferenceFixer, PhpdocSeparationFixer, PhpdocSingleLineVarSpacingFixer, PhpdocSummaryFixer, PhpdocTagCasingFixer, PhpdocTagTypeFixer, PhpdocToParamTypeFixer, PhpdocToPropertyTypeFixer, PhpdocToReturnTypeFixer, PhpdocTrimConsecutiveBlankLineSeparationFixer, PhpdocTrimConsecutiveBlankLineSeparationFixer, PhpdocTrimFixer, PhpdocTypesOrderFixer, PhpdocVarAnnotationCorrectOrderFixer, PhpdocVarWithoutNameFixer. - * Must run after ArrayIndentationFixer. - */ - public function getPriority(): int - { - return 27; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isAnyTokenKindsFound($this->tokenKinds); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $lineEnding = $this->whitespacesConfig->getLineEnding(); - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind($this->tokenKinds)) { - continue; - } - - $whitespace = ''; - $previousIndex = $index - 1; - if ($tokens[$previousIndex]->isWhitespace()) { - $whitespace = $tokens[$previousIndex]->getContent(); - --$previousIndex; - } - if ($tokens[$previousIndex]->isGivenKind(T_OPEN_TAG)) { - $whitespace = Preg::replace('/\S/', '', $tokens[$previousIndex]->getContent()).$whitespace; - } - - if (1 !== Preg::match('/\R(\h*)$/', $whitespace, $matches)) { - continue; - } - - if ($token->isGivenKind(T_COMMENT) && 'all_multiline' !== $this->configuration['comment_type'] && 1 === Preg::match('/\R(?:\R|\s*[^\s\*])/', $token->getContent())) { - continue; - } - - $indentation = $matches[1]; - $lines = Preg::split('/\R/u', $token->getContent()); - - foreach ($lines as $lineNumber => $line) { - if (0 === $lineNumber) { - continue; - } - - $line = ltrim($line); - if ($token->isGivenKind(T_COMMENT) && (!isset($line[0]) || '*' !== $line[0])) { - continue; - } - - if (!isset($line[0])) { - $line = '*'; - } elseif ('*' !== $line[0]) { - $line = '* '.$line; - } - - $lines[$lineNumber] = $indentation.' '.$line; - } - - $tokens[$index] = new Token([$token->getId(), implode($lineEnding, $lines)]); - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('comment_type', 'Whether to fix PHPDoc comments only (`phpdocs_only`), any multi-line comment whose lines all start with an asterisk (`phpdocs_like`) or any multi-line comment (`all_multiline`).')) - ->setAllowedValues(['phpdocs_only', 'phpdocs_like', 'all_multiline']) - ->setDefault('phpdocs_only') - ->getOption(), - ]); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/GeneralPhpdocAnnotationRemoveFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/GeneralPhpdocAnnotationRemoveFixer.php deleted file mode 100644 index a72c09c..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/GeneralPhpdocAnnotationRemoveFixer.php +++ /dev/null @@ -1,134 +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\Fixer\Phpdoc; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\DocBlock\DocBlock; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Graham Campbell - * @author Dariusz Rumiński - */ -final class GeneralPhpdocAnnotationRemoveFixer extends AbstractFixer implements ConfigurableFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Configured annotations should be omitted from PHPDoc.', - [ - new CodeSample( - ' ['author']] - ), - new CodeSample( - ' ['package', 'subpackage']] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run before NoEmptyPhpdocFixer, PhpdocAlignFixer, PhpdocLineSpanFixer, PhpdocSeparationFixer, PhpdocTrimFixer. - * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, PhpdocIndentFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer. - */ - public function getPriority(): int - { - return 10; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isTokenKindFound(T_DOC_COMMENT); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - if (!\count($this->configuration['annotations'])) { - return; - } - - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind(T_DOC_COMMENT)) { - continue; - } - - $doc = new DocBlock($token->getContent()); - $annotations = $doc->getAnnotationsOfType($this->configuration['annotations']); - - // nothing to do if there are no annotations - if (empty($annotations)) { - continue; - } - - foreach ($annotations as $annotation) { - $annotation->remove(); - } - - if ('' === $doc->getContent()) { - $tokens->clearTokenAndMergeSurroundingWhitespace($index); - } else { - $tokens[$index] = new Token([T_DOC_COMMENT, $doc->getContent()]); - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('annotations', 'List of annotations to remove, e.g. `["author"]`.')) - ->setAllowedTypes(['array']) - ->setDefault([]) - ->getOption(), - ]); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/GeneralPhpdocTagRenameFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/GeneralPhpdocTagRenameFixer.php deleted file mode 100644 index e7253e4..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/GeneralPhpdocTagRenameFixer.php +++ /dev/null @@ -1,213 +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\Fixer\Phpdoc; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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; -use Symfony\Component\OptionsResolver\Exception\InvalidOptionsException; -use Symfony\Component\OptionsResolver\Options; - -final class GeneralPhpdocTagRenameFixer extends AbstractFixer implements ConfigurableFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Renames PHPDoc tags.', - [ - new CodeSample(" [ - 'inheritDocs' => 'inheritDoc', - ], - ]), - new CodeSample(" [ - 'inheritDocs' => 'inheritDoc', - ], - 'fix_annotation' => false, - ]), - new CodeSample(" [ - 'inheritDocs' => 'inheritDoc', - ], - 'fix_inline' => false, - ]), - new CodeSample(" [ - 'inheritDocs' => 'inheritDoc', - ], - 'case_sensitive' => true, - ]), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run before PhpdocAddMissingParamAnnotationFixer, PhpdocAlignFixer. - * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, PhpdocIndentFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer. - */ - public function getPriority(): int - { - // must be run before PhpdocAddMissingParamAnnotationFixer - return 11; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isTokenKindFound(T_DOC_COMMENT); - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('fix_annotation', 'Whether annotation tags should be fixed.')) - ->setAllowedTypes(['bool']) - ->setDefault(true) - ->getOption(), - (new FixerOptionBuilder('fix_inline', 'Whether inline tags should be fixed.')) - ->setAllowedTypes(['bool']) - ->setDefault(true) - ->getOption(), - (new FixerOptionBuilder('replacements', 'A map of tags to replace.')) - ->setAllowedTypes(['array']) - ->setNormalizer(function (Options $options, $value) { - $normalizedValue = []; - - foreach ($value as $from => $to) { - if (!\is_string($from)) { - 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 (1 !== Preg::match('#^\S+$#', $to) || false !== strpos($to, '*/')) { - throw new InvalidOptionsException(sprintf( - 'Tag "%s" cannot be replaced by invalid tag "%s".', - $from, - $to - )); - } - - $from = trim($from); - $to = trim($to); - - if (!$options['case_sensitive']) { - $lowercaseFrom = strtolower($from); - - if (isset($normalizedValue[$lowercaseFrom]) && $normalizedValue[$lowercaseFrom] !== $to) { - throw new InvalidOptionsException(sprintf( - 'Tag "%s" cannot be configured to be replaced with several different tags when case sensitivity is off.', - $from - )); - } - - $from = $lowercaseFrom; - } - - $normalizedValue[$from] = $to; - } - - foreach ($normalizedValue as $from => $to) { - if (isset($normalizedValue[$to]) && $normalizedValue[$to] !== $to) { - 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, - $normalizedValue[$to] - )); - } - } - - return $normalizedValue; - }) - ->setDefault([]) - ->getOption(), - (new FixerOptionBuilder('case_sensitive', 'Whether tags should be replaced only if they have exact same casing.')) - ->setAllowedTypes(['bool']) - ->setDefault(false) - ->getOption(), - ]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - if (!$this->configuration['replacements']) { - return; - } - - if ($this->configuration['fix_annotation']) { - if ($this->configuration['fix_inline']) { - $regex = '/"[^"]*"(*SKIP)(*FAIL)|\b(?<=@)(%s)\b/'; - } else { - $regex = '/"[^"]*"(*SKIP)(*FAIL)|(?configuration['case_sensitive']; - $replacements = $this->configuration['replacements']; - $regex = sprintf($regex, implode('|', array_keys($replacements))); - - if ($caseInsensitive) { - $regex .= 'i'; - } - - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind(T_DOC_COMMENT)) { - continue; - } - - $tokens[$index] = new Token([T_DOC_COMMENT, Preg::replaceCallback( - $regex, - function (array $matches) use ($caseInsensitive, $replacements) { - if ($caseInsensitive) { - $matches[1] = strtolower($matches[1]); - } - - return $replacements[$matches[1]]; - }, - $token->getContent() - )]); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/NoBlankLinesAfterPhpdocFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/NoBlankLinesAfterPhpdocFixer.php deleted file mode 100644 index 1d70039..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/NoBlankLinesAfterPhpdocFixer.php +++ /dev/null @@ -1,115 +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\Fixer\Phpdoc; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Graham Campbell - */ -final class NoBlankLinesAfterPhpdocFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isTokenKindFound(T_DOC_COMMENT); - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'There should not be blank lines between docblock and the documented element.', - [ - new CodeSample( - ' $token) { - if (!$token->isGivenKind(T_DOC_COMMENT)) { - continue; - } - // get the next non-whitespace token inc comments, provided - // that there is whitespace between it and the current token - $next = $tokens->getNextNonWhitespace($index); - if ($index + 2 === $next && false === $tokens[$next]->isGivenKind($forbiddenSuccessors)) { - $this->fixWhitespace($tokens, $index + 1); - } - } - } - - /** - * Cleanup a whitespace token. - */ - private function fixWhitespace(Tokens $tokens, int $index): void - { - $content = $tokens[$index]->getContent(); - // if there is more than one new line in the whitespace, then we need to fix it - if (substr_count($content, "\n") > 1) { - // the final bit of the whitespace must be the next statement's indentation - $tokens[$index] = new Token([T_WHITESPACE, substr($content, strrpos($content, "\n"))]); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/NoEmptyPhpdocFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/NoEmptyPhpdocFixer.php deleted file mode 100644 index 64154cd..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/NoEmptyPhpdocFixer.php +++ /dev/null @@ -1,74 +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\Fixer\Phpdoc; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author SpacePossum - */ -final class NoEmptyPhpdocFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'There should not be empty PHPDoc blocks.', - [new CodeSample("isTokenKindFound(T_DOC_COMMENT); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind(T_DOC_COMMENT)) { - continue; - } - - if (Preg::match('#^/\*\*[\s\*]*\*/$#', $token->getContent())) { - $tokens->clearTokenAndMergeSurroundingWhitespace($index); - } - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/NoSuperfluousPhpdocTagsFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/NoSuperfluousPhpdocTagsFixer.php deleted file mode 100644 index 00ab353..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/NoSuperfluousPhpdocTagsFixer.php +++ /dev/null @@ -1,486 +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\Fixer\Phpdoc; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\DocBlock\Annotation; -use PhpCsFixer\DocBlock\DocBlock; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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\Analyzer\NamespaceUsesAnalyzer; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -final class NoSuperfluousPhpdocTagsFixer extends AbstractFixer implements ConfigurableFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Removes `@param`, `@return` and `@var` tags that don\'t provide any useful information.', - [ - new CodeSample(' true]), - new VersionSpecificCodeSample(' true]), - new CodeSample(' true]), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run before NoEmptyPhpdocFixer, PhpdocAlignFixer, VoidReturnFixer. - * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, FullyQualifiedStrictTypesFixer, PhpdocAddMissingParamAnnotationFixer, PhpdocIndentFixer, PhpdocReturnSelfReferenceFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocToParamTypeFixer, PhpdocToPropertyTypeFixer, PhpdocToReturnTypeFixer, PhpdocTypesFixer. - */ - public function getPriority(): int - { - return 6; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isTokenKindFound(T_DOC_COMMENT); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $namespaceUseAnalyzer = new NamespaceUsesAnalyzer(); - - $shortNames = []; - foreach ($namespaceUseAnalyzer->getDeclarationsFromTokens($tokens) as $namespaceUseAnalysis) { - $shortNames[strtolower($namespaceUseAnalysis->getShortName())] = '\\'.strtolower($namespaceUseAnalysis->getFullName()); - } - - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind(T_DOC_COMMENT)) { - continue; - } - - $content = $initialContent = $token->getContent(); - - $documentedElementIndex = $this->findDocumentedElement($tokens, $index); - - if (null === $documentedElementIndex) { - continue; - } - - $token = $tokens[$documentedElementIndex]; - - if ($this->configuration['remove_inheritdoc']) { - $content = $this->removeSuperfluousInheritDoc($content); - } - - if ($token->isGivenKind(T_FUNCTION)) { - $content = $this->fixFunctionDocComment($content, $tokens, $index, $shortNames); - } elseif ($token->isGivenKind(T_VARIABLE)) { - $content = $this->fixPropertyDocComment($content, $tokens, $index, $shortNames); - } - - if ('' === $content) { - $content = '/** */'; - } - - if ($content !== $initialContent) { - $tokens[$index] = new Token([T_DOC_COMMENT, $content]); - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('allow_mixed', 'Whether type `mixed` without description is allowed (`true`) or considered superfluous (`false`)')) - ->setAllowedTypes(['bool']) - ->setDefault(false) - ->getOption(), - (new FixerOptionBuilder('remove_inheritdoc', 'Remove `@inheritDoc` tags')) - ->setAllowedTypes(['bool']) - ->setDefault(false) - ->getOption(), - (new FixerOptionBuilder('allow_unused_params', 'Whether `param` annotation without actual signature is allowed (`true`) or considered superfluous (`false`)')) - ->setAllowedTypes(['bool']) - ->setDefault(false) - ->getOption(), - ]); - } - - private function findDocumentedElement(Tokens $tokens, int $docCommentIndex): ?int - { - $index = $docCommentIndex; - - do { - $index = $tokens->getNextMeaningfulToken($index); - - if (null === $index || $tokens[$index]->isGivenKind([T_FUNCTION, T_CLASS, T_INTERFACE])) { - return $index; - } - } while ($tokens[$index]->isGivenKind([T_ABSTRACT, T_FINAL, T_STATIC, T_PRIVATE, T_PROTECTED, T_PUBLIC])); - - $index = $tokens->getNextMeaningfulToken($docCommentIndex); - - $kindsBeforeProperty = [T_STATIC, T_PRIVATE, T_PROTECTED, T_PUBLIC, CT::T_NULLABLE_TYPE, CT::T_ARRAY_TYPEHINT, T_STRING, T_NS_SEPARATOR]; - - if (!$tokens[$index]->isGivenKind($kindsBeforeProperty)) { - return null; - } - - do { - $index = $tokens->getNextMeaningfulToken($index); - - if ($tokens[$index]->isGivenKind(T_VARIABLE)) { - return $index; - } - } while ($tokens[$index]->isGivenKind($kindsBeforeProperty)); - - return null; - } - - private function fixFunctionDocComment(string $content, Tokens $tokens, int $functionIndex, array $shortNames): string - { - $docBlock = new DocBlock($content); - - $openingParenthesisIndex = $tokens->getNextTokenOfKind($functionIndex, ['(']); - $closingParenthesisIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $openingParenthesisIndex); - - $argumentsInfo = $this->getArgumentsInfo( - $tokens, - $openingParenthesisIndex + 1, - $closingParenthesisIndex - 1 - ); - - foreach ($docBlock->getAnnotationsOfType('param') as $annotation) { - $argumentName = $annotation->getVariableName(); - - if (null === $argumentName) { - continue; - } - - if (!isset($argumentsInfo[$argumentName]) && $this->configuration['allow_unused_params']) { - continue; - } - - if (!isset($argumentsInfo[$argumentName]) || $this->annotationIsSuperfluous($annotation, $argumentsInfo[$argumentName], $shortNames)) { - $annotation->remove(); - } - } - - $returnTypeInfo = $this->getReturnTypeInfo($tokens, $closingParenthesisIndex); - - foreach ($docBlock->getAnnotationsOfType('return') as $annotation) { - if ($this->annotationIsSuperfluous($annotation, $returnTypeInfo, $shortNames)) { - $annotation->remove(); - } - } - - return $docBlock->getContent(); - } - - /** - * @param int $index Index of the DocComment token - */ - private function fixPropertyDocComment(string $content, Tokens $tokens, int $index, array $shortNames): string - { - $docBlock = new DocBlock($content); - - do { - $index = $tokens->getNextMeaningfulToken($index); - } while ($tokens[$index]->isGivenKind([T_STATIC, T_PRIVATE, T_PROTECTED, T_PUBLIC])); - - $propertyTypeInfo = $this->getPropertyTypeInfo($tokens, $index); - - foreach ($docBlock->getAnnotationsOfType('var') as $annotation) { - if ($this->annotationIsSuperfluous($annotation, $propertyTypeInfo, $shortNames)) { - $annotation->remove(); - } - } - - return $docBlock->getContent(); - } - - /** - * @return array - */ - private function getArgumentsInfo(Tokens $tokens, int $start, int $end): array - { - $argumentsInfo = []; - - for ($index = $start; $index <= $end; ++$index) { - $token = $tokens[$index]; - - if (!$token->isGivenKind(T_VARIABLE)) { - continue; - } - - $beforeArgumentIndex = $tokens->getPrevTokenOfKind($index, ['(', ',']); - $typeIndex = $tokens->getNextMeaningfulToken($beforeArgumentIndex); - - if ($typeIndex !== $index) { - $info = $this->parseTypeHint($tokens, $typeIndex); - } else { - $info = [ - 'type' => null, - 'allows_null' => true, - ]; - } - - if (!$info['allows_null']) { - $nextIndex = $tokens->getNextMeaningfulToken($index); - if ( - $tokens[$nextIndex]->equals('=') - && $tokens[$tokens->getNextMeaningfulToken($nextIndex)]->equals([T_STRING, 'null']) - ) { - $info['allows_null'] = true; - } - } - - $argumentsInfo[$token->getContent()] = $info; - } - - return $argumentsInfo; - } - - private function getReturnTypeInfo(Tokens $tokens, int $closingParenthesisIndex): array - { - $colonIndex = $tokens->getNextMeaningfulToken($closingParenthesisIndex); - if ($tokens[$colonIndex]->isGivenKind(CT::T_TYPE_COLON)) { - return $this->parseTypeHint($tokens, $tokens->getNextMeaningfulToken($colonIndex)); - } - - return [ - 'type' => null, - 'allows_null' => true, - ]; - } - - /** - * @param int $index The index of the first token of the type hint - */ - private function getPropertyTypeInfo(Tokens $tokens, int $index): array - { - if ($tokens[$index]->isGivenKind(T_VARIABLE)) { - return [ - 'type' => null, - 'allows_null' => true, - ]; - } - - return $this->parseTypeHint($tokens, $index); - } - - /** - * @param int $index The index of the first token of the type hint - */ - private function parseTypeHint(Tokens $tokens, int $index): array - { - $allowsNull = false; - if ($tokens[$index]->isGivenKind(CT::T_NULLABLE_TYPE)) { - $allowsNull = true; - $index = $tokens->getNextMeaningfulToken($index); - } - - $type = ''; - while ($tokens[$index]->isGivenKind([T_NS_SEPARATOR, T_STATIC, T_STRING, CT::T_ARRAY_TYPEHINT, T_CALLABLE])) { - $type .= $tokens[$index]->getContent(); - - $index = $tokens->getNextMeaningfulToken($index); - } - - return [ - 'type' => '' === $type ? null : $type, - 'allows_null' => $allowsNull, - ]; - } - - /** - * @param array $symbolShortNames - */ - private function annotationIsSuperfluous(Annotation $annotation, array $info, array $symbolShortNames): bool - { - if ('param' === $annotation->getTag()->getName()) { - $regex = '/@param\s+(?:\S|\s(?!\$))++\s\$\S+\s+\S/'; - } elseif ('var' === $annotation->getTag()->getName()) { - $regex = '/@var\s+\S+(\s+\$\S+)?(\s+)(?!\*+\/)([^$\s]+)/'; - } else { - $regex = '/@return\s+\S+\s+\S/'; - } - - if (Preg::match($regex, $annotation->getContent())) { - return false; - } - - $annotationTypes = $this->toComparableNames($annotation->getTypes(), $symbolShortNames); - - if (['null'] === $annotationTypes) { - return false; - } - - if (['mixed'] === $annotationTypes && null === $info['type']) { - return !$this->configuration['allow_mixed']; - } - - $actualTypes = null === $info['type'] ? [] : [$info['type']]; - if ($info['allows_null']) { - $actualTypes[] = 'null'; - } - - return $annotationTypes === $this->toComparableNames($actualTypes, $symbolShortNames); - } - - /** - * Normalizes types to make them comparable. - * - * 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 array $symbolShortNames The imports aliases - * - * @return array The normalized types - */ - private function toComparableNames(array $types, array $symbolShortNames): array - { - $normalized = array_map( - static function (string $type) use ($symbolShortNames) { - $type = strtolower($type); - - if (isset($symbolShortNames[$type])) { - return $symbolShortNames[$type]; - } - - return $type; - }, - $types - ); - - sort($normalized); - - return $normalized; - } - - private function removeSuperfluousInheritDoc(string $docComment): string - { - return Preg::replace('~ - # $1: before @inheritDoc tag - ( - # beginning of comment or a PHPDoc tag - (?: - ^/\*\* - (?: - \R - [ \t]*(?:\*[ \t]*)? - )*? - | - @\N+ - ) - - # empty comment lines - (?: - \R - [ \t]*(?:\*[ \t]*?)? - )* - ) - - # spaces before @inheritDoc tag - [ \t]* - - # @inheritDoc tag - (?:@inheritDocs?|\{@inheritDocs?\}) - - # $2: after @inheritDoc tag - ( - # empty comment lines - (?: - \R - [ \t]*(?:\*[ \t]*)? - )* - - # a PHPDoc tag or end of comment - (?: - @\N+ - | - (?: - \R - [ \t]*(?:\*[ \t]*)? - )* - [ \t]*\*/$ - ) - ) - ~ix', '$1$2', $docComment); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocAddMissingParamAnnotationFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocAddMissingParamAnnotationFixer.php deleted file mode 100644 index 9c99630..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocAddMissingParamAnnotationFixer.php +++ /dev/null @@ -1,276 +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\Fixer\Phpdoc; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\DocBlock\DocBlock; -use PhpCsFixer\DocBlock\Line; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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\ArgumentsAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dariusz Rumiński - */ -final class PhpdocAddMissingParamAnnotationFixer extends AbstractFixer implements ConfigurableFixerInterface, WhitespacesAwareFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'PHPDoc should contain `@param` for all params.', - [ - new CodeSample( - ' true] - ), - new CodeSample( - ' false] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run before NoEmptyPhpdocFixer, NoSuperfluousPhpdocTagsFixer, PhpdocAlignFixer, PhpdocAlignFixer, PhpdocOrderFixer. - * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, GeneralPhpdocTagRenameFixer, PhpdocIndentFixer, PhpdocNoAliasTagFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer. - */ - public function getPriority(): int - { - return 10; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isTokenKindFound(T_DOC_COMMENT); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $argumentsAnalyzer = new ArgumentsAnalyzer(); - - for ($index = 0, $limit = $tokens->count(); $index < $limit; ++$index) { - $token = $tokens[$index]; - - if (!$token->isGivenKind(T_DOC_COMMENT)) { - continue; - } - - $tokenContent = $token->getContent(); - - if (false !== stripos($tokenContent, 'inheritdoc')) { - continue; - } - - // ignore one-line phpdocs like `/** foo */`, as there is no place to put new annotations - if (false === strpos($tokenContent, "\n")) { - continue; - } - - $mainIndex = $index; - $index = $tokens->getNextMeaningfulToken($index); - - if (null === $index) { - return; - } - - while ($tokens[$index]->isGivenKind([ - T_ABSTRACT, - T_FINAL, - T_PRIVATE, - T_PROTECTED, - T_PUBLIC, - T_STATIC, - T_VAR, - ])) { - $index = $tokens->getNextMeaningfulToken($index); - } - - if (!$tokens[$index]->isGivenKind(T_FUNCTION)) { - continue; - } - - $openIndex = $tokens->getNextTokenOfKind($index, ['(']); - $index = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $openIndex); - - $arguments = []; - - foreach ($argumentsAnalyzer->getArguments($tokens, $openIndex, $index) as $start => $end) { - $argumentInfo = $this->prepareArgumentInformation($tokens, $start, $end); - - if (!$this->configuration['only_untyped'] || '' === $argumentInfo['type']) { - $arguments[$argumentInfo['name']] = $argumentInfo; - } - } - - if (!\count($arguments)) { - continue; - } - - $doc = new DocBlock($tokenContent); - $lastParamLine = null; - - foreach ($doc->getAnnotationsOfType('param') as $annotation) { - $pregMatched = Preg::match('/^[^$]+(\$\w+).*$/s', $annotation->getContent(), $matches); - - if (1 === $pregMatched) { - unset($arguments[$matches[1]]); - } - - $lastParamLine = max($lastParamLine, $annotation->getEnd()); - } - - if (!\count($arguments)) { - continue; - } - - $lines = $doc->getLines(); - $linesCount = \count($lines); - - Preg::match('/^(\s*).*$/', $lines[$linesCount - 1]->getContent(), $matches); - $indent = $matches[1]; - - $newLines = []; - - foreach ($arguments as $argument) { - $type = $argument['type'] ?: 'mixed'; - - if ('?' !== $type[0] && 'null' === strtolower($argument['default'])) { - $type = 'null|'.$type; - } - - $newLines[] = new Line(sprintf( - '%s* @param %s %s%s', - $indent, - $type, - $argument['name'], - $this->whitespacesConfig->getLineEnding() - )); - } - - array_splice( - $lines, - $lastParamLine ? $lastParamLine + 1 : $linesCount - 1, - 0, - $newLines - ); - - $tokens[$mainIndex] = new Token([T_DOC_COMMENT, implode('', $lines)]); - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('only_untyped', 'Whether to add missing `@param` annotations for untyped parameters only.')) - ->setDefault(true) - ->setAllowedTypes(['bool']) - ->getOption(), - ]); - } - - private function prepareArgumentInformation(Tokens $tokens, int $start, int $end): array - { - $info = [ - 'default' => '', - 'name' => '', - 'type' => '', - ]; - - $sawName = false; - - for ($index = $start; $index <= $end; ++$index) { - $token = $tokens[$index]; - - if ($token->isComment() || $token->isWhitespace()) { - continue; - } - - if ($token->isGivenKind(T_VARIABLE)) { - $sawName = true; - $info['name'] = $token->getContent(); - - continue; - } - - if ($token->equals('=')) { - continue; - } - - if ($sawName) { - $info['default'] .= $token->getContent(); - } elseif ('&' !== $token->getContent()) { - if ($token->isGivenKind(T_ELLIPSIS)) { - if ('' === $info['type']) { - $info['type'] = 'array'; - } else { - $info['type'] .= '[]'; - } - } else { - $info['type'] .= $token->getContent(); - } - } - } - - return $info; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocAlignFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocAlignFixer.php deleted file mode 100644 index 2ed92d5..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocAlignFixer.php +++ /dev/null @@ -1,422 +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\Fixer\Phpdoc; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\DocBlock\DocBlock; -use PhpCsFixer\DocBlock\TypeExpression; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerConfiguration\AllowedValueSubset; -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 Fabien Potencier - * @author Jordi Boggiano - * @author Sebastiaan Stok - * @author Graham Campbell - * @author Dariusz Rumiński - */ -final class PhpdocAlignFixer extends AbstractFixer implements ConfigurableFixerInterface, WhitespacesAwareFixerInterface -{ - /** - * @internal - */ - public const ALIGN_LEFT = 'left'; - - /** - * @internal - */ - public const ALIGN_VERTICAL = 'vertical'; - - private const ALIGNABLE_TAGS = [ - 'param', - 'property', - 'property-read', - 'property-write', - 'return', - 'throws', - 'type', - 'var', - 'method', - ]; - - private const TAGS_WITH_NAME = [ - 'param', - 'property', - ]; - - private const TAGS_WITH_METHOD_SIGNATURE = [ - 'method', - ]; - - /** - * @var string - */ - private $regex; - - /** - * @var string - */ - private $regexCommentLine; - - /** - * @var string - */ - private $align; - - /** - * {@inheritdoc} - */ - 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); - $types = []; - - $indent = '(?P(?:\ {2}|\t)*)'; - - // 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+(?P[^\s(]+)|)\s+(?P.+\))'; - } - - // optional - $desc = '(?:\s+(?P\V*))'; - - $this->regex = '/^'.$indent.'\ \*\ @(?J)(?:'.implode('|', $types).')'.$desc.'\s*$/ux'; - $this->regexCommentLine = '/^'.$indent.' \*(?! @)(?:\s+(?P\V+))(?align = $this->configuration['align']; - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - $code = <<<'EOF' - self::ALIGN_VERTICAL]), - new CodeSample($code, ['align' => self::ALIGN_LEFT]), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, CommentToPhpdocFixer, GeneralPhpdocAnnotationRemoveFixer, GeneralPhpdocTagRenameFixer, NoBlankLinesAfterPhpdocFixer, NoEmptyPhpdocFixer, NoSuperfluousPhpdocTagsFixer, PhpdocAddMissingParamAnnotationFixer, PhpdocAddMissingParamAnnotationFixer, PhpdocAnnotationWithoutDotFixer, PhpdocIndentFixer, PhpdocIndentFixer, PhpdocInlineTagNormalizerFixer, PhpdocLineSpanFixer, PhpdocNoAccessFixer, PhpdocNoAliasTagFixer, PhpdocNoEmptyReturnFixer, PhpdocNoPackageFixer, PhpdocNoUselessInheritdocFixer, PhpdocOrderByValueFixer, PhpdocOrderFixer, PhpdocReturnSelfReferenceFixer, PhpdocScalarFixer, PhpdocScalarFixer, PhpdocSeparationFixer, PhpdocSingleLineVarSpacingFixer, PhpdocSummaryFixer, PhpdocTagCasingFixer, PhpdocTagTypeFixer, PhpdocToCommentFixer, PhpdocToCommentFixer, PhpdocToParamTypeFixer, PhpdocToPropertyTypeFixer, PhpdocToReturnTypeFixer, PhpdocTrimConsecutiveBlankLineSeparationFixer, PhpdocTrimFixer, PhpdocTypesFixer, PhpdocTypesFixer, PhpdocTypesOrderFixer, PhpdocVarAnnotationCorrectOrderFixer, PhpdocVarWithoutNameFixer. - */ - public function getPriority(): int - { - /* - * Should be run after all other docblock fixers. This because they - * modify other annotations to change their type and or separation - * which totally change the behavior of this fixer. It's important that - * annotations are of the correct type, and are grouped correctly - * before running this fixer. - */ - return -42; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isTokenKindFound(T_DOC_COMMENT); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind(T_DOC_COMMENT)) { - continue; - } - - $content = $token->getContent(); - $docBlock = new DocBlock($content); - $this->fixDocBlock($docBlock); - $newContent = $docBlock->getContent(); - if ($newContent !== $content) { - $tokens[$index] = new Token([T_DOC_COMMENT, $newContent]); - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - $tags = new FixerOptionBuilder('tags', 'The tags that should be aligned.'); - $tags - ->setAllowedTypes(['array']) - ->setAllowedValues([new AllowedValueSubset(self::ALIGNABLE_TAGS)]) - ->setDefault([ - 'method', - 'param', - 'property', - 'return', - 'throws', - 'type', - 'var', - ]) - ; - - $align = new FixerOptionBuilder('align', 'Align comments'); - $align - ->setAllowedTypes(['string']) - ->setAllowedValues([self::ALIGN_LEFT, self::ALIGN_VERTICAL]) - ->setDefault(self::ALIGN_VERTICAL) - ; - - return new FixerConfigurationResolver([$tags->getOption(), $align->getOption()]); - } - - private function fixDocBlock(DocBlock $docBlock): void - { - $lineEnding = $this->whitespacesConfig->getLineEnding(); - - for ($i = 0, $l = \count($docBlock->getLines()); $i < $l; ++$i) { - $items = []; - $matches = $this->getMatches($docBlock->getLine($i)->getContent()); - - if (null === $matches) { - continue; - } - - $current = $i; - $items[] = $matches; - - while (true) { - if (null === $docBlock->getLine(++$i)) { - break 2; - } - - $matches = $this->getMatches($docBlock->getLine($i)->getContent(), true); - if (null === $matches) { - break; - } - - $items[] = $matches; - } - - // compute the max length of the tag, hint and variables - $tagMax = 0; - $hintMax = 0; - $varMax = 0; - - foreach ($items as $item) { - if (null === $item['tag']) { - continue; - } - - $tagMax = max($tagMax, \strlen($item['tag'])); - $hintMax = max($hintMax, \strlen($item['hint'])); - $varMax = max($varMax, \strlen($item['var'])); - } - - $currTag = null; - - // update - foreach ($items as $j => $item) { - if (null === $item['tag']) { - if ('@' === $item['desc'][0]) { - $docBlock->getLine($current + $j)->setContent($item['indent'].' * '.$item['desc'].$lineEnding); - - continue; - } - - $extraIndent = 2; - - if (\in_array($currTag, self::TAGS_WITH_NAME, true) || \in_array($currTag, self::TAGS_WITH_METHOD_SIGNATURE, true)) { - $extraIndent = 3; - } - - $line = - $item['indent'] - .' * ' - .$this->getIndent( - $tagMax + $hintMax + $varMax + $extraIndent, - $this->getLeftAlignedDescriptionIndent($items, $j) - ) - .$item['desc'] - .$lineEnding; - - $docBlock->getLine($current + $j)->setContent($line); - - continue; - } - - $currTag = $item['tag']; - - $line = - $item['indent'] - .' * @' - .$item['tag'] - .$this->getIndent( - $tagMax - \strlen($item['tag']) + 1, - $item['hint'] ? 1 : 0 - ) - .$item['hint'] - ; - - if (!empty($item['var'])) { - $line .= - $this->getIndent(($hintMax ?: -1) - \strlen($item['hint']) + 1) - .$item['var'] - .( - !empty($item['desc']) - ? $this->getIndent($varMax - \strlen($item['var']) + 1).$item['desc'].$lineEnding - : $lineEnding - ) - ; - } elseif (!empty($item['desc'])) { - $line .= $this->getIndent($hintMax - \strlen($item['hint']) + 1).$item['desc'].$lineEnding; - } else { - $line .= $lineEnding; - } - - $docBlock->getLine($current + $j)->setContent($line); - } - } - } - - /** - * @return null|array - */ - private function getMatches(string $line, bool $matchCommentOnly = false): ?array - { - if (Preg::match($this->regex, $line, $matches)) { - if (!empty($matches['tag2'])) { - $matches['tag'] = $matches['tag2']; - $matches['hint'] = $matches['hint2']; - $matches['var'] = ''; - } - - if (!empty($matches['tag3'])) { - $matches['tag'] = $matches['tag3']; - $matches['hint'] = $matches['hint3']; - $matches['var'] = $matches['signature']; - } - - if (isset($matches['hint'])) { - $matches['hint'] = trim($matches['hint']); - } - - return $matches; - } - - if ($matchCommentOnly && Preg::match($this->regexCommentLine, $line, $matches)) { - $matches['tag'] = null; - $matches['var'] = ''; - $matches['hint'] = ''; - - return $matches; - } - - return null; - } - - private function getIndent(int $verticalAlignIndent, int $leftAlignIndent = 1): string - { - $indent = self::ALIGN_VERTICAL === $this->align ? $verticalAlignIndent : $leftAlignIndent; - - return str_repeat(' ', $indent); - } - - /** - * @param array[] $items - */ - private function getLeftAlignedDescriptionIndent(array $items, int $index): int - { - if (self::ALIGN_LEFT !== $this->align) { - return 0; - } - - // Find last tagged line: - $item = null; - for (; $index >= 0; --$index) { - $item = $items[$index]; - if (null !== $item['tag']) { - break; - } - } - - // No last tag found — no indent: - if (null === $item) { - return 0; - } - - // Indent according to existing values: - return - $this->getSentenceIndent($item['tag']) + - $this->getSentenceIndent($item['hint']) + - $this->getSentenceIndent($item['var']); - } - - /** - * Get indent for sentence. - */ - private function getSentenceIndent(?string $sentence): int - { - if (null === $sentence) { - return 0; - } - - $length = \strlen($sentence); - - return 0 === $length ? 0 : $length + 1; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocAnnotationWithoutDotFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocAnnotationWithoutDotFixer.php deleted file mode 100644 index eadade3..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocAnnotationWithoutDotFixer.php +++ /dev/null @@ -1,138 +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\Fixer\Phpdoc; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\DocBlock\DocBlock; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dariusz Rumiński - */ -final class PhpdocAnnotationWithoutDotFixer extends AbstractFixer -{ - /** - * @var string[] - */ - private $tags = ['throws', 'return', 'param', 'internal', 'deprecated', 'var', 'type']; - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'PHPDoc annotation descriptions should not be a sentence.', - [new CodeSample('isTokenKindFound(T_DOC_COMMENT); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind(T_DOC_COMMENT)) { - continue; - } - - $doc = new DocBlock($token->getContent()); - $annotations = $doc->getAnnotations(); - - if (empty($annotations)) { - continue; - } - - foreach ($annotations as $annotation) { - if ( - !$annotation->getTag()->valid() || !\in_array($annotation->getTag()->getName(), $this->tags, true) - ) { - continue; - } - - $lineAfterAnnotation = $doc->getLine($annotation->getEnd() + 1); - if (null !== $lineAfterAnnotation) { - $lineAfterAnnotationTrimmed = ltrim($lineAfterAnnotation->getContent()); - if ('' === $lineAfterAnnotationTrimmed || '*' !== $lineAfterAnnotationTrimmed[0]) { - // malformed PHPDoc, missing asterisk ! - continue; - } - } - - $content = $annotation->getContent(); - - if ( - 1 !== Preg::match('/[.。]\h*$/u', $content) - || 0 !== Preg::match('/[.。](?!\h*$)/u', $content, $matches) - ) { - continue; - } - - $endLine = $doc->getLine($annotation->getEnd()); - $endLine->setContent(Preg::replace('/(?getContent())); - - $startLine = $doc->getLine($annotation->getStart()); - $optionalTypeRegEx = $annotation->supportTypes() - ? sprintf('(?:%s\s+(?:\$\w+\s+)?)?', preg_quote(implode('|', $annotation->getTypes()), '/')) - : ''; - $content = Preg::replaceCallback( - '/^(\s*\*\s*@\w+\s+'.$optionalTypeRegEx.')(\p{Lu}?(?=\p{Ll}|\p{Zs}))(.*)$/', - static function (array $matches) { - if (\function_exists('mb_strtolower')) { - return $matches[1].mb_strtolower($matches[2]).$matches[3]; - } - - return $matches[1].strtolower($matches[2]).$matches[3]; - }, - $startLine->getContent(), - 1 - ); - $startLine->setContent($content); - } - - $tokens[$index] = new Token([T_DOC_COMMENT, $doc->getContent()]); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocIndentFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocIndentFixer.php deleted file mode 100644 index 2ccf3f4..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocIndentFixer.php +++ /dev/null @@ -1,142 +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\Fixer\Phpdoc; - -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; -use PhpCsFixer\Utils; - -/** - * @author Ceeram - * @author Graham Campbell - */ -final class PhpdocIndentFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Docblocks should have the same indentation as the documented subject.', - [new CodeSample('isTokenKindFound(T_DOC_COMMENT); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind(T_DOC_COMMENT)) { - continue; - } - - $nextIndex = $tokens->getNextMeaningfulToken($index); - - // skip if there is no next token or if next token is block end `}` - if (null === $nextIndex || $tokens[$nextIndex]->equals('}')) { - continue; - } - - $prevIndex = $index - 1; - $prevToken = $tokens[$prevIndex]; - - // ignore inline docblocks - if ( - $prevToken->isGivenKind(T_OPEN_TAG) - || ($prevToken->isWhitespace(" \t") && !$tokens[$index - 2]->isGivenKind(T_OPEN_TAG)) - || $prevToken->equalsAny([';', ',', '{', '(']) - ) { - continue; - } - - $indent = ''; - if ($tokens[$nextIndex - 1]->isWhitespace()) { - $indent = Utils::calculateTrailingWhitespaceIndent($tokens[$nextIndex - 1]); - } - - $newPrevContent = $this->fixWhitespaceBeforeDocblock($prevToken->getContent(), $indent); - if ($newPrevContent) { - if ($prevToken->isArray()) { - $tokens[$prevIndex] = new Token([$prevToken->getId(), $newPrevContent]); - } else { - $tokens[$prevIndex] = new Token($newPrevContent); - } - } else { - $tokens->clearAt($prevIndex); - } - - $tokens[$index] = new Token([T_DOC_COMMENT, $this->fixDocBlock($token->getContent(), $indent)]); - } - } - - /** - * Fix indentation of Docblock. - * - * @param string $content Docblock contents - * @param string $indent Indentation to apply - * - * @return string Dockblock contents including correct indentation - */ - private function fixDocBlock(string $content, string $indent): string - { - return ltrim(Preg::replace('/^\h*\*/m', $indent.' *', $content)); - } - - /** - * @param string $content Whitespace before Docblock - * @param string $indent Indentation of the documented subject - * - * @return string Whitespace including correct indentation for Dockblock after this whitespace - */ - private function fixWhitespaceBeforeDocblock(string $content, string $indent): string - { - return rtrim($content, " \t").$indent; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocInlineTagNormalizerFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocInlineTagNormalizerFixer.php deleted file mode 100644 index 2da4229..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocInlineTagNormalizerFixer.php +++ /dev/null @@ -1,124 +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\Fixer\Phpdoc; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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 SpacePossum - */ -final class PhpdocInlineTagNormalizerFixer extends AbstractFixer implements ConfigurableFixerInterface -{ - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isTokenKindFound(T_DOC_COMMENT); - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Fixes PHPDoc inline tags.', - [ - new CodeSample( - " ['TUTORIAL']] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run before PhpdocAlignFixer. - * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, PhpdocIndentFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer. - */ - public function getPriority(): int - { - return 0; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - if (!$this->configuration['tags']) { - return; - } - - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind(T_DOC_COMMENT)) { - continue; - } - - // Move `@` inside tag, for example @{tag} -> {@tag}, replace multiple curly brackets, - // 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( - '#(?:@{+|{+\h*@)\h*(%s)s?([^}]*)(?:}+)#i', - implode('|', array_map(function ($tag) { - return preg_quote($tag, '/'); - }, $this->configuration['tags'])) - ), - function (array $matches) { - $doc = trim($matches[2]); - - if ('' === $doc) { - return '{@'.$matches[1].'}'; - } - - return '{@'.$matches[1].' '.$doc.'}'; - }, - $token->getContent() - ); - - $tokens[$index] = new Token([T_DOC_COMMENT, $content]); - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('tags', 'The list of tags to normalize')) - ->setAllowedTypes(['array']) - ->setDefault(['example', 'id', 'internal', 'inheritdoc', 'inheritdocs', 'link', 'source', 'toc', 'tutorial']) - ->getOption(), - ]); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocLineSpanFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocLineSpanFixer.php deleted file mode 100644 index 3fbf0ec..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocLineSpanFixer.php +++ /dev/null @@ -1,148 +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\Fixer\Phpdoc; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\DocBlock\DocBlock; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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\Tokenizer\Analyzer\WhitespacesAnalyzer; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * @author Gert de Pagter - */ -final class PhpdocLineSpanFixer extends AbstractFixer implements WhitespacesAwareFixerInterface, ConfigurableFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Changes doc blocks from single to multi line, or reversed. Works for class constants, properties and methods only.', - [ - new CodeSample(" 'single'] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run before PhpdocAlignFixer. - * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, GeneralPhpdocAnnotationRemoveFixer, PhpdocIndentFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer. - */ - public function getPriority(): int - { - return 0; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isTokenKindFound(T_DOC_COMMENT); - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('const', 'Whether const blocks should be single or multi line')) - ->setAllowedValues(['single', 'multi']) - ->setDefault('multi') - ->getOption(), - (new FixerOptionBuilder('property', 'Whether property doc blocks should be single or multi line')) - ->setAllowedValues(['single', 'multi']) - ->setDefault('multi') - ->getOption(), - (new FixerOptionBuilder('method', 'Whether method doc blocks should be single or multi line')) - ->setAllowedValues(['single', 'multi']) - ->setDefault('multi') - ->getOption(), - ]); - } - - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $analyzer = new TokensAnalyzer($tokens); - - $elements = $analyzer->getClassyElements(); - - foreach ($elements as $index => $element) { - if (!$this->hasDocBlock($tokens, $index)) { - continue; - } - - $type = $element['type']; - $docIndex = $this->getDocBlockIndex($tokens, $index); - $doc = new DocBlock($tokens[$docIndex]->getContent()); - - if ('multi' === $this->configuration[$type]) { - $doc->makeMultiLine($originalIndent = WhitespacesAnalyzer::detectIndent($tokens, $docIndex), $this->whitespacesConfig->getLineEnding()); - } else { - $doc->makeSingleLine(); - } - - $tokens->offsetSet($docIndex, new Token([T_DOC_COMMENT, $doc->getContent()])); - } - } - - private function hasDocBlock(Tokens $tokens, int $index): bool - { - $docBlockIndex = $this->getDocBlockIndex($tokens, $index); - - return $tokens[$docBlockIndex]->isGivenKind(T_DOC_COMMENT); - } - - private function getDocBlockIndex(Tokens $tokens, int $index): int - { - do { - $index = $tokens->getPrevNonWhitespace($index); - } while ($tokens[$index]->isGivenKind([ - T_PUBLIC, - T_PROTECTED, - T_PRIVATE, - T_FINAL, - T_ABSTRACT, - T_COMMENT, - T_VAR, - T_STATIC, - T_STRING, - T_NS_SEPARATOR, - CT::T_ARRAY_TYPEHINT, - CT::T_NULLABLE_TYPE, - ])); - - return $index; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoAccessFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoAccessFixer.php deleted file mode 100644 index 439f0d5..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoAccessFixer.php +++ /dev/null @@ -1,73 +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\Fixer\Phpdoc; - -use PhpCsFixer\AbstractProxyFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; - -/** - * @author Graham Campbell - * @author Dariusz Rumiński - */ -final class PhpdocNoAccessFixer extends AbstractProxyFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - '`@access` annotations should be omitted from PHPDoc.', - [ - new CodeSample( - 'configure(['annotations' => ['access']]); - - return [$fixer]; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoAliasTagFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoAliasTagFixer.php deleted file mode 100644 index 95ade7c..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoAliasTagFixer.php +++ /dev/null @@ -1,136 +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\Fixer\Phpdoc; - -use PhpCsFixer\AbstractProxyFixer; -use PhpCsFixer\ConfigurationException\InvalidConfigurationException; -use PhpCsFixer\ConfigurationException\InvalidFixerConfigurationException; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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; - -/** - * Case sensitive tag replace fixer (does not process inline tags like {@inheritdoc}). - * - * @author Graham Campbell - * @author Dariusz Rumiński - * @author SpacePossum - */ -final class PhpdocNoAliasTagFixer extends AbstractProxyFixer implements ConfigurableFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'No alias PHPDoc tags should be used.', - [ - new CodeSample( - ' ['link' => 'website']] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run before PhpdocAddMissingParamAnnotationFixer, PhpdocAlignFixer, PhpdocSingleLineVarSpacingFixer. - * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, PhpdocIndentFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer. - */ - public function getPriority(): int - { - return parent::getPriority(); - } - - public function configure(array $configuration): void - { - parent::configure($configuration); - - /** @var GeneralPhpdocTagRenameFixer $generalPhpdocTagRenameFixer */ - $generalPhpdocTagRenameFixer = $this->proxyFixers['general_phpdoc_tag_rename']; - - try { - $generalPhpdocTagRenameFixer->configure([ - 'fix_annotation' => true, - 'fix_inline' => false, - 'replacements' => $this->configuration['replacements'], - 'case_sensitive' => true, - ]); - } catch (InvalidConfigurationException $exception) { - throw new InvalidFixerConfigurationException( - $this->getName(), - Preg::replace('/^\[.+?\] /', '', $exception->getMessage()), - $exception - ); - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('replacements', 'Mapping between replaced annotations with new ones.')) - ->setAllowedTypes(['array']) - ->setDefault([ - 'property-read' => 'property', - 'property-write' => 'property', - 'type' => 'var', - 'link' => 'see', - ]) - ->getOption(), - ]); - } - - /** - * {@inheritdoc} - */ - protected function createProxyFixers(): array - { - return [new GeneralPhpdocTagRenameFixer()]; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoEmptyReturnFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoEmptyReturnFixer.php deleted file mode 100644 index f2cd3f9..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoEmptyReturnFixer.php +++ /dev/null @@ -1,126 +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\Fixer\Phpdoc; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\DocBlock\Annotation; -use PhpCsFixer\DocBlock\DocBlock; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Graham Campbell - */ -final class PhpdocNoEmptyReturnFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isTokenKindFound(T_DOC_COMMENT); - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - '`@return void` and `@return null` annotations should be omitted from PHPDoc.', - [ - new CodeSample( - ' $token) { - if (!$token->isGivenKind(T_DOC_COMMENT)) { - continue; - } - - $doc = new DocBlock($token->getContent()); - $annotations = $doc->getAnnotationsOfType('return'); - - if (empty($annotations)) { - continue; - } - - foreach ($annotations as $annotation) { - $this->fixAnnotation($doc, $annotation); - } - - $newContent = $doc->getContent(); - - if ($newContent === $token->getContent()) { - continue; - } - - if ('' === $newContent) { - $tokens->clearTokenAndMergeSurroundingWhitespace($index); - - continue; - } - - $tokens[$index] = new Token([T_DOC_COMMENT, $doc->getContent()]); - } - } - - /** - * Remove return void or return null annotations.. - */ - private function fixAnnotation(DocBlock $doc, Annotation $annotation): void - { - $types = $annotation->getNormalizedTypes(); - - if (1 === \count($types) && ('null' === $types[0] || 'void' === $types[0])) { - $annotation->remove(); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoPackageFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoPackageFixer.php deleted file mode 100644 index 6b009a0..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoPackageFixer.php +++ /dev/null @@ -1,73 +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\Fixer\Phpdoc; - -use PhpCsFixer\AbstractProxyFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; - -/** - * @author Graham Campbell - * @author Dariusz Rumiński - */ -final class PhpdocNoPackageFixer extends AbstractProxyFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - '`@package` and `@subpackage` annotations should be omitted from PHPDoc.', - [ - new CodeSample( - 'configure(['annotations' => ['package', 'subpackage']]); - - return [$fixer]; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoUselessInheritdocFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoUselessInheritdocFixer.php deleted file mode 100644 index 17ac23b..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoUselessInheritdocFixer.php +++ /dev/null @@ -1,164 +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\Fixer\Phpdoc; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Remove inheritdoc tags from classy that does not inherit. - * - * @author SpacePossum - */ -final class PhpdocNoUselessInheritdocFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Classy that does not inherit must not have `@inheritdoc` tags.', - [ - new CodeSample("isTokenKindFound(T_DOC_COMMENT) && $tokens->isAnyTokenKindsFound([T_CLASS, T_INTERFACE]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - // min. offset 4 as minimal candidate is @: isGivenKind([T_CLASS, T_INTERFACE])) { - $index = $this->fixClassy($tokens, $index); - } - } - } - - private function fixClassy(Tokens $tokens, int $index): int - { - // figure out where the classy starts - $classOpenIndex = $tokens->getNextTokenOfKind($index, ['{']); - - // figure out where the classy ends - $classEndIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $classOpenIndex); - - // is classy extending or implementing some interface - $extendingOrImplementing = $this->isExtendingOrImplementing($tokens, $index, $classOpenIndex); - - if (!$extendingOrImplementing) { - // PHPDoc of classy should not have inherit tag even when using traits as Traits cannot provide this information - $this->fixClassyOutside($tokens, $index); - } - - // figure out if the classy uses a trait - if (!$extendingOrImplementing && $this->isUsingTrait($tokens, $index, $classOpenIndex, $classEndIndex)) { - $extendingOrImplementing = true; - } - - $this->fixClassyInside($tokens, $classOpenIndex, $classEndIndex, !$extendingOrImplementing); - - return $classEndIndex; - } - - private function fixClassyInside(Tokens $tokens, int $classOpenIndex, int $classEndIndex, bool $fixThisLevel): void - { - for ($i = $classOpenIndex; $i < $classEndIndex; ++$i) { - if ($tokens[$i]->isGivenKind(T_CLASS)) { - $i = $this->fixClassy($tokens, $i); - } elseif ($fixThisLevel && $tokens[$i]->isGivenKind(T_DOC_COMMENT)) { - $this->fixToken($tokens, $i); - } - } - } - - private function fixClassyOutside(Tokens $tokens, int $classIndex): void - { - $previousIndex = $tokens->getPrevNonWhitespace($classIndex); - if ($tokens[$previousIndex]->isGivenKind(T_DOC_COMMENT)) { - $this->fixToken($tokens, $previousIndex); - } - } - - private function fixToken(Tokens $tokens, int $tokenIndex): void - { - $count = 0; - $content = Preg::replaceCallback( - '#(\h*(?:@{*|{*\h*@)\h*inheritdoc\h*)([^}]*)((?:}*)\h*)#i', - static function (array $matches) { - return ' '.$matches[2]; - }, - $tokens[$tokenIndex]->getContent(), - -1, - $count - ); - - if ($count) { - $tokens[$tokenIndex] = new Token([T_DOC_COMMENT, $content]); - } - } - - private function isExtendingOrImplementing(Tokens $tokens, int $classIndex, int $classOpenIndex): bool - { - for ($index = $classIndex; $index < $classOpenIndex; ++$index) { - if ($tokens[$index]->isGivenKind([T_EXTENDS, T_IMPLEMENTS])) { - return true; - } - } - - return false; - } - - private function isUsingTrait(Tokens $tokens, int $classIndex, int $classOpenIndex, int $classCloseIndex): bool - { - if ($tokens[$classIndex]->isGivenKind(T_INTERFACE)) { - // cannot use Trait inside an interface - return false; - } - - $useIndex = $tokens->getNextTokenOfKind($classOpenIndex, [[CT::T_USE_TRAIT]]); - - return null !== $useIndex && $useIndex < $classCloseIndex; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocOrderByValueFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocOrderByValueFixer.php deleted file mode 100644 index cae0f4b..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocOrderByValueFixer.php +++ /dev/null @@ -1,222 +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\Fixer\Phpdoc; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\DocBlock\DocBlock; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -use PhpCsFixer\FixerConfiguration\AllowedValueSubset; -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; -use Symfony\Component\OptionsResolver\Options; - -/** - * @author Filippo Tessarotto - * @author Andreas Möller - */ -final class PhpdocOrderByValueFixer extends AbstractFixer implements ConfigurableFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Order phpdoc tags by value.', - [ - new CodeSample( - ' [ - 'author', - ], - ] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run before PhpdocAlignFixer. - * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, PhpUnitFqcnAnnotationFixer, PhpdocIndentFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer. - */ - public function getPriority(): int - { - return -10; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isAllTokenKindsFound([T_CLASS, T_DOC_COMMENT]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - if ([] === $this->configuration['annotations']) { - return; - } - - for ($index = $tokens->count() - 1; $index > 0; --$index) { - foreach ($this->configuration['annotations'] as $type => $typeLowerCase) { - $findPattern = sprintf( - '/@%s\s.+@%s\s/s', - $type, - $type - ); - - if ( - !$tokens[$index]->isGivenKind(T_DOC_COMMENT) - || 0 === Preg::match($findPattern, $tokens[$index]->getContent()) - ) { - continue; - } - - $docBlock = new DocBlock($tokens[$index]->getContent()); - - $annotations = $docBlock->getAnnotationsOfType($type); - $annotationMap = []; - - if (\in_array($type, ['property', 'property-read', 'property-write'], true)) { - $replacePattern = sprintf( - '/(?s)\*\s*@%s\s+(?P.+\s+)?\$(?P[^\s]+).*/', - $type - ); - - $replacement = '\2'; - } elseif ('method' === $type) { - $replacePattern = '/(?s)\*\s*@method\s+(?P.+\s+)?(?P.+)\(.*/'; - $replacement = '\2'; - } else { - $replacePattern = sprintf( - '/\*\s*@%s\s+(?P.+)/', - $typeLowerCase - ); - - $replacement = '\1'; - } - - foreach ($annotations as $annotation) { - $rawContent = $annotation->getContent(); - - $comparableContent = Preg::replace( - $replacePattern, - $replacement, - strtolower(trim($rawContent)) - ); - - $annotationMap[$comparableContent] = $rawContent; - } - - $orderedAnnotationMap = $annotationMap; - - ksort($orderedAnnotationMap, SORT_STRING); - - if ($orderedAnnotationMap === $annotationMap) { - continue; - } - - $lines = $docBlock->getLines(); - - foreach (array_reverse($annotations) as $annotation) { - array_splice( - $lines, - $annotation->getStart(), - $annotation->getEnd() - $annotation->getStart() + 1, - array_pop($orderedAnnotationMap) - ); - } - - $tokens[$index] = new Token([T_DOC_COMMENT, implode('', $lines)]); - } - } - } - - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - $allowedValues = [ - 'author', - 'covers', - 'coversNothing', - 'dataProvider', - 'depends', - 'group', - 'internal', - 'method', - 'property', - 'property-read', - 'property-write', - 'requires', - 'throws', - 'uses', - ]; - - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('annotations', 'List of annotations to order, e.g. `["covers"]`.')) - ->setAllowedTypes([ - 'array', - ]) - ->setAllowedValues([ - new AllowedValueSubset($allowedValues), - ]) - ->setNormalizer(function (Options $options, $value) { - $normalized = []; - - foreach ($value as $index => $annotation) { - // since we will be using strtolower on the input annotations when building the sorting - // map we must match the type in lower case as well - $normalized[$annotation] = strtolower($annotation); - } - - return $normalized; - }) - ->setDefault([ - 'covers', - ]) - ->getOption(), - ]); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocOrderFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocOrderFixer.php deleted file mode 100644 index 6ae218c..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocOrderFixer.php +++ /dev/null @@ -1,166 +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\Fixer\Phpdoc; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\DocBlock\DocBlock; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Graham Campbell - */ -final class PhpdocOrderFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isTokenKindFound(T_DOC_COMMENT); - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Annotations in PHPDoc should be ordered so that `@param` annotations come first, then `@throws` annotations, then `@return` annotations.', - [ - new CodeSample( - ' $token) { - if (!$token->isGivenKind(T_DOC_COMMENT)) { - continue; - } - - $content = $token->getContent(); - // move param to start, return to end, leave throws in the middle - $content = $this->moveParamAnnotations($content); - // we're parsing the content again to make sure the internal - // state of the dockblock is correct after the modifications - $content = $this->moveReturnAnnotations($content); - // persist the content at the end - $tokens[$index] = new Token([T_DOC_COMMENT, $content]); - } - } - - /** - * Move all param annotations in before throws and return annotations. - */ - private function moveParamAnnotations(string $content): string - { - $doc = new DocBlock($content); - $params = $doc->getAnnotationsOfType('param'); - - // nothing to do if there are no param annotations - if (empty($params)) { - return $content; - } - - $others = $doc->getAnnotationsOfType(['throws', 'return']); - - if (empty($others)) { - return $content; - } - - // get the index of the final line of the final param annotation - $end = end($params)->getEnd(); - - $line = $doc->getLine($end); - - // move stuff about if required - foreach ($others as $other) { - if ($other->getStart() < $end) { - // we're doing this to maintain the original line indexes - $line->setContent($line->getContent().$other->getContent()); - $other->remove(); - } - } - - return $doc->getContent(); - } - - /** - * Move all return annotations after param and throws annotations. - */ - private function moveReturnAnnotations(string $content): string - { - $doc = new DocBlock($content); - $returns = $doc->getAnnotationsOfType('return'); - - // nothing to do if there are no return annotations - if (empty($returns)) { - return $content; - } - - $others = $doc->getAnnotationsOfType(['param', 'throws']); - - // nothing to do if there are no other annotations - if (empty($others)) { - return $content; - } - - // get the index of the first line of the first return annotation - $start = $returns[0]->getStart(); - $line = $doc->getLine($start); - - // move stuff about if required - foreach (array_reverse($others) as $other) { - if ($other->getEnd() > $start) { - // we're doing this to maintain the original line indexes - $line->setContent($other->getContent().$line->getContent()); - $other->remove(); - } - } - - return $doc->getContent(); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocReturnSelfReferenceFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocReturnSelfReferenceFixer.php deleted file mode 100644 index bdf7a24..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocReturnSelfReferenceFixer.php +++ /dev/null @@ -1,232 +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\Fixer\Phpdoc; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\DocBlock\DocBlock; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; -use Symfony\Component\OptionsResolver\Exception\InvalidOptionsException; -use Symfony\Component\OptionsResolver\Options; - -/** - * @author SpacePossum - */ -final class PhpdocReturnSelfReferenceFixer extends AbstractFixer implements ConfigurableFixerInterface -{ - /** - * @var string[] - */ - private static $toTypes = [ - '$this', - 'static', - 'self', - ]; - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'The type of `@return` annotations of methods returning a reference to itself must the configured one.', - [ - new CodeSample( - ' ['this' => 'self']] - ), - ] - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return \count($tokens) > 10 && $tokens->isTokenKindFound(T_DOC_COMMENT) && $tokens->isAnyTokenKindsFound([T_CLASS, T_INTERFACE]); - } - - /** - * {@inheritdoc} - * - * Must run before NoSuperfluousPhpdocTagsFixer, PhpdocAlignFixer. - * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, PhpdocIndentFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer. - */ - public function getPriority(): int - { - return 10; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $tokensAnalyzer = new TokensAnalyzer($tokens); - foreach ($tokensAnalyzer->getClassyElements() as $index => $element) { - if ('method' === $element['type']) { - $this->fixMethod($tokens, $index); - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - $default = [ - 'this' => '$this', - '@this' => '$this', - '$self' => 'self', - '@self' => 'self', - '$static' => 'static', - '@static' => 'static', - ]; - - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('replacements', 'Mapping between replaced return types with new ones.')) - ->setAllowedTypes(['array']) - ->setNormalizer(static function (Options $options, $value) use ($default) { - $normalizedValue = []; - foreach ($value as $from => $to) { - if (\is_string($from)) { - $from = strtolower($from); - } - - if (!isset($default[$from])) { - throw new InvalidOptionsException(sprintf( - 'Unknown key "%s", expected any of "%s".', - \is_object($from) ? \get_class($from) : \gettype($from).(\is_resource($from) ? '' : '#'.$from), - implode('", "', array_keys($default)) - )); - } - - if (!\in_array($to, self::$toTypes, true)) { - throw new InvalidOptionsException(sprintf( - 'Unknown value "%s", expected any of "%s".', - \is_object($to) ? \get_class($to) : \gettype($to).(\is_resource($to) ? '' : '#'.$to), - implode('", "', self::$toTypes) - )); - } - - $normalizedValue[$from] = $to; - } - - return $normalizedValue; - }) - ->setDefault($default) - ->getOption(), - ]); - } - - private function fixMethod(Tokens $tokens, int $index): void - { - static $methodModifiers = [T_STATIC, T_FINAL, T_ABSTRACT, T_PRIVATE, T_PROTECTED, T_PUBLIC]; - - // find PHPDoc of method (if any) - do { - $tokenIndex = $tokens->getPrevMeaningfulToken($index); - if (!$tokens[$tokenIndex]->isGivenKind($methodModifiers)) { - break; - } - - $index = $tokenIndex; - } while (true); - - $docIndex = $tokens->getPrevNonWhitespace($index); - if (!$tokens[$docIndex]->isGivenKind(T_DOC_COMMENT)) { - return; - } - - // find @return - $docBlock = new DocBlock($tokens[$docIndex]->getContent()); - $returnsBlock = $docBlock->getAnnotationsOfType('return'); - - if (!\count($returnsBlock)) { - return; // no return annotation found - } - - $returnsBlock = $returnsBlock[0]; - $types = $returnsBlock->getTypes(); - - if (!\count($types)) { - return; // no return type(s) found - } - - $newTypes = []; - foreach ($types as $type) { - $lower = strtolower($type); - $newTypes[] = $this->configuration['replacements'][$lower] ?? $type; - } - - if ($types === $newTypes) { - return; - } - - $returnsBlock->setTypes($newTypes); - $tokens[$docIndex] = new Token([T_DOC_COMMENT, $docBlock->getContent()]); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocScalarFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocScalarFixer.php deleted file mode 100644 index 047e774..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocScalarFixer.php +++ /dev/null @@ -1,131 +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\Fixer\Phpdoc; - -use PhpCsFixer\AbstractPhpdocTypesFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -use PhpCsFixer\FixerConfiguration\AllowedValueSubset; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; - -/** - * @author Graham Campbell - */ -final class PhpdocScalarFixer extends AbstractPhpdocTypesFixer implements ConfigurableFixerInterface -{ - /** - * The types to fix. - * - * @var array - */ - private static $types = [ - 'boolean' => 'bool', - 'callback' => 'callable', - 'double' => 'float', - 'integer' => 'int', - 'real' => 'float', - 'str' => 'string', - ]; - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Scalar types should always be written in the same form. `int` not `integer`, `bool` not `boolean`, `float` not `real` or `double`.', - [ - new CodeSample(' ['boolean']] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run before GeneralPhpdocAnnotationRemoveFixer, GeneralPhpdocTagRenameFixer, NoBlankLinesAfterPhpdocFixer, NoEmptyPhpdocFixer, NoSuperfluousPhpdocTagsFixer, PhpdocAddMissingParamAnnotationFixer, PhpdocAlignFixer, PhpdocAlignFixer, PhpdocInlineTagNormalizerFixer, PhpdocLineSpanFixer, PhpdocNoAccessFixer, PhpdocNoAliasTagFixer, PhpdocNoEmptyReturnFixer, PhpdocNoPackageFixer, PhpdocNoUselessInheritdocFixer, PhpdocOrderByValueFixer, PhpdocOrderFixer, PhpdocReturnSelfReferenceFixer, PhpdocSeparationFixer, PhpdocSingleLineVarSpacingFixer, PhpdocSummaryFixer, PhpdocTagCasingFixer, PhpdocTagTypeFixer, PhpdocToParamTypeFixer, PhpdocToPropertyTypeFixer, PhpdocToReturnTypeFixer, PhpdocToReturnTypeFixer, PhpdocTrimConsecutiveBlankLineSeparationFixer, PhpdocTrimFixer, PhpdocTypesOrderFixer, PhpdocVarAnnotationCorrectOrderFixer, PhpdocVarWithoutNameFixer. - * Must run after PhpdocTypesFixer. - */ - public function getPriority(): int - { - /* - * Should be run before all other docblock fixers apart from the - * phpdoc_to_comment and phpdoc_indent fixer to make sure all fixers - * apply correct indentation to new code they add. This should run - * before alignment of params is done since this fixer might change - * the type and thereby un-aligning the params. We also must run after - * the phpdoc_types_fixer because it can convert types to things that - * we can fix. - */ - return 15; - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - $types = array_keys(self::$types); - - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('types', 'A list of types to fix.')) - ->setAllowedValues([new AllowedValueSubset($types)]) - ->setDefault($types) - ->getOption(), - ]); - } - - /** - * {@inheritdoc} - */ - protected function normalize(string $type): string - { - if (\in_array($type, $this->configuration['types'], true)) { - return self::$types[$type]; - } - - return $type; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocSeparationFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocSeparationFixer.php deleted file mode 100644 index 210c208..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocSeparationFixer.php +++ /dev/null @@ -1,173 +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\Fixer\Phpdoc; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\DocBlock\Annotation; -use PhpCsFixer\DocBlock\DocBlock; -use PhpCsFixer\DocBlock\TagComparator; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Graham Campbell - */ -final class PhpdocSeparationFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Annotations in PHPDoc should be grouped together so that annotations of the same type immediately follow each other, and annotations of a different type are separated by a single blank line.', - [ - new CodeSample( - 'isTokenKindFound(T_DOC_COMMENT); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind(T_DOC_COMMENT)) { - continue; - } - - $doc = new DocBlock($token->getContent()); - $this->fixDescription($doc); - $this->fixAnnotations($doc); - - $tokens[$index] = new Token([T_DOC_COMMENT, $doc->getContent()]); - } - } - - /** - * Make sure the description is separated from the annotations. - */ - private function fixDescription(DocBlock $doc): void - { - foreach ($doc->getLines() as $index => $line) { - if ($line->containsATag()) { - break; - } - - if ($line->containsUsefulContent()) { - $next = $doc->getLine($index + 1); - - if (null !== $next && $next->containsATag()) { - $line->addBlank(); - - break; - } - } - } - } - - /** - * Make sure the annotations are correctly separated. - */ - private function fixAnnotations(DocBlock $doc): string - { - foreach ($doc->getAnnotations() as $index => $annotation) { - $next = $doc->getAnnotation($index + 1); - - if (null === $next) { - break; - } - - if (true === $next->getTag()->valid()) { - if (TagComparator::shouldBeTogether($annotation->getTag(), $next->getTag())) { - $this->ensureAreTogether($doc, $annotation, $next); - } else { - $this->ensureAreSeparate($doc, $annotation, $next); - } - } - } - - return $doc->getContent(); - } - - /** - * Force the given annotations to immediately follow each other. - */ - private function ensureAreTogether(DocBlock $doc, Annotation $first, Annotation $second): void - { - $pos = $first->getEnd(); - $final = $second->getStart(); - - for ($pos = $pos + 1; $pos < $final; ++$pos) { - $doc->getLine($pos)->remove(); - } - } - - /** - * Force the given annotations to have one empty line between each other. - */ - private function ensureAreSeparate(DocBlock $doc, Annotation $first, Annotation $second): void - { - $pos = $first->getEnd(); - $final = $second->getStart() - 1; - - // check if we need to add a line, or need to remove one or more lines - if ($pos === $final) { - $doc->getLine($pos)->addBlank(); - - return; - } - - for ($pos = $pos + 1; $pos < $final; ++$pos) { - $doc->getLine($pos)->remove(); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocSingleLineVarSpacingFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocSingleLineVarSpacingFixer.php deleted file mode 100644 index bc47903..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocSingleLineVarSpacingFixer.php +++ /dev/null @@ -1,100 +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\Fixer\Phpdoc; - -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; - -/** - * Fixer for part of rule defined in PSR5 ¶7.22. - * - * @author SpacePossum - */ -final class PhpdocSingleLineVarSpacingFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Single line `@var` PHPDoc should have proper spacing.', - [new CodeSample("isAnyTokenKindsFound([T_COMMENT, T_DOC_COMMENT]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - /** @var Token $token */ - foreach ($tokens as $index => $token) { - if (!$token->isComment()) { - continue; - } - - $content = $token->getContent(); - $fixedContent = $this->fixTokenContent($content); - - if ($content !== $fixedContent) { - $tokens[$index] = new Token([T_DOC_COMMENT, $fixedContent]); - } - } - } - - private function fixTokenContent(string $content): string - { - return Preg::replaceCallback( - '#^/\*\*\h*@var\h+(\S+)\h*(\$\S+)?\h*([^\n]*)\*/$#', - static function (array $matches) { - $content = '/** @var'; - - for ($i = 1, $m = \count($matches); $i < $m; ++$i) { - if ('' !== $matches[$i]) { - $content .= ' '.$matches[$i]; - } - } - - return rtrim($content).' */'; - }, - $content - ); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocSummaryFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocSummaryFixer.php deleted file mode 100644 index abb6a7c..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocSummaryFixer.php +++ /dev/null @@ -1,103 +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\Fixer\Phpdoc; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\DocBlock\DocBlock; -use PhpCsFixer\DocBlock\ShortDescription; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Graham Campbell - */ -final class PhpdocSummaryFixer extends AbstractFixer implements WhitespacesAwareFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'PHPDoc summary should end in either a full stop, exclamation mark, or question mark.', - [new CodeSample('isTokenKindFound(T_DOC_COMMENT); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind(T_DOC_COMMENT)) { - continue; - } - - $doc = new DocBlock($token->getContent()); - $end = (new ShortDescription($doc))->getEnd(); - - if (null !== $end) { - $line = $doc->getLine($end); - $content = rtrim($line->getContent()); - - if (!$this->isCorrectlyFormatted($content)) { - $line->setContent($content.'.'.$this->whitespacesConfig->getLineEnding()); - $tokens[$index] = new Token([T_DOC_COMMENT, $doc->getContent()]); - } - } - } - } - - /** - * Is the last line of the short description correctly formatted? - */ - private function isCorrectlyFormatted(string $content): bool - { - if (false !== stripos($content, '{@inheritdoc}')) { - return true; - } - - return $content !== rtrim($content, '.。!?¡¿!?'); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTagCasingFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTagCasingFixer.php deleted file mode 100644 index b960832..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTagCasingFixer.php +++ /dev/null @@ -1,106 +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\Fixer\Phpdoc; - -use PhpCsFixer\AbstractProxyFixer; -use PhpCsFixer\ConfigurationException\InvalidConfigurationException; -use PhpCsFixer\ConfigurationException\InvalidFixerConfigurationException; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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; - -final class PhpdocTagCasingFixer extends AbstractProxyFixer implements ConfigurableFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Fixes casing of PHPDoc tags.', - [ - new CodeSample(" ['foo'], - ]), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run before PhpdocAlignFixer. - * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, PhpdocIndentFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer. - */ - public function getPriority(): int - { - return parent::getPriority(); - } - - public function configure(array $configuration): void - { - parent::configure($configuration); - - $replacements = []; - foreach ($this->configuration['tags'] as $tag) { - $replacements[$tag] = $tag; - } - - /** @var GeneralPhpdocTagRenameFixer $generalPhpdocTagRenameFixer */ - $generalPhpdocTagRenameFixer = $this->proxyFixers['general_phpdoc_tag_rename']; - - try { - $generalPhpdocTagRenameFixer->configure([ - 'fix_annotation' => true, - 'fix_inline' => true, - 'replacements' => $replacements, - 'case_sensitive' => false, - ]); - } catch (InvalidConfigurationException $exception) { - throw new InvalidFixerConfigurationException( - $this->getName(), - Preg::replace('/^\[.+?\] /', '', $exception->getMessage()), - $exception - ); - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('tags', 'List of tags to fix with their expected casing.')) - ->setAllowedTypes(['array']) - ->setDefault(['inheritDoc']) - ->getOption(), - ]); - } - - /** - * {@inheritdoc} - */ - protected function createProxyFixers(): array - { - return [new GeneralPhpdocTagRenameFixer()]; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTagTypeFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTagTypeFixer.php deleted file mode 100644 index 9cab7e3..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTagTypeFixer.php +++ /dev/null @@ -1,214 +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\Fixer\Phpdoc; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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; -use Symfony\Component\OptionsResolver\Exception\InvalidOptionsException; -use Symfony\Component\OptionsResolver\Options; - -/** - * @author SpacePossum - */ -final class PhpdocTagTypeFixer extends AbstractFixer implements ConfigurableFixerInterface -{ - private const TAG_REGEX = '/^(?: - (? - (?:@(?.+?)(?:\s.+)?) - ) - | - {(? - (?:@(?.+?)(?:\s.+)?) - )} - )$/x'; - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isTokenKindFound(T_DOC_COMMENT); - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Forces PHPDoc tags to be either regular annotations or inline.', - [ - new CodeSample( - " ['inheritdoc' => 'inline']] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run before PhpdocAlignFixer. - * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, PhpdocIndentFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer. - */ - public function getPriority(): int - { - return 0; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - if (!$this->configuration['tags']) { - return; - } - - $regularExpression = sprintf( - '/({?@(?:%s).*?(?:(?=\s\*\/)|(?=\n)}?))/i', - implode('|', array_map( - function (string $tag) { - return preg_quote($tag, '/'); - }, - array_keys($this->configuration['tags']) - )) - ); - - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind(T_DOC_COMMENT)) { - continue; - } - - $parts = Preg::split( - $regularExpression, - $token->getContent(), - -1, - PREG_SPLIT_DELIM_CAPTURE - ); - - for ($i = 1, $max = \count($parts) - 1; $i < $max; $i += 2) { - if (!Preg::match(self::TAG_REGEX, $parts[$i], $matches)) { - continue; - } - - if ('' !== $matches['tag']) { - $tag = $matches['tag']; - $tagName = $matches['tag_name']; - } else { - $tag = $matches['inlined_tag']; - $tagName = $matches['inlined_tag_name']; - } - - $tagName = strtolower($tagName); - if (!isset($this->configuration['tags'][$tagName])) { - continue; - } - - if ('inline' === $this->configuration['tags'][$tagName]) { - $parts[$i] = '{'.$tag.'}'; - - continue; - } - - if (!$this->tagIsSurroundedByText($parts, $i)) { - $parts[$i] = $tag; - } - } - - $tokens[$index] = new Token([T_DOC_COMMENT, implode('', $parts)]); - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('tags', 'The list of tags to fix')) - ->setAllowedTypes(['array']) - ->setAllowedValues([function ($value) { - foreach ($value as $type) { - if (!\in_array($type, ['annotation', 'inline'], true)) { - throw new InvalidOptionsException("Unknown tag type \"{$type}\"."); - } - } - - return true; - }]) - ->setDefault([ - 'api' => 'annotation', - 'author' => 'annotation', - 'copyright' => 'annotation', - 'deprecated' => 'annotation', - 'example' => 'annotation', - 'global' => 'annotation', - 'inheritDoc' => 'annotation', - 'internal' => 'annotation', - 'license' => 'annotation', - 'method' => 'annotation', - 'package' => 'annotation', - 'param' => 'annotation', - 'property' => 'annotation', - 'return' => 'annotation', - 'see' => 'annotation', - 'since' => 'annotation', - 'throws' => 'annotation', - 'todo' => 'annotation', - 'uses' => 'annotation', - 'var' => 'annotation', - 'version' => 'annotation', - ]) - ->setNormalizer(function (Options $options, $value) { - $normalized = []; - foreach ($value as $tag => $type) { - $normalized[strtolower($tag)] = $type; - } - - return $normalized; - }) - ->getOption(), - ]); - } - - private function tagIsSurroundedByText(array $parts, int $index): bool - { - return - Preg::match('/(^|\R)\h*[^@\s]\N*/', $this->cleanComment($parts[$index - 1])) - || Preg::match('/^.*?\R\s*[^@\s]/', $this->cleanComment($parts[$index + 1])) - ; - } - - private function cleanComment(string $comment): string - { - $comment = Preg::replace('/^\/\*\*|\*\/$/', '', $comment); - - return Preg::replace('/(\R)(\h*\*)?\h*/', '$1', $comment); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocToCommentFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocToCommentFixer.php deleted file mode 100644 index 34da0e8..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocToCommentFixer.php +++ /dev/null @@ -1,162 +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\Fixer\Phpdoc; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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\CommentsAnalyzer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Ceeram - * @author Dariusz Rumiński - */ -final class PhpdocToCommentFixer extends AbstractFixer implements ConfigurableFixerInterface -{ - /** - * @var string[] - */ - private $ignoredTags = []; - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isTokenKindFound(T_DOC_COMMENT); - } - - /** - * {@inheritdoc} - * - * Must run before GeneralPhpdocAnnotationRemoveFixer, GeneralPhpdocTagRenameFixer, NoBlankLinesAfterPhpdocFixer, NoEmptyCommentFixer, NoEmptyPhpdocFixer, NoSuperfluousPhpdocTagsFixer, PhpdocAddMissingParamAnnotationFixer, PhpdocAlignFixer, PhpdocAlignFixer, PhpdocAnnotationWithoutDotFixer, PhpdocIndentFixer, PhpdocInlineTagNormalizerFixer, PhpdocLineSpanFixer, PhpdocNoAccessFixer, PhpdocNoAliasTagFixer, PhpdocNoEmptyReturnFixer, PhpdocNoPackageFixer, PhpdocNoUselessInheritdocFixer, PhpdocNoUselessInheritdocFixer, PhpdocOrderByValueFixer, PhpdocOrderFixer, PhpdocReturnSelfReferenceFixer, PhpdocSeparationFixer, PhpdocSingleLineVarSpacingFixer, PhpdocSummaryFixer, PhpdocTagCasingFixer, PhpdocTagTypeFixer, PhpdocToParamTypeFixer, PhpdocToPropertyTypeFixer, PhpdocToReturnTypeFixer, PhpdocTrimConsecutiveBlankLineSeparationFixer, PhpdocTrimFixer, PhpdocTypesOrderFixer, PhpdocVarAnnotationCorrectOrderFixer, PhpdocVarWithoutNameFixer. - * Must run after CommentToPhpdocFixer. - */ - public function getPriority(): int - { - /* - * Should be run before all other docblock fixers so that these fixers - * don't touch doc comments which are meant to be converted to regular - * comments. - */ - return 25; - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Docblocks should only be used on structural elements.', - [ - new CodeSample( - ' $sqlite) { - $sqlite->open($path); -} -' - ), - new CodeSample( - ' $sqlite) { - $sqlite->open($path); -} - -/** @todo This should be a PHPDoc as the tag is on "ignored_tags" list */ -foreach($connections as $key => $sqlite) { - $sqlite->open($path); -} -', - ['ignored_tags' => ['todo']] - ), - ] - ); - } - - /** - * {@inheritdoc} - */ - public function configure(array $configuration = null): void - { - parent::configure($configuration); - - $this->ignoredTags = array_map( - static function ($tag) { - return strtolower($tag); - }, - $this->configuration['ignored_tags'] - ); - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('ignored_tags', 'List of ignored tags (matched case insensitively)')) - ->setAllowedTypes(['array']) - ->setDefault([]) - ->getOption(), - ]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $commentsAnalyzer = new CommentsAnalyzer(); - - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind(T_DOC_COMMENT)) { - continue; - } - - if ($commentsAnalyzer->isHeaderComment($tokens, $index)) { - continue; - } - - if ($commentsAnalyzer->isBeforeStructuralElement($tokens, $index)) { - continue; - } - - 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; - } - } - } - - $tokens[$index] = new Token([T_COMMENT, '/*'.ltrim($token->getContent(), '/*')]); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTrimConsecutiveBlankLineSeparationFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTrimConsecutiveBlankLineSeparationFixer.php deleted file mode 100644 index bb72104..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTrimConsecutiveBlankLineSeparationFixer.php +++ /dev/null @@ -1,197 +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\Fixer\Phpdoc; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\DocBlock\DocBlock; -use PhpCsFixer\DocBlock\Line; -use PhpCsFixer\DocBlock\ShortDescription; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Nobu Funaki - * @author Dariusz Rumiński - */ -final class PhpdocTrimConsecutiveBlankLineSeparationFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Removes extra blank lines after summary and after description in PHPDoc.', - [ - new CodeSample( - 'isTokenKindFound(T_DOC_COMMENT); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind(T_DOC_COMMENT)) { - continue; - } - - $doc = new DocBlock($token->getContent()); - $summaryEnd = (new ShortDescription($doc))->getEnd(); - - if (null !== $summaryEnd) { - $this->fixSummary($doc, $summaryEnd); - $this->fixDescription($doc, $summaryEnd); - } - - $this->fixAllTheRest($doc); - - $tokens[$index] = new Token([T_DOC_COMMENT, $doc->getContent()]); - } - } - - private function fixSummary(DocBlock $doc, int $summaryEnd): void - { - $nonBlankLineAfterSummary = $this->findNonBlankLine($doc, $summaryEnd); - - $this->removeExtraBlankLinesBetween($doc, $summaryEnd, $nonBlankLineAfterSummary); - } - - private function fixDescription(DocBlock $doc, int $summaryEnd): void - { - $annotationStart = $this->findFirstAnnotationOrEnd($doc); - - // assuming the end of the Description appears before the first Annotation - $descriptionEnd = $this->reverseFindLastUsefulContent($doc, $annotationStart); - - if (null === $descriptionEnd || $summaryEnd === $descriptionEnd) { - return; // no Description - } - - if ($annotationStart === \count($doc->getLines()) - 1) { - return; // no content after Description - } - - $this->removeExtraBlankLinesBetween($doc, $descriptionEnd, $annotationStart); - } - - private function fixAllTheRest(DocBlock $doc): void - { - $annotationStart = $this->findFirstAnnotationOrEnd($doc); - $lastLine = $this->reverseFindLastUsefulContent($doc, \count($doc->getLines()) - 1); - - if (null !== $lastLine && $annotationStart !== $lastLine) { - $this->removeExtraBlankLinesBetween($doc, $annotationStart, $lastLine); - } - } - - private function removeExtraBlankLinesBetween(DocBlock $doc, int $from, int $to): void - { - for ($index = $from + 1; $index < $to; ++$index) { - $line = $doc->getLine($index); - $next = $doc->getLine($index + 1); - $this->removeExtraBlankLine($line, $next); - } - } - - private function removeExtraBlankLine(Line $current, Line $next): void - { - if (!$current->isTheEnd() && !$current->containsUsefulContent() - && !$next->isTheEnd() && !$next->containsUsefulContent()) { - $current->remove(); - } - } - - private function findNonBlankLine(DocBlock $doc, int $after): ?int - { - foreach ($doc->getLines() as $index => $line) { - if ($index <= $after) { - continue; - } - - if ($line->containsATag() || $line->containsUsefulContent() || $line->isTheEnd()) { - return $index; - } - } - - return null; - } - - private function findFirstAnnotationOrEnd(DocBlock $doc): int - { - $index = null; - foreach ($doc->getLines() as $index => $line) { - if ($line->containsATag()) { - return $index; - } - } - - return $index; // no Annotation, return the last line - } - - private function reverseFindLastUsefulContent(DocBlock $doc, int $from): ?int - { - for ($index = $from - 1; $index >= 0; --$index) { - if ($doc->getLine($index)->containsUsefulContent()) { - return $index; - } - } - - return null; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTrimFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTrimFixer.php deleted file mode 100644 index 52ff0ae..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTrimFixer.php +++ /dev/null @@ -1,124 +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\Fixer\Phpdoc; - -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 Graham Campbell - */ -final class PhpdocTrimFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'PHPDoc should start and end with content, excluding the very first and last line of the docblocks.', - [new CodeSample('isTokenKindFound(T_DOC_COMMENT); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind(T_DOC_COMMENT)) { - continue; - } - - $content = $token->getContent(); - $content = $this->fixStart($content); - // we need re-parse the docblock after fixing the start before - // fixing the end in order for the lines to be correctly indexed - $content = $this->fixEnd($content); - $tokens[$index] = new Token([T_DOC_COMMENT, $content]); - } - } - - /** - * Make sure the first useful line starts immediately after the first line. - */ - private function fixStart(string $content): string - { - return Preg::replace( - '~ - (^/\*\*) # DocComment begin - (?: - \R\h*(?:\*\h*)? # lines without useful content - (?!\R\h*\*/) # not followed by a DocComment end - )+ - (\R\h*(?:\*\h*)?\S) # first line with useful content - ~x', - '$1$2', - $content - ); - } - - /** - * Make sure the last useful line is immediately before the final line. - */ - private function fixEnd(string $content): string - { - return Preg::replace( - '~ - (\R\h*(?:\*\h*)?\S.*?) # last line with useful content - (?: - (? - * 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\Fixer\ConfigurableFixerInterface; -use PhpCsFixer\FixerConfiguration\AllowedValueSubset; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; -use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; - -/** - * @author Graham Campbell - * @author Dariusz Rumiński - */ -final class PhpdocTypesFixer extends AbstractPhpdocTypesFixer implements ConfigurableFixerInterface -{ - /** - * Available types, grouped. - * - * @var array - */ - private static $possibleTypes = [ - 'simple' => [ - 'array', - 'bool', - 'callable', - 'float', - 'int', - 'iterable', - 'null', - 'object', - 'string', - ], - 'alias' => [ - 'boolean', - 'callback', - 'double', - 'integer', - 'real', - ], - 'meta' => [ - '$this', - 'false', - 'mixed', - 'parent', - 'resource', - 'scalar', - 'self', - 'static', - 'true', - 'void', - ], - ]; - - /** - * @var array string[] - */ - private $typesToFix = []; - - /** - * {@inheritdoc} - */ - public function configure(array $configuration): void - { - parent::configure($configuration); - - $this->typesToFix = array_merge(...array_map(static function (string $group) { - return self::$possibleTypes[$group]; - }, $this->configuration['groups'])); - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'The correct case must be used for standard PHP types in PHPDoc.', - [ - new CodeSample( - ' ['simple', 'alias']] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run before GeneralPhpdocAnnotationRemoveFixer, GeneralPhpdocTagRenameFixer, NoBlankLinesAfterPhpdocFixer, NoEmptyPhpdocFixer, NoSuperfluousPhpdocTagsFixer, PhpdocAddMissingParamAnnotationFixer, PhpdocAlignFixer, PhpdocAlignFixer, PhpdocInlineTagNormalizerFixer, PhpdocLineSpanFixer, PhpdocNoAccessFixer, PhpdocNoAliasTagFixer, PhpdocNoEmptyReturnFixer, PhpdocNoPackageFixer, PhpdocNoUselessInheritdocFixer, PhpdocOrderByValueFixer, PhpdocOrderFixer, PhpdocReturnSelfReferenceFixer, PhpdocScalarFixer, PhpdocSeparationFixer, PhpdocSingleLineVarSpacingFixer, PhpdocSummaryFixer, PhpdocTagCasingFixer, PhpdocTagTypeFixer, PhpdocToParamTypeFixer, PhpdocToPropertyTypeFixer, PhpdocToReturnTypeFixer, PhpdocToReturnTypeFixer, PhpdocTrimConsecutiveBlankLineSeparationFixer, PhpdocTrimFixer, PhpdocTypesOrderFixer, PhpdocVarAnnotationCorrectOrderFixer, PhpdocVarWithoutNameFixer. - * Must run after PhpdocAnnotationWithoutDotFixer, PhpdocIndentFixer. - */ - public function getPriority(): int - { - /* - * Should be run before all other docblock fixers apart from the - * phpdoc_to_comment and phpdoc_indent fixer to make sure all fixers - * apply correct indentation to new code they add. This should run - * before alignment of params is done since this fixer might change - * the type and thereby un-aligning the params. We also must run before - * the phpdoc_scalar_fixer so that it can make changes after us. - */ - return 16; - } - - /** - * {@inheritdoc} - */ - protected function normalize(string $type): string - { - $lower = strtolower($type); - - return \in_array($lower, $this->typesToFix, true) ? $lower : $type; - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - $possibleGroups = array_keys(self::$possibleTypes); - - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('groups', 'Type groups to fix.')) - ->setAllowedTypes(['array']) - ->setAllowedValues([new AllowedValueSubset($possibleGroups)]) - ->setDefault($possibleGroups) - ->getOption(), - ]); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTypesOrderFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTypesOrderFixer.php deleted file mode 100644 index 5d5c9ca..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTypesOrderFixer.php +++ /dev/null @@ -1,222 +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\Fixer\Phpdoc; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\DocBlock\Annotation; -use PhpCsFixer\DocBlock\DocBlock; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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; -use PhpCsFixer\Utils; - -final class PhpdocTypesOrderFixer extends AbstractFixer implements ConfigurableFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Sorts PHPDoc types.', - [ - new CodeSample( - ' 'always_last'] - ), - new CodeSample( - ' 'alpha'] - ), - new CodeSample( - ' 'alpha', - 'null_adjustment' => 'always_last', - ] - ), - new CodeSample( - ' 'alpha', - 'null_adjustment' => 'none', - ] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run before PhpdocAlignFixer. - * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, PhpdocAnnotationWithoutDotFixer, PhpdocIndentFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer. - */ - public function getPriority(): int - { - return 0; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isTokenKindFound(T_DOC_COMMENT); - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('sort_algorithm', 'The sorting algorithm to apply.')) - ->setAllowedValues(['alpha', 'none']) - ->setDefault('alpha') - ->getOption(), - (new FixerOptionBuilder('null_adjustment', 'Forces the position of `null` (overrides `sort_algorithm`).')) - ->setAllowedValues(['always_first', 'always_last', 'none']) - ->setDefault('always_first') - ->getOption(), - ]); - } - - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind(T_DOC_COMMENT)) { - continue; - } - - $doc = new DocBlock($token->getContent()); - $annotations = $doc->getAnnotationsOfType(Annotation::getTagsWithTypes()); - - if (!\count($annotations)) { - continue; - } - - foreach ($annotations as $annotation) { - $types = $annotation->getTypes(); - - // fix main types - $annotation->setTypes($this->sortTypes($types)); - - // fix @method parameters types - $line = $doc->getLine($annotation->getStart()); - $line->setContent(Preg::replaceCallback('/(@method\s+.+?\s+\w+\()(.*)\)/', function (array $matches) { - $sorted = Preg::replaceCallback('/([^\s,]+)([\s]+\$[^\s,]+)/', function (array $matches) { - return $this->sortJoinedTypes($matches[1]).$matches[2]; - }, $matches[2]); - - return $matches[1].$sorted.')'; - }, $line->getContent())); - } - - $tokens[$index] = new Token([T_DOC_COMMENT, $doc->getContent()]); - } - } - - /** - * @param string[] $types - * - * @return string[] - */ - private function sortTypes(array $types): array - { - foreach ($types as $index => $type) { - $types[$index] = Preg::replaceCallback('/^([^<]+)<(?:([\w\|]+?|)(,\s*))?(.*)>$/', function (array $matches) { - return $matches[1].'<'.$this->sortJoinedTypes($matches[2]).$matches[3].$this->sortJoinedTypes($matches[4]).'>'; - }, $type); - } - - if ('alpha' === $this->configuration['sort_algorithm']) { - $types = Utils::stableSort( - $types, - static function (string $type) { return $type; }, - static function (string $typeA, string $typeB) { - $regexp = '/^\\??\\\?/'; - - return strcasecmp( - Preg::replace($regexp, '', $typeA), - Preg::replace($regexp, '', $typeB) - ); - } - ); - } - - if ('none' !== $this->configuration['null_adjustment']) { - $nulls = []; - foreach ($types as $index => $type) { - if (Preg::match('/^\\\?null$/i', $type)) { - $nulls[$index] = $type; - unset($types[$index]); - } - } - - if (\count($nulls)) { - if ('always_last' === $this->configuration['null_adjustment']) { - array_push($types, ...$nulls); - } else { - array_unshift($types, ...$nulls); - } - } - } - - return $types; - } - - private function sortJoinedTypes(string $types): string - { - $types = array_filter( - Preg::split('/([^|<{\(]+(?:[<{].*[>}]|\(.+\)(?::.+)?)?)/', $types, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY), - static function (string $value) { - return '|' !== $value; - } - ); - - return implode('|', $this->sortTypes($types)); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocVarAnnotationCorrectOrderFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocVarAnnotationCorrectOrderFixer.php deleted file mode 100644 index 400f8dd..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocVarAnnotationCorrectOrderFixer.php +++ /dev/null @@ -1,81 +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\Fixer\Phpdoc; - -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 Kuba Werłos - */ -final class PhpdocVarAnnotationCorrectOrderFixer extends AbstractFixer -{ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - '`@var` and `@type` annotations must have type and name in the correct order.', - [new CodeSample('isTokenKindFound(T_DOC_COMMENT); - } - - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind(T_DOC_COMMENT)) { - continue; - } - - if (false === stripos($token->getContent(), '@var') && false === stripos($token->getContent(), '@type')) { - continue; - } - - $newContent = Preg::replace( - '/(@(?:type|var)\s*)(\$\S+)(\h+)([^\$](?:[^<\s]|<[^>]*>)*)(\s|\*)/i', - '$1$4$3$2$5', - $token->getContent() - ); - - if ($newContent === $token->getContent()) { - continue; - } - - $tokens[$index] = new Token([$token->getId(), $newContent]); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocVarWithoutNameFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocVarWithoutNameFixer.php deleted file mode 100644 index 9e4529a..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocVarWithoutNameFixer.php +++ /dev/null @@ -1,154 +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\Fixer\Phpdoc; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\DocBlock\DocBlock; -use PhpCsFixer\DocBlock\Line; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Graham Campbell - * @author Dave van der Brugge - */ -final class PhpdocVarWithoutNameFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - '`@var` and `@type` annotations of classy properties should not contain the name.', - [new CodeSample('isTokenKindFound(T_DOC_COMMENT) && $tokens->isAnyTokenKindsFound(Token::getClassyTokenKinds()); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind(T_DOC_COMMENT)) { - continue; - } - - $nextIndex = $tokens->getNextMeaningfulToken($index); - - if (null === $nextIndex) { - continue; - } - - // For people writing static public $foo instead of public static $foo - if ($tokens[$nextIndex]->isGivenKind(T_STATIC)) { - $nextIndex = $tokens->getNextMeaningfulToken($nextIndex); - } - - // We want only doc blocks that are for properties and thus have specified access modifiers next - if (!$tokens[$nextIndex]->isGivenKind([T_PRIVATE, T_PROTECTED, T_PUBLIC, T_VAR])) { - continue; - } - - $doc = new DocBlock($token->getContent()); - - $firstLevelLines = $this->getFirstLevelLines($doc); - $annotations = $doc->getAnnotationsOfType(['type', 'var']); - - foreach ($annotations as $annotation) { - if (isset($firstLevelLines[$annotation->getStart()])) { - $this->fixLine($firstLevelLines[$annotation->getStart()]); - } - } - - $tokens[$index] = new Token([T_DOC_COMMENT, $doc->getContent()]); - } - } - - private function fixLine(Line $line): void - { - $content = $line->getContent(); - - Preg::matchAll('/ \$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/', $content, $matches); - - if (isset($matches[0][0])) { - $line->setContent(str_replace($matches[0][0], '', $content)); - } - } - - /** - * @return Line[] - */ - private function getFirstLevelLines(DocBlock $docBlock): array - { - $nested = 0; - $lines = $docBlock->getLines(); - - foreach ($lines as $index => $line) { - $content = $line->getContent(); - - if (Preg::match('/\s*\*\s*}$/', $content)) { - --$nested; - } - - if ($nested > 0) { - unset($lines[$index]); - } - - if (Preg::match('/\s\{$/', $content)) { - ++$nested; - } - } - - return $lines; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ReturnNotation/NoUselessReturnFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ReturnNotation/NoUselessReturnFixer.php deleted file mode 100644 index e268eb3..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ReturnNotation/NoUselessReturnFixer.php +++ /dev/null @@ -1,115 +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\Fixer\ReturnNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author SpacePossum - */ -final class NoUselessReturnFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isAllTokenKindsFound([T_FUNCTION, T_RETURN]); - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'There should not be an empty `return` statement at the end of a function.', - [ - new CodeSample( - ' $token) { - if (!$token->isGivenKind(T_FUNCTION)) { - continue; - } - - $index = $tokens->getNextTokenOfKind($index, [';', '{']); - if ($tokens[$index]->equals('{')) { - $this->fixFunction($tokens, $index, $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $index)); - } - } - } - - /** - * @param int $start Token index of the opening brace token of the function - * @param int $end Token index of the closing brace token of the function - */ - private function fixFunction(Tokens $tokens, int $start, int $end): void - { - for ($index = $end; $index > $start; --$index) { - if (!$tokens[$index]->isGivenKind(T_RETURN)) { - continue; - } - - $nextAt = $tokens->getNextMeaningfulToken($index); - if (!$tokens[$nextAt]->equals(';')) { - continue; - } - - if ($tokens->getNextMeaningfulToken($nextAt) !== $end) { - continue; - } - - $previous = $tokens->getPrevMeaningfulToken($index); - if ($tokens[$previous]->equalsAny([[T_ELSE], ')'])) { - continue; - } - - $tokens->clearTokenAndMergeSurroundingWhitespace($index); - $tokens->clearTokenAndMergeSurroundingWhitespace($nextAt); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ReturnNotation/ReturnAssignmentFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ReturnNotation/ReturnAssignmentFixer.php deleted file mode 100644 index 6cc4bfa..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ReturnNotation/ReturnAssignmentFixer.php +++ /dev/null @@ -1,355 +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\Fixer\ReturnNotation; - -use PhpCsFixer\AbstractFixer; -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; - -/** - * @author SpacePossum - */ -final class ReturnAssignmentFixer extends AbstractFixer -{ - /** - * @var TokensAnalyzer - */ - private $tokensAnalyzer; - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Local, dynamic and directly referenced variables should not be assigned and directly returned by a function or method.', - [new CodeSample("isAllTokenKindsFound([T_FUNCTION, T_RETURN, T_VARIABLE]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $tokenCount = \count($tokens); - $this->tokensAnalyzer = new TokensAnalyzer($tokens); - - for ($index = 1; $index < $tokenCount; ++$index) { - if (!$tokens[$index]->isGivenKind(T_FUNCTION)) { - continue; - } - - $functionOpenIndex = $tokens->getNextTokenOfKind($index, ['{', ';']); - if ($tokens[$functionOpenIndex]->equals(';')) { // abstract function - $index = $functionOpenIndex - 1; - - continue; - } - - $functionCloseIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $functionOpenIndex); - $totalTokensAdded = 0; - - do { - $tokensAdded = $this->fixFunction( - $tokens, - $index, - $functionOpenIndex, - $functionCloseIndex - ); - - $totalTokensAdded += $tokensAdded; - } while ($tokensAdded > 0); - - $index = $functionCloseIndex + $totalTokensAdded; - $tokenCount += $totalTokensAdded; - } - } - - /** - * @param int $functionIndex token index of T_FUNCTION - * @param int $functionOpenIndex token index of the opening brace token of the function - * @param int $functionCloseIndex token index of the closing brace token of the function - * - * @return int >= 0 number of tokens inserted into the Tokens collection - */ - private function fixFunction(Tokens $tokens, int $functionIndex, int $functionOpenIndex, int $functionCloseIndex): int - { - static $riskyKinds = [ - CT::T_DYNAMIC_VAR_BRACE_OPEN, // "$h = ${$g};" case - T_EVAL, // "$c = eval('return $this;');" case - T_GLOBAL, - T_INCLUDE, // loading additional symbols we cannot analyze here - T_INCLUDE_ONCE, // " - T_REQUIRE, // " - T_REQUIRE_ONCE, // " - T_STATIC, - ]; - - $inserted = 0; - $candidates = []; - $isRisky = false; - - // go through the function declaration and check if references are passed - // - check if it will be risky to fix return statements of this function - for ($index = $functionIndex + 1; $index < $functionOpenIndex; ++$index) { - if ($tokens[$index]->equals('&')) { - $isRisky = true; - - break; - } - } - - // go through all the tokens of the body of the function: - // - check if it will be risky to fix return statements of this function - // - check nested functions; fix when found and update the upper limit + number of inserted token - // - check for return statements that might be fixed (based on if fixing will be risky, which is only know after analyzing the whole function) - - for ($index = $functionOpenIndex + 1; $index < $functionCloseIndex; ++$index) { - if ($tokens[$index]->isGivenKind(T_FUNCTION)) { - $nestedFunctionOpenIndex = $tokens->getNextTokenOfKind($index, ['{', ';']); - if ($tokens[$nestedFunctionOpenIndex]->equals(';')) { // abstract function - $index = $nestedFunctionOpenIndex - 1; - - continue; - } - - $nestedFunctionCloseIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $nestedFunctionOpenIndex); - - $tokensAdded = $this->fixFunction( - $tokens, - $index, - $nestedFunctionOpenIndex, - $nestedFunctionCloseIndex - ); - - $index = $nestedFunctionCloseIndex + $tokensAdded; - $functionCloseIndex += $tokensAdded; - $inserted += $tokensAdded; - } - - if ($isRisky) { - continue; // don't bother to look into anything else than nested functions as the current is risky already - } - - if ($tokens[$index]->equals('&')) { - $isRisky = true; - - continue; - } - - if ($tokens[$index]->isGivenKind(T_RETURN)) { - $candidates[] = $index; - - continue; - } - - // test if there this is anything in the function body that might - // change global state or indirect changes (like through references, eval, etc.) - - if ($tokens[$index]->isGivenKind($riskyKinds)) { - $isRisky = true; - - continue; - } - - if ($tokens[$index]->equals('$')) { - $nextIndex = $tokens->getNextMeaningfulToken($index); - if ($tokens[$nextIndex]->isGivenKind(T_VARIABLE)) { - $isRisky = true; // "$$a" case - - continue; - } - } - - if ($this->tokensAnalyzer->isSuperGlobal($index)) { - $isRisky = true; - - continue; - } - } - - if ($isRisky) { - return $inserted; - } - - // fix the candidates in reverse order when applicable - for ($i = \count($candidates) - 1; $i >= 0; --$i) { - $index = $candidates[$i]; - - // Check if returning only a variable (i.e. not the result of an expression, function call etc.) - $returnVarIndex = $tokens->getNextMeaningfulToken($index); - if (!$tokens[$returnVarIndex]->isGivenKind(T_VARIABLE)) { - continue; // example: "return 1;" - } - - $endReturnVarIndex = $tokens->getNextMeaningfulToken($returnVarIndex); - if (!$tokens[$endReturnVarIndex]->equalsAny([';', [T_CLOSE_TAG]])) { - continue; // example: "return $a + 1;" - } - - // Check that the variable is assigned just before it is returned - $assignVarEndIndex = $tokens->getPrevMeaningfulToken($index); - if (!$tokens[$assignVarEndIndex]->equals(';')) { - continue; // example: "? return $a;" - } - - // Note: here we are @ "; return $a;" (or "; return $a ? >") - do { - $prevMeaningFul = $tokens->getPrevMeaningfulToken($assignVarEndIndex); - - if (!$tokens[$prevMeaningFul]->equals(')')) { - break; - } - - $assignVarEndIndex = $tokens->findBlockStart(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $prevMeaningFul); - } while (true); - - $assignVarOperatorIndex = $tokens->getPrevTokenOfKind( - $assignVarEndIndex, - ['=', ';', '{', [T_OPEN_TAG], [T_OPEN_TAG_WITH_ECHO]] - ); - - if (null === $assignVarOperatorIndex || !$tokens[$assignVarOperatorIndex]->equals('=')) { - continue; - } - - // Note: here we are @ "= [^;{] ; return $a;" - $assignVarIndex = $tokens->getPrevMeaningfulToken($assignVarOperatorIndex); - if (!$tokens[$assignVarIndex]->equals($tokens[$returnVarIndex], false)) { - continue; - } - - // Note: here we are @ "$a = [^;{] ; return $a;" - $beforeAssignVarIndex = $tokens->getPrevMeaningfulToken($assignVarIndex); - if (!$tokens[$beforeAssignVarIndex]->equalsAny([';', '{', '}'])) { - continue; - } - - // Note: here we are @ "[;{}] $a = [^;{] ; return $a;" - $inserted += $this->simplifyReturnStatement( - $tokens, - $assignVarIndex, - $assignVarOperatorIndex, - $index, - $endReturnVarIndex - ); - } - - return $inserted; - } - - /** - * @return int >= 0 number of tokens inserted into the Tokens collection - */ - private function simplifyReturnStatement( - Tokens $tokens, - int $assignVarIndex, - int $assignVarOperatorIndex, - int $returnIndex, - int $returnVarEndIndex - ): int { - $inserted = 0; - $originalIndent = $tokens[$assignVarIndex - 1]->isWhitespace() - ? $tokens[$assignVarIndex - 1]->getContent() - : null - ; - - // remove the return statement - if ($tokens[$returnVarEndIndex]->equals(';')) { // do not remove PHP close tags - $tokens->clearTokenAndMergeSurroundingWhitespace($returnVarEndIndex); - } - - for ($i = $returnIndex; $i <= $returnVarEndIndex - 1; ++$i) { - $this->clearIfSave($tokens, $i); - } - - // remove no longer needed indentation of the old/remove return statement - if ($tokens[$returnIndex - 1]->isWhitespace()) { - $content = $tokens[$returnIndex - 1]->getContent(); - $fistLinebreakPos = strrpos($content, "\n"); - $content = false === $fistLinebreakPos - ? ' ' - : substr($content, $fistLinebreakPos) - ; - - $tokens[$returnIndex - 1] = new Token([T_WHITESPACE, $content]); - } - - // remove the variable and the assignment - for ($i = $assignVarIndex; $i <= $assignVarOperatorIndex; ++$i) { - $this->clearIfSave($tokens, $i); - } - - // insert new return statement - $tokens->insertAt($assignVarIndex, new Token([T_RETURN, 'return'])); - ++$inserted; - - // use the original indent of the var assignment for the new return statement - if ( - null !== $originalIndent - && $tokens[$assignVarIndex - 1]->isWhitespace() - && $originalIndent !== $tokens[$assignVarIndex - 1]->getContent() - ) { - $tokens[$assignVarIndex - 1] = new Token([T_WHITESPACE, $originalIndent]); - } - - // remove trailing space after the new return statement which might be added during the clean up process - $nextIndex = $tokens->getNonEmptySibling($assignVarIndex, 1); - if (!$tokens[$nextIndex]->isWhitespace()) { - $tokens->insertAt($nextIndex, new Token([T_WHITESPACE, ' '])); - ++$inserted; - } - - return $inserted; - } - - private function clearIfSave(Tokens $tokens, int $index): void - { - if ($tokens[$index]->isComment()) { - return; - } - - if ($tokens[$index]->isWhitespace() && $tokens[$tokens->getPrevNonWhitespace($index)]->isComment()) { - return; - } - - $tokens->clearTokenAndMergeSurroundingWhitespace($index); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ReturnNotation/SimplifiedNullReturnFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ReturnNotation/SimplifiedNullReturnFixer.php deleted file mode 100644 index ccf920b..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/ReturnNotation/SimplifiedNullReturnFixer.php +++ /dev/null @@ -1,161 +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\Fixer\ReturnNotation; - -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\Tokens; - -/** - * @author Graham Campbell - */ -final class SimplifiedNullReturnFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'A return statement wishing to return `void` should not return `null`.', - [ - new CodeSample("isTokenKindFound(T_RETURN); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind(T_RETURN)) { - continue; - } - - if ($this->needFixing($tokens, $index)) { - $this->clear($tokens, $index); - } - } - } - - /** - * Clear the return statement located at a given index. - */ - private function clear(Tokens $tokens, int $index): void - { - while (!$tokens[++$index]->equals(';')) { - if ($this->shouldClearToken($tokens, $index)) { - $tokens->clearAt($index); - } - } - } - - /** - * Does the return statement located at a given index need fixing? - */ - private function needFixing(Tokens $tokens, int $index): bool - { - if ($this->isStrictOrNullableReturnTypeFunction($tokens, $index)) { - return false; - } - - $content = ''; - while (!$tokens[$index]->equals(';')) { - $index = $tokens->getNextMeaningfulToken($index); - $content .= $tokens[$index]->getContent(); - } - - $content = ltrim($content, '('); - $content = rtrim($content, ');'); - - return 'null' === strtolower($content); - } - - /** - * Is the return within a function with a non-void or nullable return type? - * - * @param int $returnIndex Current return token index - */ - private function isStrictOrNullableReturnTypeFunction(Tokens $tokens, int $returnIndex): bool - { - $functionIndex = $returnIndex; - do { - $functionIndex = $tokens->getPrevTokenOfKind($functionIndex, [[T_FUNCTION]]); - if (null === $functionIndex) { - return false; - } - $openingCurlyBraceIndex = $tokens->getNextTokenOfKind($functionIndex, ['{']); - $closingCurlyBraceIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $openingCurlyBraceIndex); - } while ($closingCurlyBraceIndex < $returnIndex); - - $possibleVoidIndex = $tokens->getPrevMeaningfulToken($openingCurlyBraceIndex); - $isStrictReturnType = $tokens[$possibleVoidIndex]->isGivenKind(T_STRING) && 'void' !== $tokens[$possibleVoidIndex]->getContent(); - - $nullableTypeIndex = $tokens->getNextTokenOfKind($functionIndex, [[CT::T_NULLABLE_TYPE]]); - $isNullableReturnType = null !== $nullableTypeIndex && $nullableTypeIndex < $openingCurlyBraceIndex; - - return $isStrictReturnType || $isNullableReturnType; - } - - /** - * 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. - */ - private function shouldClearToken(Tokens $tokens, int $index): bool - { - $token = $tokens[$index]; - - return !$token->isComment() && !($token->isWhitespace() && $tokens[$index + 1]->isComment()); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Semicolon/MultilineWhitespaceBeforeSemicolonsFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Semicolon/MultilineWhitespaceBeforeSemicolonsFixer.php deleted file mode 100644 index f983a84..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Semicolon/MultilineWhitespaceBeforeSemicolonsFixer.php +++ /dev/null @@ -1,295 +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\Fixer\Semicolon; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Graham Campbell - * @author Egidijus Girčys - */ -final class MultilineWhitespaceBeforeSemicolonsFixer extends AbstractFixer implements ConfigurableFixerInterface, WhitespacesAwareFixerInterface -{ - /** - * @internal - */ - public const STRATEGY_NO_MULTI_LINE = 'no_multi_line'; - - /** - * @internal - */ - public const STRATEGY_NEW_LINE_FOR_CHAINED_CALLS = 'new_line_for_chained_calls'; - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Forbid multi-line whitespace before the closing semicolon or move the semicolon to the new line for chained calls.', - [ - new CodeSample( - 'method1() - ->method2() - ->method(3); - ?> -', - ['strategy' => self::STRATEGY_NEW_LINE_FOR_CHAINED_CALLS] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run before SpaceAfterSemicolonFixer. - * Must run after CombineConsecutiveIssetsFixer, NoEmptyStatementFixer, SimplifiedIfReturnFixer, SingleImportPerStatementFixer. - */ - public function getPriority(): int - { - return 0; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isTokenKindFound(';'); - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder( - 'strategy', - 'Forbid multi-line whitespace or move the semicolon to the new line for chained calls.' - )) - ->setAllowedValues([self::STRATEGY_NO_MULTI_LINE, self::STRATEGY_NEW_LINE_FOR_CHAINED_CALLS]) - ->setDefault(self::STRATEGY_NO_MULTI_LINE) - ->getOption(), - ]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - if (self::STRATEGY_NEW_LINE_FOR_CHAINED_CALLS === $this->configuration['strategy']) { - $this->applyChainedCallsFix($tokens); - - return; - } - - if (self::STRATEGY_NO_MULTI_LINE === $this->configuration['strategy']) { - $this->applyNoMultiLineFix($tokens); - } - } - - private function applyNoMultiLineFix(Tokens $tokens): void - { - $lineEnding = $this->whitespacesConfig->getLineEnding(); - - foreach ($tokens as $index => $token) { - if (!$token->equals(';')) { - continue; - } - - $previousIndex = $index - 1; - $previous = $tokens[$previousIndex]; - if (!$previous->isWhitespace() || false === strpos($previous->getContent(), "\n")) { - continue; - } - - $content = $previous->getContent(); - if (0 === strpos($content, $lineEnding) && $tokens[$index - 2]->isComment()) { - $tokens->ensureWhitespaceAtIndex($previousIndex, 0, $lineEnding); - } else { - $tokens->clearAt($previousIndex); - } - } - } - - private function applyChainedCallsFix(Tokens $tokens): void - { - for ($index = \count($tokens) - 1; $index >= 0; --$index) { - // continue if token is not a semicolon - if (!$tokens[$index]->equals(';')) { - continue; - } - - // get the indent of the chained call, null in case it's not a chained call - $indent = $this->findWhitespaceBeforeFirstCall($index - 1, $tokens); - - if (null === $indent) { - continue; - } - - // unset semicolon - $tokens->clearAt($index); - - // find the line ending token index after the semicolon - $index = $this->getNewLineIndex($index, $tokens); - - // line ending string of the last method call - $lineEnding = $this->whitespacesConfig->getLineEnding(); - - // appended new line to the last method call - $newline = new Token([T_WHITESPACE, $lineEnding.$indent]); - - // insert the new line with indented semicolon - $tokens->insertAt($index, [$newline, new Token(';')]); - } - } - - /** - * Find the index for the new line. Return the given index when there's no new line. - */ - private function getNewLineIndex(int $index, Tokens $tokens): int - { - $lineEnding = $this->whitespacesConfig->getLineEnding(); - - for ($index, $count = \count($tokens); $index < $count; ++$index) { - if (false !== strstr($tokens[$index]->getContent(), $lineEnding)) { - return $index; - } - } - - return $index; - } - - /** - * Checks if the semicolon closes a chained call and returns the whitespace of the first call at $index. - * i.e. it will return the whitespace marked with '____' in the example underneath. - * - * .. - * ____$this->methodCall() - * ->anotherCall(); - * .. - */ - private function findWhitespaceBeforeFirstCall(int $index, Tokens $tokens): ?string - { - // semicolon followed by a closing bracket? - if (!$tokens[$index]->equals(')')) { - return null; - } - - // find opening bracket - $openingBrackets = 1; - for (--$index; $index > 0; --$index) { - if ($tokens[$index]->equals(')')) { - ++$openingBrackets; - - continue; - } - - if ($tokens[$index]->equals('(')) { - if (1 === $openingBrackets) { - break; - } - --$openingBrackets; - } - } - - // method name - if (!$tokens[--$index]->isGivenKind(T_STRING)) { - return null; - } - - // ->, ?-> or :: - if (!$tokens[--$index]->isObjectOperator() && !$tokens[$index]->isGivenKind(T_DOUBLE_COLON)) { - return null; - } - - // white space - if (!$tokens[--$index]->isGivenKind(T_WHITESPACE)) { - return null; - } - - $closingBrackets = 0; - for ($index; $index >= 0; --$index) { - if ($tokens[$index]->equals(')')) { - ++$closingBrackets; - } - - if ($tokens[$index]->equals('(')) { - --$closingBrackets; - } - - // must be the variable of the first call in the chain - if ($tokens[$index]->isGivenKind([T_VARIABLE, T_RETURN, T_STRING]) && 0 === $closingBrackets) { - if ($tokens[--$index]->isGivenKind(T_WHITESPACE) - || $tokens[$index]->isGivenKind(T_OPEN_TAG)) { - return $this->getIndentAt($tokens, $index); - } - } - } - - return null; - } - - private function getIndentAt(Tokens $tokens, int $index): ?string - { - $content = ''; - $lineEnding = $this->whitespacesConfig->getLineEnding(); - - // find line ending token - for ($index; $index > 0; --$index) { - if (false !== strstr($tokens[$index]->getContent(), $lineEnding)) { - break; - } - } - - if ($tokens[$index]->isWhitespace()) { - $content = $tokens[$index]->getContent(); - --$index; - } - - if ($tokens[$index]->isGivenKind(T_OPEN_TAG)) { - $content = $tokens[$index]->getContent().$content; - } - - if (1 === Preg::match('/\R{1}(\h*)$/', $content, $matches)) { - return $matches[1]; - } - - return null; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Semicolon/NoEmptyStatementFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Semicolon/NoEmptyStatementFixer.php deleted file mode 100644 index 36ba1d3..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Semicolon/NoEmptyStatementFixer.php +++ /dev/null @@ -1,196 +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\Fixer\Semicolon; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * @author SpacePossum - * @author Dariusz Rumiński - */ -final class NoEmptyStatementFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Remove useless (semicolon) statements.', - [ - new CodeSample("isTokenKindFound(';'); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - for ($index = 0, $count = $tokens->count(); $index < $count; ++$index) { - if ($tokens[$index]->isGivenKind([T_BREAK, T_CONTINUE])) { - $index = $tokens->getNextMeaningfulToken($index); - - if ($tokens[$index]->equals([T_LNUMBER, '1'])) { - $tokens->clearTokenAndMergeSurroundingWhitespace($index); - } - - continue; - } - - // skip T_FOR parenthesis to ignore double `;` like `for ($i = 1; ; ++$i) {...}` - if ($tokens[$index]->isGivenKind(T_FOR)) { - $index = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $tokens->getNextMeaningfulToken($index)) + 1; - - continue; - } - - if (!$tokens[$index]->equals(';')) { - continue; - } - - $previousMeaningfulIndex = $tokens->getPrevMeaningfulToken($index); - - // A semicolon can always be removed if it follows a semicolon, '{' or opening tag. - if ($tokens[$previousMeaningfulIndex]->equalsAny(['{', ';', [T_OPEN_TAG]])) { - $tokens->clearTokenAndMergeSurroundingWhitespace($index); - - continue; - } - - // A semicolon might be removed if it follows a '}' but only if the brace is part of certain structures. - if ($tokens[$previousMeaningfulIndex]->equals('}')) { - $this->fixSemicolonAfterCurlyBraceClose($tokens, $index, $previousMeaningfulIndex); - - continue; - } - - // A semicolon might be removed together with its noop statement, for example "getPrevMeaningfulToken($previousMeaningfulIndex); - - if ( - $tokens[$prePreviousMeaningfulIndex]->equalsAny([';', '{', '}', [T_OPEN_TAG]]) - && $tokens[$previousMeaningfulIndex]->isGivenKind([T_CONSTANT_ENCAPSED_STRING, T_DNUMBER, T_LNUMBER, T_STRING, T_VARIABLE]) - ) { - $tokens->clearTokenAndMergeSurroundingWhitespace($index); - $tokens->clearTokenAndMergeSurroundingWhitespace($previousMeaningfulIndex); - } - } - } - - /** - * Fix semicolon after closing curly brace if needed. - * - * Test for the following cases - * - just '{' '}' block (following open tag or ';') - * - if, else, elseif - * - interface, trait, class (but not anonymous) - * - catch, finally (but not try) - * - for, foreach, while (but not 'do - while') - * - switch - * - function (declaration, but not lambda) - * - declare (with '{' '}') - * - namespace (with '{' '}') - * - * @param int $index Semicolon index - */ - private function fixSemicolonAfterCurlyBraceClose(Tokens $tokens, int $index, int $curlyCloseIndex): void - { - static $beforeCurlyOpeningKinds = null; - - if (null === $beforeCurlyOpeningKinds) { - $beforeCurlyOpeningKinds = [T_ELSE, T_FINALLY, T_NAMESPACE, T_OPEN_TAG]; - } - - $curlyOpeningIndex = $tokens->findBlockStart(Tokens::BLOCK_TYPE_CURLY_BRACE, $curlyCloseIndex); - $beforeCurlyOpeningIndex = $tokens->getPrevMeaningfulToken($curlyOpeningIndex); - - if ($tokens[$beforeCurlyOpeningIndex]->isGivenKind($beforeCurlyOpeningKinds) || $tokens[$beforeCurlyOpeningIndex]->equalsAny([';', '{', '}'])) { - $tokens->clearTokenAndMergeSurroundingWhitespace($index); - - return; - } - - // check for namespaces and class, interface and trait definitions - if ($tokens[$beforeCurlyOpeningIndex]->isGivenKind(T_STRING)) { - $classyTestIndex = $tokens->getPrevMeaningfulToken($beforeCurlyOpeningIndex); - - while ($tokens[$classyTestIndex]->equals(',') || $tokens[$classyTestIndex]->isGivenKind([T_STRING, T_NS_SEPARATOR, T_EXTENDS, T_IMPLEMENTS])) { - $classyTestIndex = $tokens->getPrevMeaningfulToken($classyTestIndex); - } - - $tokensAnalyzer = new TokensAnalyzer($tokens); - - if ( - $tokens[$classyTestIndex]->isGivenKind(T_NAMESPACE) - || ($tokens[$classyTestIndex]->isClassy() && !$tokensAnalyzer->isAnonymousClass($classyTestIndex)) - ) { - $tokens->clearTokenAndMergeSurroundingWhitespace($index); - } - - return; - } - - // early return check, below only control structures with conditions are fixed - if (!$tokens[$beforeCurlyOpeningIndex]->equals(')')) { - return; - } - - $openingBraceIndex = $tokens->findBlockStart(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $beforeCurlyOpeningIndex); - $beforeOpeningBraceIndex = $tokens->getPrevMeaningfulToken($openingBraceIndex); - - if ($tokens[$beforeOpeningBraceIndex]->isGivenKind([T_IF, T_ELSEIF, T_FOR, T_FOREACH, T_WHILE, T_SWITCH, T_CATCH, T_DECLARE])) { - $tokens->clearTokenAndMergeSurroundingWhitespace($index); - - return; - } - - // check for function definition - if ($tokens[$beforeOpeningBraceIndex]->isGivenKind(T_STRING)) { - $beforeStringIndex = $tokens->getPrevMeaningfulToken($beforeOpeningBraceIndex); - - if ($tokens[$beforeStringIndex]->isGivenKind(T_FUNCTION)) { - $tokens->clearTokenAndMergeSurroundingWhitespace($index); // implicit return - } - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Semicolon/NoSinglelineWhitespaceBeforeSemicolonsFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Semicolon/NoSinglelineWhitespaceBeforeSemicolonsFixer.php deleted file mode 100644 index 1cc51c0..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Semicolon/NoSinglelineWhitespaceBeforeSemicolonsFixer.php +++ /dev/null @@ -1,78 +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\Fixer\Semicolon; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Graham Campbell - */ -final class NoSinglelineWhitespaceBeforeSemicolonsFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Single-line whitespace before closing semicolon are prohibited.', - [new CodeSample("foo() ;\n")] - ); - } - - /** - * {@inheritdoc} - * - * Must run after CombineConsecutiveIssetsFixer, FunctionToConstantFixer, NoEmptyStatementFixer, SimplifiedIfReturnFixer, SingleImportPerStatementFixer. - */ - public function getPriority(): int - { - return 0; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isTokenKindFound(';'); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - foreach ($tokens as $index => $token) { - if (!$token->equals(';') || !$tokens[$index - 1]->isWhitespace(" \t")) { - continue; - } - - if ($tokens[$index - 2]->equals(';')) { - // do not remove all whitespace before the semicolon because it is also whitespace after another semicolon - if (!$tokens[$index - 1]->equals(' ')) { - $tokens[$index - 1] = new Token([T_WHITESPACE, ' ']); - } - } elseif (!$tokens[$index - 2]->isComment()) { - $tokens->clearAt($index - 1); - } - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Semicolon/SemicolonAfterInstructionFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Semicolon/SemicolonAfterInstructionFixer.php deleted file mode 100644 index 484a6c8..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Semicolon/SemicolonAfterInstructionFixer.php +++ /dev/null @@ -1,76 +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\Fixer\Semicolon; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author SpacePossum - */ -final class SemicolonAfterInstructionFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Instructions must be terminated with a semicolon.', - [new CodeSample("\n")] - ); - } - - /** - * {@inheritdoc} - * - * Must run before SimplifiedIfReturnFixer. - */ - public function getPriority(): int - { - return 2; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isTokenKindFound(T_CLOSE_TAG); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - for ($index = \count($tokens) - 1; $index > 1; --$index) { - if (!$tokens[$index]->isGivenKind(T_CLOSE_TAG)) { - continue; - } - - $prev = $tokens->getPrevMeaningfulToken($index); - if ($tokens[$prev]->equalsAny([';', '{', '}', ':', [T_OPEN_TAG]])) { - continue; - } - - $tokens->insertAt($prev + 1, new Token(';')); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Semicolon/SpaceAfterSemicolonFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Semicolon/SpaceAfterSemicolonFixer.php deleted file mode 100644 index 53977ef..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Semicolon/SpaceAfterSemicolonFixer.php +++ /dev/null @@ -1,149 +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\Fixer\Semicolon; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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 SpacePossum - */ -final class SpaceAfterSemicolonFixer extends AbstractFixer implements ConfigurableFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Fix whitespace after a semicolon.', - [ - new CodeSample( - " true, - ]), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run after CombineConsecutiveUnsetsFixer, MultilineWhitespaceBeforeSemicolonsFixer, NoEmptyStatementFixer, OrderedClassElementsFixer, SingleImportPerStatementFixer, SingleTraitInsertPerStatementFixer. - */ - public function getPriority(): int - { - return -1; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isTokenKindFound(';'); - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('remove_in_empty_for_expressions', 'Whether spaces should be removed for empty `for` expressions.')) - ->setAllowedTypes(['bool']) - ->setDefault(false) - ->getOption(), - ]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $insideForParenthesesUntil = null; - - for ($index = 0, $max = \count($tokens) - 1; $index < $max; ++$index) { - if ($this->configuration['remove_in_empty_for_expressions']) { - if ($tokens[$index]->isGivenKind(T_FOR)) { - $index = $tokens->getNextMeaningfulToken($index); - $insideForParenthesesUntil = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $index); - - continue; - } - - if ($index === $insideForParenthesesUntil) { - $insideForParenthesesUntil = null; - - continue; - } - } - - if (!$tokens[$index]->equals(';')) { - continue; - } - - if (!$tokens[$index + 1]->isWhitespace()) { - if ( - !$tokens[$index + 1]->equalsAny([')', [T_INLINE_HTML]]) && ( - !$this->configuration['remove_in_empty_for_expressions'] - || !$tokens[$index + 1]->equals(';') - ) - ) { - $tokens->insertAt($index + 1, new Token([T_WHITESPACE, ' '])); - ++$max; - } - - continue; - } - - if ( - null !== $insideForParenthesesUntil - && ($tokens[$index + 2]->equals(';') || $index + 2 === $insideForParenthesesUntil) - && !Preg::match('/\R/', $tokens[$index + 1]->getContent()) - ) { - $tokens->clearAt($index + 1); - - continue; - } - - if ( - isset($tokens[$index + 2]) - && !$tokens[$index + 1]->equals([T_WHITESPACE, ' ']) - && $tokens[$index + 1]->isWhitespace(" \t") - && !$tokens[$index + 2]->isComment() - && !$tokens[$index + 2]->equals(')') - ) { - $tokens[$index + 1] = new Token([T_WHITESPACE, ' ']); - } - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Strict/DeclareStrictTypesFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Strict/DeclareStrictTypesFixer.php deleted file mode 100644 index ef5d0be..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Strict/DeclareStrictTypesFixer.php +++ /dev/null @@ -1,155 +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\Fixer\Strict; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\FixerDefinition\VersionSpecification; -use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Jordi Boggiano - * @author SpacePossum - */ -final class DeclareStrictTypesFixer extends AbstractFixer implements WhitespacesAwareFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Force strict types declaration in all files. Requires PHP >= 7.0.', - [ - new VersionSpecificCodeSample( - "= 70000 && isset($tokens[0]) && $tokens[0]->isGivenKind(T_OPEN_TAG); - } - - /** - * {@inheritdoc} - */ - public function isRisky(): bool - { - return true; - } - - /** - * {@inheritdoc} - */ - 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 - - return; - } - - $sequenceLocation = $tokens->findSequence([[T_DECLARE, 'declare'], '(', [T_STRING, 'strict_types'], '=', [T_LNUMBER], ')'], $searchIndex, null, false); - if (null === $sequenceLocation) { - $this->insertSequence($tokens); // declaration not found, insert one - - return; - } - - $this->fixStrictTypesCasingAndValue($tokens, $sequenceLocation); - } - - /** - * @param array $sequence - */ - private function fixStrictTypesCasingAndValue(Tokens $tokens, array $sequence): void - { - /** @var int $index */ - /** @var Token $token */ - foreach ($sequence as $index => $token) { - if ($token->isGivenKind(T_STRING)) { - $tokens[$index] = new Token([T_STRING, strtolower($token->getContent())]); - - continue; - } - if ($token->isGivenKind(T_LNUMBER)) { - $tokens[$index] = new Token([T_LNUMBER, '1']); - - break; - } - } - } - - private function insertSequence(Tokens $tokens): void - { - $sequence = [ - new Token([T_DECLARE, 'declare']), - new Token('('), - new Token([T_STRING, 'strict_types']), - new Token('='), - new Token([T_LNUMBER, '1']), - new Token(')'), - new Token(';'), - ]; - $endIndex = \count($sequence); - - $tokens->insertAt(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()).' ']); - } - - if ($endIndex === \count($tokens) - 1) { - return; // no more tokens afters 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; - } - - $content = $tokens[1 + $endIndex]->getContent(); - $tokens[1 + $endIndex] = new Token([T_WHITESPACE, $lineEnding.ltrim($content, " \t")]); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Strict/StrictComparisonFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Strict/StrictComparisonFixer.php deleted file mode 100644 index b03ff31..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Strict/StrictComparisonFixer.php +++ /dev/null @@ -1,89 +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\Fixer\Strict; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dariusz Rumiński - */ -final class StrictComparisonFixer extends AbstractFixer -{ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Comparisons should be strict.', - [new CodeSample("isAnyTokenKindsFound([T_IS_EQUAL, T_IS_NOT_EQUAL]); - } - - /** - * {@inheritdoc} - */ - public function isRisky(): bool - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - static $map = [ - T_IS_EQUAL => [ - 'id' => T_IS_IDENTICAL, - 'content' => '===', - ], - T_IS_NOT_EQUAL => [ - 'id' => T_IS_NOT_IDENTICAL, - 'content' => '!==', - ], - ]; - - foreach ($tokens as $index => $token) { - $tokenId = $token->getId(); - - if (isset($map[$tokenId])) { - $tokens[$index] = new Token([$map[$tokenId]['id'], $map[$tokenId]['content']]); - } - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Strict/StrictParamFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Strict/StrictParamFixer.php deleted file mode 100644 index dbe9332..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Strict/StrictParamFixer.php +++ /dev/null @@ -1,177 +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\Fixer\Strict; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Analyzer\FunctionsAnalyzer; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dariusz Rumiński - */ -final class StrictParamFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Functions should be used with `$strict` param set to `true`.', - [new CodeSample("isTokenKindFound(T_STRING); - } - - /** - * {@inheritdoc} - */ - public function isRisky(): bool - { - return true; - } - - /** - * {@inheritdoc} - * - * Must run before NativeFunctionInvocationFixer. - */ - public function getPriority(): int - { - return 11; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $functionsAnalyzer = new FunctionsAnalyzer(); - - static $map = null; - - if (null === $map) { - $trueToken = new Token([T_STRING, 'true']); - - $map = [ - 'array_keys' => [null, null, $trueToken], - 'array_search' => [null, null, $trueToken], - 'base64_decode' => [null, $trueToken], - 'in_array' => [null, null, $trueToken], - 'mb_detect_encoding' => [null, [new Token([T_STRING, 'mb_detect_order']), new Token('('), new Token(')')], $trueToken], - ]; - } - - for ($index = $tokens->count() - 1; 0 <= $index; --$index) { - $token = $tokens[$index]; - - $nextIndex = $tokens->getNextMeaningfulToken($index); - if (null !== $nextIndex && !$tokens[$nextIndex]->equals('(')) { - continue; - } - - $lowercaseContent = strtolower($token->getContent()); - if (isset($map[$lowercaseContent]) && $functionsAnalyzer->isGlobalFunctionCall($tokens, $index)) { - $this->fixFunction($tokens, $index, $map[$lowercaseContent]); - } - } - } - - private function fixFunction(Tokens $tokens, int $functionIndex, array $functionParams): void - { - $startBraceIndex = $tokens->getNextTokenOfKind($functionIndex, ['(']); - $endBraceIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $startBraceIndex); - $paramsQuantity = 0; - $expectParam = true; - - for ($index = $startBraceIndex + 1; $index < $endBraceIndex; ++$index) { - $token = $tokens[$index]; - - if ($expectParam && !$token->isWhitespace() && !$token->isComment()) { - ++$paramsQuantity; - $expectParam = false; - } - - if ($token->equals('(')) { - $index = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $index); - - continue; - } - - if ($token->isGivenKind(CT::T_ARRAY_SQUARE_BRACE_OPEN)) { - $index = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_ARRAY_SQUARE_BRACE, $index); - - continue; - } - - if ($token->equals(',')) { - $expectParam = true; - - continue; - } - } - - $functionParamsQuantity = \count($functionParams); - - if ($paramsQuantity === $functionParamsQuantity) { - return; - } - - $tokensToInsert = []; - - 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]) { - return; - } - - $tokensToInsert[] = new Token(','); - $tokensToInsert[] = new Token([T_WHITESPACE, ' ']); - - if (!\is_array($functionParams[$i])) { - $tokensToInsert[] = clone $functionParams[$i]; - - continue; - } - - foreach ($functionParams[$i] as $param) { - $tokensToInsert[] = clone $param; - } - } - - $beforeEndBraceIndex = $tokens->getPrevMeaningfulToken($endBraceIndex); - - if ($tokens[$beforeEndBraceIndex]->equals(',')) { - array_shift($tokensToInsert); - $tokensToInsert[] = new Token(','); - } - - $tokens->insertAt($beforeEndBraceIndex + 1, $tokensToInsert); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/EscapeImplicitBackslashesFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/EscapeImplicitBackslashesFixer.php deleted file mode 100644 index bcae727..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/EscapeImplicitBackslashesFixer.php +++ /dev/null @@ -1,171 +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\Fixer\StringNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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 - */ -final class EscapeImplicitBackslashesFixer extends AbstractFixer implements ConfigurableFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - $codeSample = <<<'EOF' - true] - ), - new CodeSample( - $codeSample, - ['double_quoted' => false] - ), - new CodeSample( - $codeSample, - ['heredoc_syntax' => false] - ), - ], - '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.' - ); - } - - /** - * {@inheritdoc} - */ - 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. - */ - public function getPriority(): int - { - return 1; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - static $singleQuotedRegex = '/(? $token) { - $content = $token->getContent(); - if ($token->equalsAny(['"', 'b"', 'B"'])) { - $doubleQuoteOpened = !$doubleQuoteOpened; - } - if (!$token->isGivenKind([T_ENCAPSED_AND_WHITESPACE, T_CONSTANT_ENCAPSED_STRING]) || false === strpos($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]); - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('single_quoted', 'Whether to fix single-quoted strings.')) - ->setAllowedTypes(['bool']) - ->setDefault(false) - ->getOption(), - (new FixerOptionBuilder('double_quoted', 'Whether to fix double-quoted strings.')) - ->setAllowedTypes(['bool']) - ->setDefault(true) - ->getOption(), - (new FixerOptionBuilder('heredoc_syntax', 'Whether to fix heredoc syntax.')) - ->setAllowedTypes(['bool']) - ->setDefault(true) - ->getOption(), - ]); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/ExplicitStringVariableFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/ExplicitStringVariableFixer.php deleted file mode 100644 index 2c74756..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/ExplicitStringVariableFixer.php +++ /dev/null @@ -1,173 +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\Fixer\StringNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Filippo Tessarotto - */ -final class ExplicitStringVariableFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Converts implicit variables into explicit ones in double-quoted strings or heredoc syntax.', - [new CodeSample( - <<<'EOT' -country !"; -$c = "I have $farm[0] chickens !"; - -EOT - )], - '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".'- 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' - ); - } - - /** - * {@inheritdoc} - * - * Must run before SimpleToComplexStringVariableFixer. - * Must run after BacktickToShellExecFixer. - */ - public function getPriority(): int - { - return 0; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isTokenKindFound(T_VARIABLE); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $backtickStarted = false; - for ($index = \count($tokens) - 1; $index > 0; --$index) { - $token = $tokens[$index]; - if ($token->equals('`')) { - $backtickStarted = !$backtickStarted; - - continue; - } - - if ($backtickStarted || !$token->isGivenKind(T_VARIABLE)) { - continue; - } - - $prevToken = $tokens[$index - 1]; - if (!$this->isStringPartToken($prevToken)) { - continue; - } - - $distinctVariableIndex = $index; - $variableTokens = [ - $distinctVariableIndex => [ - 'tokens' => [$index => $token], - 'firstVariableTokenIndex' => $index, - 'lastVariableTokenIndex' => $index, - ], - ]; - - $nextIndex = $index + 1; - $squareBracketCount = 0; - while (!$this->isStringPartToken($tokens[$nextIndex])) { - if ($tokens[$nextIndex]->isGivenKind(T_CURLY_OPEN)) { - $nextIndex = $tokens->getNextTokenOfKind($nextIndex, [[CT::T_CURLY_CLOSE]]); - } elseif ($tokens[$nextIndex]->isGivenKind(T_VARIABLE) && 1 !== $squareBracketCount) { - $distinctVariableIndex = $nextIndex; - $variableTokens[$distinctVariableIndex] = [ - 'tokens' => [$nextIndex => $tokens[$nextIndex]], - 'firstVariableTokenIndex' => $nextIndex, - 'lastVariableTokenIndex' => $nextIndex, - ]; - } else { - $variableTokens[$distinctVariableIndex]['tokens'][$nextIndex] = $tokens[$nextIndex]; - $variableTokens[$distinctVariableIndex]['lastVariableTokenIndex'] = $nextIndex; - - if ($tokens[$nextIndex]->equalsAny(['[', ']'])) { - ++$squareBracketCount; - } - } - - ++$nextIndex; - } - krsort($variableTokens, SORT_NUMERIC); - - foreach ($variableTokens as $distinctVariableSet) { - if (1 === \count($distinctVariableSet['tokens'])) { - $singleVariableIndex = key($distinctVariableSet['tokens']); - $singleVariableToken = current($distinctVariableSet['tokens']); - $tokens->overrideRange($singleVariableIndex, $singleVariableIndex, [ - new Token([T_DOLLAR_OPEN_CURLY_BRACES, '${']), - new Token([T_STRING_VARNAME, substr($singleVariableToken->getContent(), 1)]), - new Token([CT::T_DOLLAR_CLOSE_CURLY_BRACES, '}']), - ]); - } else { - foreach ($distinctVariableSet['tokens'] as $variablePartIndex => $variablePartToken) { - if ($variablePartToken->isGivenKind(T_NUM_STRING)) { - $tokens[$variablePartIndex] = new Token([T_LNUMBER, $variablePartToken->getContent()]); - - continue; - } - - if ($variablePartToken->isGivenKind(T_STRING) && $tokens[$variablePartIndex + 1]->equals(']')) { - $tokens[$variablePartIndex] = new Token([T_CONSTANT_ENCAPSED_STRING, "'".$variablePartToken->getContent()."'"]); - } - } - - $tokens->insertAt($distinctVariableSet['lastVariableTokenIndex'] + 1, new Token([CT::T_CURLY_CLOSE, '}'])); - $tokens->insertAt($distinctVariableSet['firstVariableTokenIndex'], new Token([T_CURLY_OPEN, '{'])); - } - } - } - } - - /** - * Check if token is a part of a string. - * - * @param Token $token The token to check - */ - private function isStringPartToken(Token $token): bool - { - return $token->isGivenKind(T_ENCAPSED_AND_WHITESPACE) - || $token->isGivenKind(T_START_HEREDOC) - || '"' === $token->getContent() - || 'b"' === strtolower($token->getContent()) - ; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/HeredocToNowdocFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/HeredocToNowdocFixer.php deleted file mode 100644 index 343fad5..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/HeredocToNowdocFixer.php +++ /dev/null @@ -1,116 +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\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 Gregor Harlan - */ -final class HeredocToNowdocFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Convert `heredoc` to `nowdoc` where possible.', - [ - new CodeSample( - <<<'EOF' -isTokenKindFound(T_START_HEREDOC); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind(T_START_HEREDOC) || false !== strpos($token->getContent(), "'")) { - continue; - } - - if ($tokens[$index + 1]->isGivenKind(T_END_HEREDOC)) { - $tokens[$index] = $this->convertToNowdoc($token); - - continue; - } - - if ( - !$tokens[$index + 1]->isGivenKind(T_ENCAPSED_AND_WHITESPACE) - || !$tokens[$index + 2]->isGivenKind(T_END_HEREDOC) - ) { - continue; - } - - $content = $tokens[$index + 1]->getContent(); - // regex: odd number of backslashes, not followed by dollar - if (Preg::match('/(?convertToNowdoc($token); - $content = str_replace(['\\\\', '\\$'], ['\\', '$'], $content); - $tokens[$index + 1] = new Token([ - $tokens[$index + 1]->getId(), - $content, - ]); - } - } - - /** - * Transforms the heredoc start token to nowdoc notation. - */ - private function convertToNowdoc(Token $token): Token - { - return new Token([ - $token->getId(), - Preg::replace('/^([Bb]?<<<)(\h*)"?([^\s"]+)"?/', '$1$2\'$3\'', $token->getContent()), - ]); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/NoBinaryStringFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/NoBinaryStringFixer.php deleted file mode 100644 index c2b05c5..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/NoBinaryStringFixer.php +++ /dev/null @@ -1,68 +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\Fixer\StringNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author ntzm - */ -final class NoBinaryStringFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isAnyTokenKindsFound([T_CONSTANT_ENCAPSED_STRING, T_START_HEREDOC]); - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'There should not be a binary flag before strings.', - [ - new CodeSample(" $token) { - if (!$token->isGivenKind([T_CONSTANT_ENCAPSED_STRING, T_START_HEREDOC])) { - continue; - } - - $content = $token->getContent(); - - if ('b' === strtolower($content[0])) { - $tokens[$index] = new Token([$token->getId(), substr($content, 1)]); - } - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/NoTrailingWhitespaceInStringFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/NoTrailingWhitespaceInStringFixer.php deleted file mode 100644 index 8ba97ff..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/NoTrailingWhitespaceInStringFixer.php +++ /dev/null @@ -1,112 +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\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 Gregor Harlan - */ -final class NoTrailingWhitespaceInStringFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isAnyTokenKindsFound([T_CONSTANT_ENCAPSED_STRING, T_ENCAPSED_AND_WHITESPACE, T_INLINE_HTML]); - } - - /** - * {@inheritdoc} - */ - public function isRisky(): bool - { - return true; - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'There must be no trailing whitespace in strings.', - [ - new CodeSample( - "count() - 1, $last = true; $index >= 0; --$index, $last = false) { - /** @var Token $token */ - $token = $tokens[$index]; - - if (!$token->isGivenKind([T_CONSTANT_ENCAPSED_STRING, T_ENCAPSED_AND_WHITESPACE, T_INLINE_HTML])) { - continue; - } - - $isInlineHtml = $token->isGivenKind(T_INLINE_HTML); - $regex = $isInlineHtml && $last ? '/\h+(?=\R|$)/' : '/\h+(?=\R)/'; - $content = Preg::replace($regex, '', $token->getContent()); - - if ($token->getContent() === $content) { - continue; - } - - if (!$isInlineHtml || 0 === $index) { - $this->updateContent($tokens, $index, $content); - - continue; - } - - $prev = $index - 1; - - if ($tokens[$prev]->equals([T_CLOSE_TAG, '?>']) && Preg::match('/^\R/', $content, $match)) { - $tokens[$prev] = new Token([T_CLOSE_TAG, $tokens[$prev]->getContent().$match[0]]); - $content = substr($content, \strlen($match[0])); - $content = false === $content ? '' : $content; // @phpstan-ignore-line due to https://github.com/phpstan/phpstan/issues/1215 , awaiting PHP8 as min requirement of Fixer - } - - $this->updateContent($tokens, $index, $content); - } - } - - private function updateContent(Tokens $tokens, int $index, string $content): void - { - if ('' === $content) { - $tokens->clearAt($index); - - return; - } - - $tokens[$index] = new Token([$tokens[$index]->getId(), $content]); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/SimpleToComplexStringVariableFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/SimpleToComplexStringVariableFixer.php deleted file mode 100644 index 8ad3915..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/SimpleToComplexStringVariableFixer.php +++ /dev/null @@ -1,116 +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\Fixer\StringNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dave van der Brugge - */ -final class SimpleToComplexStringVariableFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Converts explicit variables in double-quoted strings and heredoc syntax from simple to complex format (`${` to `{$`).', - [ - new CodeSample( - <<<'EOT' -isTokenKindFound(T_DOLLAR_OPEN_CURLY_BRACES); - } - - 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)) { - continue; - } - - $varnameToken = $tokens[$index + 1]; - - if (!$varnameToken->isGivenKind(T_STRING_VARNAME)) { - continue; - } - - $dollarCloseToken = $tokens[$index + 2]; - - if (!$dollarCloseToken->isGivenKind(CT::T_DOLLAR_CLOSE_CURLY_BRACES)) { - continue; - } - - $tokenOfStringBeforeToken = $tokens[$index - 1]; - $stringContent = $tokenOfStringBeforeToken->getContent(); - - if ('$' === substr($stringContent, -1) && '\\$' !== substr($stringContent, -2)) { - $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, '}']), - ]); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/SingleQuoteFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/SingleQuoteFixer.php deleted file mode 100644 index 959b8cc..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/SingleQuoteFixer.php +++ /dev/null @@ -1,120 +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\Fixer\StringNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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 Gregor Harlan - */ -final class SingleQuoteFixer extends AbstractFixer implements ConfigurableFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - $codeSample = <<<'EOF' - true] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run after BacktickToShellExecFixer, EscapeImplicitBackslashesFixer. - */ - public function getPriority(): int - { - return 0; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isTokenKindFound(T_CONSTANT_ENCAPSED_STRING); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - foreach ($tokens as $index => $token) { - if (!$token->isGivenKind(T_CONSTANT_ENCAPSED_STRING)) { - continue; - } - - $content = $token->getContent(); - $prefix = ''; - - if ('b' === strtolower($content[0])) { - $prefix = $content[0]; - $content = substr($content, 1); - } - - if ( - '"' === $content[0] - && (true === $this->configuration['strings_containing_single_quote_chars'] || false === strpos($content, "'")) - // regex: odd number of backslashes, not followed by double quote or dollar - && !Preg::match('/(?setAllowedTypes(['bool']) - ->setDefault(false) - ->getOption(), - ]); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/StringLineEndingFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/StringLineEndingFixer.php deleted file mode 100644 index 7e50c73..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/StringLineEndingFixer.php +++ /dev/null @@ -1,88 +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\Fixer\StringNotation; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Fixes the line endings in multi-line strings. - * - * @author Ilija Tovilo - */ -final class StringLineEndingFixer extends AbstractFixer implements WhitespacesAwareFixerInterface -{ - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isAnyTokenKindsFound([T_CONSTANT_ENCAPSED_STRING, T_ENCAPSED_AND_WHITESPACE, T_INLINE_HTML]); - } - - /** - * {@inheritdoc} - */ - public function isRisky(): bool - { - return true; - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'All multi-line strings must use correct line ending.', - [ - new CodeSample( - "whitespacesConfig->getLineEnding(); - - foreach ($tokens as $tokenIndex => $token) { - if (!$token->isGivenKind([T_CONSTANT_ENCAPSED_STRING, T_ENCAPSED_AND_WHITESPACE, T_INLINE_HTML])) { - continue; - } - - $tokens[$tokenIndex] = new Token([ - $token->getId(), - Preg::replace( - '#\R#u', - $ending, - $token->getContent() - ), - ]); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/ArrayIndentationFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/ArrayIndentationFixer.php deleted file mode 100644 index 542770f..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/ArrayIndentationFixer.php +++ /dev/null @@ -1,276 +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\Fixer\Whitespace; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -final class ArrayIndentationFixer extends AbstractFixer implements WhitespacesAwareFixerInterface -{ - /** @var int */ - private $newlineTokenIndexCache; - - /** @var int */ - private $newlineTokenPositionCache; - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Each element of an array must be indented exactly once.', - [ - new CodeSample(" [\n 'baz' => true,\n ],\n];\n"), - ] - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isAnyTokenKindsFound([T_ARRAY, CT::T_ARRAY_SQUARE_BRACE_OPEN]); - } - - /** - * {@inheritdoc} - * - * Must run before AlignMultilineCommentFixer, BinaryOperatorSpacesFixer. - * Must run after BracesFixer, MethodArgumentSpaceFixer, MethodChainingIndentationFixer. - */ - public function getPriority(): int - { - return 29; - } - - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $this->returnWithUpdateCache(0, null); - - $scopes = []; - $previousLineInitialIndent = ''; - $previousLineNewIndent = ''; - - foreach ($tokens as $index => $token) { - $currentScope = [] !== $scopes ? \count($scopes) - 1 : null; - - if ($token->isComment()) { - continue; - } - - if ( - $token->isGivenKind(CT::T_ARRAY_SQUARE_BRACE_OPEN) - || ($token->equals('(') && $tokens[$tokens->getPrevMeaningfulToken($index)]->isGivenKind(T_ARRAY)) - ) { - $endIndex = $tokens->findBlockEnd( - $token->equals('(') ? Tokens::BLOCK_TYPE_PARENTHESIS_BRACE : Tokens::BLOCK_TYPE_ARRAY_SQUARE_BRACE, - $index - ); - - $scopes[] = [ - 'type' => 'array', - 'end_index' => $endIndex, - 'initial_indent' => $this->getLineIndentation($tokens, $index), - ]; - - continue; - } - - if (null === $currentScope) { - continue; - } - - if ($token->isWhitespace()) { - if (!Preg::match('/\R/', $token->getContent())) { - continue; - } - - if ('array' === $scopes[$currentScope]['type']) { - $indent = false; - - for ($searchEndIndex = $index + 1; $searchEndIndex < $scopes[$currentScope]['end_index']; ++$searchEndIndex) { - $searchEndToken = $tokens[$searchEndIndex]; - - if ( - (!$searchEndToken->isWhitespace() && !$searchEndToken->isComment()) - || ($searchEndToken->isWhitespace() && Preg::match('/\R/', $searchEndToken->getContent())) - ) { - $indent = true; - - break; - } - } - - $content = Preg::replace( - '/(\R+)\h*$/', - '$1'.$scopes[$currentScope]['initial_indent'].($indent ? $this->whitespacesConfig->getIndent() : ''), - $token->getContent() - ); - - $previousLineInitialIndent = $this->extractIndent($token->getContent()); - $previousLineNewIndent = $this->extractIndent($content); - } else { - $content = Preg::replace( - '/(\R)'.preg_quote($scopes[$currentScope]['initial_indent'], '/').'(\h*)$/', - '$1'.$scopes[$currentScope]['new_indent'].'$2', - $token->getContent() - ); - } - - $tokens[$index] = new Token([T_WHITESPACE, $content]); - - continue; - } - - if ($index === $scopes[$currentScope]['end_index']) { - while ([] !== $scopes && $index === $scopes[$currentScope]['end_index']) { - array_pop($scopes); - --$currentScope; - } - - continue; - } - - if ($token->equals(',')) { - continue; - } - - if ('expression' !== $scopes[$currentScope]['type']) { - $endIndex = $this->findExpressionEndIndex($tokens, $index, $scopes[$currentScope]['end_index']); - - if ($endIndex === $index) { - continue; - } - - $scopes[] = [ - 'type' => 'expression', - 'end_index' => $endIndex, - 'initial_indent' => $previousLineInitialIndent, - 'new_indent' => $previousLineNewIndent, - ]; - } - } - } - - private function findExpressionEndIndex(Tokens $tokens, int $index, int $parentScopeEndIndex): int - { - $endIndex = null; - - for ($searchEndIndex = $index + 1; $searchEndIndex < $parentScopeEndIndex; ++$searchEndIndex) { - $searchEndToken = $tokens[$searchEndIndex]; - - if ($searchEndToken->equalsAny(['(', '{']) || $searchEndToken->isGivenKind(CT::T_ARRAY_SQUARE_BRACE_OPEN)) { - $type = Tokens::detectBlockType($searchEndToken); - $searchEndIndex = $tokens->findBlockEnd( - $type['type'], - $searchEndIndex - ); - - continue; - } - - if ($searchEndToken->equals(',')) { - $endIndex = $tokens->getPrevMeaningfulToken($searchEndIndex); - - break; - } - } - - if (null !== $endIndex) { - return $endIndex; - } - - return $tokens->getPrevMeaningfulToken($parentScopeEndIndex); - } - - private function getLineIndentation(Tokens $tokens, int $index): string - { - $newlineTokenIndex = $this->getPreviousNewlineTokenIndex($tokens, $index); - - if (null === $newlineTokenIndex) { - return ''; - } - - return $this->extractIndent($this->computeNewLineContent($tokens, $newlineTokenIndex)); - } - - private function extractIndent(string $content): string - { - if (Preg::match('/\R(\h*)[^\r\n]*$/D', $content, $matches)) { - return $matches[1]; - } - - return ''; - } - - private function getPreviousNewlineTokenIndex(Tokens $tokens, int $startIndex): ?int - { - $index = $startIndex; - while ($index > 0) { - $index = $tokens->getPrevTokenOfKind($index, [[T_WHITESPACE], [T_INLINE_HTML]]); - - if ($this->newlineTokenIndexCache > $index) { - return $this->returnWithUpdateCache($startIndex, $this->newlineTokenPositionCache); - } - - if (null === $index) { - break; - } - - if ($this->isNewLineToken($tokens, $index)) { - return $this->returnWithUpdateCache($startIndex, $index); - } - } - - return $this->returnWithUpdateCache($startIndex, null); - } - - private function isNewLineToken(Tokens $tokens, int $index): bool - { - if (!$tokens[$index]->isGivenKind([T_WHITESPACE, T_INLINE_HTML])) { - return false; - } - - return (bool) Preg::match('/\R/', $this->computeNewLineContent($tokens, $index)); - } - - private function computeNewLineContent(Tokens $tokens, int $index): string - { - $content = $tokens[$index]->getContent(); - - if (0 !== $index && $tokens[$index - 1]->equalsAny([[T_OPEN_TAG], [T_CLOSE_TAG]])) { - $content = Preg::replace('/\S/', '', $tokens[$index - 1]->getContent()).$content; - } - - return $content; - } - - private function returnWithUpdateCache(int $index, ?int $position): ?int - { - $this->newlineTokenIndexCache = $index; - $this->newlineTokenPositionCache = $position; - - return $position; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/BlankLineBeforeStatementFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/BlankLineBeforeStatementFixer.php deleted file mode 100644 index 1a8364d..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/BlankLineBeforeStatementFixer.php +++ /dev/null @@ -1,350 +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\Fixer\Whitespace; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerConfiguration\AllowedValueSubset; -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\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * @author Dariusz Rumiński - * @author Andreas Möller - * @author SpacePossum - */ -final class BlankLineBeforeStatementFixer extends AbstractFixer implements ConfigurableFixerInterface, WhitespacesAwareFixerInterface -{ - /** - * @var array - */ - private static $tokenMap = [ - 'break' => T_BREAK, - 'case' => T_CASE, - 'continue' => T_CONTINUE, - 'declare' => T_DECLARE, - 'default' => T_DEFAULT, - 'do' => T_DO, - 'exit' => T_EXIT, - 'for' => T_FOR, - 'foreach' => T_FOREACH, - 'goto' => T_GOTO, - 'if' => T_IF, - 'include' => T_INCLUDE, - 'include_once' => T_INCLUDE_ONCE, - 'require' => T_REQUIRE, - 'require_once' => T_REQUIRE_ONCE, - 'return' => T_RETURN, - 'switch' => T_SWITCH, - 'throw' => T_THROW, - 'try' => T_TRY, - 'while' => T_WHILE, - 'yield' => T_YIELD, - 'yield_from' => T_YIELD_FROM, - ]; - - /** - * @var array - */ - private $fixTokenMap = []; - - /** - * {@inheritdoc} - */ - 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); - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'An empty line feed must precede any configured statement.', - [ - new CodeSample( - 'process(); - break; - case 44: - break; -} -', - [ - 'statements' => ['break'], - ] - ), - new CodeSample( - 'isTired()) { - $bar->sleep(); - continue; - } -} -', - [ - 'statements' => ['continue'], - ] - ), - new CodeSample( - ' 0); -', - [ - 'statements' => ['do'], - ] - ), - new CodeSample( - ' ['exit'], - ] - ), - new CodeSample( - ' ['goto'], - ] - ), - new CodeSample( - ' ['if'], - ] - ), - new CodeSample( - ' ['return'], - ] - ), - new CodeSample( - ' ['switch'], - ] - ), - new CodeSample( - 'bar(); - throw new \UnexpectedValueException("A cannot be null."); -} -', - [ - 'statements' => ['throw'], - ] - ), - new CodeSample( - 'bar(); -} catch (\Exception $exception) { - $a = -1; -} -', - [ - 'statements' => ['try'], - ] - ), - new CodeSample( - ' ['yield'], - ] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run after NoExtraBlankLinesFixer, NoUselessReturnFixer, ReturnAssignmentFixer. - */ - public function getPriority(): int - { - return -21; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isAnyTokenKindsFound($this->fixTokenMap); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $analyzer = new TokensAnalyzer($tokens); - - for ($index = $tokens->count() - 1; $index > 0; --$index) { - $token = $tokens[$index]; - - if (!$token->isGivenKind($this->fixTokenMap)) { - continue; - } - - if ($token->isGivenKind(T_WHILE) && $analyzer->isWhilePartOfDoWhile($index)) { - continue; - } - - $prevNonWhitespace = $tokens->getPrevNonWhitespace($index); - - if ($this->shouldAddBlankLine($tokens, $prevNonWhitespace)) { - $this->insertBlankLine($tokens, $index); - } - - $index = $prevNonWhitespace; - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - 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))]) - ->setDefault([ - 'break', - 'continue', - 'declare', - 'return', - 'throw', - 'try', - ]) - ->getOption(), - ]); - } - - private function shouldAddBlankLine(Tokens $tokens, int $prevNonWhitespace): bool - { - $prevNonWhitespaceToken = $tokens[$prevNonWhitespace]; - - if ($prevNonWhitespaceToken->isComment()) { - for ($j = $prevNonWhitespace - 1; $j >= 0; --$j) { - if (false !== strpos($tokens[$j]->getContent(), "\n")) { - return false; - } - - if ($tokens[$j]->isWhitespace() || $tokens[$j]->isComment()) { - continue; - } - - return $tokens[$j]->equalsAny([';', '}']); - } - } - - return $prevNonWhitespaceToken->equalsAny([';', '}']); - } - - private function insertBlankLine(Tokens $tokens, int $index): void - { - $prevIndex = $index - 1; - $prevToken = $tokens[$prevIndex]; - $lineEnding = $this->whitespacesConfig->getLineEnding(); - - if ($prevToken->isWhitespace()) { - $newlinesCount = substr_count($prevToken->getContent(), "\n"); - - if (0 === $newlinesCount) { - $tokens[$prevIndex] = new Token([T_WHITESPACE, rtrim($prevToken->getContent(), " \t").$lineEnding.$lineEnding]); - } elseif (1 === $newlinesCount) { - $tokens[$prevIndex] = new Token([T_WHITESPACE, $lineEnding.$prevToken->getContent()]); - } - } else { - $tokens->insertAt($index, new Token([T_WHITESPACE, $lineEnding.$lineEnding])); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/CompactNullableTypehintFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/CompactNullableTypehintFixer.php deleted file mode 100644 index e92a69b..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/CompactNullableTypehintFixer.php +++ /dev/null @@ -1,82 +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\Fixer\Whitespace; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\FixerDefinition\VersionSpecification; -use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Jack Cherng - */ -final class CompactNullableTypehintFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Remove extra spaces in a nullable typehint.', - [ - new VersionSpecificCodeSample( - "= 70100 && $tokens->isTokenKindFound(CT::T_NULLABLE_TYPE); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - static $typehintKinds = [ - CT::T_ARRAY_TYPEHINT, - T_CALLABLE, - T_NS_SEPARATOR, - T_STRING, - ]; - - for ($index = $tokens->count() - 1; $index >= 0; --$index) { - if (!$tokens[$index]->isGivenKind(CT::T_NULLABLE_TYPE)) { - continue; - } - - // remove whitespaces only if there are only whitespaces - // between '?' and the variable type - if ( - $tokens[$index + 1]->isWhitespace() - && $tokens[$index + 2]->isGivenKind($typehintKinds) - ) { - $tokens->removeTrailingWhitespace($index); - } - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/HeredocIndentationFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/HeredocIndentationFixer.php deleted file mode 100644 index 8aadf90..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/HeredocIndentationFixer.php +++ /dev/null @@ -1,195 +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\Fixer\Whitespace; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -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\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Gregor Harlan - */ -final class HeredocIndentationFixer extends AbstractFixer implements ConfigurableFixerInterface, WhitespacesAwareFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Heredoc/nowdoc content must be properly indented. Requires PHP >= 7.3.', - [ - new VersionSpecificCodeSample( - <<<'SAMPLE' - 'same_as_start'] - ), - ] - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return \PHP_VERSION_ID >= 70300 && $tokens->isTokenKindFound(T_START_HEREDOC); - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('indentation', 'Whether the indentation should be the same as in the start token line or one level more.')) - ->setAllowedValues(['start_plus_one', 'same_as_start']) - ->setDefault('start_plus_one') - ->getOption(), - ]); - } - - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - for ($index = \count($tokens) - 1; 0 <= $index; --$index) { - if (!$tokens[$index]->isGivenKind(T_END_HEREDOC)) { - continue; - } - - $end = $index; - $index = $tokens->getPrevTokenOfKind($index, [[T_START_HEREDOC]]); - - $this->fixIndentation($tokens, $index, $end); - } - } - - private function fixIndentation(Tokens $tokens, int $start, int $end): void - { - $indent = $this->getIndentAt($tokens, $start); - - if ('start_plus_one' === $this->configuration['indentation']) { - $indent .= $this->whitespacesConfig->getIndent(); - } - - Preg::match('/^\h*/', $tokens[$end]->getContent(), $matches); - $currentIndent = $matches[0]; - $currentIndentLength = \strlen($currentIndent); - - $content = $indent.substr($tokens[$end]->getContent(), $currentIndentLength); - $tokens[$end] = new Token([T_END_HEREDOC, $content]); - - if ($end === $start + 1) { - return; - } - - for ($index = $end - 1, $last = true; $index > $start; --$index, $last = false) { - if (!$tokens[$index]->isGivenKind([T_ENCAPSED_AND_WHITESPACE, T_WHITESPACE])) { - continue; - } - - $content = $tokens[$index]->getContent(); - - if ('' !== $currentIndent) { - $content = Preg::replace('/(?<=\v)(?!'.$currentIndent.')\h+/', '', $content); - } - - $regexEnd = $last && !$currentIndent ? '(?!\v|$)' : '(?!\v)'; - $content = Preg::replace('/(?<=\v)'.$currentIndent.$regexEnd.'/', $indent, $content); - - $tokens[$index] = new Token([$tokens[$index]->getId(), $content]); - } - - ++$index; - - if (!$tokens[$index]->isGivenKind(T_ENCAPSED_AND_WHITESPACE)) { - $tokens->insertAt($index, new Token([T_ENCAPSED_AND_WHITESPACE, $indent])); - - return; - } - - $content = $tokens[$index]->getContent(); - - if (!\in_array($content[0], ["\r", "\n"], true) && (!$currentIndent || $currentIndent === substr($content, 0, $currentIndentLength))) { - $content = $indent.substr($content, $currentIndentLength); - } elseif ($currentIndent) { - $content = Preg::replace('/^(?!'.$currentIndent.')\h+/', '', $content); - } - - $tokens[$index] = new Token([T_ENCAPSED_AND_WHITESPACE, $content]); - } - - private function getIndentAt(Tokens $tokens, int $index): string - { - for (; $index >= 0; --$index) { - if (!$tokens[$index]->isGivenKind([T_WHITESPACE, T_INLINE_HTML, T_OPEN_TAG])) { - continue; - } - - $content = $tokens[$index]->getContent(); - - if ($tokens[$index]->isWhitespace() && $tokens[$index - 1]->isGivenKind(T_OPEN_TAG)) { - $content = $tokens[$index - 1]->getContent().$content; - } - - if (1 === Preg::match('/\R(\h*)$/', $content, $matches)) { - return $matches[1]; - } - } - - return ''; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/IndentationTypeFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/IndentationTypeFixer.php deleted file mode 100644 index a06c2b2..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/IndentationTypeFixer.php +++ /dev/null @@ -1,153 +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\Fixer\Whitespace; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Fixer for rules defined in PSR2 ¶2.4. - * - * @author Dariusz Rumiński - */ -final class IndentationTypeFixer extends AbstractFixer implements WhitespacesAwareFixerInterface -{ - /** - * @var string - */ - private $indent; - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Code MUST use configured indentation type.', - [ - new CodeSample("isAnyTokenKindsFound([T_COMMENT, T_DOC_COMMENT, T_WHITESPACE]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $this->indent = $this->whitespacesConfig->getIndent(); - - foreach ($tokens as $index => $token) { - if ($token->isComment()) { - $tokens[$index] = $this->fixIndentInComment($tokens, $index); - - continue; - } - - if ($token->isWhitespace()) { - $tokens[$index] = $this->fixIndentToken($tokens, $index); - - continue; - } - } - } - - private function fixIndentInComment(Tokens $tokens, int $index): Token - { - $content = Preg::replace('/^(?:(?getContent(), -1, $count); - - // Also check for more tabs. - while (0 !== $count) { - $content = Preg::replace('/^(\ +)?\t/m', '\1 ', $content, -1, $count); - } - - $indent = $this->indent; - - // change indent to expected one - $content = Preg::replaceCallback('/^(?: )+/m', function (array $matches) use ($indent) { - return $this->getExpectedIndent($matches[0], $indent); - }, $content); - - return new Token([$tokens[$index]->getId(), $content]); - } - - private function fixIndentToken(Tokens $tokens, int $index): Token - { - $content = $tokens[$index]->getContent(); - $previousTokenHasTrailingLinebreak = false; - - // @TODO this can be removed when we have a transformer for "T_OPEN_TAG" to "T_OPEN_TAG + T_WHITESPACE" - if (false !== strpos($tokens[$index - 1]->getContent(), "\n")) { - $content = "\n".$content; - $previousTokenHasTrailingLinebreak = true; - } - - $indent = $this->indent; - $newContent = Preg::replaceCallback( - '/(\R)(\h+)/', // find indent - function (array $matches) use ($indent) { - // normalize mixed indent - $content = Preg::replace('/(?:(?getExpectedIndent($content, $indent); - }, - $content - ); - - if ($previousTokenHasTrailingLinebreak) { - $newContent = substr($newContent, 1); - } - - return new Token([T_WHITESPACE, $newContent]); - } - - /** - * @return string mixed - */ - private function getExpectedIndent(string $content, string $indent): string - { - if ("\t" === $indent) { - $content = str_replace(' ', $indent, $content); - } - - return $content; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/LineEndingFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/LineEndingFixer.php deleted file mode 100644 index 2f69b54..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/LineEndingFixer.php +++ /dev/null @@ -1,105 +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\Fixer\Whitespace; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Fixer for rules defined in PSR2 ¶2.2. - * - * @author Fabien Potencier - * @author SpacePossum - * @author Dariusz Rumiński - */ -final class LineEndingFixer extends AbstractFixer implements WhitespacesAwareFixerInterface -{ - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return true; - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'All PHP files must use same line ending.', - [ - new CodeSample( - "whitespacesConfig->getLineEnding(); - - for ($index = 0, $count = \count($tokens); $index < $count; ++$index) { - $token = $tokens[$index]; - - if ($token->isGivenKind(T_ENCAPSED_AND_WHITESPACE)) { - if ($tokens[$tokens->getNextMeaningfulToken($index)]->isGivenKind(T_END_HEREDOC)) { - $tokens[$index] = new Token([ - $token->getId(), - Preg::replace( - '#\R#', - $ending, - $token->getContent() - ), - ]); - } - - continue; - } - - if ($token->isGivenKind([T_CLOSE_TAG, T_COMMENT, T_DOC_COMMENT, T_OPEN_TAG, T_START_HEREDOC, T_WHITESPACE])) { - $tokens[$index] = new Token([ - $token->getId(), - Preg::replace( - '#\R#', - $ending, - $token->getContent() - ), - ]); - } - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/MethodChainingIndentationFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/MethodChainingIndentationFixer.php deleted file mode 100644 index 66e70b4..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/MethodChainingIndentationFixer.php +++ /dev/null @@ -1,197 +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\Fixer\Whitespace; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Vladimir Boliev - */ -final class MethodChainingIndentationFixer extends AbstractFixer implements WhitespacesAwareFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Method chaining MUST be properly indented. Method chaining with different levels of indentation is not supported.', - [new CodeSample("setEmail('voff.web@gmail.com')\n ->setPassword('233434');\n")] - ); - } - - /** - * {@inheritdoc} - * - * Must run before ArrayIndentationFixer, MethodArgumentSpaceFixer. - * Must run after BracesFixer. - */ - public function getPriority(): int - { - return 34; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isAnyTokenKindsFound(Token::getObjectOperatorKinds()); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $lineEnding = $this->whitespacesConfig->getLineEnding(); - - for ($index = 1, $count = \count($tokens); $index < $count; ++$index) { - if (!$tokens[$index]->isObjectOperator()) { - continue; - } - - if ($this->canBeMovedToNextLine($index, $tokens)) { - $newline = new Token([T_WHITESPACE, $lineEnding]); - if ($tokens[$index - 1]->isWhitespace()) { - $tokens[$index - 1] = $newline; - } else { - $tokens->insertAt($index, $newline); - ++$index; - } - } - - $currentIndent = $this->getIndentAt($tokens, $index - 1); - if (null === $currentIndent) { - continue; - } - - $expectedIndent = $this->getExpectedIndentAt($tokens, $index); - if ($currentIndent !== $expectedIndent) { - $tokens[$index - 1] = new Token([T_WHITESPACE, $lineEnding.$expectedIndent]); - } - } - } - - /** - * @param int $index index of the first token on the line to indent - */ - private function getExpectedIndentAt(Tokens $tokens, int $index): string - { - $index = $tokens->getPrevMeaningfulToken($index); - $indent = $this->whitespacesConfig->getIndent(); - - for ($i = $index; $i >= 0; --$i) { - if ($tokens[$i]->equals(')')) { - $i = $tokens->findBlockStart(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $i); - } - - $currentIndent = $this->getIndentAt($tokens, $i); - if (null === $currentIndent) { - continue; - } - - if ($this->currentLineRequiresExtraIndentLevel($tokens, $i, $index)) { - return $currentIndent.$indent; - } - - return $currentIndent; - } - - return $indent; - } - - /** - * @param int $index position of the object operator token ("->" or "?->") - */ - private function canBeMovedToNextLine(int $index, Tokens $tokens): bool - { - $prevMeaningful = $tokens->getPrevMeaningfulToken($index); - $hasCommentBefore = false; - - for ($i = $index - 1; $i > $prevMeaningful; --$i) { - if ($tokens[$i]->isComment()) { - $hasCommentBefore = true; - - continue; - } - - if ($tokens[$i]->isWhitespace() && 1 === Preg::match('/\R/', $tokens[$i]->getContent())) { - return $hasCommentBefore; - } - } - - return false; - } - - /** - * @param int $index index of the indentation token - */ - private function getIndentAt(Tokens $tokens, int $index): ?string - { - if (1 === Preg::match('/\R{1}(\h*)$/', $this->getIndentContentAt($tokens, $index), $matches)) { - return $matches[1]; - } - - return null; - } - - private function getIndentContentAt(Tokens $tokens, int $index): string - { - if (!$tokens[$index]->isGivenKind([T_WHITESPACE, T_INLINE_HTML])) { - return ''; - } - - $content = $tokens[$index]->getContent(); - - if ($tokens[$index]->isWhitespace() && $tokens[$index - 1]->isGivenKind(T_OPEN_TAG)) { - $content = $tokens[$index - 1]->getContent().$content; - } - - if (Preg::match('/\R/', $content)) { - return $content; - } - - return ''; - } - - /** - * @param int $start index of first meaningful token on previous line - * @param int $end index of last token on previous line - */ - private function currentLineRequiresExtraIndentLevel(Tokens $tokens, int $start, int $end): bool - { - if ($tokens[$start + 1]->isObjectOperator()) { - return false; - } - - if ($tokens[$end]->isGivenKind(CT::T_BRACE_CLASS_INSTANTIATION_CLOSE)) { - return true; - } - - return - !$tokens[$end]->equals(')') - || $tokens->findBlockStart(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $end) >= $start - ; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoExtraBlankLinesFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoExtraBlankLinesFixer.php deleted file mode 100644 index e7d71c0..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoExtraBlankLinesFixer.php +++ /dev/null @@ -1,466 +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\Fixer\Whitespace; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerConfiguration\AllowedValueSubset; -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\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * @author Dariusz Rumiński - * @author SpacePossum - */ -final class NoExtraBlankLinesFixer extends AbstractFixer implements ConfigurableFixerInterface, WhitespacesAwareFixerInterface -{ - /** - * @var string[] - */ - private static $availableTokens = [ - 'break', - 'case', - 'continue', - 'curly_brace_block', - 'default', - 'extra', - 'parenthesis_brace_block', - 'return', - 'square_brace_block', - 'switch', - 'throw', - 'use', - 'use_trait', - ]; - - /** - * @var array key is token id, value is name of callback - */ - private $tokenKindCallbackMap; - - /** - * @var array token prototype, value is name of callback - */ - private $tokenEqualsMap; - - /** - * @var Tokens - */ - private $tokens; - - /** - * @var TokensAnalyzer - */ - private $tokensAnalyzer; - - /** - * {@inheritdoc} - */ - public function configure(array $configuration): void - { - parent::configure($configuration); - - static $reprToTokenMap = [ - 'break' => T_BREAK, - 'case' => T_CASE, - 'continue' => T_CONTINUE, - 'curly_brace_block' => '{', - 'default' => T_DEFAULT, - 'extra' => T_WHITESPACE, - 'parenthesis_brace_block' => '(', - 'return' => T_RETURN, - 'square_brace_block' => CT::T_ARRAY_SQUARE_BRACE_OPEN, - 'switch' => T_SWITCH, - 'throw' => T_THROW, - 'use' => T_USE, - 'use_trait' => CT::T_USE_TRAIT, - ]; - - static $tokenKindCallbackMap = [ - T_BREAK => 'fixAfterToken', - T_CASE => 'fixAfterToken', - T_CONTINUE => 'fixAfterToken', - T_DEFAULT => 'fixAfterToken', - T_RETURN => 'fixAfterToken', - T_SWITCH => 'fixAfterToken', - T_THROW => 'fixAfterThrowToken', - T_USE => 'removeBetweenUse', - T_WHITESPACE => 'removeMultipleBlankLines', - CT::T_USE_TRAIT => 'removeBetweenUse', - CT::T_ARRAY_SQUARE_BRACE_OPEN => 'fixStructureOpenCloseIfMultiLine', // typeless '[' tokens should not be fixed (too rare) - ]; - - static $tokenEqualsMap = [ - '{' => 'fixStructureOpenCloseIfMultiLine', // i.e. not: CT::T_ARRAY_INDEX_CURLY_BRACE_OPEN - '(' => 'fixStructureOpenCloseIfMultiLine', // i.e. not: CT::T_BRACE_CLASS_INSTANTIATION_OPEN - ]; - - $tokensAssoc = array_flip(array_intersect_key($reprToTokenMap, array_flip($this->configuration['tokens']))); - - $this->tokenKindCallbackMap = array_intersect_key($tokenKindCallbackMap, $tokensAssoc); - $this->tokenEqualsMap = array_intersect_key($tokenEqualsMap, $tokensAssoc); - } - - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Removes extra blank lines and/or blank lines following configuration.', - [ - new CodeSample( - ' ['break']] - ), - new CodeSample( - ' ['continue']] - ), - new CodeSample( - ' ['curly_brace_block']] - ), - new CodeSample( - ' ['extra']] - ), - new CodeSample( - ' ['parenthesis_brace_block']] - ), - new CodeSample( - ' ['return']] - ), - new CodeSample( - ' ['square_brace_block']] - ), - new CodeSample( - ' ['throw']] - ), - new CodeSample( - ' ['use']] - ), - new CodeSample( - ' ['use_trait']] - ), - new CodeSample( - ' ['switch', 'case', 'default']] - ), - ] - ); - } - - /** - * {@inheritdoc} - * - * Must run before BlankLineBeforeStatementFixer. - * Must run after CombineConsecutiveUnsetsFixer, EmptyLoopBodyFixer, FunctionToConstantFixer, NoEmptyCommentFixer, NoEmptyPhpdocFixer, NoEmptyStatementFixer, NoUnusedImportsFixer, NoUselessElseFixer, NoUselessReturnFixer, NoUselessSprintfFixer. - */ - public function getPriority(): int - { - return -20; - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return true; - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - $this->tokens = $tokens; - $this->tokensAnalyzer = new TokensAnalyzer($this->tokens); - for ($index = $tokens->getSize() - 1; $index > 0; --$index) { - $this->fixByToken($tokens[$index], $index); - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('tokens', 'List of tokens to fix.')) - ->setAllowedTypes(['array']) - ->setAllowedValues([new AllowedValueSubset(self::$availableTokens)]) - ->setDefault(['extra']) - ->getOption(), - ]); - } - - private function fixByToken(Token $token, int $index): void - { - foreach ($this->tokenKindCallbackMap as $kind => $callback) { - if (!$token->isGivenKind($kind)) { - continue; - } - - $this->{$callback}($index); - - return; - } - - foreach ($this->tokenEqualsMap as $equals => $callback) { - if (!$token->equals($equals)) { - continue; - } - - $this->{$callback}($index); - - return; - } - } - - private function removeBetweenUse(int $index): void - { - $next = $this->tokens->getNextTokenOfKind($index, [';', [T_CLOSE_TAG]]); - if (null === $next || $this->tokens[$next]->isGivenKind(T_CLOSE_TAG)) { - return; - } - - $nextUseCandidate = $this->tokens->getNextMeaningfulToken($next); - if (null === $nextUseCandidate || !$this->tokens[$nextUseCandidate]->isGivenKind($this->tokens[$index]->getId()) || !$this->containsLinebreak($index, $nextUseCandidate)) { - return; - } - - $this->removeEmptyLinesAfterLineWithTokenAt($next); - } - - private function removeMultipleBlankLines(int $index): void - { - $expected = $this->tokens[$index - 1]->isGivenKind(T_OPEN_TAG) && 1 === Preg::match('/\R$/', $this->tokens[$index - 1]->getContent()) ? 1 : 2; - - $parts = Preg::split('/(.*\R)/', $this->tokens[$index]->getContent(), -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); - $count = \count($parts); - - if ($count > $expected) { - $this->tokens[$index] = new Token([T_WHITESPACE, implode('', \array_slice($parts, 0, $expected)).rtrim($parts[$count - 1], "\r\n")]); - } - } - - private function fixAfterToken(int $index): void - { - for ($i = $index - 1; $i > 0; --$i) { - if ($this->tokens[$i]->isGivenKind(T_FUNCTION) && $this->tokensAnalyzer->isLambda($i)) { - return; - } - - if ($this->tokens[$i]->isGivenKind(T_CLASS) && $this->tokensAnalyzer->isAnonymousClass($i)) { - return; - } - - if ($this->tokens[$i]->isWhitespace() && false !== strpos($this->tokens[$i]->getContent(), "\n")) { - break; - } - } - - $this->removeEmptyLinesAfterLineWithTokenAt($index); - } - - private function fixAfterThrowToken(int $index): void - { - if ($this->tokens[$this->tokens->getPrevMeaningfulToken($index)]->equalsAny([';', '{', '}', ':', [T_OPEN_TAG]])) { - $this->fixAfterToken($index); - } - } - - /** - * Remove white line(s) after the index of a block type, - * but only if the block is not on one line. - * - * @param int $index body start - */ - private function fixStructureOpenCloseIfMultiLine(int $index): void - { - $blockTypeInfo = Tokens::detectBlockType($this->tokens[$index]); - $bodyEnd = $this->tokens->findBlockEnd($blockTypeInfo['type'], $index); - - for ($i = $bodyEnd - 1; $i >= $index; --$i) { - if (false !== strpos($this->tokens[$i]->getContent(), "\n")) { - $this->removeEmptyLinesAfterLineWithTokenAt($i); - $this->removeEmptyLinesAfterLineWithTokenAt($index); - - break; - } - } - } - - private function removeEmptyLinesAfterLineWithTokenAt(int $index): void - { - // find the line break - $tokenCount = \count($this->tokens); - for ($end = $index; $end < $tokenCount; ++$end) { - if ( - $this->tokens[$end]->equals('}') - || false !== strpos($this->tokens[$end]->getContent(), "\n") - ) { - break; - } - } - - if ($end === $tokenCount) { - return; // not found, early return - } - - $ending = $this->whitespacesConfig->getLineEnding(); - - for ($i = $end; $i < $tokenCount && $this->tokens[$i]->isWhitespace(); ++$i) { - $content = $this->tokens[$i]->getContent(); - if (substr_count($content, "\n") < 1) { - continue; - } - - $pos = strrpos($content, "\n"); - if ($pos + 2 <= \strlen($content)) { // preserve indenting where possible - $newContent = $ending.substr($content, $pos + 1); - } else { - $newContent = $ending; - } - - $this->tokens[$i] = new Token([T_WHITESPACE, $newContent]); - } - } - - private function containsLinebreak(int $startIndex, int $endIndex): bool - { - for ($i = $endIndex; $i > $startIndex; --$i) { - if (Preg::match('/\R/', $this->tokens[$i]->getContent())) { - return true; - } - } - - return false; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoSpacesAroundOffsetFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoSpacesAroundOffsetFixer.php deleted file mode 100644 index a9f6961..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoSpacesAroundOffsetFixer.php +++ /dev/null @@ -1,111 +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\Fixer\Whitespace; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -use PhpCsFixer\FixerConfiguration\AllowedValueSubset; -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\Tokens; - -/** - * @author Javier Spagnoletti - */ -final class NoSpacesAroundOffsetFixer extends AbstractFixer implements ConfigurableFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'There MUST NOT be spaces around offset braces.', - [ - new CodeSample(" ['inside']]), - new CodeSample(" ['outside']]), - ] - ); - } - - /** - * {@inheritdoc} - */ - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isAnyTokenKindsFound(['[', CT::T_ARRAY_INDEX_CURLY_BRACE_OPEN]); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - foreach ($tokens as $index => $token) { - if (!$token->equalsAny(['[', [CT::T_ARRAY_INDEX_CURLY_BRACE_OPEN]])) { - continue; - } - - if (\in_array('inside', $this->configuration['positions'], true)) { - if ($token->equals('[')) { - $endIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_INDEX_SQUARE_BRACE, $index); - } else { - $endIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_ARRAY_INDEX_CURLY_BRACE, $index); - } - - // remove space after opening `[` or `{` - if ($tokens[$index + 1]->isWhitespace(" \t")) { - $tokens->clearAt($index + 1); - } - - // remove space before closing `]` or `}` - if ($tokens[$endIndex - 1]->isWhitespace(" \t")) { - $tokens->clearAt($endIndex - 1); - } - } - - if (\in_array('outside', $this->configuration['positions'], true)) { - $prevNonWhitespaceIndex = $tokens->getPrevNonWhitespace($index); - if ($tokens[$prevNonWhitespaceIndex]->isComment()) { - continue; - } - - $tokens->removeLeadingWhitespace($index); - } - } - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - $values = ['inside', 'outside']; - - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('positions', 'Whether spacing should be fixed inside and/or outside the offset braces.')) - ->setAllowedTypes(['array']) - ->setAllowedValues([new AllowedValueSubset($values)]) - ->setDefault($values) - ->getOption(), - ]); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoSpacesInsideParenthesisFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoSpacesInsideParenthesisFixer.php deleted file mode 100644 index 3511d3a..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoSpacesInsideParenthesisFixer.php +++ /dev/null @@ -1,111 +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\Fixer\Whitespace; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Fixer for rules defined in PSR2 ¶4.3, ¶4.6, ¶5. - * - * @author Marc Aubé - * @author Dariusz Rumiński - */ -final class NoSpacesInsideParenthesisFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'There MUST NOT be a space after the opening parenthesis. There MUST NOT be a space before the closing parenthesis.', - [ - new CodeSample("isTokenKindFound('('); - } - - /** - * {@inheritdoc} - */ - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - foreach ($tokens as $index => $token) { - if (!$token->equals('(')) { - continue; - } - - $prevIndex = $tokens->getPrevMeaningfulToken($index); - - // ignore parenthesis for T_ARRAY - if (null !== $prevIndex && $tokens[$prevIndex]->isGivenKind(T_ARRAY)) { - continue; - } - - $endIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $index); - - // remove space after opening `(` - if (!$tokens[$tokens->getNextNonWhitespace($index)]->isComment()) { - $this->removeSpaceAroundToken($tokens, $index + 1); - } - - // remove space before closing `)` if it is not `list($a, $b, )` case - if (!$tokens[$tokens->getPrevMeaningfulToken($endIndex)]->equals(',')) { - $this->removeSpaceAroundToken($tokens, $endIndex - 1); - } - } - } - - /** - * Remove spaces from token at a given index. - */ - private function removeSpaceAroundToken(Tokens $tokens, int $index): void - { - $token = $tokens[$index]; - - if ($token->isWhitespace() && false === strpos($token->getContent(), "\n")) { - $tokens->clearAt($index); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoTrailingWhitespaceFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoTrailingWhitespaceFixer.php deleted file mode 100644 index ff132cf..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoTrailingWhitespaceFixer.php +++ /dev/null @@ -1,117 +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\Fixer\Whitespace; - -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; - -/** - * Fixer for rules defined in PSR2 ¶2.3. - * - * Don't add trailing spaces at the end of non-blank lines. - * - * @author Fabien Potencier - * @author Dariusz Rumiński - */ -final class NoTrailingWhitespaceFixer extends AbstractFixer -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Remove trailing whitespace at the end of non-blank lines.', - [new CodeSample("= 0; --$index) { - $token = $tokens[$index]; - if ( - $token->isGivenKind(T_OPEN_TAG) - && $tokens->offsetExists($index + 1) - && $tokens[$index + 1]->isWhitespace() - && 1 === Preg::match('/(.*)\h$/', $token->getContent(), $openTagMatches) - && 1 === Preg::match('/^(\R)(.*)$/s', $tokens[$index + 1]->getContent(), $whitespaceMatches) - ) { - $tokens[$index] = new Token([T_OPEN_TAG, $openTagMatches[1].$whitespaceMatches[1]]); - if ('' === $whitespaceMatches[2]) { - $tokens->clearAt($index + 1); - } else { - $tokens[$index + 1] = new Token([T_WHITESPACE, $whitespaceMatches[2]]); - } - - continue; - } - - if (!$token->isWhitespace()) { - continue; - } - - $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 - if ($linesSize > 1 || !isset($tokens[$index + 1])) { - if (!$tokens[$index - 1]->isGivenKind(T_OPEN_TAG) || 1 !== Preg::match('/(.*)\R$/', $tokens[$index - 1]->getContent())) { - $lines[0] = rtrim($lines[0], " \t"); - } - - for ($i = 1; $i < $linesSize; ++$i) { - $trimmedLine = rtrim($lines[$i], " \t"); - if ('' !== $trimmedLine) { - $lines[$i] = $trimmedLine; - } - } - - $content = implode('', $lines); - if ('' !== $content) { - $tokens[$index] = new Token([$token->getId(), $content]); - } else { - $tokens->clearAt($index); - } - } - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoWhitespaceInBlankLineFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoWhitespaceInBlankLineFixer.php deleted file mode 100644 index fdb6225..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoWhitespaceInBlankLineFixer.php +++ /dev/null @@ -1,103 +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\Fixer\Whitespace; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dariusz Rumiński - */ -final class NoWhitespaceInBlankLineFixer extends AbstractFixer implements WhitespacesAwareFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'Remove trailing whitespace at the end of blank lines.', - [new CodeSample("isWhitespace()) { - $this->fixWhitespaceToken($tokens, $i); - } - } - } - - private function fixWhitespaceToken(Tokens $tokens, int $index): void - { - $content = $tokens[$index]->getContent(); - $lines = Preg::split("/(\r\n|\n)/", $content); - $lineCount = \count($lines); - - if ( - // fix T_WHITESPACES with at least 3 lines (eg `\n \n`) - $lineCount > 2 - // and T_WHITESPACES with at least 2 lines at the end of file or after open tag with linebreak - || ($lineCount > 0 && (!isset($tokens[$index + 1]) || $tokens[$index - 1]->isGivenKind(T_OPEN_TAG))) - ) { - $lMax = isset($tokens[$index + 1]) ? $lineCount - 1 : $lineCount; - - $lStart = 1; - if ($tokens[$index - 1]->isGivenKind(T_OPEN_TAG) && "\n" === substr($tokens[$index - 1]->getContent(), -1)) { - $lStart = 0; - } - - for ($l = $lStart; $l < $lMax; ++$l) { - $lines[$l] = Preg::replace('/^\h+$/', '', $lines[$l]); - } - $content = implode($this->whitespacesConfig->getLineEnding(), $lines); - if ('' !== $content) { - $tokens[$index] = new Token([T_WHITESPACE, $content]); - } else { - $tokens->clearAt($index); - } - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/SingleBlankLineAtEofFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/SingleBlankLineAtEofFixer.php deleted file mode 100644 index 1aebdb9..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/SingleBlankLineAtEofFixer.php +++ /dev/null @@ -1,76 +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\Fixer\Whitespace; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerDefinition\CodeSample; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * A file must always end with a line endings character. - * - * Fixer for rules defined in PSR2 ¶2.2. - * - * @author Fabien Potencier - * @author Dariusz Rumiński - */ -final class SingleBlankLineAtEofFixer extends AbstractFixer implements WhitespacesAwareFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'A PHP file without end tag must always end with a single empty line feed.', - [ - new CodeSample("count(); - - if ($count && !$tokens[$count - 1]->isGivenKind([T_INLINE_HTML, T_CLOSE_TAG, T_OPEN_TAG])) { - $tokens->ensureWhitespaceAtIndex($count - 1, 1, $this->whitespacesConfig->getLineEnding()); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/TypesSpacesFixer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/TypesSpacesFixer.php deleted file mode 100644 index b2b1877..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/TypesSpacesFixer.php +++ /dev/null @@ -1,126 +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\Fixer\Whitespace; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -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\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -final class TypesSpacesFixer extends AbstractFixer implements ConfigurableFixerInterface -{ - /** - * {@inheritdoc} - */ - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'A single space or none should be around union type operator.', - [ - new CodeSample( - " 'single'] - ), - new VersionSpecificCodeSample( - "isTokenKindFound(CT::T_TYPE_ALTERNATION); - } - - /** - * {@inheritdoc} - */ - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('space', 'spacing to apply around union type operator.')) - ->setAllowedValues(['none', 'single']) - ->setDefault('none') - ->getOption(), - ]); - } - - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void - { - for ($index = $tokens->count() - 1; $index > 0; --$index) { - if (!$tokens[$index]->isGivenKind(CT::T_TYPE_ALTERNATION)) { - continue; - } - - if ('single' === $this->configuration['space']) { - $this->ensureSingleSpace($tokens, $index + 1, 0); - $this->ensureSingleSpace($tokens, $index - 1, 1); - } else { - $this->ensureNoSpace($tokens, $index + 1); - $this->ensureNoSpace($tokens, $index - 1); - } - } - } - - private function ensureSingleSpace(Tokens $tokens, int $index, int $offset): void - { - if (!$tokens[$index]->isWhitespace()) { - $tokens->insertSlices([$index + $offset => new Token([T_WHITESPACE, ' '])]); - - return; - } - - if (' ' === $tokens[$index]->getContent()) { - return; - } - - if (1 === Preg::match('/\R/', $tokens[$index]->getContent())) { - return; - } - - $tokens[$index] = new Token([T_WHITESPACE, ' ']); - } - - private function ensureNoSpace(Tokens $tokens, int $index): void - { - if (!$tokens[$index]->isWhitespace()) { - return; - } - - if (1 === Preg::match('/\R/', $tokens[$index]->getContent())) { - return; - } - - $tokens->clearAt($index); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/WhitespacesAwareFixerInterface.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/WhitespacesAwareFixerInterface.php deleted file mode 100644 index c03a3e7..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Fixer/WhitespacesAwareFixerInterface.php +++ /dev/null @@ -1,25 +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\Fixer; - -use PhpCsFixer\WhitespacesFixerConfig; - -/** - * @author Dariusz Rumiński - */ -interface WhitespacesAwareFixerInterface extends FixerInterface -{ - public function setWhitespacesConfig(WhitespacesFixerConfig $config): void; -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/AliasedFixerOption.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/AliasedFixerOption.php deleted file mode 100644 index 6e54eb8..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/AliasedFixerOption.php +++ /dev/null @@ -1,100 +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\FixerConfiguration; - -/** - * @author ntzm - * - * @internal - */ -final class AliasedFixerOption implements FixerOptionInterface -{ - /** - * @var FixerOptionInterface - */ - private $fixerOption; - - /** - * @var string - */ - private $alias; - - public function __construct(FixerOptionInterface $fixerOption, string $alias) - { - $this->fixerOption = $fixerOption; - $this->alias = $alias; - } - - public function getAlias(): string - { - return $this->alias; - } - - /** - * {@inheritdoc} - */ - public function getName(): string - { - return $this->fixerOption->getName(); - } - - /** - * {@inheritdoc} - */ - public function getDescription(): string - { - return $this->fixerOption->getDescription(); - } - - /** - * {@inheritdoc} - */ - public function hasDefault(): bool - { - return $this->fixerOption->hasDefault(); - } - - /** - * {@inheritdoc} - */ - public function getDefault() - { - return $this->fixerOption->getDefault(); - } - - /** - * {@inheritdoc} - */ - public function getAllowedTypes(): ?array - { - return $this->fixerOption->getAllowedTypes(); - } - - /** - * {@inheritdoc} - */ - public function getAllowedValues(): ?array - { - return $this->fixerOption->getAllowedValues(); - } - - /** - * {@inheritdoc} - */ - public function getNormalizer(): ?\Closure - { - return $this->fixerOption->getNormalizer(); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/AliasedFixerOptionBuilder.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/AliasedFixerOptionBuilder.php deleted file mode 100644 index 6fa2329..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/AliasedFixerOptionBuilder.php +++ /dev/null @@ -1,91 +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\FixerConfiguration; - -/** - * @author ntzm - * - * @internal - */ -final class AliasedFixerOptionBuilder -{ - /** - * @var FixerOptionBuilder - */ - private $optionBuilder; - - /** - * @var string - */ - private $alias; - - public function __construct(FixerOptionBuilder $optionBuilder, string $alias) - { - $this->optionBuilder = $optionBuilder; - $this->alias = $alias; - } - - /** - * @param mixed $default - * - * @return $this - */ - public function setDefault($default): self - { - $this->optionBuilder->setDefault($default); - - return $this; - } - - /** - * @param string[] $allowedTypes - * - * @return $this - */ - public function setAllowedTypes(array $allowedTypes): self - { - $this->optionBuilder->setAllowedTypes($allowedTypes); - - return $this; - } - - /** - * @return $this - */ - public function setAllowedValues(array $allowedValues): self - { - $this->optionBuilder->setAllowedValues($allowedValues); - - return $this; - } - - /** - * @return $this - */ - public function setNormalizer(\Closure $normalizer): self - { - $this->optionBuilder->setNormalizer($normalizer); - - return $this; - } - - public function getOption(): AliasedFixerOption - { - return new AliasedFixerOption( - $this->optionBuilder->getOption(), - $this->alias - ); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/AllowedValueSubset.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/AllowedValueSubset.php deleted file mode 100644 index 3317605..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/AllowedValueSubset.php +++ /dev/null @@ -1,56 +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\FixerConfiguration; - -/** - * @internal - */ -final class AllowedValueSubset -{ - /** - * @var array - */ - private $allowedValues; - - public function __construct(array $allowedValues) - { - $this->allowedValues = $allowedValues; - } - - /** - * Checks whether the given values are a subset of the allowed ones. - * - * @param mixed $values the value to validate - */ - public function __invoke($values): bool - { - if (!\is_array($values)) { - return false; - } - - foreach ($values as $value) { - if (!\in_array($value, $this->allowedValues, true)) { - return false; - } - } - - return true; - } - - public function getAllowedValues(): ?array - { - return $this->allowedValues; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/DeprecatedFixerOption.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/DeprecatedFixerOption.php deleted file mode 100644 index 41121b1..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/DeprecatedFixerOption.php +++ /dev/null @@ -1,95 +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\FixerConfiguration; - -final class DeprecatedFixerOption implements DeprecatedFixerOptionInterface -{ - /** - * @var FixerOptionInterface - */ - private $option; - - /** - * @var string - */ - private $deprecationMessage; - - public function __construct(FixerOptionInterface $option, string $deprecationMessage) - { - $this->option = $option; - $this->deprecationMessage = $deprecationMessage; - } - - /** - * {@inheritdoc} - */ - public function getName(): string - { - return $this->option->getName(); - } - - /** - * {@inheritdoc} - */ - public function getDescription(): string - { - return $this->option->getDescription(); - } - - /** - * {@inheritdoc} - */ - public function hasDefault(): bool - { - return $this->option->hasDefault(); - } - - /** - * {@inheritdoc} - */ - public function getDefault() - { - return $this->option->getDefault(); - } - - /** - * {@inheritdoc} - */ - public function getAllowedTypes(): ?array - { - return $this->option->getAllowedTypes(); - } - - /** - * {@inheritdoc} - */ - public function getAllowedValues(): ?array - { - return $this->option->getAllowedValues(); - } - - /** - * {@inheritdoc} - */ - public function getNormalizer(): ?\Closure - { - return $this->option->getNormalizer(); - } - - public function getDeprecationMessage(): string - { - return $this->deprecationMessage; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/DeprecatedFixerOptionInterface.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/DeprecatedFixerOptionInterface.php deleted file mode 100644 index d847aea..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/DeprecatedFixerOptionInterface.php +++ /dev/null @@ -1,20 +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\FixerConfiguration; - -interface DeprecatedFixerOptionInterface extends FixerOptionInterface -{ - public function getDeprecationMessage(): string; -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerConfigurationResolver.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerConfigurationResolver.php deleted file mode 100644 index ca86277..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerConfigurationResolver.php +++ /dev/null @@ -1,135 +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\FixerConfiguration; - -use PhpCsFixer\Utils; -use Symfony\Component\OptionsResolver\Exception\InvalidOptionsException; -use Symfony\Component\OptionsResolver\OptionsResolver; - -final class FixerConfigurationResolver implements FixerConfigurationResolverInterface -{ - /** - * @var FixerOptionInterface[] - */ - private $options = []; - - /** - * @var string[] - */ - private $registeredNames = []; - - /** - * @param iterable $options - */ - public function __construct(iterable $options) - { - foreach ($options as $option) { - $this->addOption($option); - } - - if (empty($this->registeredNames)) { - throw new \LogicException('Options cannot be empty.'); - } - } - - /** - * {@inheritdoc} - */ - public function getOptions(): array - { - return $this->options; - } - - /** - * {@inheritdoc} - */ - public function resolve(array $options): array - { - $resolver = new OptionsResolver(); - - foreach ($this->options as $option) { - $name = $option->getName(); - - if ($option instanceof AliasedFixerOption) { - $alias = $option->getAlias(); - - if (\array_key_exists($alias, $options)) { - if (\array_key_exists($name, $options)) { - throw new InvalidOptionsException(sprintf('Aliased option "%s"/"%s" is passed multiple times.', $name, $alias)); - } - - Utils::triggerDeprecation(new \RuntimeException(sprintf( - 'Option "%s" is deprecated, use "%s" instead.', - $alias, - $name - ))); - - $options[$name] = $options[$alias]; - unset($options[$alias]); - } - } - - if ($option->hasDefault()) { - $resolver->setDefault($name, $option->getDefault()); - } else { - $resolver->setRequired($name); - } - - $allowedValues = $option->getAllowedValues(); - if (null !== $allowedValues) { - foreach ($allowedValues as &$allowedValue) { - if (\is_object($allowedValue) && \is_callable($allowedValue)) { - $allowedValue = static function (/* mixed */ $values) use ($allowedValue) { - return $allowedValue($values); - }; - } - } - - $resolver->setAllowedValues($name, $allowedValues); - } - - $allowedTypes = $option->getAllowedTypes(); - if (null !== $allowedTypes) { - $resolver->setAllowedTypes($name, $allowedTypes); - } - - $normalizer = $option->getNormalizer(); - if (null !== $normalizer) { - $resolver->setNormalizer($name, $normalizer); - } - } - - return $resolver->resolve($options); - } - - /** - * @throws \LogicException when the option is already defined - * - * @return $this - */ - private function addOption(FixerOptionInterface $option): self - { - $name = $option->getName(); - - if (\in_array($name, $this->registeredNames, true)) { - throw new \LogicException(sprintf('The "%s" option is defined multiple times.', $name)); - } - - $this->options[] = $option; - $this->registeredNames[] = $name; - - return $this; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerConfigurationResolverInterface.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerConfigurationResolverInterface.php deleted file mode 100644 index d0932ac..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerConfigurationResolverInterface.php +++ /dev/null @@ -1,30 +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\FixerConfiguration; - -interface FixerConfigurationResolverInterface -{ - /** - * @return FixerOptionInterface[] - */ - public function getOptions(): array; - - /** - * @param array $configuration - * - * @return array - */ - public function resolve(array $configuration): array; -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerOption.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerOption.php deleted file mode 100644 index f25b52b..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerOption.php +++ /dev/null @@ -1,169 +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\FixerConfiguration; - -final class FixerOption implements FixerOptionInterface -{ - /** - * @var string - */ - private $name; - - /** - * @var string - */ - private $description; - - /** - * @var mixed - */ - private $default; - - /** - * @var bool - */ - private $isRequired; - - /** - * @var null|string[] - */ - private $allowedTypes; - - /** - * @var null|array - */ - private $allowedValues; - - /** - * @var null|\Closure - */ - private $normalizer; - - /** - * @param mixed $default - * @param null|string[] $allowedTypes - */ - public function __construct( - string $name, - string $description, - bool $isRequired = true, - $default = null, - ?array $allowedTypes = null, - ?array $allowedValues = null, - ?\Closure $normalizer = null - ) { - if ($isRequired && null !== $default) { - throw new \LogicException('Required options cannot have a default value.'); - } - - if (null !== $allowedValues) { - foreach ($allowedValues as &$allowedValue) { - if ($allowedValue instanceof \Closure) { - $allowedValue = $this->unbind($allowedValue); - } - } - } - - $this->name = $name; - $this->description = $description; - $this->isRequired = $isRequired; - $this->default = $default; - $this->allowedTypes = $allowedTypes; - $this->allowedValues = $allowedValues; - if (null !== $normalizer) { - $this->normalizer = $this->unbind($normalizer); - } - } - - /** - * {@inheritdoc} - */ - public function getName(): string - { - return $this->name; - } - - /** - * {@inheritdoc} - */ - public function getDescription(): string - { - return $this->description; - } - - /** - * {@inheritdoc} - */ - public function hasDefault(): bool - { - return !$this->isRequired; - } - - /** - * {@inheritdoc} - */ - public function getDefault() - { - if (!$this->hasDefault()) { - throw new \LogicException('No default value defined.'); - } - - return $this->default; - } - - /** - * {@inheritdoc} - */ - public function getAllowedTypes(): ?array - { - return $this->allowedTypes; - } - - /** - * {@inheritdoc} - */ - public function getAllowedValues(): ?array - { - return $this->allowedValues; - } - - /** - * {@inheritdoc} - */ - public function getNormalizer(): ?\Closure - { - return $this->normalizer; - } - - /** - * Unbinds the given closure to avoid memory leaks. - * - * The closures provided to this class were probably defined in a fixer - * class and thus bound to it by default. The configuration will then be - * stored in {@see AbstractFixer::$configurationDefinition}, leading to the - * following cyclic reference: - * - * fixer -> configuration definition -> options -> closures -> fixer - * - * This cyclic reference prevent the garbage collector to free memory as - * all elements are still referenced. - * - * See {@see https://bugs.php.net/bug.php?id=69639 Bug #69639} for details. - */ - private function unbind(\Closure $closure): \Closure - { - return $closure->bindTo(null); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerOptionBuilder.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerOptionBuilder.php deleted file mode 100644 index 499be70..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerOptionBuilder.php +++ /dev/null @@ -1,138 +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\FixerConfiguration; - -final class FixerOptionBuilder -{ - /** - * @var string - */ - private $name; - - /** - * @var string - */ - private $description; - - /** - * @var mixed - */ - private $default; - - /** - * @var bool - */ - private $isRequired = true; - - /** - * @var null|string[] - */ - private $allowedTypes; - - /** - * @var null|array - */ - private $allowedValues; - - /** - * @var null|\Closure - */ - private $normalizer; - - /** - * @var null|string - */ - private $deprecationMessage; - - public function __construct(string $name, string $description) - { - $this->name = $name; - $this->description = $description; - } - - /** - * @param mixed $default - * - * @return $this - */ - public function setDefault($default): self - { - $this->default = $default; - $this->isRequired = false; - - return $this; - } - - /** - * @param string[] $allowedTypes - * - * @return $this - */ - public function setAllowedTypes(array $allowedTypes): self - { - $this->allowedTypes = $allowedTypes; - - return $this; - } - - /** - * @return $this - */ - public function setAllowedValues(array $allowedValues): self - { - $this->allowedValues = $allowedValues; - - return $this; - } - - /** - * @return $this - */ - public function setNormalizer(\Closure $normalizer): self - { - $this->normalizer = $normalizer; - - return $this; - } - - /** - * @return $this - */ - public function setDeprecationMessage(?string $deprecationMessage): self - { - $this->deprecationMessage = $deprecationMessage; - - return $this; - } - - public function getOption(): FixerOptionInterface - { - $option = new FixerOption( - $this->name, - $this->description, - $this->isRequired, - $this->default, - $this->allowedTypes, - $this->allowedValues, - $this->normalizer - ); - - if (null !== $this->deprecationMessage) { - $option = new DeprecatedFixerOption($option, $this->deprecationMessage); - } - - return $option; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerOptionInterface.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerOptionInterface.php deleted file mode 100644 index f7bfaeb..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerOptionInterface.php +++ /dev/null @@ -1,40 +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\FixerConfiguration; - -interface FixerOptionInterface -{ - public function getName(): string; - - public function getDescription(): string; - - public function hasDefault(): bool; - - /** - * @throws \LogicException when no default value is defined - * - * @return mixed - */ - public function getDefault(); - - /** - * @return null|string[] - */ - public function getAllowedTypes(): ?array; - - public function getAllowedValues(): ?array; - - public function getNormalizer(): ?\Closure; -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/InvalidOptionsForEnvException.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/InvalidOptionsForEnvException.php deleted file mode 100644 index e1957ac..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/InvalidOptionsForEnvException.php +++ /dev/null @@ -1,26 +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\FixerConfiguration; - -use Symfony\Component\OptionsResolver\Exception\InvalidOptionsException; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -final class InvalidOptionsForEnvException extends InvalidOptionsException -{ -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/CodeSample.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/CodeSample.php deleted file mode 100644 index dd5e473..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/CodeSample.php +++ /dev/null @@ -1,47 +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\FixerDefinition; - -/** - * @author Dariusz Rumiński - */ -final class CodeSample implements CodeSampleInterface -{ - /** - * @var string - */ - private $code; - - /** - * @var null|array - */ - private $configuration; - - public function __construct(string $code, ?array $configuration = null) - { - $this->code = $code; - $this->configuration = $configuration; - } - - public function getCode(): string - { - return $this->code; - } - - public function getConfiguration(): ?array - { - return $this->configuration; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/CodeSampleInterface.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/CodeSampleInterface.php deleted file mode 100644 index 7d4971f..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/CodeSampleInterface.php +++ /dev/null @@ -1,25 +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\FixerDefinition; - -/** - * @author Dariusz Rumiński - */ -interface CodeSampleInterface -{ - public function getCode(): string; - - public function getConfiguration(): ?array; -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/FileSpecificCodeSample.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/FileSpecificCodeSample.php deleted file mode 100644 index 24a1f72..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/FileSpecificCodeSample.php +++ /dev/null @@ -1,66 +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\FixerDefinition; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -final class FileSpecificCodeSample implements FileSpecificCodeSampleInterface -{ - /** - * @var CodeSampleInterface - */ - private $codeSample; - - /** - * @var \SplFileInfo - */ - private $splFileInfo; - - public function __construct( - string $code, - \SplFileInfo $splFileInfo, - ?array $configuration = null - ) { - $this->codeSample = new CodeSample($code, $configuration); - $this->splFileInfo = $splFileInfo; - } - - /** - * {@inheritdoc} - */ - public function getCode(): string - { - return $this->codeSample->getCode(); - } - - /** - * {@inheritdoc} - */ - public function getConfiguration(): ?array - { - return $this->codeSample->getConfiguration(); - } - - /** - * {@inheritdoc} - */ - public function getSplFileInfo(): \SplFileInfo - { - return $this->splFileInfo; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/FileSpecificCodeSampleInterface.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/FileSpecificCodeSampleInterface.php deleted file mode 100644 index df6f092..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/FileSpecificCodeSampleInterface.php +++ /dev/null @@ -1,25 +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\FixerDefinition; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -interface FileSpecificCodeSampleInterface extends CodeSampleInterface -{ - public function getSplFileInfo(): \SplFileInfo; -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/FixerDefinition.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/FixerDefinition.php deleted file mode 100644 index 87fb055..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/FixerDefinition.php +++ /dev/null @@ -1,77 +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\FixerDefinition; - -/** - * @author Dariusz Rumiński - */ -final class FixerDefinition implements FixerDefinitionInterface -{ - /** - * @var null|string - */ - private $riskyDescription; - - /** - * @var CodeSampleInterface[] - */ - private $codeSamples; - - /** - * @var string - */ - private $summary; - - /** - * @var null|string - */ - private $description; - - /** - * @param CodeSampleInterface[] $codeSamples array of samples, where single sample is [code, configuration] - * @param null|string $riskyDescription null for non-risky fixer - */ - public function __construct( - string $summary, - array $codeSamples, - ?string $description = null, - ?string $riskyDescription = null - ) { - $this->summary = $summary; - $this->codeSamples = $codeSamples; - $this->description = $description; - $this->riskyDescription = $riskyDescription; - } - - public function getSummary(): string - { - return $this->summary; - } - - public function getDescription(): ?string - { - return $this->description; - } - - public function getRiskyDescription(): ?string - { - return $this->riskyDescription; - } - - public function getCodeSamples(): array - { - return $this->codeSamples; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/FixerDefinitionInterface.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/FixerDefinitionInterface.php deleted file mode 100644 index 85c2282..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/FixerDefinitionInterface.php +++ /dev/null @@ -1,37 +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\FixerDefinition; - -/** - * @author Dariusz Rumiński - */ -interface FixerDefinitionInterface -{ - public function getSummary(): string; - - public function getDescription(): ?string; - - /** - * @return null|string null for non-risky fixer - */ - public function getRiskyDescription(): ?string; - - /** - * Array of samples, where single sample is [code, configuration]. - * - * @return CodeSampleInterface[] - */ - public function getCodeSamples(): array; -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/VersionSpecificCodeSample.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/VersionSpecificCodeSample.php deleted file mode 100644 index aa5a0ab..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/VersionSpecificCodeSample.php +++ /dev/null @@ -1,64 +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\FixerDefinition; - -/** - * @author Andreas Möller - */ -final class VersionSpecificCodeSample implements VersionSpecificCodeSampleInterface -{ - /** - * @var CodeSampleInterface - */ - private $codeSample; - - /** - * @var VersionSpecificationInterface - */ - private $versionSpecification; - - public function __construct( - string $code, - VersionSpecificationInterface $versionSpecification, - ?array $configuration = null - ) { - $this->codeSample = new CodeSample($code, $configuration); - $this->versionSpecification = $versionSpecification; - } - - /** - * {@inheritdoc} - */ - public function getCode(): string - { - return $this->codeSample->getCode(); - } - - /** - * {@inheritdoc} - */ - public function getConfiguration(): ?array - { - return $this->codeSample->getConfiguration(); - } - - /** - * {@inheritdoc} - */ - public function isSuitableFor(int $version): bool - { - return $this->versionSpecification->isSatisfiedBy($version); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/VersionSpecificCodeSampleInterface.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/VersionSpecificCodeSampleInterface.php deleted file mode 100644 index 74e4f44..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/VersionSpecificCodeSampleInterface.php +++ /dev/null @@ -1,23 +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\FixerDefinition; - -/** - * @author Andreas Moeller - */ -interface VersionSpecificCodeSampleInterface extends CodeSampleInterface -{ - public function isSuitableFor(int $version): bool; -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/VersionSpecification.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/VersionSpecification.php deleted file mode 100644 index d28cae6..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/VersionSpecification.php +++ /dev/null @@ -1,74 +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\FixerDefinition; - -/** - * @author Andreas Möller - */ -final class VersionSpecification implements VersionSpecificationInterface -{ - /** - * @var null|int - */ - private $minimum; - - /** - * @var null|int - */ - private $maximum; - - /** - * @throws \InvalidArgumentException - */ - public function __construct(?int $minimum = null, ?int $maximum = null) - { - if (null === $minimum && null === $maximum) { - throw new \InvalidArgumentException('Minimum or maximum need to be specified.'); - } - - if (null !== $minimum && 1 > $minimum) { - throw new \InvalidArgumentException('Minimum needs to be either null or an integer greater than 0.'); - } - - if (null !== $maximum) { - if (1 > $maximum) { - throw new \InvalidArgumentException('Maximum needs to be either null or an integer greater than 0.'); - } - - if (null !== $minimum && $maximum < $minimum) { - throw new \InvalidArgumentException('Maximum should not be lower than the minimum.'); - } - } - - $this->minimum = $minimum; - $this->maximum = $maximum; - } - - /** - * {@inheritdoc} - */ - public function isSatisfiedBy(int $version): bool - { - if (null !== $this->minimum && $version < $this->minimum) { - return false; - } - - if (null !== $this->maximum && $version > $this->maximum) { - return false; - } - - return true; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/VersionSpecificationInterface.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/VersionSpecificationInterface.php deleted file mode 100644 index 502cdc4..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/VersionSpecificationInterface.php +++ /dev/null @@ -1,23 +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\FixerDefinition; - -/** - * @author Andreas Möller - */ -interface VersionSpecificationInterface -{ - public function isSatisfiedBy(int $version): bool; -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerFactory.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerFactory.php deleted file mode 100644 index c683052..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerFactory.php +++ /dev/null @@ -1,240 +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; - -use PhpCsFixer\ConfigurationException\InvalidFixerConfigurationException; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -use PhpCsFixer\Fixer\FixerInterface; -use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\RuleSet\RuleSetInterface; -use Symfony\Component\Finder\Finder as SymfonyFinder; -use Symfony\Component\Finder\SplFileInfo; - -/** - * Class provides a way to create a group of fixers. - * - * Fixers may be registered (made the factory aware of them) by - * registering a custom fixer and default, built in fixers. - * Then, one can attach Config instance to fixer instances. - * - * Finally factory creates a ready to use group of fixers. - * - * @author Dariusz Rumiński - * - * @internal - */ -final class FixerFactory -{ - /** - * @var FixerNameValidator - */ - private $nameValidator; - - /** - * @var FixerInterface[] - */ - private $fixers = []; - - /** - * @var FixerInterface[] Associative array of fixers with names as keys - */ - private $fixersByName = []; - - public function __construct() - { - $this->nameValidator = new FixerNameValidator(); - } - - public function setWhitespacesConfig(WhitespacesFixerConfig $config): self - { - foreach ($this->fixers as $fixer) { - if ($fixer instanceof WhitespacesAwareFixerInterface) { - $fixer->setWhitespacesConfig($config); - } - } - - return $this; - } - - /** - * @return FixerInterface[] - */ - public function getFixers(): array - { - $this->fixers = Utils::sortFixers($this->fixers); - - return $this->fixers; - } - - /** - * @return $this - */ - public function registerBuiltInFixers(): self - { - static $builtInFixers = null; - - if (null === $builtInFixers) { - $builtInFixers = []; - - /** @var SplFileInfo $file */ - foreach (SymfonyFinder::create()->files()->in(__DIR__.'/Fixer')->depth(1) as $file) { - $relativeNamespace = $file->getRelativePath(); - $fixerClass = 'PhpCsFixer\\Fixer\\'.($relativeNamespace ? $relativeNamespace.'\\' : '').$file->getBasename('.php'); - if ('Fixer' === substr($fixerClass, -5)) { - $builtInFixers[] = $fixerClass; - } - } - } - - foreach ($builtInFixers as $class) { - $this->registerFixer(new $class(), false); - } - - return $this; - } - - /** - * @param FixerInterface[] $fixers - * - * @return $this - */ - public function registerCustomFixers(iterable $fixers): self - { - foreach ($fixers as $fixer) { - $this->registerFixer($fixer, true); - } - - return $this; - } - - /** - * @return $this - */ - 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)); - } - - if (!$this->nameValidator->isValid($name, $isCustom)) { - throw new \UnexpectedValueException(sprintf('Fixer named "%s" has invalid name.', $name)); - } - - $this->fixers[] = $fixer; - $this->fixersByName[$name] = $fixer; - - return $this; - } - - /** - * Apply RuleSet on fixers to filter out all unwanted fixers. - * - * @return $this - */ - public function useRuleSet(RuleSetInterface $ruleSet): self - { - $fixers = []; - $fixersByName = []; - $fixerConflicts = []; - - $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)); - } - - $fixer = $this->fixersByName[$name]; - - $config = $ruleSet->getRuleConfiguration($name); - if (null !== $config) { - if ($fixer instanceof ConfigurableFixerInterface) { - if (!\is_array($config) || !\count($config)) { - throw new InvalidFixerConfigurationException($fixer->getName(), 'Configuration must be an array and may not be empty.'); - } - - $fixer->configure($config); - } else { - throw new InvalidFixerConfigurationException($fixer->getName(), 'Is not configurable.'); - } - } - - $fixers[] = $fixer; - $fixersByName[$name] = $fixer; - - $conflicts = array_intersect($this->getFixersConflicts($fixer), $fixerNames); - if (\count($conflicts) > 0) { - $fixerConflicts[$name] = $conflicts; - } - } - - if (\count($fixerConflicts) > 0) { - throw new \UnexpectedValueException($this->generateConflictMessage($fixerConflicts)); - } - - $this->fixers = $fixers; - $this->fixersByName = $fixersByName; - - return $this; - } - - /** - * Check if fixer exists. - */ - public function hasRule(string $name): bool - { - return isset($this->fixersByName[$name]); - } - - /** - * @return null|string[] - */ - private function getFixersConflicts(FixerInterface $fixer): ?array - { - static $conflictMap = [ - 'no_blank_lines_before_namespace' => ['single_blank_line_before_namespace'], - 'single_import_per_statement' => ['group_import'], - ]; - - $fixerName = $fixer->getName(); - - return \array_key_exists($fixerName, $conflictMap) ? $conflictMap[$fixerName] : []; - } - - /** - * @param array $fixerConflicts - */ - private function generateConflictMessage(array $fixerConflicts): string - { - $message = 'Rule contains conflicting fixers:'; - $report = []; - foreach ($fixerConflicts as $fixer => $fixers) { - // filter mutual conflicts - $report[$fixer] = array_filter( - $fixers, - static function (string $candidate) use ($report, $fixer) { - return !\array_key_exists($candidate, $report) || !\in_array($fixer, $report[$candidate], true); - } - ); - - if (\count($report[$fixer]) > 0) { - $message .= sprintf("\n- \"%s\" with \"%s\"", $fixer, implode('", "', $report[$fixer])); - } - } - - return $message; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerFileProcessedEvent.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerFileProcessedEvent.php deleted file mode 100644 index d46bb32..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerFileProcessedEvent.php +++ /dev/null @@ -1,55 +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; - -use Symfony\Contracts\EventDispatcher\Event; - -/** - * Event that is fired when file was processed by Fixer. - * - * @author Dariusz Rumiński - * - * @internal - */ -final class FixerFileProcessedEvent extends Event -{ - /** - * Event name. - */ - public const NAME = 'fixer.file_processed'; - - public const STATUS_UNKNOWN = 0; - public const STATUS_INVALID = 1; - public const STATUS_SKIPPED = 2; - public const STATUS_NO_CHANGES = 3; - public const STATUS_FIXED = 4; - public const STATUS_EXCEPTION = 5; - public const STATUS_LINT = 6; - - /** - * @var int - */ - private $status; - - public function __construct(int $status) - { - $this->status = $status; - } - - public function getStatus(): int - { - return $this->status; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerNameValidator.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerNameValidator.php deleted file mode 100644 index ce2697d..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/FixerNameValidator.php +++ /dev/null @@ -1,32 +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; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -final class FixerNameValidator -{ - public function isValid(string $name, bool $isCustom): bool - { - if (!$isCustom) { - return 1 === Preg::match('/^[a-z][a-z0-9_]*$/', $name); - } - - return 1 === Preg::match('/^[A-Z][a-zA-Z0-9]*\/[a-z][a-z0-9_]*$/', $name); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Indicator/PhpUnitTestCaseIndicator.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Indicator/PhpUnitTestCaseIndicator.php deleted file mode 100644 index 7bb198d..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Indicator/PhpUnitTestCaseIndicator.php +++ /dev/null @@ -1,73 +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\Indicator; - -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @internal - */ -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())); - } - - $index = $tokens->getNextMeaningfulToken($index); - if (0 !== Preg::match('/(?:Test|TestCase)$/', $tokens[$index]->getContent())) { - return true; - } - - while (null !== $index = $tokens->getNextMeaningfulToken($index)) { - if ($tokens[$index]->equals('{')) { - break; // end of class signature - } - - if (!$tokens[$index]->isGivenKind(T_STRING)) { - continue; // not part of extends nor part of implements; so continue - } - - if (0 !== Preg::match('/(?:Test|TestCase)(?:Interface)?$/', $tokens[$index]->getContent())) { - return true; - } - } - - return false; - } - - /** - * @return \Generator array of [int start, int end] indexes from sooner to later classes - */ - public function findPhpUnitClasses(Tokens $tokens): \Generator - { - for ($index = $tokens->count() - 1; $tokens->offsetExists($index); --$index) { - if (!$tokens[$index]->isGivenKind(T_CLASS) || !$this->isPhpUnitClass($tokens, $index)) { - continue; - } - - $startIndex = $tokens->getNextTokenOfKind($index, ['{'], false); - - if (null === $startIndex) { - return; - } - - $endIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $startIndex); - yield [$startIndex, $endIndex]; - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Linter/CachingLinter.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Linter/CachingLinter.php deleted file mode 100644 index 6da3898..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Linter/CachingLinter.php +++ /dev/null @@ -1,74 +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\Linter; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -final class CachingLinter implements LinterInterface -{ - /** - * @var LinterInterface - */ - private $sublinter; - - /** - * @var array - */ - private $cache = []; - - public function __construct(LinterInterface $linter) - { - $this->sublinter = $linter; - } - - /** - * {@inheritdoc} - */ - public function isAsync(): bool - { - return $this->sublinter->isAsync(); - } - - /** - * {@inheritdoc} - */ - public function lintFile(string $path): LintingResultInterface - { - $checksum = crc32(file_get_contents($path)); - - if (!isset($this->cache[$checksum])) { - $this->cache[$checksum] = $this->sublinter->lintFile($path); - } - - return $this->cache[$checksum]; - } - - /** - * {@inheritdoc} - */ - public function lintSource(string $source): LintingResultInterface - { - $checksum = crc32($source); - - if (!isset($this->cache[$checksum])) { - $this->cache[$checksum] = $this->sublinter->lintSource($source); - } - - return $this->cache[$checksum]; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Linter/Linter.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Linter/Linter.php deleted file mode 100644 index 563b117..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Linter/Linter.php +++ /dev/null @@ -1,66 +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\Linter; - -/** - * Handle PHP code linting process. - * - * @author Dariusz Rumiński - * - * @internal - */ -final class Linter implements LinterInterface -{ - /** - * @var LinterInterface - */ - private $sublinter; - - /** - * @param null|string $executable PHP executable, null for autodetection - */ - public function __construct(?string $executable = null) - { - try { - $this->sublinter = new TokenizerLinter(); - } catch (UnavailableLinterException $e) { - $this->sublinter = new ProcessLinter($executable); - } - } - - /** - * {@inheritdoc} - */ - public function isAsync(): bool - { - return $this->sublinter->isAsync(); - } - - /** - * {@inheritdoc} - */ - public function lintFile(string $path): LintingResultInterface - { - return $this->sublinter->lintFile($path); - } - - /** - * {@inheritdoc} - */ - public function lintSource(string $source): LintingResultInterface - { - return $this->sublinter->lintSource($source); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Linter/LinterInterface.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Linter/LinterInterface.php deleted file mode 100644 index 1b5c2db..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Linter/LinterInterface.php +++ /dev/null @@ -1,35 +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\Linter; - -/** - * Interface for PHP code linting process manager. - * - * @author Dariusz Rumiński - */ -interface LinterInterface -{ - public function isAsync(): bool; - - /** - * Lint PHP file. - */ - public function lintFile(string $path): LintingResultInterface; - - /** - * Lint PHP code. - */ - public function lintSource(string $source): LintingResultInterface; -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Linter/LintingException.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Linter/LintingException.php deleted file mode 100644 index 48d3734..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Linter/LintingException.php +++ /dev/null @@ -1,22 +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\Linter; - -/** - * @author Dariusz Rumiński - */ -class LintingException extends \RuntimeException -{ -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Linter/LintingResultInterface.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Linter/LintingResultInterface.php deleted file mode 100644 index 855d695..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Linter/LintingResultInterface.php +++ /dev/null @@ -1,26 +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\Linter; - -/** - * @author Dariusz Rumiński - */ -interface LintingResultInterface -{ - /** - * Check if linting process was successful and raise LintingException if not. - */ - public function check(): void; -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Linter/ProcessLinter.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Linter/ProcessLinter.php deleted file mode 100644 index da418ce..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Linter/ProcessLinter.php +++ /dev/null @@ -1,167 +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\Linter; - -use PhpCsFixer\FileReader; -use PhpCsFixer\FileRemoval; -use Symfony\Component\Filesystem\Exception\IOException; -use Symfony\Component\Process\PhpExecutableFinder; -use Symfony\Component\Process\Process; - -/** - * Handle PHP code linting using separated process of `php -l _file_`. - * - * @author Dariusz Rumiński - * - * @internal - */ -final class ProcessLinter implements LinterInterface -{ - /** - * @var FileRemoval - */ - private $fileRemoval; - - /** - * @var ProcessLinterProcessBuilder - */ - private $processBuilder; - - /** - * Temporary file for code linting. - * - * @var null|string - */ - private $temporaryFile; - - /** - * @param null|string $executable PHP executable, null for autodetection - */ - public function __construct(?string $executable = null) - { - if (null === $executable) { - $executableFinder = new PhpExecutableFinder(); - $executable = $executableFinder->find(false); - - if (false === $executable) { - throw new UnavailableLinterException('Cannot find PHP executable.'); - } - - if ('phpdbg' === \PHP_SAPI) { - if (false === strpos($executable, 'phpdbg')) { - throw new UnavailableLinterException('Automatically found PHP executable is non-standard phpdbg. Could not find proper PHP executable.'); - } - - // automatically found executable is `phpdbg`, let us try to fallback to regular `php` - $executable = str_replace('phpdbg', 'php', $executable); - - if (!is_executable($executable)) { - throw new UnavailableLinterException('Automatically found PHP executable is phpdbg. Could not find proper PHP executable.'); - } - } - } - - $this->processBuilder = new ProcessLinterProcessBuilder($executable); - - $this->fileRemoval = new FileRemoval(); - } - - public function __destruct() - { - if (null !== $this->temporaryFile) { - $this->fileRemoval->delete($this->temporaryFile); - } - } - - /** - * This class is not intended to be serialized, - * and cannot be deserialized (see __wakeup method). - */ - public function __sleep(): array - { - throw new \BadMethodCallException('Cannot serialize '.__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 '.__CLASS__); - } - - /** - * {@inheritdoc} - */ - public function isAsync(): bool - { - return true; - } - - /** - * {@inheritdoc} - */ - public function lintFile(string $path): LintingResultInterface - { - return new ProcessLintingResult($this->createProcessForFile($path), $path); - } - - /** - * {@inheritdoc} - */ - public function lintSource(string $source): LintingResultInterface - { - return new ProcessLintingResult($this->createProcessForSource($source), $this->temporaryFile); - } - - /** - * @param string $path path to file - */ - private function createProcessForFile(string $path): Process - { - // in case php://stdin - if (!is_file($path)) { - return $this->createProcessForSource(FileReader::createSingleton()->read($path)); - } - - $process = $this->processBuilder->build($path); - $process->setTimeout(10); - $process->start(); - - return $process; - } - - /** - * Create process that lint PHP code. - * - * @param string $source code - */ - private function createProcessForSource(string $source): Process - { - if (null === $this->temporaryFile) { - $this->temporaryFile = tempnam(sys_get_temp_dir(), 'cs_fixer_tmp_'); - $this->fileRemoval->observe($this->temporaryFile); - } - - if (false === @file_put_contents($this->temporaryFile, $source)) { - throw new IOException(sprintf('Failed to write file "%s".', $this->temporaryFile), 0, null, $this->temporaryFile); - } - - return $this->createProcessForFile($this->temporaryFile); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Linter/ProcessLinterProcessBuilder.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Linter/ProcessLinterProcessBuilder.php deleted file mode 100644 index 4b6403e..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Linter/ProcessLinterProcessBuilder.php +++ /dev/null @@ -1,47 +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\Linter; - -use Symfony\Component\Process\Process; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -final class ProcessLinterProcessBuilder -{ - /** - * @var string - */ - private $executable; - - /** - * @param string $executable PHP executable - */ - public function __construct(string $executable) - { - $this->executable = $executable; - } - - public function build(string $path): Process - { - return new Process([ - $this->executable, - '-l', - $path, - ]); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Linter/ProcessLintingResult.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Linter/ProcessLintingResult.php deleted file mode 100644 index 808f795..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Linter/ProcessLintingResult.php +++ /dev/null @@ -1,97 +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\Linter; - -use Symfony\Component\Process\Process; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -final class ProcessLintingResult implements LintingResultInterface -{ - /** - * @var bool - */ - private $isSuccessful; - - /** - * @var Process - */ - private $process; - - /** - * @var null|string - */ - private $path; - - public function __construct(Process $process, ?string $path = null) - { - $this->process = $process; - $this->path = $path; - } - - /** - * {@inheritdoc} - */ - public function check(): void - { - if (!$this->isSuccessful()) { - // on some systems stderr is used, but on others, it's not - throw new LintingException($this->getProcessErrorMessage(), $this->process->getExitCode()); - } - } - - private function getProcessErrorMessage(): string - { - $output = strtok(ltrim($this->process->getErrorOutput() ?: $this->process->getOutput()), "\n"); - - if (false === $output) { - return 'Fatal error: Unable to lint file.'; - } - - if (null !== $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))); - } - } - - $prefix = substr($output, 0, 18); - - if ('PHP Parse error: ' === $prefix) { - return sprintf('Parse error: %s.', substr($output, 18)); - } - - if ('PHP Fatal error: ' === $prefix) { - return sprintf('Fatal error: %s.', substr($output, 18)); - } - - return sprintf('%s.', $output); - } - - private function isSuccessful(): bool - { - if (null === $this->isSuccessful) { - $this->process->wait(); - $this->isSuccessful = $this->process->isSuccessful(); - } - - return $this->isSuccessful; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Linter/TokenizerLinter.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Linter/TokenizerLinter.php deleted file mode 100644 index e017bbc..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Linter/TokenizerLinter.php +++ /dev/null @@ -1,77 +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\Linter; - -use PhpCsFixer\FileReader; -use PhpCsFixer\Tokenizer\CodeHasher; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Handle PHP code linting. - * - * @author Dariusz Rumiński - * - * @internal - */ -final class TokenizerLinter implements LinterInterface -{ - public function __construct() - { - if ( - // @TODO: drop condition when PHP 7.3+ is required - false === class_exists(\CompileError::class) - ) { - throw new UnavailableLinterException('Cannot use tokenizer as linter.'); - } - } - - /** - * {@inheritdoc} - */ - public function isAsync(): bool - { - return false; - } - - /** - * {@inheritdoc} - */ - public function lintFile(string $path): LintingResultInterface - { - return $this->lintSource(FileReader::createSingleton()->read($path)); - } - - /** - * {@inheritdoc} - */ - public function lintSource(string $source): LintingResultInterface - { - try { - // To lint, we will parse the source into Tokens. - // 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); - Tokens::clearCache($codeHash); - Tokens::fromCode($source); - - return new TokenizerLintingResult(); - } catch (\ParseError $e) { - return new TokenizerLintingResult($e); - } catch (\CompileError $e) { - return new TokenizerLintingResult($e); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Linter/TokenizerLintingResult.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Linter/TokenizerLintingResult.php deleted file mode 100644 index ea49e49..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Linter/TokenizerLintingResult.php +++ /dev/null @@ -1,52 +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\Linter; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -final class TokenizerLintingResult implements LintingResultInterface -{ - /** - * @var null|\Error - */ - private $error; - - public function __construct(?\Error $error = null) - { - $this->error = $error; - } - - /** - * {@inheritdoc} - */ - 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()), - $this->error->getCode(), - $this->error - ); - } - } - - private function getMessagePrefix(): string - { - return $this->error instanceof \ParseError ? 'Parse error' : 'Fatal error'; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Linter/UnavailableLinterException.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Linter/UnavailableLinterException.php deleted file mode 100644 index 6cfd1eb..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Linter/UnavailableLinterException.php +++ /dev/null @@ -1,24 +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\Linter; - -/** - * Exception that is thrown when the chosen linter is not available on the environment. - * - * @author Dariusz Rumiński - */ -class UnavailableLinterException extends \RuntimeException -{ -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/PharChecker.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/PharChecker.php deleted file mode 100644 index fb35242..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/PharChecker.php +++ /dev/null @@ -1,41 +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; - -/** - * @internal - */ -final class PharChecker implements PharCheckerInterface -{ - /** - * {@inheritdoc} - */ - public function checkFileValidity(string $filename): ?string - { - try { - $phar = new \Phar($filename); - // free the variable to unlock the file - unset($phar); - } catch (\Exception $e) { - if (!$e instanceof \UnexpectedValueException && !$e instanceof \PharException) { - throw $e; - } - - return 'Failed to create Phar instance. '.$e->getMessage(); - } - - return null; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/PharCheckerInterface.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/PharCheckerInterface.php deleted file mode 100644 index 6ae2208..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/PharCheckerInterface.php +++ /dev/null @@ -1,26 +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; - -/** - * @internal - */ -interface PharCheckerInterface -{ - /** - * @return null|string the invalidity reason if any, null otherwise - */ - public function checkFileValidity(string $filename): ?string; -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Preg.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Preg.php deleted file mode 100644 index f238e11..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Preg.php +++ /dev/null @@ -1,209 +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; - -/** - * This class replaces preg_* functions to better handling UTF8 strings, - * ensuring no matter "u" modifier is present or absent subject will be handled correctly. - * - * @author Kuba Werłos - * - * @internal - */ -final class Preg -{ - /** - * @param null|string[] $matches - * - * @throws PregException - */ - public static function match(string $pattern, string $subject, ?array &$matches = null, int $flags = 0, int $offset = 0): int - { - $result = @preg_match(self::addUtf8Modifier($pattern), $subject, $matches, $flags, $offset); - if (false !== $result && PREG_NO_ERROR === preg_last_error()) { - return $result; - } - - $result = @preg_match(self::removeUtf8Modifier($pattern), $subject, $matches, $flags, $offset); - if (false !== $result && PREG_NO_ERROR === preg_last_error()) { - return $result; - } - - throw self::newPregException(preg_last_error(), __METHOD__, (array) $pattern); - } - - /** - * @param null|string[] $matches - * - * @throws PregException - */ - public static function matchAll(string $pattern, string $subject, ?array &$matches = null, int $flags = PREG_PATTERN_ORDER, int $offset = 0): int - { - $result = @preg_match_all(self::addUtf8Modifier($pattern), $subject, $matches, $flags, $offset); - if (false !== $result && PREG_NO_ERROR === preg_last_error()) { - return $result; - } - - $result = @preg_match_all(self::removeUtf8Modifier($pattern), $subject, $matches, $flags, $offset); - if (false !== $result && PREG_NO_ERROR === preg_last_error()) { - return $result; - } - - throw self::newPregException(preg_last_error(), __METHOD__, (array) $pattern); - } - - /** - * @param string|string[] $pattern - * @param string|string[] $replacement - * @param string|string[] $subject - * - * @throws PregException - * - * @return string|string[] - */ - public static function replace($pattern, $replacement, $subject, int $limit = -1, ?int &$count = null) - { - $result = @preg_replace(self::addUtf8Modifier($pattern), $replacement, $subject, $limit, $count); - if (null !== $result && PREG_NO_ERROR === preg_last_error()) { - return $result; - } - - $result = @preg_replace(self::removeUtf8Modifier($pattern), $replacement, $subject, $limit, $count); - if (null !== $result && PREG_NO_ERROR === preg_last_error()) { - return $result; - } - - throw self::newPregException(preg_last_error(), __METHOD__, (array) $pattern); - } - - /** - * @param string|string[] $pattern - * @param string|string[] $subject - * - * @throws PregException - * - * @return string|string[] - */ - public static function replaceCallback($pattern, callable $callback, $subject, int $limit = -1, ?int &$count = null) - { - $result = @preg_replace_callback(self::addUtf8Modifier($pattern), $callback, $subject, $limit, $count); - if (null !== $result && PREG_NO_ERROR === preg_last_error()) { - return $result; - } - - $result = @preg_replace_callback(self::removeUtf8Modifier($pattern), $callback, $subject, $limit, $count); - if (null !== $result && PREG_NO_ERROR === preg_last_error()) { - return $result; - } - - throw self::newPregException(preg_last_error(), __METHOD__, (array) $pattern); - } - - /** - * @throws PregException - * - * @return string[] - */ - public static function split(string $pattern, string $subject, int $limit = -1, int $flags = 0): array - { - $result = @preg_split(self::addUtf8Modifier($pattern), $subject, $limit, $flags); - if (false !== $result && PREG_NO_ERROR === preg_last_error()) { - return $result; - } - - $result = @preg_split(self::removeUtf8Modifier($pattern), $subject, $limit, $flags); - if (false !== $result && PREG_NO_ERROR === preg_last_error()) { - return $result; - } - - throw self::newPregException(preg_last_error(), __METHOD__, (array) $pattern); - } - - /** - * @param string|string[] $pattern - * - * @return string|string[] - */ - private static function addUtf8Modifier($pattern) - { - if (\is_array($pattern)) { - return array_map(__METHOD__, $pattern); - } - - return $pattern.'u'; - } - - /** - * @param string|string[] $pattern - * - * @return string|string[] - */ - private static function removeUtf8Modifier($pattern) - { - if (\is_array($pattern)) { - return array_map(__METHOD__, $pattern); - } - - if ('' === $pattern) { - return ''; - } - - $delimiter = $pattern[0]; - - $endDelimiterPosition = strrpos($pattern, $delimiter); - - return substr($pattern, 0, $endDelimiterPosition).str_replace('u', '', substr($pattern, $endDelimiterPosition)); - } - - /** - * 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 - */ - private static function newPregException(int $error, string $method, array $patterns): 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 - ); - } - - return new PregException(sprintf('Error occurred when calling %s.', $method), $error); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/PregException.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/PregException.php deleted file mode 100644 index c91b86c..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/PregException.php +++ /dev/null @@ -1,26 +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; - -/** - * Exception that is thrown when PCRE function encounters an error. - * - * @author Kuba Werłos - * - * @internal - */ -final class PregException extends \RuntimeException -{ -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/AbstractRuleSetDescription.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/AbstractRuleSetDescription.php deleted file mode 100644 index 4556d0f..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/AbstractRuleSetDescription.php +++ /dev/null @@ -1,37 +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\RuleSet; - -/** - * @internal - */ -abstract class AbstractRuleSetDescription implements RuleSetDescriptionInterface -{ - public function __construct() - { - } - - public function getName(): string - { - $name = substr(static::class, 1 + strrpos(static::class, '\\'), -3); - - return '@'.str_replace('Risky', ':risky', $name); - } - - public function isRisky(): bool - { - return false !== strpos(static::class, 'Risky'); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/RuleSet.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/RuleSet.php deleted file mode 100644 index b7c6197..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/RuleSet.php +++ /dev/null @@ -1,151 +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\RuleSet; - -use PhpCsFixer\ConfigurationException\InvalidFixerConfigurationException; - -/** - * Set of rules to be used by fixer. - * - * @author Dariusz Rumiński - * @author SpacePossum - * - * @internal - */ -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 must not point to any set. - * - * @var array - */ - private $rules; - - public function __construct(array $set = []) - { - foreach ($set as $name => $value) { - if ('' === $name) { - throw new \InvalidArgumentException('Rule/set name must not be empty.'); - } - - if (\is_int($name)) { - throw new \InvalidArgumentException(sprintf('Missing value for "%s" rule/set.', $value)); - } - - if (!\is_bool($value) && !\is_array($value)) { - $message = '@' === $name[0] ? 'Set must be enabled (true) or disabled (false). Other values are not allowed.' : 'Rule must be enabled (true), disabled (false) or configured (non-empty, assoc array). Other values are not allowed.'; - - if (null === $value) { - $message .= ' To disable the '.('@' === $name[0] ? 'set' : 'rule').', use "FALSE" instead of "NULL".'; - } - - throw new InvalidFixerConfigurationException($name, $message); - } - } - - $this->resolveSet($set); - } - - /** - * {@inheritdoc} - */ - public function hasRule(string $rule): bool - { - return \array_key_exists($rule, $this->rules); - } - - /** - * {@inheritdoc} - */ - public function getRuleConfiguration(string $rule): ?array - { - if (!$this->hasRule($rule)) { - throw new \InvalidArgumentException(sprintf('Rule "%s" is not in the set.', $rule)); - } - - if (true === $this->rules[$rule]) { - return null; - } - - return $this->rules[$rule]; - } - - /** - * {@inheritdoc} - */ - public function getRules(): array - { - return $this->rules; - } - - /** - * Resolve input set into group of rules. - * - * @return $this - */ - private function resolveSet(array $rules): self - { - $resolvedRules = []; - - // expand sets - foreach ($rules as $name => $value) { - if ('@' === $name[0]) { - if (!\is_bool($value)) { - throw new \UnexpectedValueException(sprintf('Nested rule set "%s" configuration must be a boolean.', $name)); - } - - $set = $this->resolveSubset($name, $value); - $resolvedRules = array_merge($resolvedRules, $set); - } else { - $resolvedRules[$name] = $value; - } - } - - // filter out all resolvedRules that are off - $resolvedRules = array_filter($resolvedRules); - - $this->rules = $resolvedRules; - - return $this; - } - - /** - * Resolve set rules as part of another set. - * - * If set value is false then disable all fixers in set, - * if not then get value from set item. - */ - private function resolveSubset(string $setName, bool $setValue): array - { - $rules = RuleSets::getSetDefinition($setName)->getRules(); - - foreach ($rules as $name => $value) { - if ('@' === $name[0]) { - $set = $this->resolveSubset($name, $setValue); - unset($rules[$name]); - $rules = array_merge($rules, $set); - } elseif (!$setValue) { - $rules[$name] = false; - } else { - $rules[$name] = $value; - } - } - - return $rules; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/RuleSetDescriptionInterface.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/RuleSetDescriptionInterface.php deleted file mode 100644 index 9fa6e91..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/RuleSetDescriptionInterface.php +++ /dev/null @@ -1,36 +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\RuleSet; - -/** - * @author SpacePossum - * - * @internal - */ -interface RuleSetDescriptionInterface -{ - public function __construct(); - - public function getDescription(): string; - - public function getName(): string; - - /** - * Get all rules from rules set. - */ - public function getRules(): array; - - public function isRisky(): bool; -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/RuleSetInterface.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/RuleSetInterface.php deleted file mode 100644 index 6149e0e..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/RuleSetInterface.php +++ /dev/null @@ -1,46 +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\RuleSet; - -/** - * Set of rules to be used by fixer. - * - * Example of set: ["@PSR2" => true, "@PSR1" => false, "strict" => true]. - * - * @author Dariusz Rumiński - */ -interface RuleSetInterface -{ - public function __construct(array $set = []); - - /** - * Get configuration for given rule. - * - * @param string $rule name of rule - */ - public function getRuleConfiguration(string $rule): ?array; - - /** - * Get all rules from rules set. - */ - public function getRules(): array; - - /** - * Check given rule is in rules set. - * - * @param string $rule name of rule - */ - public function hasRule(string $rule): bool; -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/RuleSets.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/RuleSets.php deleted file mode 100644 index 0d07716..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/RuleSets.php +++ /dev/null @@ -1,69 +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\RuleSet; - -use Symfony\Component\Finder\Finder; - -/** - * Set of rule sets to be used by fixer. - * - * @author SpacePossum - * - * @internal - */ -final class RuleSets -{ - private static $setDefinitions; - - /** - * @return array - */ - public static function getSetDefinitions(): array - { - if (null === self::$setDefinitions) { - self::$setDefinitions = []; - - foreach (Finder::create()->files()->in(__DIR__.'/Sets') as $file) { - $class = 'PhpCsFixer\RuleSet\Sets\\'.$file->getBasename('.php'); - $set = new $class(); - - self::$setDefinitions[$set->getName()] = $set; - } - - ksort(self::$setDefinitions); - } - - return self::$setDefinitions; - } - - /** - * @return string[] - */ - public static function getSetDefinitionNames(): array - { - return array_keys(self::getSetDefinitions()); - } - - public static function getSetDefinition(string $name): RuleSetDescriptionInterface - { - $definitions = self::getSetDefinitions(); - - if (!isset($definitions[$name])) { - throw new \InvalidArgumentException(sprintf('Set "%s" does not exist.', $name)); - } - - return $definitions[$name]; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/DoctrineAnnotationSet.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/DoctrineAnnotationSet.php deleted file mode 100644 index b2ea04a..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/DoctrineAnnotationSet.php +++ /dev/null @@ -1,42 +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\RuleSet\Sets; - -use PhpCsFixer\RuleSet\AbstractRuleSetDescription; - -/** - * @internal - */ -final class DoctrineAnnotationSet extends AbstractRuleSetDescription -{ - public function getRules(): array - { - return [ - 'doctrine_annotation_array_assignment' => [ - 'operator' => ':', - ], - 'doctrine_annotation_braces' => true, - 'doctrine_annotation_indentation' => true, - 'doctrine_annotation_spaces' => [ - 'before_array_assignments_colon' => false, - ], - ]; - } - - public function getDescription(): string - { - return 'Rules covering Doctrine annotations with configuration based on examples found in `Doctrine Annotation documentation `_ and `Symfony documentation `_.'; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP54MigrationSet.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP54MigrationSet.php deleted file mode 100644 index 7986c74..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP54MigrationSet.php +++ /dev/null @@ -1,35 +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\RuleSet\Sets; - -use PhpCsFixer\RuleSet\AbstractRuleSetDescription; - -/** - * @internal - */ -final class PHP54MigrationSet extends AbstractRuleSetDescription -{ - public function getRules(): array - { - return [ - 'array_syntax' => true, - ]; - } - - public function getDescription(): string - { - return 'Rules to improve code for PHP 5.4 compatibility.'; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP56MigrationRiskySet.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP56MigrationRiskySet.php deleted file mode 100644 index 0b8127b..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP56MigrationRiskySet.php +++ /dev/null @@ -1,35 +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\RuleSet\Sets; - -use PhpCsFixer\RuleSet\AbstractRuleSetDescription; - -/** - * @internal - */ -final class PHP56MigrationRiskySet extends AbstractRuleSetDescription -{ - public function getRules(): array - { - return [ - 'pow_to_exponentiation' => true, - ]; - } - - public function getDescription(): string - { - return 'Rules to improve code for PHP 5.6 compatibility.'; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP70MigrationRiskySet.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP70MigrationRiskySet.php deleted file mode 100644 index 9a1f88e..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP70MigrationRiskySet.php +++ /dev/null @@ -1,44 +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\RuleSet\Sets; - -use PhpCsFixer\RuleSet\AbstractRuleSetDescription; - -/** - * @internal - */ -final class PHP70MigrationRiskySet extends AbstractRuleSetDescription -{ - public function getRules(): array - { - return [ - '@PHP56Migration:risky' => true, - 'combine_nested_dirname' => true, - 'declare_strict_types' => true, - 'non_printable_character' => true, - 'random_api_migration' => [ - 'replacements' => [ - 'mt_rand' => 'random_int', - 'rand' => 'random_int', - ], - ], - ]; - } - - public function getDescription(): string - { - return 'Rules to improve code for PHP 7.0 compatibility.'; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP70MigrationSet.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP70MigrationSet.php deleted file mode 100644 index 0775376..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP70MigrationSet.php +++ /dev/null @@ -1,36 +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\RuleSet\Sets; - -use PhpCsFixer\RuleSet\AbstractRuleSetDescription; - -/** - * @internal - */ -final class PHP70MigrationSet extends AbstractRuleSetDescription -{ - public function getRules(): array - { - return [ - '@PHP54Migration' => true, - 'ternary_to_null_coalescing' => true, - ]; - } - - public function getDescription(): string - { - return 'Rules to improve code for PHP 7.0 compatibility.'; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP71MigrationRiskySet.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP71MigrationRiskySet.php deleted file mode 100644 index 632b203..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP71MigrationRiskySet.php +++ /dev/null @@ -1,36 +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\RuleSet\Sets; - -use PhpCsFixer\RuleSet\AbstractRuleSetDescription; - -/** - * @internal - */ -final class PHP71MigrationRiskySet extends AbstractRuleSetDescription -{ - public function getRules(): array - { - return [ - '@PHP70Migration:risky' => true, - 'void_return' => true, - ]; - } - - public function getDescription(): string - { - return 'Rules to improve code for PHP 7.1 compatibility.'; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP71MigrationSet.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP71MigrationSet.php deleted file mode 100644 index 6f06df3..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP71MigrationSet.php +++ /dev/null @@ -1,37 +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\RuleSet\Sets; - -use PhpCsFixer\RuleSet\AbstractRuleSetDescription; - -/** - * @internal - */ -final class PHP71MigrationSet extends AbstractRuleSetDescription -{ - public function getRules(): array - { - return [ - '@PHP70Migration' => true, - 'list_syntax' => true, - 'visibility_required' => true, - ]; - } - - public function getDescription(): string - { - return 'Rules to improve code for PHP 7.1 compatibility.'; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP73MigrationSet.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP73MigrationSet.php deleted file mode 100644 index 3b4ca5e..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP73MigrationSet.php +++ /dev/null @@ -1,39 +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\RuleSet\Sets; - -use PhpCsFixer\RuleSet\AbstractRuleSetDescription; - -/** - * @internal - */ -final class PHP73MigrationSet extends AbstractRuleSetDescription -{ - public function getRules(): array - { - return [ - '@PHP71Migration' => true, - 'heredoc_indentation' => true, - 'method_argument_space' => ['after_heredoc' => true], - 'no_whitespace_before_comma_in_array' => ['after_heredoc' => true], - 'trailing_comma_in_multiline' => ['after_heredoc' => true], - ]; - } - - public function getDescription(): string - { - return 'Rules to improve code for PHP 7.3 compatibility.'; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP74MigrationRiskySet.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP74MigrationRiskySet.php deleted file mode 100644 index 078d577..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP74MigrationRiskySet.php +++ /dev/null @@ -1,38 +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\RuleSet\Sets; - -use PhpCsFixer\RuleSet\AbstractRuleSetDescription; - -/** - * @internal - */ -final class PHP74MigrationRiskySet extends AbstractRuleSetDescription -{ - public function getRules(): array - { - return [ - '@PHP71Migration:risky' => true, - 'implode_call' => true, - 'no_alias_functions' => true, - 'use_arrow_functions' => true, - ]; - } - - public function getDescription(): string - { - return 'Rules to improve code for PHP 7.4 compatibility.'; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP74MigrationSet.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP74MigrationSet.php deleted file mode 100644 index e0d8af2..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP74MigrationSet.php +++ /dev/null @@ -1,37 +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\RuleSet\Sets; - -use PhpCsFixer\RuleSet\AbstractRuleSetDescription; - -/** - * @internal - */ -final class PHP74MigrationSet extends AbstractRuleSetDescription -{ - public function getRules(): array - { - return [ - '@PHP73Migration' => true, - 'normalize_index_brace' => true, - 'short_scalar_cast' => true, - ]; - } - - public function getDescription(): string - { - return 'Rules to improve code for PHP 7.4 compatibility.'; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP80MigrationRiskySet.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP80MigrationRiskySet.php deleted file mode 100644 index ab244cd..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP80MigrationRiskySet.php +++ /dev/null @@ -1,43 +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\RuleSet\Sets; - -use PhpCsFixer\RuleSet\AbstractRuleSetDescription; - -/** - * @internal - */ -final class PHP80MigrationRiskySet extends AbstractRuleSetDescription -{ - public function getRules(): array - { - return [ - '@PHP74Migration:risky' => true, - 'no_alias_functions' => [ - 'sets' => [ - '@all', - ], - ], - 'no_php4_constructor' => true, - 'no_unneeded_final_method' => true, // final private method (not constructor) are no longer allowed >= PHP8.0 - 'no_unreachable_default_argument_value' => true, - ]; - } - - public function getDescription(): string - { - return 'Rules to improve code for PHP 8.0 compatibility.'; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP80MigrationSet.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP80MigrationSet.php deleted file mode 100644 index 43f3a9f..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP80MigrationSet.php +++ /dev/null @@ -1,37 +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\RuleSet\Sets; - -use PhpCsFixer\RuleSet\AbstractRuleSetDescription; - -/** - * @internal - */ -final class PHP80MigrationSet extends AbstractRuleSetDescription -{ - public function getRules(): array - { - return [ - '@PHP74Migration' => true, - 'clean_namespace' => true, - 'no_unset_cast' => true, - ]; - } - - public function getDescription(): string - { - return 'Rules to improve code for PHP 8.0 compatibility.'; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit30MigrationRiskySet.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit30MigrationRiskySet.php deleted file mode 100644 index 753b3db..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit30MigrationRiskySet.php +++ /dev/null @@ -1,38 +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\RuleSet\Sets; - -use PhpCsFixer\Fixer\PhpUnit\PhpUnitTargetVersion; -use PhpCsFixer\RuleSet\AbstractRuleSetDescription; - -/** - * @internal - */ -final class PHPUnit30MigrationRiskySet extends AbstractRuleSetDescription -{ - public function getRules(): array - { - return [ - 'php_unit_dedicate_assert' => [ - 'target' => PhpUnitTargetVersion::VERSION_3_0, - ], - ]; - } - - public function getDescription(): string - { - return 'Rules to improve tests code for PHPUnit 3.0 compatibility.'; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit32MigrationRiskySet.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit32MigrationRiskySet.php deleted file mode 100644 index 265c5be..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit32MigrationRiskySet.php +++ /dev/null @@ -1,39 +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\RuleSet\Sets; - -use PhpCsFixer\Fixer\PhpUnit\PhpUnitTargetVersion; -use PhpCsFixer\RuleSet\AbstractRuleSetDescription; - -/** - * @internal - */ -final class PHPUnit32MigrationRiskySet extends AbstractRuleSetDescription -{ - public function getRules(): array - { - return [ - '@PHPUnit30Migration:risky' => true, - 'php_unit_no_expectation_annotation' => [ - 'target' => PhpUnitTargetVersion::VERSION_3_2, - ], - ]; - } - - public function getDescription(): string - { - return 'Rules to improve tests code for PHPUnit 3.2 compatibility.'; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit35MigrationRiskySet.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit35MigrationRiskySet.php deleted file mode 100644 index 3e5e45a..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit35MigrationRiskySet.php +++ /dev/null @@ -1,39 +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\RuleSet\Sets; - -use PhpCsFixer\Fixer\PhpUnit\PhpUnitTargetVersion; -use PhpCsFixer\RuleSet\AbstractRuleSetDescription; - -/** - * @internal - */ -final class PHPUnit35MigrationRiskySet extends AbstractRuleSetDescription -{ - public function getRules(): array - { - return [ - '@PHPUnit32Migration:risky' => true, - 'php_unit_dedicate_assert' => [ - 'target' => PhpUnitTargetVersion::VERSION_3_5, - ], - ]; - } - - public function getDescription(): string - { - return 'Rules to improve tests code for PHPUnit 3.5 compatibility.'; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit43MigrationRiskySet.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit43MigrationRiskySet.php deleted file mode 100644 index 4945ef1..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit43MigrationRiskySet.php +++ /dev/null @@ -1,39 +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\RuleSet\Sets; - -use PhpCsFixer\Fixer\PhpUnit\PhpUnitTargetVersion; -use PhpCsFixer\RuleSet\AbstractRuleSetDescription; - -/** - * @internal - */ -final class PHPUnit43MigrationRiskySet extends AbstractRuleSetDescription -{ - public function getRules(): array - { - return [ - '@PHPUnit35Migration:risky' => true, - 'php_unit_no_expectation_annotation' => [ - 'target' => PhpUnitTargetVersion::VERSION_4_3, - ], - ]; - } - - public function getDescription(): string - { - return 'Rules to improve tests code for PHPUnit 4.3 compatibility.'; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit48MigrationRiskySet.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit48MigrationRiskySet.php deleted file mode 100644 index 6c84b02..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit48MigrationRiskySet.php +++ /dev/null @@ -1,39 +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\RuleSet\Sets; - -use PhpCsFixer\Fixer\PhpUnit\PhpUnitTargetVersion; -use PhpCsFixer\RuleSet\AbstractRuleSetDescription; - -/** - * @internal - */ -final class PHPUnit48MigrationRiskySet extends AbstractRuleSetDescription -{ - public function getRules(): array - { - return [ - '@PHPUnit43Migration:risky' => true, - 'php_unit_namespaced' => [ - 'target' => PhpUnitTargetVersion::VERSION_4_8, - ], - ]; - } - - public function getDescription(): string - { - return 'Rules to improve tests code for PHPUnit 4.8 compatibility.'; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit50MigrationRiskySet.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit50MigrationRiskySet.php deleted file mode 100644 index 93de108..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit50MigrationRiskySet.php +++ /dev/null @@ -1,39 +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\RuleSet\Sets; - -use PhpCsFixer\Fixer\PhpUnit\PhpUnitTargetVersion; -use PhpCsFixer\RuleSet\AbstractRuleSetDescription; - -/** - * @internal - */ -final class PHPUnit50MigrationRiskySet extends AbstractRuleSetDescription -{ - public function getRules(): array - { - return [ - '@PHPUnit48Migration:risky' => true, - 'php_unit_dedicate_assert' => [ - 'target' => PhpUnitTargetVersion::VERSION_5_0, - ], - ]; - } - - public function getDescription(): string - { - return 'Rules to improve tests code for PHPUnit 5.0 compatibility.'; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit52MigrationRiskySet.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit52MigrationRiskySet.php deleted file mode 100644 index a170c28..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit52MigrationRiskySet.php +++ /dev/null @@ -1,39 +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\RuleSet\Sets; - -use PhpCsFixer\Fixer\PhpUnit\PhpUnitTargetVersion; -use PhpCsFixer\RuleSet\AbstractRuleSetDescription; - -/** - * @internal - */ -final class PHPUnit52MigrationRiskySet extends AbstractRuleSetDescription -{ - public function getRules(): array - { - return [ - '@PHPUnit50Migration:risky' => true, - 'php_unit_expectation' => [ - 'target' => PhpUnitTargetVersion::VERSION_5_2, - ], - ]; - } - - public function getDescription(): string - { - return 'Rules to improve tests code for PHPUnit 5.2 compatibility.'; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit54MigrationRiskySet.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit54MigrationRiskySet.php deleted file mode 100644 index fa1ee5b..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit54MigrationRiskySet.php +++ /dev/null @@ -1,39 +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\RuleSet\Sets; - -use PhpCsFixer\Fixer\PhpUnit\PhpUnitTargetVersion; -use PhpCsFixer\RuleSet\AbstractRuleSetDescription; - -/** - * @internal - */ -final class PHPUnit54MigrationRiskySet extends AbstractRuleSetDescription -{ - public function getRules(): array - { - return [ - '@PHPUnit52Migration:risky' => true, - 'php_unit_mock' => [ - 'target' => PhpUnitTargetVersion::VERSION_5_4, - ], - ]; - } - - public function getDescription(): string - { - return 'Rules to improve tests code for PHPUnit 5.4 compatibility.'; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit55MigrationRiskySet.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit55MigrationRiskySet.php deleted file mode 100644 index b895d2e..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit55MigrationRiskySet.php +++ /dev/null @@ -1,39 +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\RuleSet\Sets; - -use PhpCsFixer\Fixer\PhpUnit\PhpUnitTargetVersion; -use PhpCsFixer\RuleSet\AbstractRuleSetDescription; - -/** - * @internal - */ -final class PHPUnit55MigrationRiskySet extends AbstractRuleSetDescription -{ - public function getRules(): array - { - return [ - '@PHPUnit54Migration:risky' => true, - 'php_unit_mock' => [ - 'target' => PhpUnitTargetVersion::VERSION_5_5, - ], - ]; - } - - public function getDescription(): string - { - return 'Rules to improve tests code for PHPUnit 5.5 compatibility.'; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit56MigrationRiskySet.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit56MigrationRiskySet.php deleted file mode 100644 index f58cff5..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit56MigrationRiskySet.php +++ /dev/null @@ -1,42 +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\RuleSet\Sets; - -use PhpCsFixer\Fixer\PhpUnit\PhpUnitTargetVersion; -use PhpCsFixer\RuleSet\AbstractRuleSetDescription; - -/** - * @internal - */ -final class PHPUnit56MigrationRiskySet extends AbstractRuleSetDescription -{ - public function getRules(): array - { - return [ - '@PHPUnit55Migration:risky' => true, - 'php_unit_dedicate_assert' => [ - 'target' => PhpUnitTargetVersion::VERSION_5_6, - ], - 'php_unit_expectation' => [ - 'target' => PhpUnitTargetVersion::VERSION_5_6, - ], - ]; - } - - public function getDescription(): string - { - return 'Rules to improve tests code for PHPUnit 5.6 compatibility.'; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit57MigrationRiskySet.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit57MigrationRiskySet.php deleted file mode 100644 index 5fcd183..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit57MigrationRiskySet.php +++ /dev/null @@ -1,39 +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\RuleSet\Sets; - -use PhpCsFixer\Fixer\PhpUnit\PhpUnitTargetVersion; -use PhpCsFixer\RuleSet\AbstractRuleSetDescription; - -/** - * @internal - */ -final class PHPUnit57MigrationRiskySet extends AbstractRuleSetDescription -{ - public function getRules(): array - { - return [ - '@PHPUnit56Migration:risky' => true, - 'php_unit_namespaced' => [ - 'target' => PhpUnitTargetVersion::VERSION_5_7, - ], - ]; - } - - public function getDescription(): string - { - return 'Rules to improve tests code for PHPUnit 5.7 compatibility.'; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit60MigrationRiskySet.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit60MigrationRiskySet.php deleted file mode 100644 index 8894feb..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit60MigrationRiskySet.php +++ /dev/null @@ -1,39 +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\RuleSet\Sets; - -use PhpCsFixer\Fixer\PhpUnit\PhpUnitTargetVersion; -use PhpCsFixer\RuleSet\AbstractRuleSetDescription; - -/** - * @internal - */ -final class PHPUnit60MigrationRiskySet extends AbstractRuleSetDescription -{ - public function getRules(): array - { - return [ - '@PHPUnit57Migration:risky' => true, - 'php_unit_namespaced' => [ - 'target' => PhpUnitTargetVersion::VERSION_6_0, - ], - ]; - } - - public function getDescription(): string - { - return 'Rules to improve tests code for PHPUnit 6.0 compatibility.'; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit75MigrationRiskySet.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit75MigrationRiskySet.php deleted file mode 100644 index 43ff35a..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit75MigrationRiskySet.php +++ /dev/null @@ -1,39 +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\RuleSet\Sets; - -use PhpCsFixer\Fixer\PhpUnit\PhpUnitTargetVersion; -use PhpCsFixer\RuleSet\AbstractRuleSetDescription; - -/** - * @internal - */ -final class PHPUnit75MigrationRiskySet extends AbstractRuleSetDescription -{ - public function getRules(): array - { - return [ - '@PHPUnit60Migration:risky' => true, - 'php_unit_dedicate_assert_internal_type' => [ - 'target' => PhpUnitTargetVersion::VERSION_7_5, - ], - ]; - } - - public function getDescription(): string - { - return 'Rules to improve tests code for PHPUnit 7.5 compatibility.'; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit84MigrationRiskySet.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit84MigrationRiskySet.php deleted file mode 100644 index cab174a..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit84MigrationRiskySet.php +++ /dev/null @@ -1,40 +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\RuleSet\Sets; - -use PhpCsFixer\Fixer\PhpUnit\PhpUnitTargetVersion; -use PhpCsFixer\RuleSet\AbstractRuleSetDescription; - -/** - * @internal - */ -final class PHPUnit84MigrationRiskySet extends AbstractRuleSetDescription -{ - public function getRules(): array - { - return [ - '@PHPUnit60Migration:risky' => true, - '@PHPUnit75Migration:risky' => true, - 'php_unit_expectation' => [ - 'target' => PhpUnitTargetVersion::VERSION_8_4, - ], - ]; - } - - public function getDescription(): string - { - return 'Rules to improve tests code for PHPUnit 8.4 compatibility.'; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PSR12RiskySet.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PSR12RiskySet.php deleted file mode 100644 index 84fd3ef..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PSR12RiskySet.php +++ /dev/null @@ -1,36 +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\RuleSet\Sets; - -use PhpCsFixer\RuleSet\AbstractRuleSetDescription; - -/** - * @internal - */ -final class PSR12RiskySet extends AbstractRuleSetDescription -{ - public function getRules(): array - { - return [ - 'no_trailing_whitespace_in_string' => true, - 'no_unreachable_default_argument_value' => true, - ]; - } - - public function getDescription(): string - { - return 'Rules that follow `PSR-12 `_ standard.'; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PSR12Set.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PSR12Set.php deleted file mode 100644 index bc6a8ea..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PSR12Set.php +++ /dev/null @@ -1,66 +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\RuleSet\Sets; - -use PhpCsFixer\RuleSet\AbstractRuleSetDescription; - -/** - * @internal - */ -final class PSR12Set extends AbstractRuleSetDescription -{ - public function getRules(): array - { - return [ - '@PSR2' => true, - 'blank_line_after_opening_tag' => true, - 'braces' => [ - 'allow_single_line_anonymous_class_with_empty_body' => true, - ], - 'compact_nullable_typehint' => true, - 'declare_equal_normalize' => true, - 'lowercase_cast' => true, - 'lowercase_static_reference' => true, - 'new_with_braces' => true, - 'no_blank_lines_after_class_opening' => true, - 'no_leading_import_slash' => true, - 'no_whitespace_in_blank_line' => true, - 'ordered_class_elements' => [ - 'order' => [ - 'use_trait', - ], - ], - 'ordered_imports' => [ - 'imports_order' => [ - 'class', - 'function', - 'const', - ], - 'sort_algorithm' => 'none', - ], - 'return_type_declaration' => true, - 'short_scalar_cast' => true, - 'single_blank_line_before_namespace' => true, - 'single_trait_insert_per_statement' => true, - 'ternary_operator_spaces' => true, - 'visibility_required' => true, - ]; - } - - public function getDescription(): string - { - return 'Rules that follow `PSR-12 `_ standard.'; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PSR1Set.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PSR1Set.php deleted file mode 100644 index 3c82ea5..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PSR1Set.php +++ /dev/null @@ -1,36 +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\RuleSet\Sets; - -use PhpCsFixer\RuleSet\AbstractRuleSetDescription; - -/** - * @internal - */ -final class PSR1Set extends AbstractRuleSetDescription -{ - public function getRules(): array - { - return [ - 'encoding' => true, - 'full_opening_tag' => true, - ]; - } - - public function getDescription(): string - { - return 'Rules that follow `PSR-1 `_ standard.'; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PSR2Set.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PSR2Set.php deleted file mode 100644 index a196ed8..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PSR2Set.php +++ /dev/null @@ -1,64 +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\RuleSet\Sets; - -use PhpCsFixer\RuleSet\AbstractRuleSetDescription; - -/** - * @internal - */ -final class PSR2Set extends AbstractRuleSetDescription -{ - public function getRules(): array - { - return [ - '@PSR1' => true, - 'blank_line_after_namespace' => true, - 'braces' => true, - 'class_definition' => true, - 'constant_case' => true, - 'elseif' => true, - 'function_declaration' => true, - 'indentation_type' => true, - 'line_ending' => true, - 'lowercase_keywords' => true, - 'method_argument_space' => [ - 'on_multiline' => 'ensure_fully_multiline', - ], - 'no_break_comment' => true, - 'no_closing_tag' => true, - 'no_spaces_after_function_name' => true, - 'no_spaces_inside_parenthesis' => true, - 'no_trailing_whitespace' => true, - 'no_trailing_whitespace_in_comment' => true, - 'single_blank_line_at_eof' => true, - 'single_class_element_per_statement' => [ - 'elements' => [ - 'property', - ], - ], - 'single_import_per_statement' => true, - 'single_line_after_imports' => true, - 'switch_case_semicolon_to_colon' => true, - 'switch_case_space' => true, - 'visibility_required' => ['elements' => ['method', 'property']], - ]; - } - - public function getDescription(): string - { - return 'Rules that follow `PSR-2 `_ standard.'; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PhpCsFixerRiskySet.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PhpCsFixerRiskySet.php deleted file mode 100644 index d537201..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PhpCsFixerRiskySet.php +++ /dev/null @@ -1,60 +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\RuleSet\Sets; - -use PhpCsFixer\RuleSet\AbstractRuleSetDescription; - -/** - * @internal - */ -final class PhpCsFixerRiskySet extends AbstractRuleSetDescription -{ - public function getRules(): array - { - return [ - '@Symfony:risky' => true, - 'comment_to_phpdoc' => true, - 'final_internal_class' => true, - // @TODO: consider switching to `true`, like in @Symfony - 'native_constant_invocation' => [ - 'fix_built_in' => false, - 'include' => [ - 'DIRECTORY_SEPARATOR', - 'PHP_INT_SIZE', - 'PHP_SAPI', - 'PHP_VERSION_ID', - ], - 'scope' => 'namespaced', - 'strict' => true, - ], - 'no_alias_functions' => [ - 'sets' => [ - '@all', - ], - ], - 'no_unreachable_default_argument_value' => true, - 'no_unset_on_property' => true, - 'php_unit_strict' => true, - 'php_unit_test_case_static_method_calls' => true, - 'strict_comparison' => true, - 'strict_param' => true, - ]; - } - - public function getDescription(): string - { - return 'Rule set as used by the PHP-CS-Fixer development team, highly opinionated.'; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PhpCsFixerSet.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PhpCsFixerSet.php deleted file mode 100644 index 51a38f4..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PhpCsFixerSet.php +++ /dev/null @@ -1,108 +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\RuleSet\Sets; - -use PhpCsFixer\RuleSet\AbstractRuleSetDescription; - -/** - * @internal - */ -final class PhpCsFixerSet extends AbstractRuleSetDescription -{ - public function getRules(): array - { - return [ - '@Symfony' => true, - 'align_multiline_comment' => true, - 'array_indentation' => true, - 'blank_line_before_statement' => [ - 'statements' => [ - 'break', - 'case', - 'continue', - 'declare', - 'default', - 'exit', - 'goto', - 'include', - 'include_once', - 'require', - 'require_once', - 'return', - 'switch', - 'throw', - 'try', - ], - ], - 'combine_consecutive_issets' => true, - 'combine_consecutive_unsets' => true, - 'empty_loop_body' => true, - 'escape_implicit_backslashes' => true, - 'explicit_indirect_variable' => true, - 'explicit_string_variable' => true, - 'heredoc_to_nowdoc' => true, - 'method_argument_space' => [ - 'on_multiline' => 'ensure_fully_multiline', - ], - 'method_chaining_indentation' => true, - 'multiline_comment_opening_closing' => true, - 'multiline_whitespace_before_semicolons' => [ - 'strategy' => 'new_line_for_chained_calls', - ], - 'no_extra_blank_lines' => [ - 'tokens' => [ - 'break', - 'case', - 'continue', - 'curly_brace_block', - 'default', - 'extra', - 'parenthesis_brace_block', - 'return', - 'square_brace_block', - 'switch', - 'throw', - 'use', - 'use_trait', - ], - ], - 'no_null_property_initialization' => true, - 'no_superfluous_elseif' => true, - 'no_useless_else' => true, - 'no_useless_return' => true, - 'operator_linebreak' => [ - 'only_booleans' => true, - ], - 'ordered_class_elements' => true, - 'php_unit_internal_class' => true, - 'php_unit_test_class_requires_covers' => true, - 'phpdoc_add_missing_param_annotation' => true, - 'phpdoc_no_empty_return' => true, - 'phpdoc_order' => true, - 'phpdoc_order_by_value' => true, - 'phpdoc_types_order' => true, - 'phpdoc_var_annotation_correct_order' => true, - 'return_assignment' => true, - 'simple_to_complex_string_variable' => true, - 'single_line_comment_style' => true, - 'single_line_throw' => false, - ]; - } - - public function getDescription(): string - { - return 'Rule set as used by the PHP-CS-Fixer development team, highly opinionated.'; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/SymfonyRiskySet.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/SymfonyRiskySet.php deleted file mode 100644 index 271815e..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/SymfonyRiskySet.php +++ /dev/null @@ -1,79 +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\RuleSet\Sets; - -use PhpCsFixer\RuleSet\AbstractRuleSetDescription; - -/** - * @internal - */ -final class SymfonyRiskySet extends AbstractRuleSetDescription -{ - public function getRules(): array - { - $rules = [ - '@PHP56Migration:risky' => true, - '@PSR12:risky' => true, - 'array_push' => true, - 'combine_nested_dirname' => true, - 'dir_constant' => true, - 'ereg_to_preg' => true, - 'error_suppression' => true, - 'fopen_flag_order' => true, - 'fopen_flags' => [ - 'b_mode' => false, - ], - 'function_to_constant' => true, - 'implode_call' => true, - 'is_null' => true, - 'logical_operators' => true, - 'modernize_types_casting' => true, - 'native_constant_invocation' => true, - 'native_function_invocation' => [ - 'include' => [ - '@compiler_optimized', - ], - 'scope' => 'namespaced', - 'strict' => true, - ], - 'no_alias_functions' => true, - '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, - 'php_unit_construct' => true, - 'php_unit_mock_short_will_return' => true, - 'php_unit_set_up_tear_down_visibility' => true, - 'php_unit_test_annotation' => true, - 'psr_autoloading' => true, - 'self_accessor' => true, - 'set_type_to_cast' => true, - 'string_line_ending' => true, - 'ternary_to_elvis_operator' => true, - ]; - - ksort($rules); - - return $rules; - } - - public function getDescription(): string - { - return 'Rules that follow the official `Symfony Coding Standards `_.'; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/SymfonySet.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/SymfonySet.php deleted file mode 100644 index e153c88..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/SymfonySet.php +++ /dev/null @@ -1,184 +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\RuleSet\Sets; - -use PhpCsFixer\RuleSet\AbstractRuleSetDescription; - -/** - * @internal - */ -final class SymfonySet extends AbstractRuleSetDescription -{ - public function getRules(): array - { - return [ - '@PSR12' => true, - 'array_syntax' => true, - 'backtick_to_shell_exec' => true, - 'binary_operator_spaces' => true, - 'blank_line_before_statement' => [ - 'statements' => [ - 'return', - ], - ], - 'braces' => [ - 'allow_single_line_anonymous_class_with_empty_body' => true, - 'allow_single_line_closure' => true, - ], - 'cast_spaces' => true, - 'class_attributes_separation' => [ - 'elements' => [ - 'method' => 'one', - ], - ], - 'class_definition' => [ - 'single_line' => true, - ], - 'clean_namespace' => true, - 'concat_space' => true, - 'echo_tag_syntax' => true, - 'fully_qualified_strict_types' => true, - 'function_typehint_space' => true, - 'general_phpdoc_tag_rename' => [ - 'replacements' => [ - 'inheritDocs' => 'inheritDoc', - ], - ], - 'include' => true, - 'increment_style' => true, - 'lambda_not_used_import' => true, - 'linebreak_after_opening_tag' => true, - 'magic_constant_casing' => true, - 'magic_method_casing' => true, - 'method_argument_space' => [ - 'on_multiline' => 'ignore', - ], - 'native_function_casing' => true, - 'native_function_type_declaration_casing' => true, - 'no_alias_language_construct_call' => true, - 'no_alternative_syntax' => true, - 'no_binary_string' => true, - 'no_blank_lines_after_phpdoc' => true, - 'no_empty_comment' => true, - 'no_empty_phpdoc' => true, - 'no_empty_statement' => true, - 'no_extra_blank_lines' => [ - 'tokens' => [ - 'case', - 'continue', - 'curly_brace_block', - 'default', - 'extra', - 'parenthesis_brace_block', - 'square_brace_block', - 'switch', - 'throw', - 'use', - 'use_trait', - ], - ], - 'no_leading_namespace_whitespace' => true, - 'no_mixed_echo_print' => true, - 'no_multiline_whitespace_around_double_arrow' => true, - 'no_short_bool_cast' => true, - 'no_singleline_whitespace_before_semicolons' => true, - 'no_spaces_around_offset' => true, - 'no_superfluous_phpdoc_tags' => [ - 'allow_mixed' => true, - 'allow_unused_params' => true, - ], - 'no_trailing_comma_in_list_call' => true, - 'no_trailing_comma_in_singleline_array' => true, - 'no_unneeded_control_parentheses' => [ - 'statements' => [ - 'break', - 'clone', - 'continue', - 'echo_print', - 'return', - 'switch_case', - 'yield', - 'yield_from', - ], - ], - 'no_unneeded_curly_braces' => [ - 'namespaces' => true, - ], - 'no_unset_cast' => true, - 'no_unused_imports' => true, - 'no_whitespace_before_comma_in_array' => true, - 'normalize_index_brace' => true, - 'object_operator_without_whitespace' => true, - 'ordered_imports' => true, - 'php_unit_fqcn_annotation' => true, - 'php_unit_method_casing' => true, - 'phpdoc_align' => true, - 'phpdoc_annotation_without_dot' => true, - 'phpdoc_indent' => true, - 'phpdoc_inline_tag_normalizer' => true, - 'phpdoc_no_access' => true, - 'phpdoc_no_alias_tag' => true, - 'phpdoc_no_package' => true, - 'phpdoc_no_useless_inheritdoc' => true, - 'phpdoc_return_self_reference' => true, - 'phpdoc_scalar' => true, - 'phpdoc_separation' => true, - 'phpdoc_single_line_var_spacing' => true, - 'phpdoc_summary' => true, - 'phpdoc_tag_type' => [ - 'tags' => [ - 'inheritDoc' => 'inline', - ], - ], - 'phpdoc_to_comment' => true, - 'phpdoc_trim' => true, - 'phpdoc_trim_consecutive_blank_line_separation' => true, - 'phpdoc_types' => true, - 'phpdoc_types_order' => [ - 'null_adjustment' => 'always_last', - 'sort_algorithm' => 'none', - ], - 'phpdoc_var_without_name' => true, - 'protected_to_private' => true, - 'semicolon_after_instruction' => true, - 'single_class_element_per_statement' => true, - 'single_line_comment_style' => [ - 'comment_types' => [ - 'hash', - ], - ], - 'single_line_throw' => true, - 'single_quote' => true, - 'single_space_after_construct' => true, - 'space_after_semicolon' => [ - 'remove_in_empty_for_expressions' => true, - ], - 'standardize_increment' => true, - 'standardize_not_equals' => true, - 'switch_continue_to_break' => true, - 'trailing_comma_in_multiline' => true, - 'trim_array_spaces' => true, - 'types_spaces' => true, - 'unary_operator_spaces' => true, - 'whitespace_after_comma_in_array' => true, - 'yoda_style' => true, - ]; - } - - public function getDescription(): string - { - return 'Rules that follow the official `Symfony Coding Standards `_.'; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Runner/FileCachingLintingIterator.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Runner/FileCachingLintingIterator.php deleted file mode 100644 index b8ea84d..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Runner/FileCachingLintingIterator.php +++ /dev/null @@ -1,82 +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\Runner; - -use PhpCsFixer\Linter\LinterInterface; -use PhpCsFixer\Linter\LintingResultInterface; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -final class FileCachingLintingIterator extends \CachingIterator -{ - /** - * @var LintingResultInterface - */ - private $currentResult; - - /** - * @var LinterInterface - */ - private $linter; - - /** - * @var LintingResultInterface - */ - private $nextResult; - - public function __construct(\Iterator $iterator, LinterInterface $linter) - { - parent::__construct($iterator); - - $this->linter = $linter; - } - - public function currentLintingResult(): LintingResultInterface - { - return $this->currentResult; - } - - public function next(): void - { - parent::next(); - - $this->currentResult = $this->nextResult; - - if ($this->hasNext()) { - $this->nextResult = $this->handleItem($this->getInnerIterator()->current()); - } - } - - public function rewind(): void - { - parent::rewind(); - - if ($this->valid()) { - $this->currentResult = $this->handleItem($this->current()); - } - - if ($this->hasNext()) { - $this->nextResult = $this->handleItem($this->getInnerIterator()->current()); - } - } - - private function handleItem(\SplFileInfo $file): LintingResultInterface - { - return $this->linter->lintFile($file->getRealPath()); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Runner/FileFilterIterator.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Runner/FileFilterIterator.php deleted file mode 100644 index 8feb19f..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Runner/FileFilterIterator.php +++ /dev/null @@ -1,112 +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\Runner; - -use PhpCsFixer\Cache\CacheManagerInterface; -use PhpCsFixer\FileReader; -use PhpCsFixer\FixerFileProcessedEvent; -use Symfony\Component\EventDispatcher\EventDispatcherInterface; -use Symfony\Contracts\EventDispatcher\Event; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -final class FileFilterIterator extends \FilterIterator -{ - /** - * @var null|EventDispatcherInterface - */ - private $eventDispatcher; - - /** - * @var CacheManagerInterface - */ - private $cacheManager; - - /** - * @var array - */ - private $visitedElements = []; - - public function __construct( - \Traversable $iterator, - ?EventDispatcherInterface $eventDispatcher, - CacheManagerInterface $cacheManager - ) { - if (!$iterator instanceof \Iterator) { - $iterator = new \IteratorIterator($iterator); - } - - parent::__construct($iterator); - - $this->eventDispatcher = $eventDispatcher; - $this->cacheManager = $cacheManager; - } - - public function accept(): bool - { - $file = $this->current(); - if (!$file instanceof \SplFileInfo) { - throw new \RuntimeException( - sprintf( - 'Expected instance of "\SplFileInfo", got "%s".', - \is_object($file) ? \get_class($file) : \gettype($file) - ) - ); - } - - $path = $file->isLink() ? $file->getPathname() : $file->getRealPath(); - - if (isset($this->visitedElements[$path])) { - return false; - } - - $this->visitedElements[$path] = true; - - if (!$file->isFile() || $file->isLink()) { - return false; - } - - $content = FileReader::createSingleton()->read($path); - - // mark as skipped: - if ( - // empty file - '' === $content - // file that does not need fixing due to cache - || !$this->cacheManager->needFixing($file->getPathname(), $content) - ) { - $this->dispatchEvent( - FixerFileProcessedEvent::NAME, - new FixerFileProcessedEvent(FixerFileProcessedEvent::STATUS_SKIPPED) - ); - - return false; - } - - return true; - } - - private function dispatchEvent(string $name, Event $event): void - { - if (null === $this->eventDispatcher) { - return; - } - - $this->eventDispatcher->dispatch($event, $name); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Runner/FileLintingIterator.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Runner/FileLintingIterator.php deleted file mode 100644 index fb0a7b4..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Runner/FileLintingIterator.php +++ /dev/null @@ -1,67 +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\Runner; - -use PhpCsFixer\Linter\LinterInterface; -use PhpCsFixer\Linter\LintingResultInterface; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -final class FileLintingIterator extends \IteratorIterator -{ - /** - * @var LintingResultInterface - */ - private $currentResult; - - /** - * @var null|LinterInterface - */ - private $linter; - - public function __construct(\Iterator $iterator, LinterInterface $linter) - { - parent::__construct($iterator); - - $this->linter = $linter; - } - - public function currentLintingResult(): ?LintingResultInterface - { - return $this->currentResult; - } - - public function next(): void - { - parent::next(); - - $this->currentResult = $this->valid() ? $this->handleItem($this->current()) : null; - } - - public function rewind(): void - { - parent::rewind(); - - $this->currentResult = $this->valid() ? $this->handleItem($this->current()) : null; - } - - private function handleItem(\SplFileInfo $file): LintingResultInterface - { - return $this->linter->lintFile($file->getRealPath()); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Runner/Runner.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Runner/Runner.php deleted file mode 100644 index 337ee10..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Runner/Runner.php +++ /dev/null @@ -1,319 +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\Runner; - -use PhpCsFixer\AbstractFixer; -use PhpCsFixer\Cache\CacheManagerInterface; -use PhpCsFixer\Cache\Directory; -use PhpCsFixer\Cache\DirectoryInterface; -use PhpCsFixer\Differ\DifferInterface; -use PhpCsFixer\Error\Error; -use PhpCsFixer\Error\ErrorsManager; -use PhpCsFixer\FileReader; -use PhpCsFixer\Fixer\FixerInterface; -use PhpCsFixer\FixerFileProcessedEvent; -use PhpCsFixer\Linter\LinterInterface; -use PhpCsFixer\Linter\LintingException; -use PhpCsFixer\Linter\LintingResultInterface; -use PhpCsFixer\Tokenizer\Tokens; -use Symfony\Component\EventDispatcher\EventDispatcherInterface; -use Symfony\Component\Filesystem\Exception\IOException; -use Symfony\Contracts\EventDispatcher\Event; - -/** - * @author Dariusz Rumiński - */ -final class Runner -{ - /** - * @var DifferInterface - */ - private $differ; - - /** - * @var DirectoryInterface - */ - private $directory; - - /** - * @var null|EventDispatcherInterface - */ - private $eventDispatcher; - - /** - * @var ErrorsManager - */ - private $errorsManager; - - /** - * @var CacheManagerInterface - */ - private $cacheManager; - - /** - * @var bool - */ - private $isDryRun; - - /** - * @var LinterInterface - */ - private $linter; - - /** - * @var \Traversable - */ - private $finder; - - /** - * @var FixerInterface[] - */ - private $fixers; - - /** - * @var bool - */ - private $stopOnViolation; - - public function __construct( - $finder, - array $fixers, - DifferInterface $differ, - ?EventDispatcherInterface $eventDispatcher, - ErrorsManager $errorsManager, - LinterInterface $linter, - $isDryRun, - CacheManagerInterface $cacheManager, - ?DirectoryInterface $directory = null, - $stopOnViolation = false - ) { - $this->finder = $finder; - $this->fixers = $fixers; - $this->differ = $differ; - $this->eventDispatcher = $eventDispatcher; - $this->errorsManager = $errorsManager; - $this->linter = $linter; - $this->isDryRun = $isDryRun; - $this->cacheManager = $cacheManager; - $this->directory = $directory ?: new Directory(''); - $this->stopOnViolation = $stopOnViolation; - } - - public function fix(): array - { - $changed = []; - - $finder = $this->finder; - $finderIterator = $finder instanceof \IteratorAggregate ? $finder->getIterator() : $finder; - $fileFilteredFileIterator = new FileFilterIterator( - $finderIterator, - $this->eventDispatcher, - $this->cacheManager - ); - - $collection = $this->linter->isAsync() - ? new FileCachingLintingIterator($fileFilteredFileIterator, $this->linter) - : new FileLintingIterator($fileFilteredFileIterator, $this->linter); - - /** @var \SplFileInfo $file */ - foreach ($collection as $file) { - $fixInfo = $this->fixFile($file, $collection->currentLintingResult()); - - // we do not need Tokens to still caching just fixed file - so clear the cache - Tokens::clearCache(); - - if ($fixInfo) { - $name = $this->directory->getRelativePathTo($file->__toString()); - $changed[$name] = $fixInfo; - - if ($this->stopOnViolation) { - break; - } - } - } - - return $changed; - } - - private function fixFile(\SplFileInfo $file, LintingResultInterface $lintingResult): ?array - { - $name = $file->getPathname(); - - try { - $lintingResult->check(); - } catch (LintingException $e) { - $this->dispatchEvent( - FixerFileProcessedEvent::NAME, - new FixerFileProcessedEvent(FixerFileProcessedEvent::STATUS_INVALID) - ); - - $this->errorsManager->report(new Error(Error::TYPE_INVALID, $name, $e)); - - return null; - } - - $old = FileReader::createSingleton()->read($file->getRealPath()); - - $tokens = Tokens::fromCode($old); - $oldHash = $tokens->getCodeHash(); - - $newHash = $oldHash; - $new = $old; - - $appliedFixers = []; - - try { - foreach ($this->fixers as $fixer) { - // for custom fixers we don't know is it safe to run `->fix()` without checking `->supports()` and `->isCandidate()`, - // thus we need to check it and conditionally skip fixing - if ( - !$fixer instanceof AbstractFixer - && (!$fixer->supports($file) || !$fixer->isCandidate($tokens)) - ) { - continue; - } - - $fixer->fix($file, $tokens); - - if ($tokens->isChanged()) { - $tokens->clearEmptyTokens(); - $tokens->clearChanged(); - $appliedFixers[] = $fixer->getName(); - } - } - } catch (\Exception $e) { - $this->processException($name, $e); - - return null; - } catch (\ParseError $e) { - $this->dispatchEvent( - FixerFileProcessedEvent::NAME, - new FixerFileProcessedEvent(FixerFileProcessedEvent::STATUS_LINT) - ); - - $this->errorsManager->report(new Error(Error::TYPE_LINT, $name, $e)); - - return null; - } catch (\Throwable $e) { - $this->processException($name, $e); - - return null; - } - - $fixInfo = null; - - if (!empty($appliedFixers)) { - $new = $tokens->generateCode(); - $newHash = $tokens->getCodeHash(); - } - - // We need to check if content was changed and then applied changes. - // But we can't simple check $appliedFixers, because one fixer may revert - // work of other and both of them will mark collection as changed. - // Therefore we need to check if code hashes changed. - if ($oldHash !== $newHash) { - $fixInfo = [ - 'appliedFixers' => $appliedFixers, - 'diff' => $this->differ->diff($old, $new, $file), - ]; - - try { - $this->linter->lintSource($new)->check(); - } catch (LintingException $e) { - $this->dispatchEvent( - FixerFileProcessedEvent::NAME, - new FixerFileProcessedEvent(FixerFileProcessedEvent::STATUS_LINT) - ); - - $this->errorsManager->report(new Error(Error::TYPE_LINT, $name, $e, $fixInfo['appliedFixers'], $fixInfo['diff'])); - - return null; - } - - if (!$this->isDryRun) { - $fileName = $file->getRealPath(); - - if (!file_exists($fileName)) { - throw new IOException( - sprintf('Failed to write file "%s" (no longer) exists.', $file->getPathname()), - 0, - null, - $file->getPathname() - ); - } - - if (is_dir($fileName)) { - throw new IOException( - sprintf('Cannot write file "%s" as the location exists as directory.', $fileName), - 0, - null, - $fileName - ); - } - - if (!is_writable($fileName)) { - throw new IOException( - sprintf('Cannot write to file "%s" as it is not writable.', $fileName), - 0, - null, - $fileName - ); - } - - if (false === @file_put_contents($fileName, $new)) { - $error = error_get_last(); - - throw new IOException( - sprintf('Failed to write file "%s", "%s".', $fileName, $error ? $error['message'] : 'no reason available'), - 0, - null, - $fileName - ); - } - } - } - - $this->cacheManager->setFile($name, $new); - - $this->dispatchEvent( - FixerFileProcessedEvent::NAME, - new FixerFileProcessedEvent($fixInfo ? FixerFileProcessedEvent::STATUS_FIXED : FixerFileProcessedEvent::STATUS_NO_CHANGES) - ); - - return $fixInfo; - } - - /** - * Process an exception that occurred. - */ - private function processException(string $name, \Throwable $e): void - { - $this->dispatchEvent( - FixerFileProcessedEvent::NAME, - new FixerFileProcessedEvent(FixerFileProcessedEvent::STATUS_EXCEPTION) - ); - - $this->errorsManager->report(new Error(Error::TYPE_EXCEPTION, $name, $e)); - } - - private function dispatchEvent(string $name, Event $event): void - { - if (null === $this->eventDispatcher) { - return; - } - - $this->eventDispatcher->dispatch($event, $name); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/StdinFileInfo.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/StdinFileInfo.php deleted file mode 100644 index bbb66ac..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/StdinFileInfo.php +++ /dev/null @@ -1,174 +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; - -/** - * @author Davi Koscianski Vidal - * - * @internal - */ -final class StdinFileInfo extends \SplFileInfo -{ - public function __construct() - { - } - - public function __toString(): string - { - return $this->getRealPath(); - } - - public function getRealPath(): string - { - // So file_get_contents & friends will work. - // Warning - this stream is not seekable, so `file_get_contents` will work only once! Consider using `FileReader`. - return 'php://stdin'; - } - - public function getATime(): int - { - return 0; - } - - public function getBasename($suffix = null): string - { - return $this->getFilename(); - } - - public function getCTime(): int - { - return 0; - } - - public function getExtension(): string - { - return '.php'; - } - - public function getFileInfo($className = null): \SplFileInfo - { - throw new \BadMethodCallException(sprintf('Method "%s" is not implemented.', __METHOD__)); - } - - public function getFilename(): string - { - /* - * Useful so fixers depending on PHP-only files still work. - * - * The idea to use STDIN is to parse PHP-only files, so we can - * assume that there will be always a PHP file out there. - */ - - return 'stdin.php'; - } - - public function getGroup(): int - { - return 0; - } - - public function getInode(): int - { - return 0; - } - - public function getLinkTarget(): string - { - return ''; - } - - public function getMTime(): int - { - return 0; - } - - public function getOwner(): int - { - return 0; - } - - public function getPath(): string - { - return ''; - } - - public function getPathInfo($className = null): \SplFileInfo - { - throw new \BadMethodCallException(sprintf('Method "%s" is not implemented.', __METHOD__)); - } - - public function getPathname(): string - { - return $this->getFilename(); - } - - public function getPerms(): int - { - return 0; - } - - public function getSize(): int - { - return 0; - } - - public function getType(): string - { - return 'file'; - } - - public function isDir(): bool - { - return false; - } - - public function isExecutable(): bool - { - return false; - } - - public function isFile(): bool - { - return true; - } - - public function isLink(): bool - { - return false; - } - - public function isReadable(): bool - { - return true; - } - - public function isWritable(): bool - { - return false; - } - - public function openFile($openMode = 'r', $useIncludePath = false, $context = null): \SplFileObject - { - 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/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/AbstractTransformer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/AbstractTransformer.php deleted file mode 100644 index 8b0fae8..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/AbstractTransformer.php +++ /dev/null @@ -1,49 +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\Tokenizer; - -use PhpCsFixer\Utils; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -abstract class AbstractTransformer implements TransformerInterface -{ - /** - * {@inheritdoc} - */ - public function getName(): string - { - $nameParts = explode('\\', static::class); - $name = substr(end($nameParts), 0, -\strlen('Transformer')); - - return Utils::camelCaseToUnderscore($name); - } - - /** - * {@inheritdoc} - */ - public function getPriority(): int - { - return 0; - } - - /** - * {@inheritdoc} - */ - abstract public function getCustomTokens(): array; -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/ArgumentAnalysis.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/ArgumentAnalysis.php deleted file mode 100644 index 54b8167..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/ArgumentAnalysis.php +++ /dev/null @@ -1,87 +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\Tokenizer\Analyzer\Analysis; - -/** - * @internal - */ -final class ArgumentAnalysis -{ - /** - * The default value of the argument. - * - * @var null|string - */ - private $default; - - /** - * The name of the argument. - * - * @var string - */ - private $name; - - /** - * The index where the name is located in the supplied Tokens object. - * - * @var int - */ - private $nameIndex; - - /** - * The type analysis of the argument. - * - * @var ?TypeAnalysis - */ - private $typeAnalysis; - - public function __construct(string $name, int $nameIndex, ?string $default, ?TypeAnalysis $typeAnalysis = null) - { - $this->name = $name; - $this->nameIndex = $nameIndex; - $this->default = $default ?: null; - $this->typeAnalysis = $typeAnalysis ?: null; - } - - public function getDefault(): ?string - { - return $this->default; - } - - public function hasDefault(): bool - { - return null !== $this->default; - } - - public function getName(): string - { - return $this->name; - } - - public function getNameIndex(): int - { - return $this->nameIndex; - } - - public function getTypeAnalysis(): ?TypeAnalysis - { - return $this->typeAnalysis; - } - - public function hasTypeAnalysis(): bool - { - return null !== $this->typeAnalysis; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/CaseAnalysis.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/CaseAnalysis.php deleted file mode 100644 index dee9b92..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/CaseAnalysis.php +++ /dev/null @@ -1,38 +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\Tokenizer\Analyzer\Analysis; - -/** - * @author Kuba Werłos - * - * @internal - */ -final class CaseAnalysis -{ - /** - * @var int - */ - private $colonIndex; - - public function __construct(int $colonIndex) - { - $this->colonIndex = $colonIndex; - } - - public function getColonIndex(): int - { - return $this->colonIndex; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/NamespaceAnalysis.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/NamespaceAnalysis.php deleted file mode 100644 index 2a9aa0a..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/NamespaceAnalysis.php +++ /dev/null @@ -1,103 +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\Tokenizer\Analyzer\Analysis; - -/** - * @internal - */ -final class NamespaceAnalysis implements StartEndTokenAwareAnalysis -{ - /** - * The fully qualified namespace name. - * - * @var string - */ - private $fullName; - - /** - * The short version of the namespace. - * - * @var string - */ - private $shortName; - - /** - * The start index of the namespace declaration in the analyzed Tokens. - * - * @var int - */ - private $startIndex; - - /** - * The end index of the namespace declaration in the analyzed Tokens. - * - * @var int - */ - private $endIndex; - - /** - * The start index of the scope of the namespace in the analyzed Tokens. - * - * @var int - */ - private $scopeStartIndex; - - /** - * The end index of the scope of the namespace in the analyzed Tokens. - * - * @var int - */ - private $scopeEndIndex; - - public function __construct(string $fullName, string $shortName, int $startIndex, int $endIndex, int $scopeStartIndex, int $scopeEndIndex) - { - $this->fullName = $fullName; - $this->shortName = $shortName; - $this->startIndex = $startIndex; - $this->endIndex = $endIndex; - $this->scopeStartIndex = $scopeStartIndex; - $this->scopeEndIndex = $scopeEndIndex; - } - - public function getFullName(): string - { - return $this->fullName; - } - - public function getShortName(): string - { - return $this->shortName; - } - - public function getStartIndex(): int - { - return $this->startIndex; - } - - public function getEndIndex(): int - { - return $this->endIndex; - } - - public function getScopeStartIndex(): int - { - return $this->scopeStartIndex; - } - - public function getScopeEndIndex(): int - { - return $this->scopeEndIndex; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/NamespaceUseAnalysis.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/NamespaceUseAnalysis.php deleted file mode 100644 index beb29d7..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/NamespaceUseAnalysis.php +++ /dev/null @@ -1,122 +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\Tokenizer\Analyzer\Analysis; - -/** - * @internal - */ -final class NamespaceUseAnalysis implements StartEndTokenAwareAnalysis -{ - public const TYPE_CLASS = 1; // "classy" could be class, interface or trait - public const TYPE_FUNCTION = 2; - public const TYPE_CONSTANT = 3; - - /** - * The fully qualified use namespace. - * - * @var string - */ - private $fullName; - - /** - * The short version of use namespace or the alias name in case of aliased use statements. - * - * @var string - */ - private $shortName; - - /** - * Is the use statement being aliased? - * - * @var bool - */ - private $isAliased; - - /** - * The start index of the namespace declaration in the analyzed Tokens. - * - * @var int - */ - private $startIndex; - - /** - * The end index of the namespace declaration in the analyzed Tokens. - * - * @var int - */ - private $endIndex; - - /** - * The type of import: class, function or constant. - * - * @var int - */ - private $type; - - public function __construct(string $fullName, string $shortName, bool $isAliased, int $startIndex, int $endIndex, int $type) - { - $this->fullName = $fullName; - $this->shortName = $shortName; - $this->isAliased = $isAliased; - $this->startIndex = $startIndex; - $this->endIndex = $endIndex; - $this->type = $type; - } - - public function getFullName(): string - { - return $this->fullName; - } - - public function getShortName(): string - { - return $this->shortName; - } - - public function isAliased(): bool - { - return $this->isAliased; - } - - public function getStartIndex(): int - { - return $this->startIndex; - } - - public function getEndIndex(): int - { - return $this->endIndex; - } - - public function getType(): int - { - return $this->type; - } - - public function isClass(): bool - { - return self::TYPE_CLASS === $this->type; - } - - public function isFunction(): bool - { - return self::TYPE_FUNCTION === $this->type; - } - - public function isConstant(): bool - { - return self::TYPE_CONSTANT === $this->type; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/StartEndTokenAwareAnalysis.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/StartEndTokenAwareAnalysis.php deleted file mode 100644 index 0b2f318..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/StartEndTokenAwareAnalysis.php +++ /dev/null @@ -1,28 +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\Tokenizer\Analyzer\Analysis; - -interface StartEndTokenAwareAnalysis -{ - /** - * The start index of the analyzed subject inside of the Tokens. - */ - public function getStartIndex(): int; - - /** - * The end index of the analyzed subject inside of the Tokens. - */ - public function getEndIndex(): int; -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/SwitchAnalysis.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/SwitchAnalysis.php deleted file mode 100644 index f439e1e..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/SwitchAnalysis.php +++ /dev/null @@ -1,66 +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\Tokenizer\Analyzer\Analysis; - -/** - * @author Kuba Werłos - * - * @internal - */ -final class SwitchAnalysis -{ - /** - * @var int - */ - private $casesStart; - - /** - * @var int - */ - private $casesEnd; - - /** - * @var CaseAnalysis[] - */ - private $cases = []; - - /** - * @param CaseAnalysis[] $cases - */ - public function __construct(int $casesStart, int $casesEnd, array $cases) - { - $this->casesStart = $casesStart; - $this->casesEnd = $casesEnd; - $this->cases = $cases; - } - - public function getCasesStart(): int - { - return $this->casesStart; - } - - public function getCasesEnd(): int - { - return $this->casesEnd; - } - - /** - * @return CaseAnalysis[] - */ - public function getCases(): array - { - return $this->cases; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/TypeAnalysis.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/TypeAnalysis.php deleted file mode 100644 index 51b520e..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/TypeAnalysis.php +++ /dev/null @@ -1,107 +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\Tokenizer\Analyzer\Analysis; - -/** - * @internal - */ -final class TypeAnalysis implements StartEndTokenAwareAnalysis -{ - /** - * This list contains soft and hard reserved types that can be used or will be used by PHP at some point. - * - * More info: - * - * @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 array - */ - private static $reservedTypes = [ - 'array', - 'bool', - 'callable', - 'int', - 'iterable', - 'float', - 'mixed', - 'numeric', - 'object', - 'resource', - 'self', - 'string', - 'void', - ]; - - /** - * @var string - */ - private $name; - - /** - * @var int - */ - private $startIndex; - - /** - * @var int - */ - private $endIndex; - - /** - * @var bool - */ - private $nullable; - - public function __construct(string $name, int $startIndex, int $endIndex) - { - $this->name = $name; - $this->nullable = false; - - if (0 === strpos($name, '?')) { - $this->name = substr($name, 1); - $this->nullable = true; - } - - $this->startIndex = $startIndex; - $this->endIndex = $endIndex; - } - - public function getName(): string - { - return $this->name; - } - - public function getStartIndex(): int - { - return $this->startIndex; - } - - public function getEndIndex(): int - { - return $this->endIndex; - } - - public function isReservedType(): bool - { - return \in_array($this->name, self::$reservedTypes, true); - } - - public function isNullable(): bool - { - return $this->nullable; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/ArgumentsAnalyzer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/ArgumentsAnalyzer.php deleted file mode 100644 index 0bc0a9d..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/ArgumentsAnalyzer.php +++ /dev/null @@ -1,147 +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\Tokenizer\Analyzer; - -use PhpCsFixer\Tokenizer\Analyzer\Analysis\ArgumentAnalysis; -use PhpCsFixer\Tokenizer\Analyzer\Analysis\TypeAnalysis; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Dariusz Rumiński - * @author Vladimir Reznichenko - * - * @internal - */ -final class ArgumentsAnalyzer -{ - /** - * Count amount of parameters in a function/method reference. - */ - public function countArguments(Tokens $tokens, int $openParenthesis, int $closeParenthesis): int - { - return \count($this->getArguments($tokens, $openParenthesis, $closeParenthesis)); - } - - /** - * Returns start and end token indexes of arguments. - * - * Returns an array with each key being the first token of an - * argument and the value the last. Including non-function tokens - * such as comments and white space tokens, but without the separation - * tokens like '(', ',' and ')'. - * - * @return array - */ - public function getArguments(Tokens $tokens, int $openParenthesis, int $closeParenthesis): array - { - $arguments = []; - $firstSensibleToken = $tokens->getNextMeaningfulToken($openParenthesis); - - if ($tokens[$firstSensibleToken]->equals(')')) { - return $arguments; - } - - $paramContentIndex = $openParenthesis + 1; - $argumentsStart = $paramContentIndex; - - for (; $paramContentIndex < $closeParenthesis; ++$paramContentIndex) { - $token = $tokens[$paramContentIndex]; - - // skip nested (), [], {} constructs - $blockDefinitionProbe = Tokens::detectBlockType($token); - - if (null !== $blockDefinitionProbe && true === $blockDefinitionProbe['isStart']) { - $paramContentIndex = $tokens->findBlockEnd($blockDefinitionProbe['type'], $paramContentIndex); - - continue; - } - - // if comma matched, increase arguments counter - if ($token->equals(',')) { - if ($tokens->getNextMeaningfulToken($paramContentIndex) === $closeParenthesis) { - break; // trailing ',' in function call (PHP 7.3) - } - - $arguments[$argumentsStart] = $paramContentIndex - 1; - $argumentsStart = $paramContentIndex + 1; - } - } - - $arguments[$argumentsStart] = $paramContentIndex - 1; - - return $arguments; - } - - public function getArgumentInfo(Tokens $tokens, int $argumentStart, int $argumentEnd): ArgumentAnalysis - { - $info = [ - 'default' => null, - 'name' => null, - 'name_index' => null, - 'type' => null, - 'type_index_start' => null, - 'type_index_end' => null, - ]; - - $sawName = false; - - for ($index = $argumentStart; $index <= $argumentEnd; ++$index) { - $token = $tokens[$index]; - - if ( - $token->isComment() - || $token->isWhitespace() - || $token->isGivenKind([T_ELLIPSIS, CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PUBLIC, CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PROTECTED, CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PRIVATE]) - || $token->equals('&') - ) { - continue; - } - - if ($token->isGivenKind(T_VARIABLE)) { - $sawName = true; - $info['name_index'] = $index; - $info['name'] = $token->getContent(); - - continue; - } - - if ($token->equals('=')) { - continue; - } - - if (\defined('T_ATTRIBUTE') && $token->isGivenKind(T_ATTRIBUTE)) { - $index = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_ATTRIBUTE, $index); - - continue; - } - - if ($sawName) { - $info['default'] .= $token->getContent(); - } else { - $info['type_index_start'] = ($info['type_index_start'] > 0) ? $info['type_index_start'] : $index; - $info['type_index_end'] = $index; - $info['type'] .= $token->getContent(); - } - } - - return new ArgumentAnalysis( - $info['name'], - $info['name_index'], - $info['default'], - $info['type'] ? new TypeAnalysis($info['type'], $info['type_index_start'], $info['type_index_end']) : null - ); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/AttributeAnalyzer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/AttributeAnalyzer.php deleted file mode 100644 index c67b76b..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/AttributeAnalyzer.php +++ /dev/null @@ -1,70 +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\Tokenizer\Analyzer; - -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @internal - */ -final class AttributeAnalyzer -{ - private const TOKEN_KINDS_NOT_ALLOWED_IN_ATTRIBUTE = [ - ';', - '{', - [T_ATTRIBUTE], - [T_FUNCTION], - [T_OPEN_TAG], - [T_OPEN_TAG_WITH_ECHO], - [T_PRIVATE], - [T_PROTECTED], - [T_PUBLIC], - [T_RETURN], - [T_VARIABLE], - [CT::T_ATTRIBUTE_CLOSE], - ]; - - /** - * Check if given index is an attribute declaration. - */ - public static function isAttribute(Tokens $tokens, int $index): bool - { - if ( - !\defined('T_ATTRIBUTE') // attributes not available, PHP version lower than 8.0 - || !$tokens[$index]->isGivenKind(T_STRING) // checked token is not a string - || !$tokens->isAnyTokenKindsFound([T_ATTRIBUTE]) // no attributes in the tokens collection - ) { - return false; - } - - $attributeStartIndex = $tokens->getPrevTokenOfKind($index, self::TOKEN_KINDS_NOT_ALLOWED_IN_ATTRIBUTE); - if (!$tokens[$attributeStartIndex]->isGivenKind(T_ATTRIBUTE)) { - return false; - } - - // now, between attribute start and the attribute candidate index cannot be more "(" than ")" - $count = 0; - for ($i = $attributeStartIndex + 1; $i < $index; ++$i) { - if ($tokens[$i]->equals('(')) { - ++$count; - } elseif ($tokens[$i]->equals(')')) { - --$count; - } - } - - return 0 === $count; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/BlocksAnalyzer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/BlocksAnalyzer.php deleted file mode 100644 index bc72630..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/BlocksAnalyzer.php +++ /dev/null @@ -1,60 +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\Tokenizer\Analyzer; - -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Kuba Werłos - * - * @internal - */ -final class BlocksAnalyzer -{ - public function isBlock(Tokens $tokens, ?int $openIndex, ?int $closeIndex): bool - { - if (null === $openIndex || null === $closeIndex) { - return false; - } - - if (!$tokens->offsetExists($openIndex)) { - return false; - } - - if (!$tokens->offsetExists($closeIndex)) { - return false; - } - - $blockType = $this->getBlockType($tokens[$openIndex]); - - if (null === $blockType) { - return false; - } - - return $closeIndex === $tokens->findBlockEnd($blockType, $openIndex); - } - - private function getBlockType(Token $token): ?int - { - foreach (Tokens::getBlockEdgeDefinitions() as $blockType => $definition) { - if ($token->equals($definition['start'])) { - return $blockType; - } - } - - return null; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/ClassyAnalyzer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/ClassyAnalyzer.php deleted file mode 100644 index c45cece..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/ClassyAnalyzer.php +++ /dev/null @@ -1,83 +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\Tokenizer\Analyzer; - -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @internal - */ -final class ClassyAnalyzer -{ - 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())); - } - - if (\in_array(strtolower($token->getContent()), ['bool', 'float', 'int', 'iterable', 'object', 'parent', 'self', 'string', 'void', 'null', 'false'], true)) { - return false; - } - - $next = $tokens->getNextMeaningfulToken($index); - $nextToken = $tokens[$next]; - - if ($nextToken->isGivenKind(T_NS_SEPARATOR)) { - return false; - } - - if ($nextToken->isGivenKind([T_DOUBLE_COLON, T_ELLIPSIS, CT::T_TYPE_ALTERNATION, T_VARIABLE])) { - return true; - } - - $prev = $tokens->getPrevMeaningfulToken($index); - - while ($tokens[$prev]->isGivenKind([CT::T_NAMESPACE_OPERATOR, T_NS_SEPARATOR, T_STRING])) { - $prev = $tokens->getPrevMeaningfulToken($prev); - } - - $prevToken = $tokens[$prev]; - - if ($prevToken->isGivenKind([T_EXTENDS, T_INSTANCEOF, T_INSTEADOF, T_IMPLEMENTS, T_NEW, CT::T_NULLABLE_TYPE, CT::T_TYPE_ALTERNATION, CT::T_TYPE_COLON, CT::T_USE_TRAIT])) { - return true; - } - - if (AttributeAnalyzer::isAttribute($tokens, $index)) { - return true; - } - - // `Foo & $bar` could be: - // - function reference parameter: function baz(Foo & $bar) {} - // - bit operator: $x = Foo & $bar; - if ($nextToken->equals('&') && $tokens[$tokens->getNextMeaningfulToken($next)]->isGivenKind(T_VARIABLE)) { - $checkIndex = $tokens->getPrevTokenOfKind($prev + 1, [';', '{', '}', [T_FUNCTION], [T_OPEN_TAG], [T_OPEN_TAG_WITH_ECHO]]); - - return $tokens[$checkIndex]->isGivenKind(T_FUNCTION); - } - - if (!$prevToken->equals(',')) { - return false; - } - - do { - $prev = $tokens->getPrevMeaningfulToken($prev); - } while ($tokens[$prev]->equalsAny([',', [T_NS_SEPARATOR], [T_STRING], [CT::T_NAMESPACE_OPERATOR]])); - - return $tokens[$prev]->isGivenKind([T_IMPLEMENTS, CT::T_USE_TRAIT]); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/CommentsAnalyzer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/CommentsAnalyzer.php deleted file mode 100644 index 9ca60e9..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/CommentsAnalyzer.php +++ /dev/null @@ -1,294 +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\Tokenizer\Analyzer; - -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Kuba Werłos - * @author SpacePossum - * - * @internal - */ -final class CommentsAnalyzer -{ - private const TYPE_HASH = 1; - private const TYPE_DOUBLE_SLASH = 2; - private const TYPE_SLASH_ASTERISK = 3; - - public function isHeaderComment(Tokens $tokens, int $index): bool - { - if (!$tokens[$index]->isGivenKind([T_COMMENT, T_DOC_COMMENT])) { - throw new \InvalidArgumentException('Given index must point to a comment.'); - } - - if (null === $tokens->getNextMeaningfulToken($index)) { - return false; - } - - $prevIndex = $tokens->getPrevNonWhitespace($index); - - if ($tokens[$prevIndex]->equals(';')) { - $braceCloseIndex = $tokens->getPrevMeaningfulToken($prevIndex); - if (!$tokens[$braceCloseIndex]->equals(')')) { - return false; - } - - $braceOpenIndex = $tokens->findBlockStart(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $braceCloseIndex); - $declareIndex = $tokens->getPrevMeaningfulToken($braceOpenIndex); - if (!$tokens[$declareIndex]->isGivenKind(T_DECLARE)) { - return false; - } - - $prevIndex = $tokens->getPrevNonWhitespace($declareIndex); - } - - return $tokens[$prevIndex]->isGivenKind(T_OPEN_TAG); - } - - /** - * Check if comment at given index precedes structural element. - * - * @see https://github.com/php-fig/fig-standards/blob/master/proposed/phpdoc.md#3-definitions - */ - public function isBeforeStructuralElement(Tokens $tokens, int $index): bool - { - $token = $tokens[$index]; - - if (!$token->isGivenKind([T_COMMENT, T_DOC_COMMENT])) { - 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('(')); - - if (null === $nextIndex || $tokens[$nextIndex]->equals('}')) { - return false; - } - - $nextToken = $tokens[$nextIndex]; - - if ($this->isStructuralElement($nextToken)) { - return true; - } - - if ($this->isValidControl($tokens, $token, $nextIndex)) { - return true; - } - - if ($this->isValidVariable($tokens, $nextIndex)) { - return true; - } - - if ($this->isValidLanguageConstruct($tokens, $token, $nextIndex)) { - return true; - } - - return false; - } - - /** - * Return array of indices that are part of a comment started at given index. - * - * @param int $index T_COMMENT index - */ - public function getCommentBlockIndices(Tokens $tokens, int $index): ?array - { - if (!$tokens[$index]->isGivenKind(T_COMMENT)) { - throw new \InvalidArgumentException('Given index must point to a comment.'); - } - - $commentType = $this->getCommentType($tokens[$index]->getContent()); - $indices = [$index]; - - if (self::TYPE_SLASH_ASTERISK === $commentType) { - return $indices; - } - - $count = \count($tokens); - ++$index; - - for (; $index < $count; ++$index) { - if ($tokens[$index]->isComment()) { - if ($commentType === $this->getCommentType($tokens[$index]->getContent())) { - $indices[] = $index; - - continue; - } - - break; - } - - if (!$tokens[$index]->isWhitespace() || $this->getLineBreakCount($tokens, $index, $index + 1) > 1) { - break; - } - } - - return $indices; - } - - /** - * @see https://github.com/phpDocumentor/fig-standards/blob/master/proposed/phpdoc.md#3-definitions - */ - private function isStructuralElement(Token $token): bool - { - static $skip = [ - T_PRIVATE, - T_PROTECTED, - T_PUBLIC, - T_VAR, - T_FUNCTION, - T_ABSTRACT, - T_CONST, - T_NAMESPACE, - T_REQUIRE, - T_REQUIRE_ONCE, - T_INCLUDE, - T_INCLUDE_ONCE, - T_FINAL, - T_STATIC, - ]; - - return $token->isClassy() || $token->isGivenKind($skip); - } - - /** - * Checks control structures (for, foreach, if, switch, while) for correct docblock usage. - * - * @param Token $docsToken docs Token - * @param int $controlIndex index of control structure Token - */ - private function isValidControl(Tokens $tokens, Token $docsToken, int $controlIndex): bool - { - static $controlStructures = [ - T_FOR, - T_FOREACH, - T_IF, - T_SWITCH, - T_WHILE, - ]; - - if (!$tokens[$controlIndex]->isGivenKind($controlStructures)) { - return false; - } - - $index = $tokens->getNextMeaningfulToken($controlIndex); - $endIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $index); - $docsContent = $docsToken->getContent(); - - for ($index = $index + 1; $index < $endIndex; ++$index) { - $token = $tokens[$index]; - - if ( - $token->isGivenKind(T_VARIABLE) - && false !== strpos($docsContent, $token->getContent()) - ) { - return true; - } - } - - return false; - } - - /** - * Checks variable assignments through `list()`, `print()` etc. calls for correct docblock usage. - * - * @param Token $docsToken docs Token - * @param int $languageConstructIndex index of variable Token - */ - private function isValidLanguageConstruct(Tokens $tokens, Token $docsToken, int $languageConstructIndex): bool - { - static $languageStructures = [ - T_LIST, - T_PRINT, - T_ECHO, - CT::T_DESTRUCTURING_SQUARE_BRACE_OPEN, - ]; - - if (!$tokens[$languageConstructIndex]->isGivenKind($languageStructures)) { - return false; - } - - $endKind = $tokens[$languageConstructIndex]->isGivenKind(CT::T_DESTRUCTURING_SQUARE_BRACE_OPEN) - ? [CT::T_DESTRUCTURING_SQUARE_BRACE_CLOSE] - : ')'; - - $endIndex = $tokens->getNextTokenOfKind($languageConstructIndex, [$endKind]); - - $docsContent = $docsToken->getContent(); - - for ($index = $languageConstructIndex + 1; $index < $endIndex; ++$index) { - $token = $tokens[$index]; - - if ($token->isGivenKind(T_VARIABLE) && false !== strpos($docsContent, $token->getContent())) { - return true; - } - } - - return false; - } - - /** - * Checks variable assignments for correct docblock usage. - * - * @param int $index index of variable Token - */ - private function isValidVariable(Tokens $tokens, int $index): bool - { - if (!$tokens[$index]->isGivenKind(T_VARIABLE)) { - return false; - } - - $nextIndex = $tokens->getNextMeaningfulToken($index); - - return $tokens[$nextIndex]->equals('='); - } - - private function getCommentType(string $content): int - { - if ('#' === $content[0]) { - return self::TYPE_HASH; - } - - if ('*' === $content[1]) { - return self::TYPE_SLASH_ASTERISK; - } - - return self::TYPE_DOUBLE_SLASH; - } - - private function getLineBreakCount(Tokens $tokens, int $whiteStart, int $whiteEnd): int - { - $lineCount = 0; - for ($i = $whiteStart; $i < $whiteEnd; ++$i) { - $lineCount += Preg::matchAll('/\R/u', $tokens[$i]->getContent()); - } - - return $lineCount; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/FunctionsAnalyzer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/FunctionsAnalyzer.php deleted file mode 100644 index d10b02d..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/FunctionsAnalyzer.php +++ /dev/null @@ -1,261 +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\Tokenizer\Analyzer; - -use PhpCsFixer\Tokenizer\Analyzer\Analysis\ArgumentAnalysis; -use PhpCsFixer\Tokenizer\Analyzer\Analysis\NamespaceUseAnalysis; -use PhpCsFixer\Tokenizer\Analyzer\Analysis\TypeAnalysis; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @internal - */ -final class FunctionsAnalyzer -{ - /** - * @var array - */ - private $functionsAnalysis = ['tokens' => '', 'imports' => [], 'declarations' => []]; - - /** - * Important: risky because of the limited (file) scope of the tool. - */ - public function isGlobalFunctionCall(Tokens $tokens, int $index): bool - { - if (!$tokens[$index]->isGivenKind(T_STRING)) { - return false; - } - - $nextIndex = $tokens->getNextMeaningfulToken($index); - - if (!$tokens[$nextIndex]->equals('(')) { - return false; - } - - $previousIsNamespaceSeparator = false; - $prevIndex = $tokens->getPrevMeaningfulToken($index); - - if ($tokens[$prevIndex]->isGivenKind(T_NS_SEPARATOR)) { - $previousIsNamespaceSeparator = true; - $prevIndex = $tokens->getPrevMeaningfulToken($prevIndex); - } - - $possibleKind = array_merge([T_DOUBLE_COLON, T_FUNCTION, CT::T_NAMESPACE_OPERATOR, T_NEW, CT::T_RETURN_REF, T_STRING], Token::getObjectOperatorKinds()); - - // @TODO: drop condition when PHP 8.0+ is required - if (\defined('T_ATTRIBUTE')) { - $possibleKind[] = T_ATTRIBUTE; - } - - if ($tokens[$prevIndex]->isGivenKind($possibleKind)) { - return false; - } - - if ($previousIsNamespaceSeparator) { - return true; - } - - if ($tokens->isChanged() || $tokens->getCodeHash() !== $this->functionsAnalysis['tokens']) { - $this->buildFunctionsAnalysis($tokens); - } - - // figure out in which namespace we are - $namespaceAnalyzer = new NamespacesAnalyzer(); - - $declarations = $namespaceAnalyzer->getDeclarations($tokens); - $scopeStartIndex = 0; - $scopeEndIndex = \count($tokens) - 1; - $inGlobalNamespace = false; - - foreach ($declarations as $declaration) { - $scopeStartIndex = $declaration->getScopeStartIndex(); - $scopeEndIndex = $declaration->getScopeEndIndex(); - - if ($index >= $scopeStartIndex && $index <= $scopeEndIndex) { - $inGlobalNamespace = '' === $declaration->getFullName(); - - break; - } - } - - $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 - - if (!$inGlobalNamespace) { - /** @var int $functionNameIndex */ - foreach ($this->functionsAnalysis['declarations'] as $functionNameIndex) { - if ($functionNameIndex < $scopeStartIndex || $functionNameIndex > $scopeEndIndex) { - continue; - } - - if (strtolower($tokens[$functionNameIndex]->getContent()) === $call) { - return false; - } - } - } - - /** @var NamespaceUseAnalysis $functionUse */ - foreach ($this->functionsAnalysis['imports'] as $functionUse) { - if ($functionUse->getStartIndex() < $scopeStartIndex || $functionUse->getEndIndex() > $scopeEndIndex) { - continue; - } - - if ($call !== strtolower($functionUse->getShortName())) { - continue; - } - - // global import like `use function \str_repeat;` - return $functionUse->getShortName() === ltrim($functionUse->getFullName(), '\\'); - } - - return true; - } - - /** - * @return ArgumentAnalysis[] - */ - public function getFunctionArguments(Tokens $tokens, int $methodIndex): array - { - $argumentsStart = $tokens->getNextTokenOfKind($methodIndex, ['(']); - $argumentsEnd = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $argumentsStart); - $argumentAnalyzer = new ArgumentsAnalyzer(); - $arguments = []; - - foreach ($argumentAnalyzer->getArguments($tokens, $argumentsStart, $argumentsEnd) as $start => $end) { - $argumentInfo = $argumentAnalyzer->getArgumentInfo($tokens, $start, $end); - $arguments[$argumentInfo->getName()] = $argumentInfo; - } - - return $arguments; - } - - public function getFunctionReturnType(Tokens $tokens, int $methodIndex): ?TypeAnalysis - { - $argumentsStart = $tokens->getNextTokenOfKind($methodIndex, ['(']); - $argumentsEnd = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $argumentsStart); - $typeColonIndex = $tokens->getNextMeaningfulToken($argumentsEnd); - - if (!$tokens[$typeColonIndex]->isGivenKind(CT::T_TYPE_COLON)) { - return null; - } - - $type = ''; - $typeStartIndex = $tokens->getNextMeaningfulToken($typeColonIndex); - $typeEndIndex = $typeStartIndex; - $functionBodyStart = $tokens->getNextTokenOfKind($typeColonIndex, ['{', ';', [T_DOUBLE_ARROW]]); - - for ($i = $typeStartIndex; $i < $functionBodyStart; ++$i) { - if ($tokens[$i]->isWhitespace() || $tokens[$i]->isComment()) { - continue; - } - - $type .= $tokens[$i]->getContent(); - $typeEndIndex = $i; - } - - return new TypeAnalysis($type, $typeStartIndex, $typeEndIndex); - } - - public function isTheSameClassCall(Tokens $tokens, int $index): bool - { - if (!$tokens->offsetExists($index)) { - return false; - } - - $operatorIndex = $tokens->getPrevMeaningfulToken($index); - - if (null === $operatorIndex) { - return false; - } - - if (!$tokens[$operatorIndex]->isObjectOperator() && !$tokens[$operatorIndex]->isGivenKind(T_DOUBLE_COLON)) { - return false; - } - - $referenceIndex = $tokens->getPrevMeaningfulToken($operatorIndex); - - if (null === $referenceIndex) { - return false; - } - - return $tokens[$referenceIndex]->equalsAny([[T_VARIABLE, '$this'], [T_STRING, 'self'], [T_STATIC, 'static']], false); - } - - private function buildFunctionsAnalysis(Tokens $tokens): void - { - $this->functionsAnalysis = [ - 'tokens' => $tokens->getCodeHash(), - 'imports' => [], - 'declarations' => [], - ]; - - // find declarations - - if ($tokens->isTokenKindFound(T_FUNCTION)) { - $end = \count($tokens); - - for ($i = 0; $i < $end; ++$i) { - // skip classy, we are looking for functions not methods - if ($tokens[$i]->isGivenKind(Token::getClassyTokenKinds())) { - $i = $tokens->getNextTokenOfKind($i, ['(', '{']); - - if ($tokens[$i]->equals('(')) { // anonymous class - $i = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $i); - $i = $tokens->getNextTokenOfKind($i, ['{']); - } - - $i = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $i); - - continue; - } - - if (!$tokens[$i]->isGivenKind(T_FUNCTION)) { - continue; - } - - $i = $tokens->getNextMeaningfulToken($i); - - if ($tokens[$i]->isGivenKind(CT::T_RETURN_REF)) { - $i = $tokens->getNextMeaningfulToken($i); - } - - if (!$tokens[$i]->isGivenKind(T_STRING)) { - continue; - } - - $this->functionsAnalysis['declarations'][] = $i; - } - } - - // find imported functions - - $namespaceUsesAnalyzer = new NamespaceUsesAnalyzer(); - - if ($tokens->isTokenKindFound(CT::T_FUNCTION_IMPORT)) { - $declarations = $namespaceUsesAnalyzer->getDeclarationsFromTokens($tokens); - - foreach ($declarations as $declaration) { - if ($declaration->isFunction()) { - $this->functionsAnalysis['imports'][] = $declaration; - } - } - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/GotoLabelAnalyzer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/GotoLabelAnalyzer.php deleted file mode 100644 index 15d5b06..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/GotoLabelAnalyzer.php +++ /dev/null @@ -1,40 +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\Tokenizer\Analyzer; - -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @internal - */ -final class GotoLabelAnalyzer -{ - public function belongsToGoToLabel(Tokens $tokens, int $index): bool - { - if (!$tokens[$index]->equals(':')) { - return false; - } - - $prevMeaningfulTokenIndex = $tokens->getPrevMeaningfulToken($index); - - if (!$tokens[$prevMeaningfulTokenIndex]->isGivenKind(T_STRING)) { - return false; - } - - $prevMeaningfulTokenIndex = $tokens->getPrevMeaningfulToken($prevMeaningfulTokenIndex); - - return $tokens[$prevMeaningfulTokenIndex]->equalsAny([':', ';', '{', '}', [T_OPEN_TAG]]); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/NamespaceUsesAnalyzer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/NamespaceUsesAnalyzer.php deleted file mode 100644 index fde4c34..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/NamespaceUsesAnalyzer.php +++ /dev/null @@ -1,118 +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\Tokenizer\Analyzer; - -use PhpCsFixer\Tokenizer\Analyzer\Analysis\NamespaceAnalysis; -use PhpCsFixer\Tokenizer\Analyzer\Analysis\NamespaceUseAnalysis; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; - -/** - * @internal - */ -final class NamespaceUsesAnalyzer -{ - /** - * @return NamespaceUseAnalysis[] - */ - public function getDeclarationsFromTokens(Tokens $tokens): array - { - $tokenAnalyzer = new TokensAnalyzer($tokens); - $useIndexes = $tokenAnalyzer->getImportUseIndexes(); - - return $this->getDeclarations($tokens, $useIndexes); - } - - /** - * @return NamespaceUseAnalysis[] - */ - public function getDeclarationsInNamespace(Tokens $tokens, NamespaceAnalysis $namespace): array - { - $namespaceUses = []; - - foreach ($this->getDeclarationsFromTokens($tokens) as $namespaceUse) { - if ($namespaceUse->getStartIndex() >= $namespace->getScopeStartIndex() && $namespaceUse->getStartIndex() <= $namespace->getScopeEndIndex()) { - $namespaceUses[] = $namespaceUse; - } - } - - return $namespaceUses; - } - - /** - * @return NamespaceUseAnalysis[] - */ - private function getDeclarations(Tokens $tokens, array $useIndexes): array - { - $uses = []; - - foreach ($useIndexes as $index) { - $endIndex = $tokens->getNextTokenOfKind($index, [';', [T_CLOSE_TAG]]); - $analysis = $this->parseDeclaration($tokens, $index, $endIndex); - if ($analysis) { - $uses[] = $analysis; - } - } - - return $uses; - } - - private function parseDeclaration(Tokens $tokens, int $startIndex, int $endIndex): ?NamespaceUseAnalysis - { - $fullName = $shortName = ''; - $aliased = false; - - $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; - } - - if ($token->isGivenKind(CT::T_FUNCTION_IMPORT)) { - $type = NamespaceUseAnalysis::TYPE_FUNCTION; - } elseif ($token->isGivenKind(CT::T_CONST_IMPORT)) { - $type = NamespaceUseAnalysis::TYPE_CONSTANT; - } - - if ($token->isWhitespace() || $token->isComment() || $token->isGivenKind(T_USE)) { - continue; - } - - if ($token->isGivenKind(T_STRING)) { - $shortName = $token->getContent(); - if (!$aliased) { - $fullName .= $shortName; - } - } elseif ($token->isGivenKind(T_NS_SEPARATOR)) { - $fullName .= $token->getContent(); - } elseif ($token->isGivenKind(T_AS)) { - $aliased = true; - } - } - - return new NamespaceUseAnalysis( - trim($fullName), - $shortName, - $aliased, - $startIndex, - $endIndex, - $type - ); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/NamespacesAnalyzer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/NamespacesAnalyzer.php deleted file mode 100644 index c8bd2fe..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/NamespacesAnalyzer.php +++ /dev/null @@ -1,88 +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\Tokenizer\Analyzer; - -use PhpCsFixer\Tokenizer\Analyzer\Analysis\NamespaceAnalysis; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @internal - */ -final class NamespacesAnalyzer -{ - /** - * @return NamespaceAnalysis[] - */ - public function getDeclarations(Tokens $tokens): array - { - $namespaces = []; - - for ($index = 1, $count = \count($tokens); $index < $count; ++$index) { - $token = $tokens[$index]; - - if (!$token->isGivenKind(T_NAMESPACE)) { - continue; - } - - $declarationEndIndex = $tokens->getNextTokenOfKind($index, [';', '{']); - $namespace = trim($tokens->generatePartialCode($index + 1, $declarationEndIndex - 1)); - $declarationParts = explode('\\', $namespace); - $shortName = end($declarationParts); - - if ($tokens[$declarationEndIndex]->equals('{')) { - $scopeEndIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $declarationEndIndex); - } else { - $scopeEndIndex = $tokens->getNextTokenOfKind($declarationEndIndex, [[T_NAMESPACE]]); - if (null === $scopeEndIndex) { - $scopeEndIndex = \count($tokens); - } - --$scopeEndIndex; - } - - $namespaces[] = new NamespaceAnalysis( - $namespace, - $shortName, - $index, - $declarationEndIndex, - $index, - $scopeEndIndex - ); - - // Continue the analysis after the end of this namespace to find the next one - $index = $scopeEndIndex; - } - - if (0 === \count($namespaces)) { - $namespaces[] = new NamespaceAnalysis('', '', 0, 0, 0, \count($tokens) - 1); - } - - return $namespaces; - } - - public function getNamespaceAt(Tokens $tokens, int $index): NamespaceAnalysis - { - if (!$tokens->offsetExists($index)) { - throw new \InvalidArgumentException("Token index {$index} does not exist."); - } - - foreach ($this->getDeclarations($tokens) as $namespace) { - if ($namespace->getScopeStartIndex() <= $index && $namespace->getScopeEndIndex() >= $index) { - return $namespace; - } - } - - throw new \LogicException("Unable to get the namespace at index {$index}."); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/ReferenceAnalyzer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/ReferenceAnalyzer.php deleted file mode 100644 index 0c7d4bd..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/ReferenceAnalyzer.php +++ /dev/null @@ -1,49 +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\Tokenizer\Analyzer; - -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Kuba Werłos - * - * @internal - */ -final class ReferenceAnalyzer -{ - public function isReference(Tokens $tokens, int $index): bool - { - if ($tokens[$index]->isGivenKind(CT::T_RETURN_REF)) { - return true; - } - - if (!$tokens[$index]->equals('&')) { - return false; - } - - /** @var int $index */ - $index = $tokens->getPrevMeaningfulToken($index); - if ($tokens[$index]->equalsAny(['=', [T_AS], [T_CALLABLE], [T_DOUBLE_ARROW], [CT::T_ARRAY_TYPEHINT]])) { - return true; - } - - if ($tokens[$index]->isGivenKind(T_STRING)) { - $index = $tokens->getPrevMeaningfulToken($index); - } - - return $tokens[$index]->equalsAny(['(', ',', [T_NS_SEPARATOR], [CT::T_NULLABLE_TYPE]]); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/SwitchAnalyzer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/SwitchAnalyzer.php deleted file mode 100644 index 2a5e475..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/SwitchAnalyzer.php +++ /dev/null @@ -1,117 +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\Tokenizer\Analyzer; - -use PhpCsFixer\Tokenizer\Analyzer\Analysis\CaseAnalysis; -use PhpCsFixer\Tokenizer\Analyzer\Analysis\SwitchAnalysis; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @author Kuba Werłos - * - * @internal - */ -final class SwitchAnalyzer -{ - public function getSwitchAnalysis(Tokens $tokens, int $switchIndex): SwitchAnalysis - { - if (!$tokens[$switchIndex]->isGivenKind(T_SWITCH)) { - throw new \InvalidArgumentException(sprintf('Index %d is not "switch".', $switchIndex)); - } - - $casesStartIndex = $this->getCasesStart($tokens, $switchIndex); - $casesEndIndex = $this->getCasesEnd($tokens, $casesStartIndex); - - $cases = []; - $index = $casesStartIndex; - while ($index < $casesEndIndex) { - $index = $this->getNextSameLevelToken($tokens, $index); - - if (!$tokens[$index]->isGivenKind([T_CASE, T_DEFAULT])) { - continue; - } - - $caseAnalysis = $this->getCaseAnalysis($tokens, $index); - - $cases[] = $caseAnalysis; - } - - return new SwitchAnalysis($casesStartIndex, $casesEndIndex, $cases); - } - - private function getCasesStart(Tokens $tokens, int $switchIndex): int - { - /** @var int $parenthesisStartIndex */ - $parenthesisStartIndex = $tokens->getNextMeaningfulToken($switchIndex); - $parenthesisEndIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $parenthesisStartIndex); - - $casesStartIndex = $tokens->getNextMeaningfulToken($parenthesisEndIndex); - \assert(\is_int($casesStartIndex)); - - return $casesStartIndex; - } - - private function getCasesEnd(Tokens $tokens, int $casesStartIndex): int - { - if ($tokens[$casesStartIndex]->equals('{')) { - return $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $casesStartIndex); - } - - $index = $casesStartIndex; - while ($index < $tokens->count()) { - $index = $this->getNextSameLevelToken($tokens, $index); - - if ($tokens[$index]->isGivenKind(T_ENDSWITCH)) { - break; - } - } - - $afterEndswitchIndex = $tokens->getNextMeaningfulToken($index); - - $afterEndswitchToken = $tokens[$afterEndswitchIndex]; - - return $afterEndswitchToken->equalsAny([';', [T_CLOSE_TAG]]) ? $afterEndswitchIndex : $index; - } - - private function getCaseAnalysis(Tokens $tokens, int $index): CaseAnalysis - { - while ($index < $tokens->count()) { - $index = $this->getNextSameLevelToken($tokens, $index); - - if ($tokens[$index]->equalsAny([':', ';'])) { - break; - } - } - - return new CaseAnalysis($index); - } - - private function getNextSameLevelToken(Tokens $tokens, int $index): int - { - $index = $tokens->getNextMeaningfulToken($index); - - if ($tokens[$index]->isGivenKind(T_SWITCH)) { - return (new self())->getSwitchAnalysis($tokens, $index)->getCasesEnd(); - } - - /** @var null|array{isStart: bool, type: int} $blockType */ - $blockType = Tokens::detectBlockType($tokens[$index]); - if (null !== $blockType && $blockType['isStart']) { - return $tokens->findBlockEnd($blockType['type'], $index) + 1; - } - - return $index; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/WhitespacesAnalyzer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/WhitespacesAnalyzer.php deleted file mode 100644 index 7b1d596..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/WhitespacesAnalyzer.php +++ /dev/null @@ -1,52 +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\Tokenizer\Analyzer; - -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @internal - */ -final class WhitespacesAnalyzer -{ - public static function detectIndent(Tokens $tokens, int $index): string - { - while (true) { - $whitespaceIndex = $tokens->getPrevTokenOfKind($index, [[T_WHITESPACE]]); - - if (null === $whitespaceIndex) { - return ''; - } - - $whitespaceToken = $tokens[$whitespaceIndex]; - - if (false !== strpos($whitespaceToken->getContent(), "\n")) { - break; - } - - $prevToken = $tokens[$whitespaceIndex - 1]; - - if ($prevToken->isGivenKind([T_OPEN_TAG, T_COMMENT]) && "\n" === substr($prevToken->getContent(), -1)) { - break; - } - - $index = $whitespaceIndex; - } - - $explodedContent = explode("\n", $whitespaceToken->getContent()); - - return end($explodedContent); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/CT.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/CT.php deleted file mode 100644 index 59fea01..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/CT.php +++ /dev/null @@ -1,99 +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\Tokenizer; - -/** - * @author Dariusz Rumiński - */ -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; - - private function __construct() - { - } - - /** - * Get name for custom token. - * - * @param int $value custom token value - */ - public static function getName(int $value): string - { - if (!self::has($value)) { - throw new \InvalidArgumentException(sprintf('No custom token was found for "%s".', $value)); - } - - $tokens = self::getMapById(); - - return 'CT::'.$tokens[$value]; - } - - /** - * Check if given custom token exists. - * - * @param int $value custom token value - */ - public static function has(int $value): bool - { - $tokens = self::getMapById(); - - return isset($tokens[$value]); - } - - private static function getMapById(): array - { - static $constants; - - if (null === $constants) { - $reflection = new \ReflectionClass(__CLASS__); - $constants = array_flip($reflection->getConstants()); - } - - return $constants; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/CodeHasher.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/CodeHasher.php deleted file mode 100644 index 2c9a7cc..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/CodeHasher.php +++ /dev/null @@ -1,36 +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\Tokenizer; - -/** - * @author Dariusz Rumiński - * - * @internal - */ -final class CodeHasher -{ - private function __construct() - { - // cannot create instance of util. class - } - - /** - * Calculate hash for code. - */ - public static function calculateCodeHash(string $code): string - { - return (string) crc32($code); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Generator/NamespacedStringTokenGenerator.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Generator/NamespacedStringTokenGenerator.php deleted file mode 100644 index d78c510..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Generator/NamespacedStringTokenGenerator.php +++ /dev/null @@ -1,43 +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\Tokenizer\Generator; - -use PhpCsFixer\Tokenizer\Token; - -/** - * @internal - */ -final class NamespacedStringTokenGenerator -{ - /** - * Parse a string that contains a namespace into tokens. - * - * @return Token[] - */ - public function generate(string $input): array - { - $tokens = []; - $parts = explode('\\', $input); - - foreach ($parts as $index => $part) { - $tokens[] = new Token([T_STRING, $part]); - if ($index !== \count($parts) - 1) { - $tokens[] = new Token([T_NS_SEPARATOR, '\\']); - } - } - - return $tokens; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Resolver/TypeShortNameResolver.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Resolver/TypeShortNameResolver.php deleted file mode 100644 index 0e6cc86..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Resolver/TypeShortNameResolver.php +++ /dev/null @@ -1,92 +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\Tokenizer\Resolver; - -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Analyzer\Analysis\NamespaceAnalysis; -use PhpCsFixer\Tokenizer\Analyzer\NamespacesAnalyzer; -use PhpCsFixer\Tokenizer\Analyzer\NamespaceUsesAnalyzer; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * @internal - */ -final class TypeShortNameResolver -{ - /** - * This method will resolve the shortName of a FQCN if possible or otherwise return the inserted type name. - * E.g.: use Foo\Bar => "Bar". - */ - public function resolve(Tokens $tokens, string $typeName): string - { - // First match explicit imports: - $useMap = $this->getUseMapFromTokens($tokens); - foreach ($useMap as $shortName => $fullName) { - $regex = '/^\\\\?'.preg_quote($fullName, '/').'$/'; - if (Preg::match($regex, $typeName)) { - return $shortName; - } - } - - // Next try to match (partial) classes inside the same namespace - // For now only support one namespace per file: - $namespaces = $this->getNamespacesFromTokens($tokens); - if (1 === \count($namespaces)) { - foreach ($namespaces as $fullName) { - $matches = []; - $regex = '/^\\\\?'.preg_quote($fullName, '/').'\\\\(?P.+)$/'; - if (Preg::match($regex, $typeName, $matches)) { - return $matches['className']; - } - } - } - - // Next: Try to match partial use statements: - - foreach ($useMap as $shortName => $fullName) { - $matches = []; - $regex = '/^\\\\?'.preg_quote($fullName, '/').'\\\\(?P.+)$/'; - if (Preg::match($regex, $typeName, $matches)) { - return $shortName.'\\'.$matches['className']; - } - } - - return $typeName; - } - - /** - * @return array A list of all FQN namespaces in the file with the short name as key - */ - private function getNamespacesFromTokens(Tokens $tokens): array - { - return array_map(static function (NamespaceAnalysis $info) { - return $info->getFullName(); - }, (new NamespacesAnalyzer())->getDeclarations($tokens)); - } - - /** - * @return array A list of all FQN use statements in the file with the short name as key - */ - private function getUseMapFromTokens(Tokens $tokens): array - { - $map = []; - - foreach ((new NamespaceUsesAnalyzer())->getDeclarationsFromTokens($tokens) as $useDeclaration) { - $map[$useDeclaration->getShortName()] = $useDeclaration->getFullName(); - } - - return $map; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Token.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Token.php deleted file mode 100644 index 12d7af4..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Token.php +++ /dev/null @@ -1,494 +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\Tokenizer; - -/** - * Representation of single token. - * As a token prototype you should understand a single element generated by token_get_all. - * - * @author Dariusz Rumiński - */ -final class Token -{ - /** - * Content of token prototype. - * - * @var string - */ - private $content; - - /** - * ID of token prototype, if available. - * - * @var null|int - */ - private $id; - - /** - * If token prototype is an array. - * - * @var bool - */ - private $isArray; - - /** - * Flag is token was changed. - * - * @var bool - */ - private $changed = false; - - /** - * @param array|string $token token prototype - */ - public function __construct($token) - { - if (\is_array($token)) { - if (!\is_int($token[0])) { - throw new \InvalidArgumentException(sprintf( - 'Id must be an int, got "%s".', - \is_object($token[0]) ? \get_class($token[0]) : \gettype($token[0]) - )); - } - - if (!\is_string($token[1])) { - throw new \InvalidArgumentException(sprintf( - 'Content must be a string, got "%s".', - \is_object($token[1]) ? \get_class($token[1]) : \gettype($token[1]) - )); - } - - if ('' === $token[1]) { - throw new \InvalidArgumentException('Cannot set empty content for id-based Token.'); - } - - $this->isArray = true; - $this->id = $token[0]; - $this->content = $token[1]; - } elseif (\is_string($token)) { - $this->isArray = false; - $this->content = $token; - } else { - throw new \InvalidArgumentException(sprintf( - 'Cannot recognize input value as valid Token prototype, got "%s".', - // @phpstan-ignore-next-line due to lack of strong typing of method parameter - \is_object($token) ? \get_class($token) : \gettype($token) - )); - } - } - - /** - * @return int[] - */ - public static function getCastTokenKinds(): array - { - static $castTokens = [T_ARRAY_CAST, T_BOOL_CAST, T_DOUBLE_CAST, T_INT_CAST, T_OBJECT_CAST, T_STRING_CAST, T_UNSET_CAST]; - - return $castTokens; - } - - /** - * Get classy tokens kinds: T_CLASS, T_INTERFACE and T_TRAIT. - * - * @return int[] - */ - public static function getClassyTokenKinds(): array - { - static $classTokens = [T_CLASS, T_TRAIT, T_INTERFACE]; - - return $classTokens; - } - - /** - * Get object operator tokens kinds: T_OBJECT_OPERATOR and (if available) T_NULLSAFE_OBJECT_OPERATOR. - * - * @return int[] - */ - public static function getObjectOperatorKinds(): array - { - static $objectOperators = null; - - if (null === $objectOperators) { - $objectOperators = [T_OBJECT_OPERATOR]; - if (\defined('T_NULLSAFE_OBJECT_OPERATOR')) { - $objectOperators[] = T_NULLSAFE_OBJECT_OPERATOR; - } - } - - return $objectOperators; - } - - /** - * Check if token is equals to given one. - * - * If tokens are arrays, then only keys defined in parameter token are checked. - * - * @param array|string|Token $other token or it's prototype - * @param bool $caseSensitive perform a case sensitive comparison - */ - public function equals($other, bool $caseSensitive = true): bool - { - if ($other instanceof self) { - // Inlined getPrototype() on this very hot path. - // We access the private properties of $other directly to save function call overhead. - // This is only possible because $other is of the same class as `self`. - if (!$other->isArray) { - $otherPrototype = $other->content; - } else { - $otherPrototype = [ - $other->id, - $other->content, - ]; - } - } else { - $otherPrototype = $other; - } - - if ($this->isArray !== \is_array($otherPrototype)) { - return false; - } - - if (!$this->isArray) { - return $this->content === $otherPrototype; - } - - if ($this->id !== $otherPrototype[0]) { - return false; - } - - if (isset($otherPrototype[1])) { - if ($caseSensitive) { - if ($this->content !== $otherPrototype[1]) { - return false; - } - } elseif (0 !== strcasecmp($this->content, $otherPrototype[1])) { - return false; - } - } - - // detect unknown keys - unset($otherPrototype[0], $otherPrototype[1]); - - return empty($otherPrototype); - } - - /** - * Check if token is equals to one of given. - * - * @param array $others array of tokens or token prototypes - * @param bool $caseSensitive perform a case sensitive comparison - */ - public function equalsAny(array $others, bool $caseSensitive = true): bool - { - foreach ($others as $other) { - if ($this->equals($other, $caseSensitive)) { - return true; - } - } - - return false; - } - - /** - * A helper method used to find out whether or not 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 $others. 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 - */ - public static function isKeyCaseSensitive($caseSensitive, int $key): bool - { - if (\is_array($caseSensitive)) { - return $caseSensitive[$key] ?? true; - } - - return $caseSensitive; - } - - /** - * @return array|string token prototype - */ - public function getPrototype() - { - if (!$this->isArray) { - return $this->content; - } - - return [ - $this->id, - $this->content, - ]; - } - - /** - * Get token's content. - * - * It shall be used only for getting the content of token, not for checking it against excepted value. - */ - public function getContent(): string - { - return $this->content; - } - - /** - * Get token's id. - * - * It shall be used only for getting the internal id of token, not for checking it against excepted value. - */ - public function getId(): ?int - { - return $this->id; - } - - /** - * Get token's name. - * - * It shall be used only for getting the name of token, not for checking it against excepted value. - * - * @return null|string token name - */ - public function getName(): ?string - { - if (null === $this->id) { - return null; - } - - return self::getNameForId($this->id); - } - - /** - * Get token's name. - * - * It shall be used only for getting the name of token, not for checking it against excepted value. - * - * @return null|string token name - */ - public static function getNameForId(int $id): ?string - { - if (CT::has($id)) { - return CT::getName($id); - } - - $name = token_name($id); - - return 'UNKNOWN' === $name ? null : $name; - } - - /** - * Generate array containing all keywords that exists in PHP version in use. - * - * @return array - */ - public static function getKeywords(): array - { - static $keywords = null; - - if (null === $keywords) { - $keywords = self::getTokenKindsForNames(['T_ABSTRACT', 'T_ARRAY', 'T_AS', 'T_BREAK', 'T_CALLABLE', 'T_CASE', - 'T_CATCH', 'T_CLASS', 'T_CLONE', 'T_CONST', 'T_CONTINUE', 'T_DECLARE', 'T_DEFAULT', 'T_DO', - 'T_ECHO', 'T_ELSE', 'T_ELSEIF', 'T_EMPTY', 'T_ENDDECLARE', 'T_ENDFOR', 'T_ENDFOREACH', - 'T_ENDIF', 'T_ENDSWITCH', 'T_ENDWHILE', 'T_EVAL', 'T_EXIT', 'T_EXTENDS', 'T_FINAL', - 'T_FINALLY', 'T_FN', 'T_FOR', 'T_FOREACH', 'T_FUNCTION', 'T_GLOBAL', 'T_GOTO', 'T_HALT_COMPILER', - 'T_IF', 'T_IMPLEMENTS', 'T_INCLUDE', 'T_INCLUDE_ONCE', 'T_INSTANCEOF', 'T_INSTEADOF', - 'T_INTERFACE', 'T_ISSET', 'T_LIST', 'T_LOGICAL_AND', 'T_LOGICAL_OR', 'T_LOGICAL_XOR', - 'T_NAMESPACE', 'T_MATCH', 'T_NEW', 'T_PRINT', 'T_PRIVATE', 'T_PROTECTED', 'T_PUBLIC', 'T_REQUIRE', - 'T_REQUIRE_ONCE', 'T_RETURN', 'T_STATIC', 'T_SWITCH', 'T_THROW', 'T_TRAIT', 'T_TRY', - 'T_UNSET', 'T_USE', 'T_VAR', 'T_WHILE', 'T_YIELD', 'T_YIELD_FROM', - ]) + [ - CT::T_ARRAY_TYPEHINT => CT::T_ARRAY_TYPEHINT, - CT::T_CLASS_CONSTANT => CT::T_CLASS_CONSTANT, - CT::T_CONST_IMPORT => CT::T_CONST_IMPORT, - CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PRIVATE => CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PRIVATE, - CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PROTECTED => CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PROTECTED, - CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PUBLIC => CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PUBLIC, - CT::T_FUNCTION_IMPORT => CT::T_FUNCTION_IMPORT, - CT::T_NAMESPACE_OPERATOR => CT::T_NAMESPACE_OPERATOR, - CT::T_USE_LAMBDA => CT::T_USE_LAMBDA, - CT::T_USE_TRAIT => CT::T_USE_TRAIT, - ]; - } - - return $keywords; - } - - /** - * Generate array containing all predefined constants that exists in PHP version in use. - * - * @see https://php.net/manual/en/language.constants.predefined.php - * - * @return array - */ - public static function getMagicConstants(): array - { - static $magicConstants = null; - - if (null === $magicConstants) { - $magicConstants = self::getTokenKindsForNames(['T_CLASS_C', 'T_DIR', 'T_FILE', 'T_FUNC_C', 'T_LINE', 'T_METHOD_C', 'T_NS_C', 'T_TRAIT_C']); - } - - return $magicConstants; - } - - /** - * Check if token prototype is an array. - * - * @return bool is array - */ - public function isArray(): bool - { - return $this->isArray; - } - - /** - * Check if token is one of type cast tokens. - */ - public function isCast(): bool - { - return $this->isGivenKind(self::getCastTokenKinds()); - } - - /** - * Check if token is one of classy tokens: T_CLASS, T_INTERFACE or T_TRAIT. - */ - public function isClassy(): bool - { - return $this->isGivenKind(self::getClassyTokenKinds()); - } - - /** - * Check if token is one of comment tokens: T_COMMENT or T_DOC_COMMENT. - */ - public function isComment(): bool - { - static $commentTokens = [T_COMMENT, T_DOC_COMMENT]; - - return $this->isGivenKind($commentTokens); - } - - /** - * Check if token is one of object operator tokens: T_OBJECT_OPERATOR or T_NULLSAFE_OBJECT_OPERATOR. - */ - public function isObjectOperator(): bool - { - return $this->isGivenKind(self::getObjectOperatorKinds()); - } - - /** - * Check if token is one of given kind. - * - * @param int|int[] $possibleKind kind or array of kinds - */ - public function isGivenKind($possibleKind): bool - { - return $this->isArray && (\is_array($possibleKind) ? \in_array($this->id, $possibleKind, true) : $this->id === $possibleKind); - } - - /** - * Check if token is a keyword. - */ - public function isKeyword(): bool - { - $keywords = static::getKeywords(); - - return $this->isArray && isset($keywords[$this->id]); - } - - /** - * Check if token is a native PHP constant: true, false or null. - */ - public function isNativeConstant(): bool - { - static $nativeConstantStrings = ['true', 'false', 'null']; - - return $this->isArray && \in_array(strtolower($this->content), $nativeConstantStrings, true); - } - - /** - * Returns if the token is of a Magic constants type. - * - * @see https://php.net/manual/en/language.constants.predefined.php - */ - public function isMagicConstant(): bool - { - $magicConstants = static::getMagicConstants(); - - return $this->isArray && isset($magicConstants[$this->id]); - } - - /** - * Check if token is whitespace. - * - * @param null|string $whitespaces whitespace characters, default is " \t\n\r\0\x0B" - */ - public function isWhitespace(?string $whitespaces = " \t\n\r\0\x0B"): bool - { - if (null === $whitespaces) { - $whitespaces = " \t\n\r\0\x0B"; - } - - if ($this->isArray && !$this->isGivenKind(T_WHITESPACE)) { - return false; - } - - return '' === trim($this->content, $whitespaces); - } - - public function toArray(): array - { - return [ - 'id' => $this->id, - 'name' => $this->getName(), - 'content' => $this->content, - 'isArray' => $this->isArray, - 'changed' => $this->changed, - ]; - } - - public function toJson(): string - { - $jsonResult = json_encode($this->toArray(), JSON_PRETTY_PRINT | JSON_NUMERIC_CHECK); - - if (JSON_ERROR_NONE !== json_last_error()) { - $jsonResult = json_encode( - [ - 'errorDescription' => 'Can not encode Tokens to JSON.', - 'rawErrorMessage' => json_last_error_msg(), - ], - JSON_PRETTY_PRINT | JSON_NUMERIC_CHECK - ); - } - - return $jsonResult; - } - - /** - * @param string[] $tokenNames - * - * @return array - */ - private static function getTokenKindsForNames(array $tokenNames): array - { - $keywords = []; - foreach ($tokenNames as $keywordName) { - if (\defined($keywordName)) { - $keyword = \constant($keywordName); - $keywords[$keyword] = $keyword; - } - } - - return $keywords; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Tokens.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Tokens.php deleted file mode 100644 index 37ff4b5..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Tokens.php +++ /dev/null @@ -1,1395 +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\Tokenizer; - -use PhpCsFixer\Preg; - -/** - * Collection of code tokens. - * - * Its role is to provide the ability to manage collection and navigate through it. - * - * As a token prototype you should understand a single element generated by token_get_all. - * - * @author Dariusz Rumiński - * - * @extends \SplFixedArray - * - * @final - */ -class Tokens extends \SplFixedArray -{ - public const BLOCK_TYPE_PARENTHESIS_BRACE = 1; - public const BLOCK_TYPE_CURLY_BRACE = 2; - public const BLOCK_TYPE_INDEX_SQUARE_BRACE = 3; - public const BLOCK_TYPE_ARRAY_SQUARE_BRACE = 4; - public const BLOCK_TYPE_DYNAMIC_PROP_BRACE = 5; - public const BLOCK_TYPE_DYNAMIC_VAR_BRACE = 6; - public const BLOCK_TYPE_ARRAY_INDEX_CURLY_BRACE = 7; - public const BLOCK_TYPE_GROUP_IMPORT_BRACE = 8; - public const BLOCK_TYPE_DESTRUCTURING_SQUARE_BRACE = 9; - public const BLOCK_TYPE_BRACE_CLASS_INSTANTIATION = 10; - public const BLOCK_TYPE_ATTRIBUTE = 11; - - /** - * Static class cache. - * - * @var array - */ - private static $cache = []; - - /** - * Cache of block starts. Any change in collection will invalidate it. - * - * @var array - */ - private $blockStartCache = []; - - /** - * Cache of block ends. Any change in collection will invalidate it. - * - * @var array - */ - private $blockEndCache = []; - - /** - * crc32 hash of code string. - * - * @var string - */ - private $codeHash; - - /** - * Flag is collection was changed. - * - * It doesn't know about change of collection's items. To check it run `isChanged` method. - * - * @var bool - */ - private $changed = false; - - /** - * Set of found token kinds. - * - * 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. - * - * @var array - */ - private $foundTokenKinds = []; - - /** - * Clone tokens collection. - */ - public function __clone() - { - foreach ($this as $key => $val) { - $this[$key] = clone $val; - } - } - - /** - * Clear cache - one position or all of them. - * - * @param null|string $key position to clear, when null clear all - */ - public static function clearCache(?string $key = null): void - { - if (null === $key) { - self::$cache = []; - - return; - } - - if (self::hasCache($key)) { - unset(self::$cache[$key]); - } - } - - /** - * Detect type of block. - * - * @param Token $token token - * - * @return null|array array with 'type' and 'isStart' keys or null if not found - */ - 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]; - } - } - - return null; - } - - /** - * Create token collection from array. - * - * @param Token[] $array the array to import - * @param ?bool $saveIndexes save the numeric indexes used in the original array, default is yes - */ - public static function fromArray($array, $saveIndexes = null): self - { - $tokens = new self(\count($array)); - - if (null === $saveIndexes || $saveIndexes) { - 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(); - - return $tokens; - } - - /** - * Create token collection directly from code. - * - * @param string $code PHP code - */ - public static function fromCode(string $code): self - { - $codeHash = self::calculateCodeHash($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(); - - return $tokens; - } - } - - $tokens = new self(); - $tokens->setCode($code); - $tokens->clearChanged(); - - return $tokens; - } - - 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, ')'], - ], - ]; - - // @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; - } - - /** - * Set new size of collection. - * - * @param int $size - */ - public function setSize($size): bool - { - if ($this->getSize() !== $size) { - $this->changed = true; - - return parent::setSize($size); - } - - return true; - } - - /** - * Unset collection item. - * - * @param int $index - */ - public function offsetUnset($index): void - { - $this->changed = true; - $this->unregisterFoundToken($this[$index]); - parent::offsetUnset($index); - } - - /** - * Set collection item. - * - * Warning! `$newval` must not be typehinted to be compatible with `ArrayAccess::offsetSet` method. - * - * @param int $index - * @param Token $newval - */ - public function offsetSet($index, $newval): void - { - $this->blockStartCache = []; - $this->blockEndCache = []; - - if (!isset($this[$index]) || !$this[$index]->equals($newval)) { - $this->changed = true; - - if (isset($this[$index])) { - $this->unregisterFoundToken($this[$index]); - } - - $this->registerFoundToken($newval); - } - - parent::offsetSet($index, $newval); - } - - /** - * Clear internal flag if collection was changed and flag for all collection's items. - */ - public function clearChanged(): void - { - $this->changed = false; - } - - /** - * Clear empty tokens. - * - * Empty tokens can occur e.g. after calling clear on item of collection. - */ - public function clearEmptyTokens(): void - { - $limit = $this->count(); - $index = 0; - - for (; $index < $limit; ++$index) { - if ($this->isEmptyAt($index)) { - break; - } - } - - // 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)) { - $this[$count++] = $this[$index]; // @phpstan-ignore-line as we know that index exists - } - } - - $this->setSize($count); - } - - /** - * Ensure that on given index is a whitespace with given kind. - * - * If there is a whitespace then it's content will be modified. - * If not - the new Token will be added. - * - * @param int $index index - * @param int $indexOffset index offset for Token insertion - * @param string $whitespace whitespace to set - * - * @return bool if new Token was added - */ - public function ensureWhitespaceAtIndex(int $index, int $indexOffset, string $whitespace): bool - { - $removeLastCommentLine = static function (self $tokens, int $index, int $indexOffset, string $whitespace): string { - $token = $tokens[$index]; - - if (1 === $indexOffset && $token->isGivenKind(T_OPEN_TAG)) { - if (0 === strpos($whitespace, "\r\n")) { - $tokens[$index] = new Token([T_OPEN_TAG, rtrim($token->getContent())."\r\n"]); - - return \strlen($whitespace) > 2 // can be removed on PHP 7; https://php.net/manual/en/function.substr.php - ? substr($whitespace, 2) - : '' - ; - } - - $tokens[$index] = new Token([T_OPEN_TAG, rtrim($token->getContent()).$whitespace[0]]); - - return \strlen($whitespace) > 1 // can be removed on PHP 7; https://php.net/manual/en/function.substr.php - ? substr($whitespace, 1) - : '' - ; - } - - return $whitespace; - }; - - if ($this[$index]->isWhitespace()) { - $whitespace = $removeLastCommentLine($this, $index - 1, $indexOffset, $whitespace); - - if ('' === $whitespace) { - $this->clearAt($index); - } else { - $this[$index] = new Token([T_WHITESPACE, $whitespace]); - } - - return false; - } - - $whitespace = $removeLastCommentLine($this, $index, $indexOffset, $whitespace); - - if ('' === $whitespace) { - return false; - } - - $this->insertAt( - $index + $indexOffset, - [new Token([T_WHITESPACE, $whitespace])] - ); - - return true; - } - - /** - * @param int $type type of block, one of BLOCK_TYPE_* - * @param int $searchIndex index of opening brace - * - * @return int index of closing brace - */ - public function findBlockEnd(int $type, int $searchIndex): int - { - return $this->findOppositeBlockEdge($type, $searchIndex, true); - } - - /** - * @param int $type type of block, one of BLOCK_TYPE_* - * @param int $searchIndex index of closing brace - * - * @return int index of opening brace - */ - public function findBlockStart(int $type, int $searchIndex): int - { - return $this->findOppositeBlockEdge($type, $searchIndex, false); - } - - /** - * @param array|int $possibleKind kind or array of kind - * @param int $start optional offset - * @param null|int $end optional limit - * - * @return array array of tokens of given kinds or assoc array of arrays - */ - public function findGivenKind($possibleKind, int $start = 0, ?int $end = null): array - { - if (null === $end) { - $end = $this->count(); - } - - $elements = []; - $possibleKinds = (array) $possibleKind; - - foreach ($possibleKinds as $kind) { - $elements[$kind] = []; - } - - $possibleKinds = array_filter($possibleKinds, function ($kind) { - return $this->isTokenKindFound($kind); - }); - - if (\count($possibleKinds)) { - for ($i = $start; $i < $end; ++$i) { - $token = $this[$i]; - if ($token->isGivenKind($possibleKinds)) { - $elements[$token->getId()][$i] = $token; - } - } - } - - return \is_array($possibleKind) ? $elements : $elements[$possibleKind]; - } - - public function generateCode(): string - { - $code = $this->generatePartialCode(0, \count($this) - 1); - $this->changeCodeHash(self::calculateCodeHash($code)); - - return $code; - } - - /** - * Generate code from tokens between given indexes. - * - * @param int $start start index - * @param int $end end index - */ - public function generatePartialCode(int $start, int $end): string - { - $code = ''; - - for ($i = $start; $i <= $end; ++$i) { - $code .= $this[$i]->getContent(); - } - - return $code; - } - - /** - * Get hash of code. - */ - public function getCodeHash(): string - { - return $this->codeHash; - } - - /** - * Get index for closest next token which is non whitespace. - * - * This method is shorthand for getNonWhitespaceSibling method. - * - * @param int $index token index - * @param null|string $whitespaces whitespaces characters for Token::isWhitespace - */ - public function getNextNonWhitespace(int $index, ?string $whitespaces = null): ?int - { - return $this->getNonWhitespaceSibling($index, 1, $whitespaces); - } - - /** - * Get index for closest next token of given kind. - * - * This method is shorthand for getTokenOfKindSibling method. - * - * @param int $index token index - * @param array $tokens possible tokens - * @param bool $caseSensitive perform a case sensitive comparison - */ - public function getNextTokenOfKind(int $index, array $tokens = [], bool $caseSensitive = true): ?int - { - return $this->getTokenOfKindSibling($index, 1, $tokens, $caseSensitive); - } - - /** - * Get index for closest sibling token which is non whitespace. - * - * @param int $index token index - * @param int $direction direction for looking, +1 or -1 - * @param null|string $whitespaces whitespaces characters for Token::isWhitespace - */ - public function getNonWhitespaceSibling(int $index, int $direction, ?string $whitespaces = null): ?int - { - while (true) { - $index += $direction; - - if (!$this->offsetExists($index)) { - return null; - } - - if (!$this[$index]->isWhitespace($whitespaces)) { - return $index; - } - } - } - - /** - * Get index for closest previous token which is non whitespace. - * - * This method is shorthand for getNonWhitespaceSibling method. - * - * @param int $index token index - * @param null|string $whitespaces whitespaces characters for Token::isWhitespace - */ - public function getPrevNonWhitespace(int $index, ?string $whitespaces = null): ?int - { - return $this->getNonWhitespaceSibling($index, -1, $whitespaces); - } - - /** - * Get index for closest previous token of given kind. - * This method is shorthand for getTokenOfKindSibling method. - * - * @param int $index token index - * @param array $tokens possible tokens - * @param bool $caseSensitive perform a case sensitive comparison - */ - public function getPrevTokenOfKind(int $index, array $tokens = [], bool $caseSensitive = true): ?int - { - return $this->getTokenOfKindSibling($index, -1, $tokens, $caseSensitive); - } - - /** - * Get index for closest sibling token of given kind. - * - * @param int $index token index - * @param int $direction direction for looking, +1 or -1 - * @param array $tokens possible tokens - * @param bool $caseSensitive perform a case sensitive comparison - */ - public function getTokenOfKindSibling(int $index, int $direction, array $tokens = [], bool $caseSensitive = true): ?int - { - $tokens = array_filter($tokens, function ($token) { - return $this->isTokenKindFound($this->extractTokenKind($token)); - }); - - if (!\count($tokens)) { - return null; - } - - while (true) { - $index += $direction; - - if (!$this->offsetExists($index)) { - return null; - } - - if ($this[$index]->equalsAny($tokens, $caseSensitive)) { - return $index; - } - } - } - - /** - * Get index for closest sibling token not of given kind. - * - * @param int $index token index - * @param int $direction direction for looking, +1 or -1 - * @param array $tokens possible tokens - */ - public function getTokenNotOfKindSibling(int $index, int $direction, array $tokens = []): ?int - { - return $this->getTokenNotOfKind( - $index, - $direction, - function (int $a) use ($tokens) { - return $this[$a]->equalsAny($tokens); - } - ); - } - - /** - * Get index for closest sibling token not of given kind. - * - * @param int $index token index - * @param int $direction direction for looking, +1 or -1 - * @param array $kinds possible tokens kinds - */ - public function getTokenNotOfKindsSibling(int $index, int $direction, array $kinds = []): ?int - { - return $this->getTokenNotOfKind( - $index, - $direction, - function (int $index) use ($kinds) { - return $this[$index]->isGivenKind($kinds); - } - ); - } - - /** - * Get index for closest sibling token that is not a whitespace, comment or attribute. - * - * @param int $index token index - * @param int $direction direction for looking, +1 or -1 - */ - public function getMeaningfulTokenSibling(int $index, int $direction): ?int - { - return $this->getTokenNotOfKindsSibling( - $index, - $direction, - [T_WHITESPACE, T_COMMENT, T_DOC_COMMENT] - ); - } - - /** - * Get index for closest sibling token which is not empty. - * - * @param int $index token index - * @param int $direction direction for looking, +1 or -1 - */ - public function getNonEmptySibling(int $index, int $direction): ?int - { - while (true) { - $index += $direction; - - if (!$this->offsetExists($index)) { - return null; - } - - if (!$this->isEmptyAt($index)) { - return $index; - } - } - } - - /** - * Get index for closest next token that is not a whitespace or comment. - * - * @param int $index token index - */ - public function getNextMeaningfulToken(int $index): ?int - { - return $this->getMeaningfulTokenSibling($index, 1); - } - - /** - * Get index for closest previous token that is not a whitespace or comment. - * - * @param int $index token index - */ - public function getPrevMeaningfulToken(int $index): ?int - { - return $this->getMeaningfulTokenSibling($index, -1); - } - - /** - * Find a sequence of meaningful tokens and returns the array of their locations. - * - * @param array $sequence an array of tokens (kinds) (same format used by getNextTokenOfKind) - * @param int $start start index, defaulting to the start of the file - * @param int $end end index, defaulting to the end of the file - * @param array|bool $caseSensitive global case sensitiveness or an array of booleans, whose keys should match - * the ones used in $others. 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 - */ - public function findSequence(array $sequence, int $start = 0, ?int $end = null, $caseSensitive = true): ?array - { - $sequenceCount = \count($sequence); - if (0 === $sequenceCount) { - throw new \InvalidArgumentException('Invalid sequence.'); - } - - // $end defaults to the end of the collection - $end = null === $end ? \count($this) - 1 : min($end, \count($this) - 1); - - if ($start + $sequenceCount - 1 > $end) { - return null; - } - - $nonMeaningFullKind = [T_COMMENT, T_DOC_COMMENT, T_WHITESPACE]; - - // make sure the sequence content is "meaningful" - foreach ($sequence as $key => $token) { - // if not a Token instance already, we convert it to verify the meaningfulness - if (!$token instanceof Token) { - if (\is_array($token) && !isset($token[1])) { - // fake some content as it is required by the Token constructor, - // although optional for search purposes - $token[1] = 'DUMMY'; - } - - $token = new Token($token); - } - - if ($token->isGivenKind($nonMeaningFullKind)) { - 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)); - } - } - - foreach ($sequence as $token) { - if (!$this->isTokenKindFound($this->extractTokenKind($token))) { - return 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]); - - // begin searching for the first token in the sequence (start included) - $index = $start - 1; - while (null !== $index && $index <= $end) { - $index = $this->getNextTokenOfKind($index, [$firstToken], $firstCs); - - // ensure we found a match and didn't get past the end index - if (null === $index || $index > $end) { - return null; - } - - // initialise the result array with the current index - $result = [$index => $this[$index]]; - - // advance cursor to the current position - $currIdx = $index; - - // iterate through the remaining tokens in the sequence - foreach ($sequence as $key => $token) { - $currIdx = $this->getNextMeaningfulToken($currIdx); - - // ensure we didn't go too far - if (null === $currIdx || $currIdx > $end) { - return null; - } - - if (!$this[$currIdx]->equals($token, Token::isKeyCaseSensitive($caseSensitive, $key))) { - // not a match, restart the outer loop - continue 2; - } - - // append index to the result array - $result[$currIdx] = $this[$currIdx]; - } - - // do we have a complete match? - // hint: $result is bigger than $sequence since the first token has been removed from the latter - if (\count($sequence) < \count($result)) { - return $result; - } - } - - return null; - } - - /** - * Insert instances of Token inside collection. - * - * @param int $index start inserting index - * @param array|Token|Tokens $items instances of Token to insert - */ - public function insertAt(int $index, $items): void - { - $items = \is_array($items) || $items instanceof self ? $items : [$items]; - - $this->insertSlices([$index => $items]); - } - - /** - * Insert a slices or individual Tokens into multiple places in a single run. - * - * This approach is kind-of an experiment - it's proven to improve performance a lot for big files that needs plenty of new tickets to be inserted, - * like edge case example of 3.7h vs 4s (https://github.com/FriendsOfPHP/PHP-CS-Fixer/issues/3996#issuecomment-455617637), - * yet at same time changing a logic of fixers in not-always easy way. - * - * To be discuss: - * - should we always aim to use this method? - * - should we deprecate `insertAt` method ? - * - * The `$slices` parameter is an assoc array, in which: - * - index: starting point for inserting of individual slice, with indexes being relatives to original array collection before any Token inserted - * - value under index: a slice of Tokens to be inserted - * - * @internal - * - * @param array|Token|Tokens> $slices - */ - public function insertSlices(array $slices): void - { - $itemsCount = 0; - foreach ($slices as $slice) { - $slice = \is_array($slice) || $slice instanceof self ? $slice : [$slice]; - $itemsCount += \count($slice); - } - - if (0 === $itemsCount) { - return; - } - - $oldSize = \count($this); - $this->changed = true; - $this->blockStartCache = []; - $this->blockEndCache = []; - $this->setSize($oldSize + $itemsCount); - - krsort($slices); - - $insertBound = $oldSize - 1; - - // since we only move already existing items around, we directly call into SplFixedArray::offset* methods. - // that way we get around additional overhead this class adds with overridden offset* methods. - foreach ($slices as $index => $slice) { - $slice = \is_array($slice) || $slice instanceof self ? $slice : [$slice]; - $sliceCount = \count($slice); - - for ($i = $insertBound; $i >= $index; --$i) { - $oldItem = parent::offsetExists($i) ? parent::offsetGet($i) : new Token(''); - parent::offsetSet($i + $itemsCount, $oldItem); - } - - $insertBound = $index - $sliceCount; - $itemsCount -= $sliceCount; - - foreach ($slice as $indexItem => $item) { - if ('' === $item->getContent()) { - throw new \InvalidArgumentException('Must not add empty token to collection.'); - } - - $this->registerFoundToken($item); - $newOffset = $index + $itemsCount + $indexItem; - parent::offsetSet($newOffset, $item); - } - } - } - - /** - * Check if collection was change: collection itself (like insert new tokens) or any of collection's elements. - */ - public function isChanged(): bool - { - if ($this->changed) { - return true; - } - - return false; - } - - public function isEmptyAt(int $index): bool - { - $token = $this[$index]; - - return null === $token->getId() && '' === $token->getContent(); - } - - public function clearAt(int $index): void - { - $this[$index] = new Token(''); - } - - /** - * Override tokens at given range. - * - * @param int $indexStart start overriding index - * @param int $indexEnd end overriding index - * @param array|Tokens $items tokens to insert - */ - public function overrideRange(int $indexStart, int $indexEnd, iterable $items): void - { - $indexToChange = $indexEnd - $indexStart + 1; - $itemsCount = \count($items); - - // If we want to add more items than passed range contains we need to - // add placeholders for overhead items. - if ($itemsCount > $indexToChange) { - $placeholders = []; - - while ($itemsCount > $indexToChange) { - $placeholders[] = new Token('__PLACEHOLDER__'); - ++$indexToChange; - } - - $this->insertAt($indexEnd + 1, $placeholders); - } - - // Override each items. - foreach ($items as $itemIndex => $item) { - $this[$indexStart + $itemIndex] = $item; - } - - // If we want to add less tokens than passed range contains then clear - // not needed tokens. - if ($itemsCount < $indexToChange) { - $this->clearRange($indexStart + $itemsCount, $indexEnd); - } - } - - /** - * @param null|string $whitespaces optional whitespaces characters for Token::isWhitespace - */ - public function removeLeadingWhitespace(int $index, ?string $whitespaces = null): void - { - $this->removeWhitespaceSafely($index, -1, $whitespaces); - } - - /** - * @param null|string $whitespaces optional whitespaces characters for Token::isWhitespace - */ - public function removeTrailingWhitespace(int $index, ?string $whitespaces = null): void - { - $this->removeWhitespaceSafely($index, 1, $whitespaces); - } - - /** - * Set code. Clear all current content and replace it by new Token items generated from code directly. - * - * @param string $code PHP code - */ - public function setCode(string $code): void - { - // No need to work when the code is the same. - // That is how we avoid a lot of work and setting changed flag. - if ($code === $this->generateCode()) { - return; - } - - // clear memory - $this->setSize(0); - - $tokens = token_get_all($code, TOKEN_PARSE); - - $this->setSize(\count($tokens)); - - foreach ($tokens as $index => $token) { - $this[$index] = new Token($token); - } - - $this->applyTransformers(); - - $this->foundTokenKinds = []; - - foreach ($this as $token) { - $this->registerFoundToken($token); - } - - if (\PHP_VERSION_ID < 80000) { - $this->rewind(); - } - - $this->changeCodeHash(self::calculateCodeHash($code)); - $this->changed = true; - } - - public function toJson(): string - { - $output = new \SplFixedArray(\count($this)); - - foreach ($this as $index => $token) { - $output[$index] = $token->toArray(); - } - - if (\PHP_VERSION_ID < 80000) { - $this->rewind(); - } - - return json_encode($output, JSON_PRETTY_PRINT | JSON_NUMERIC_CHECK); - } - - /** - * Check if all token kinds given as argument are found. - */ - public function isAllTokenKindsFound(array $tokenKinds): bool - { - foreach ($tokenKinds as $tokenKind) { - if (empty($this->foundTokenKinds[$tokenKind])) { - return false; - } - } - - return true; - } - - /** - * Check if any token kind given as argument is found. - */ - public function isAnyTokenKindsFound(array $tokenKinds): bool - { - foreach ($tokenKinds as $tokenKind) { - if (!empty($this->foundTokenKinds[$tokenKind])) { - return true; - } - } - - return false; - } - - /** - * Check if token kind given as argument is found. - * - * @param int|string $tokenKind - */ - public function isTokenKindFound($tokenKind): bool - { - return !empty($this->foundTokenKinds[$tokenKind]); - } - - /** - * @param int|string $tokenKind - */ - public function countTokenKind($tokenKind): int - { - return $this->foundTokenKinds[$tokenKind] ?? 0; - } - - /** - * Clear tokens in the given range. - */ - public function clearRange(int $indexStart, int $indexEnd): void - { - for ($i = $indexStart; $i <= $indexEnd; ++$i) { - $this->clearAt($i); - } - } - - /** - * Checks for monolithic PHP code. - * - * Checks that the code is pure PHP code, in a single code block, starting - * with an open tag. - */ - public function isMonolithicPhp(): bool - { - $size = $this->count(); - - if (0 === $size) { - return false; - } - - if ($this->isTokenKindFound(T_INLINE_HTML)) { - return false; - } - - return 1 >= ($this->countTokenKind(T_OPEN_TAG) + $this->countTokenKind(T_OPEN_TAG_WITH_ECHO)); - } - - /** - * @param int $start start index - * @param int $end end index - */ - public function isPartialCodeMultiline(int $start, int $end): bool - { - for ($i = $start; $i <= $end; ++$i) { - if (false !== strpos($this[$i]->getContent(), "\n")) { - return true; - } - } - - return false; - } - - public function hasAlternativeSyntax(): bool - { - return $this->isAnyTokenKindsFound([ - T_ENDDECLARE, - T_ENDFOR, - T_ENDFOREACH, - T_ENDIF, - T_ENDSWITCH, - T_ENDWHILE, - ]); - } - - public function clearTokenAndMergeSurroundingWhitespace(int $index): void - { - $count = \count($this); - $this->clearAt($index); - - if ($index === $count - 1) { - return; - } - - $nextIndex = $this->getNonEmptySibling($index, 1); - - if (null === $nextIndex || !$this[$nextIndex]->isWhitespace()) { - return; - } - - $prevIndex = $this->getNonEmptySibling($index, -1); - - if ($this[$prevIndex]->isWhitespace()) { - $this[$prevIndex] = new Token([T_WHITESPACE, $this[$prevIndex]->getContent().$this[$nextIndex]->getContent()]); - } elseif ($this->isEmptyAt($prevIndex + 1)) { - $this[$prevIndex + 1] = new Token([T_WHITESPACE, $this[$nextIndex]->getContent()]); - } - - $this->clearAt($nextIndex); - } - - /** - * @internal - */ - protected function applyTransformers(): void - { - $transformers = Transformers::createSingleton(); - $transformers->transform($this); - } - - private function removeWhitespaceSafely(int $index, int $direction, ?string $whitespaces = null): void - { - $whitespaceIndex = $this->getNonEmptySibling($index, $direction); - if (isset($this[$whitespaceIndex]) && $this[$whitespaceIndex]->isWhitespace()) { - $newContent = ''; - $tokenToCheck = $this[$whitespaceIndex]; - - // if the token candidate to remove is preceded by single line comment we do not consider the new line after this comment as part of T_WHITESPACE - if (isset($this[$whitespaceIndex - 1]) && $this[$whitespaceIndex - 1]->isComment() && '/*' !== substr($this[$whitespaceIndex - 1]->getContent(), 0, 2)) { - [$emptyString, $newContent, $whitespacesToCheck] = Preg::split('/^(\R)/', $this[$whitespaceIndex]->getContent(), -1, PREG_SPLIT_DELIM_CAPTURE); - - if ('' === $whitespacesToCheck) { - return; - } - - $tokenToCheck = new Token([T_WHITESPACE, $whitespacesToCheck]); - } - - if (!$tokenToCheck->isWhitespace($whitespaces)) { - return; - } - - if ('' === $newContent) { - $this->clearAt($whitespaceIndex); - } else { - $this[$whitespaceIndex] = new Token([T_WHITESPACE, $newContent]); - } - } - } - - /** - * @param int $type type of block, one of BLOCK_TYPE_* - * @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 - */ - 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)); - } - - if ($findEnd && isset($this->blockStartCache[$searchIndex])) { - return $this->blockStartCache[$searchIndex]; - } - if (!$findEnd && isset($this->blockEndCache[$searchIndex])) { - return $this->blockEndCache[$searchIndex]; - } - - $startEdge = $blockEdgeDefinitions[$type]['start']; - $endEdge = $blockEdgeDefinitions[$type]['end']; - $startIndex = $searchIndex; - $endIndex = $this->count() - 1; - $indexOffset = 1; - - if (!$findEnd) { - [$startEdge, $endEdge] = [$endEdge, $startEdge]; - $indexOffset = -1; - $endIndex = 0; - } - - if (!$this[$startIndex]->equals($startEdge)) { - throw new \InvalidArgumentException(sprintf('Invalid param $startIndex - not a proper block "%s".', $findEnd ? 'start' : 'end')); - } - - $blockLevel = 0; - - for ($index = $startIndex; $index !== $endIndex; $index += $indexOffset) { - $token = $this[$index]; - - if ($token->equals($startEdge)) { - ++$blockLevel; - - continue; - } - - if ($token->equals($endEdge)) { - --$blockLevel; - - if (0 === $blockLevel) { - break; - } - } - } - - if (!$this[$index]->equals($endEdge)) { - throw new \UnexpectedValueException(sprintf('Missing block "%s".', $findEnd ? 'end' : 'start')); - } - - if ($startIndex < $index) { - $this->blockStartCache[$startIndex] = $index; - $this->blockEndCache[$index] = $startIndex; - } else { - $this->blockStartCache[$index] = $startIndex; - $this->blockEndCache[$startIndex] = $index; - } - - return $index; - } - - /** - * Calculate hash for code. - */ - private static function calculateCodeHash(string $code): string - { - return CodeHasher::calculateCodeHash($code); - } - - /** - * Get cache value for given key. - * - * @param string $key item key - */ - private static function getCache(string $key): self - { - if (!self::hasCache($key)) { - throw new \OutOfBoundsException(sprintf('Unknown cache key: "%s".', $key)); - } - - return self::$cache[$key]; - } - - /** - * Check if given key exists in cache. - * - * @param string $key item key - */ - private static function hasCache(string $key): bool - { - return isset(self::$cache[$key]); - } - - /** - * @param string $key item key - * @param Tokens $value item value - */ - private static function setCache(string $key, self $value): void - { - self::$cache[$key] = $value; - } - - /** - * Change code hash. - * - * Remove old cache and set new one. - * - * @param string $codeHash new code hash - */ - private function changeCodeHash(string $codeHash): void - { - if (null !== $this->codeHash) { - self::clearCache($this->codeHash); - } - - $this->codeHash = $codeHash; - self::setCache($this->codeHash, $this); - } - - /** - * Register token as found. - * - * @param array|string|Token $token token prototype - */ - private function registerFoundToken($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) - ; - - if (!isset($this->foundTokenKinds[$tokenKind])) { - $this->foundTokenKinds[$tokenKind] = 0; - } - - ++$this->foundTokenKinds[$tokenKind]; - } - - /** - * Register token as found. - * - * @param array|string|Token $token token prototype - */ - private function unregisterFoundToken($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) - ; - - if (!isset($this->foundTokenKinds[$tokenKind])) { - return; - } - - --$this->foundTokenKinds[$tokenKind]; - } - - /** - * @param array|string|Token $token token prototype - * - * @return int|string - */ - private function extractTokenKind($token) - { - return $token instanceof Token - ? ($token->isArray() ? $token->getId() : $token->getContent()) - : (\is_array($token) ? $token[0] : $token) - ; - } - - /** - * @param int $index token index - * @param int $direction direction for looking, +1 or -1 - */ - private function getTokenNotOfKind(int $index, int $direction, callable $filter): ?int - { - while (true) { - $index += $direction; - - if (!$this->offsetExists($index)) { - return null; - } - - if ($this->isEmptyAt($index) || $filter($index)) { - continue; - } - - return $index; - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/TokensAnalyzer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/TokensAnalyzer.php deleted file mode 100644 index 01d7eac..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/TokensAnalyzer.php +++ /dev/null @@ -1,760 +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\Tokenizer; - -use PhpCsFixer\Tokenizer\Analyzer\AttributeAnalyzer; -use PhpCsFixer\Tokenizer\Analyzer\GotoLabelAnalyzer; - -/** - * Analyzer of Tokens collection. - * - * Its role is to provide the ability to analyze collection. - * - * @author Dariusz Rumiński - * @author Gregor Harlan - * @author SpacePossum - * - * @internal - */ -final class TokensAnalyzer -{ - /** - * Tokens collection instance. - * - * @var Tokens - */ - private $tokens; - - /** - * @var ?GotoLabelAnalyzer - */ - private $gotoLabelAnalyzer; - - public function __construct(Tokens $tokens) - { - $this->tokens = $tokens; - } - - /** - * Get indexes of methods and properties in classy code (classes, interfaces and traits). - * - * @return array[] - */ - public function getClassyElements(): array - { - $elements = []; - - for ($index = 1, $count = \count($this->tokens) - 2; $index < $count; ++$index) { - if ($this->tokens[$index]->isClassy()) { - [$index, $newElements] = $this->findClassyElements($index, $index); - $elements += $newElements; - } - } - - ksort($elements); - - return $elements; - } - - /** - * Get indexes of namespace uses. - * - * @param bool $perNamespace Return namespace uses per namespace - * - * @return int[]|int[][] - */ - public function getImportUseIndexes(bool $perNamespace = false): array - { - $tokens = $this->tokens; - - $uses = []; - $namespaceIndex = 0; - - for ($index = 0, $limit = $tokens->count(); $index < $limit; ++$index) { - $token = $tokens[$index]; - - if ($token->isGivenKind(T_NAMESPACE)) { - $nextTokenIndex = $tokens->getNextTokenOfKind($index, [';', '{']); - $nextToken = $tokens[$nextTokenIndex]; - - if ($nextToken->equals('{')) { - $index = $nextTokenIndex; - } - - if ($perNamespace) { - ++$namespaceIndex; - } - - continue; - } - - if ($token->isGivenKind(T_USE)) { - $uses[$namespaceIndex][] = $index; - } - } - - if (!$perNamespace && isset($uses[$namespaceIndex])) { - return $uses[$namespaceIndex]; - } - - return $uses; - } - - /** - * Check if there is an array at given index. - */ - public function isArray(int $index): bool - { - return $this->tokens[$index]->isGivenKind([T_ARRAY, CT::T_ARRAY_SQUARE_BRACE_OPEN]); - } - - /** - * Check if the array at index is multiline. - * - * This only checks the root-level of the array. - */ - public function isArrayMultiLine(int $index): bool - { - if (!$this->isArray($index)) { - throw new \InvalidArgumentException(sprintf('Not an array at given index %d.', $index)); - } - - $tokens = $this->tokens; - - // Skip only when its an array, for short arrays we need the brace for correct - // level counting - if ($tokens[$index]->isGivenKind(T_ARRAY)) { - $index = $tokens->getNextMeaningfulToken($index); - } - - return $this->isBlockMultiline($tokens, $index); - } - - 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)); - } - - $endIndex = $tokens->findBlockEnd($blockType['type'], $index); - - for (++$index; $index < $endIndex; ++$index) { - $token = $tokens[$index]; - $blockType = Tokens::detectBlockType($token); - - if ($blockType && $blockType['isStart']) { - $index = $tokens->findBlockEnd($blockType['type'], $index); - - continue; - } - - if ( - $token->isWhitespace() - && !$tokens[$index - 1]->isGivenKind(T_END_HEREDOC) - && false !== strpos($token->getContent(), "\n") - ) { - return true; - } - } - - return false; - } - - /** - * Returns the attributes of the method under the given index. - * - * The array has the following items: - * 'visibility' int|null T_PRIVATE, T_PROTECTED or T_PUBLIC - * 'static' bool - * 'abstract' bool - * 'final' bool - * - * @param int $index Token index of the method (T_FUNCTION) - */ - public function getMethodAttributes(int $index): array - { - $tokens = $this->tokens; - $token = $tokens[$index]; - - if (!$token->isGivenKind(T_FUNCTION)) { - throw new \LogicException(sprintf('No T_FUNCTION at given index %d, got "%s".', $index, $token->getName())); - } - - $attributes = [ - 'visibility' => null, - 'static' => false, - 'abstract' => false, - 'final' => false, - ]; - - for ($i = $index; $i >= 0; --$i) { - $tokenIndex = $tokens->getPrevMeaningfulToken($i); - - $i = $tokenIndex; - $token = $tokens[$tokenIndex]; - - if ($token->isGivenKind(T_STATIC)) { - $attributes['static'] = true; - - continue; - } - - if ($token->isGivenKind(T_FINAL)) { - $attributes['final'] = true; - - continue; - } - - if ($token->isGivenKind(T_ABSTRACT)) { - $attributes['abstract'] = true; - - continue; - } - - // visibility - - if ($token->isGivenKind(T_PRIVATE)) { - $attributes['visibility'] = T_PRIVATE; - - continue; - } - - if ($token->isGivenKind(T_PROTECTED)) { - $attributes['visibility'] = T_PROTECTED; - - continue; - } - - if ($token->isGivenKind(T_PUBLIC)) { - $attributes['visibility'] = T_PUBLIC; - - continue; - } - - // found a meaningful token that is not part of - // the function signature; stop looking - break; - } - - return $attributes; - } - - /** - * Check if there is an anonymous class under given index. - */ - public function isAnonymousClass(int $index): bool - { - if (!$this->tokens[$index]->isClassy()) { - throw new \LogicException(sprintf('No classy token at given index %d.', $index)); - } - - if (!$this->tokens[$index]->isGivenKind(T_CLASS)) { - return false; - } - - return $this->tokens[$this->tokens->getPrevMeaningfulToken($index)]->isGivenKind(T_NEW); - } - - /** - * Check if the function under given index is a lambda. - */ - public function isLambda(int $index): bool - { - if ( - !$this->tokens[$index]->isGivenKind(T_FUNCTION) - && (\PHP_VERSION_ID < 70400 || !$this->tokens[$index]->isGivenKind(T_FN)) - ) { - 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); - $startParenthesisToken = $this->tokens[$startParenthesisIndex]; - - // skip & for `function & () {}` syntax - if ($startParenthesisToken->isGivenKind(CT::T_RETURN_REF)) { - $startParenthesisIndex = $this->tokens->getNextMeaningfulToken($startParenthesisIndex); - $startParenthesisToken = $this->tokens[$startParenthesisIndex]; - } - - return $startParenthesisToken->equals('('); - } - - /** - * Check if the T_STRING under given index is a constant invocation. - */ - 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())); - } - - $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, T_VARIABLE]) - ) { - 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]) || $this->tokens[$prevIndex]->isObjectOperator()) { - return false; - } - - while ($this->tokens[$prevIndex]->isGivenKind([CT::T_NAMESPACE_OPERATOR, T_NS_SEPARATOR, T_STRING])) { - $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])) { - return false; - } - - // `FOO & $bar` could be: - // - function reference parameter: function baz(Foo & $bar) {} - // - bit operator: $x = FOO & $bar; - if ($this->tokens[$nextIndex]->equals('&') && $this->tokens[$this->tokens->getNextMeaningfulToken($nextIndex)]->isGivenKind(T_VARIABLE)) { - $checkIndex = $this->tokens->getPrevTokenOfKind($prevIndex, [';', '{', '}', [T_FUNCTION], [T_OPEN_TAG], [T_OPEN_TAG_WITH_ECHO]]); - - if ($this->tokens[$checkIndex]->isGivenKind(T_FUNCTION)) { - return false; - } - } - - // check for `extends`/`implements`/`use` list - if ($this->tokens[$prevIndex]->equals(',')) { - $checkIndex = $prevIndex; - while ($this->tokens[$checkIndex]->equalsAny([',', [T_AS], [CT::T_NAMESPACE_OPERATOR], [T_NS_SEPARATOR], [T_STRING]])) { - $checkIndex = $this->tokens->getPrevMeaningfulToken($checkIndex); - } - - if ($this->tokens[$checkIndex]->isGivenKind([T_EXTENDS, CT::T_GROUP_IMPORT_BRACE_OPEN, T_IMPLEMENTS, T_USE, CT::T_USE_TRAIT])) { - return false; - } - } - - // check for array in double quoted string: `"..$foo[bar].."` - if ($this->tokens[$prevIndex]->equals('[') && $this->tokens[$nextIndex]->equals(']')) { - $checkToken = $this->tokens[$this->tokens->getNextMeaningfulToken($nextIndex)]; - - if ($checkToken->equals('"') || $checkToken->isGivenKind([T_CURLY_OPEN, T_DOLLAR_OPEN_CURLY_BRACES, T_ENCAPSED_AND_WHITESPACE, T_VARIABLE])) { - return false; - } - } - - // check for attribute: `#[Foo]` - if (AttributeAnalyzer::isAttribute($this->tokens, $index)) { - return false; - } - - // 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; - } - } - - // check for non-capturing catches - while ($this->tokens[$prevIndex]->isGivenKind([CT::T_TYPE_ALTERNATION, T_STRING])) { - $prevIndex = $this->tokens->getPrevMeaningfulToken($prevIndex); - } - - if ($this->tokens[$prevIndex]->equals('(')) { - $prevPrevIndex = $this->tokens->getPrevMeaningfulToken($prevIndex); - if ($this->tokens[$prevPrevIndex]->isGivenKind(T_CATCH)) { - return false; - } - } - - return true; - } - - /** - * Checks if there is an unary successor operator under given index. - */ - public function isUnarySuccessorOperator(int $index): bool - { - static $allowedPrevToken = [ - ']', - [T_STRING], - [T_VARIABLE], - [CT::T_ARRAY_INDEX_CURLY_BRACE_CLOSE], - [CT::T_DYNAMIC_PROP_BRACE_CLOSE], - [CT::T_DYNAMIC_VAR_BRACE_CLOSE], - ]; - - $tokens = $this->tokens; - $token = $tokens[$index]; - - if (!$token->isGivenKind([T_INC, T_DEC])) { - return false; - } - - $prevToken = $tokens[$tokens->getPrevMeaningfulToken($index)]; - - return $prevToken->equalsAny($allowedPrevToken); - } - - /** - * Checks if there is an unary predecessor operator under given index. - */ - public function isUnaryPredecessorOperator(int $index): bool - { - static $potentialSuccessorOperator = [T_INC, T_DEC]; - - static $potentialBinaryOperator = ['+', '-', '&', [CT::T_RETURN_REF]]; - - static $otherOperators; - if (null === $otherOperators) { - $otherOperators = ['!', '~', '@', [T_ELLIPSIS]]; - } - - static $disallowedPrevTokens; - if (null === $disallowedPrevTokens) { - $disallowedPrevTokens = [ - ']', - '}', - ')', - '"', - '`', - [CT::T_ARRAY_SQUARE_BRACE_CLOSE], - [CT::T_ARRAY_INDEX_CURLY_BRACE_CLOSE], - [CT::T_DYNAMIC_PROP_BRACE_CLOSE], - [CT::T_DYNAMIC_VAR_BRACE_CLOSE], - [T_CLASS_C], - [T_CONSTANT_ENCAPSED_STRING], - [T_DEC], - [T_DIR], - [T_DNUMBER], - [T_FILE], - [T_FUNC_C], - [T_INC], - [T_LINE], - [T_LNUMBER], - [T_METHOD_C], - [T_NS_C], - [T_STRING], - [T_TRAIT_C], - [T_VARIABLE], - ]; - } - - $tokens = $this->tokens; - $token = $tokens[$index]; - - if ($token->isGivenKind($potentialSuccessorOperator)) { - return !$this->isUnarySuccessorOperator($index); - } - - if ($token->equalsAny($otherOperators)) { - return true; - } - - if (!$token->equalsAny($potentialBinaryOperator)) { - return false; - } - - $prevToken = $tokens[$tokens->getPrevMeaningfulToken($index)]; - - if (!$prevToken->equalsAny($disallowedPrevTokens)) { - return true; - } - - if (!$token->equals('&') || !$prevToken->isGivenKind(T_STRING)) { - return false; - } - - static $searchTokens = [ - ';', - '{', - '}', - [T_FUNCTION], - [T_OPEN_TAG], - [T_OPEN_TAG_WITH_ECHO], - ]; - $prevToken = $tokens[$tokens->getPrevTokenOfKind($index, $searchTokens)]; - - return $prevToken->isGivenKind(T_FUNCTION); - } - - /** - * Checks if there is a binary operator under given index. - */ - public function isBinaryOperator(int $index): bool - { - static $nonArrayOperators = [ - '=' => true, - '*' => true, - '/' => true, - '%' => true, - '<' => true, - '>' => true, - '|' => true, - '^' => true, - '.' => true, - ]; - - static $potentialUnaryNonArrayOperators = [ - '+' => true, - '-' => true, - '&' => true, - ]; - - static $arrayOperators; - if (null === $arrayOperators) { - $arrayOperators = [ - T_AND_EQUAL => true, // &= - T_BOOLEAN_AND => true, // && - T_BOOLEAN_OR => true, // || - T_CONCAT_EQUAL => true, // .= - T_DIV_EQUAL => true, // /= - T_DOUBLE_ARROW => true, // => - T_IS_EQUAL => true, // == - T_IS_GREATER_OR_EQUAL => true, // >= - T_IS_IDENTICAL => true, // === - T_IS_NOT_EQUAL => true, // !=, <> - T_IS_NOT_IDENTICAL => true, // !== - T_IS_SMALLER_OR_EQUAL => true, // <= - T_LOGICAL_AND => true, // and - T_LOGICAL_OR => true, // or - T_LOGICAL_XOR => true, // xor - T_MINUS_EQUAL => true, // -= - T_MOD_EQUAL => true, // %= - T_MUL_EQUAL => true, // *= - T_OR_EQUAL => true, // |= - T_PLUS_EQUAL => true, // += - T_POW => true, // ** - T_POW_EQUAL => true, // **= - T_SL => true, // << - T_SL_EQUAL => true, // <<= - T_SR => true, // >> - T_SR_EQUAL => true, // >>= - T_XOR_EQUAL => true, // ^= - T_SPACESHIP => true, // <=> - T_COALESCE => true, // ?? - ]; - - // @TODO: drop condition when PHP 7.4+ is required - if (\defined('T_COALESCE_EQUAL')) { - $arrayOperators[T_COALESCE_EQUAL] = true; // ??= - } - } - - $tokens = $this->tokens; - $token = $tokens[$index]; - - if ($token->isArray()) { - return isset($arrayOperators[$token->getId()]); - } - - if (isset($nonArrayOperators[$token->getContent()])) { - return true; - } - - if (isset($potentialUnaryNonArrayOperators[$token->getContent()])) { - return !$this->isUnaryPredecessorOperator($index); - } - - return false; - } - - /** - * Check if `T_WHILE` token at given index is `do { ... } while ();` syntax - * and not `while () { ...}`. - */ - public function isWhilePartOfDoWhile(int $index): bool - { - $tokens = $this->tokens; - $token = $tokens[$index]; - - if (!$token->isGivenKind(T_WHILE)) { - throw new \LogicException(sprintf('No T_WHILE at given index %d, got "%s".', $index, $token->getName())); - } - - $endIndex = $tokens->getPrevMeaningfulToken($index); - if (!$tokens[$endIndex]->equals('}')) { - return false; - } - - $startIndex = $tokens->findBlockStart(Tokens::BLOCK_TYPE_CURLY_BRACE, $endIndex); - $beforeStartIndex = $tokens->getPrevMeaningfulToken($startIndex); - - return $tokens[$beforeStartIndex]->isGivenKind(T_DO); - } - - public function isSuperGlobal(int $index): bool - { - static $superNames = [ - '$_COOKIE' => true, - '$_ENV' => true, - '$_FILES' => true, - '$_GET' => true, - '$_POST' => true, - '$_REQUEST' => true, - '$_SERVER' => true, - '$_SESSION' => true, - '$GLOBALS' => true, - ]; - - $token = $this->tokens[$index]; - - if (!$token->isGivenKind(T_VARIABLE)) { - return false; - } - - return isset($superNames[strtoupper($token->getContent())]); - } - - /** - * Find classy elements. - * - * Searches in tokens from the classy (start) index till the end (index) of the classy. - * Returns an array; first value is the index until the method has analysed (int), second the found classy elements (array). - * - * @param int $classIndex classy index - */ - private function findClassyElements(int $classIndex, int $index): array - { - $elements = []; - $curlyBracesLevel = 0; - $bracesLevel = 0; - ++$index; // skip the classy index itself - - for ($count = \count($this->tokens); $index < $count; ++$index) { - $token = $this->tokens[$index]; - - if ($token->isGivenKind(T_ENCAPSED_AND_WHITESPACE)) { - continue; - } - - if ($token->isClassy()) { // anonymous class in class - // check for nested anonymous classes inside the new call of an anonymous class, - // for example `new class(function (){new class(function (){new class(function (){}){};}){};}){};` etc. - // if class(XYZ) {} skip till `(` as XYZ might contain functions etc. - - $nestedClassIndex = $index; - $index = $this->tokens->getNextMeaningfulToken($index); - - if ($this->tokens[$index]->equals('(')) { - ++$index; // move after `(` - - for ($nestedBracesLevel = 1; $index < $count; ++$index) { - $token = $this->tokens[$index]; - - if ($token->equals('(')) { - ++$nestedBracesLevel; - - continue; - } - - if ($token->equals(')')) { - --$nestedBracesLevel; - - if (0 === $nestedBracesLevel) { - [$index, $newElements] = $this->findClassyElements($nestedClassIndex, $index); - $elements += $newElements; - - break; - } - - continue; - } - - if ($token->isClassy()) { // anonymous class in class - [$index, $newElements] = $this->findClassyElements($index, $index); - $elements += $newElements; - } - } - } else { - [$index, $newElements] = $this->findClassyElements($nestedClassIndex, $nestedClassIndex); - $elements += $newElements; - } - - continue; - } - - if ($token->equals('(')) { - ++$bracesLevel; - - continue; - } - - if ($token->equals(')')) { - --$bracesLevel; - - continue; - } - - if ($token->equals('{')) { - ++$curlyBracesLevel; - - continue; - } - - if ($token->equals('}')) { - --$curlyBracesLevel; - - if (0 === $curlyBracesLevel) { - break; - } - - continue; - } - - if (1 !== $curlyBracesLevel || !$token->isArray()) { - continue; - } - - if (0 === $bracesLevel && $token->isGivenKind(T_VARIABLE)) { - $elements[$index] = [ - 'token' => $token, - 'type' => 'property', - 'classIndex' => $classIndex, - ]; - - continue; - } - - if ($token->isGivenKind(T_FUNCTION)) { - $elements[$index] = [ - 'token' => $token, - 'type' => 'method', - 'classIndex' => $classIndex, - ]; - } elseif ($token->isGivenKind(T_CONST)) { - $elements[$index] = [ - 'token' => $token, - 'type' => 'const', - 'classIndex' => $classIndex, - ]; - } elseif ($token->isGivenKind(CT::T_USE_TRAIT)) { - $elements[$index] = [ - 'token' => $token, - 'type' => 'trait_import', - 'classIndex' => $classIndex, - ]; - } - } - - return [$index, $elements]; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/ArrayTypehintTransformer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/ArrayTypehintTransformer.php deleted file mode 100644 index 69410f7..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/ArrayTypehintTransformer.php +++ /dev/null @@ -1,63 +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\Tokenizer\Transformer; - -use PhpCsFixer\Tokenizer\AbstractTransformer; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Transform `array` typehint from T_ARRAY into CT::T_ARRAY_TYPEHINT. - * - * @author Dariusz Rumiński - * - * @internal - */ -final class ArrayTypehintTransformer extends AbstractTransformer -{ - /** - * {@inheritdoc} - */ - public function getRequiredPhpVersionId(): int - { - return 50000; - } - - /** - * {@inheritdoc} - */ - public function process(Tokens $tokens, Token $token, int $index): void - { - if (!$token->isGivenKind(T_ARRAY)) { - return; - } - - $nextIndex = $tokens->getNextMeaningfulToken($index); - $nextToken = $tokens[$nextIndex]; - - if (!$nextToken->equals('(')) { - $tokens[$index] = new Token([CT::T_ARRAY_TYPEHINT, $token->getContent()]); - } - } - - /** - * {@inheritdoc} - */ - public function getCustomTokens(): array - { - return [CT::T_ARRAY_TYPEHINT]; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/AttributeTransformer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/AttributeTransformer.php deleted file mode 100644 index c099f88..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/AttributeTransformer.php +++ /dev/null @@ -1,79 +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\Tokenizer\Transformer; - -use PhpCsFixer\Tokenizer\AbstractTransformer; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Transforms attribute related Tokens. - * - * @internal - */ -final class AttributeTransformer extends AbstractTransformer -{ - /** - * {@inheritdoc} - */ - public function getPriority(): int - { - // must run before all other transformers that might touch attributes - return 200; - } - - /** - * {@inheritdoc} - */ - public function getRequiredPhpVersionId(): int - { - return 80000; - } - - /** - * {@inheritdoc} - */ - public function process(Tokens $tokens, Token $token, int $index): void - { - if (!$tokens[$index]->isGivenKind(T_ATTRIBUTE)) { - return; - } - - $level = 1; - - do { - ++$index; - - if ($tokens[$index]->equals('[')) { - ++$level; - } elseif ($tokens[$index]->equals(']')) { - --$level; - } - } while (0 < $level); - - $tokens[$index] = new Token([CT::T_ATTRIBUTE_CLOSE, ']']); - } - - /** - * {@inheritdoc} - */ - public function getCustomTokens(): array - { - return [ - CT::T_ATTRIBUTE_CLOSE, - ]; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/BraceClassInstantiationTransformer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/BraceClassInstantiationTransformer.php deleted file mode 100644 index 00be8d7..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/BraceClassInstantiationTransformer.php +++ /dev/null @@ -1,90 +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\Tokenizer\Transformer; - -use PhpCsFixer\Tokenizer\AbstractTransformer; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Transform braced class instantiation braces in `(new Foo())` into CT::T_BRACE_CLASS_INSTANTIATION_OPEN - * and CT::T_BRACE_CLASS_INSTANTIATION_CLOSE. - * - * @author Sebastiaans Stok - * - * @internal - */ -final class BraceClassInstantiationTransformer extends AbstractTransformer -{ - /** - * {@inheritdoc} - */ - public function getPriority(): int - { - // must run after CurlyBraceTransformer and SquareBraceTransformer - return -2; - } - - /** - * {@inheritdoc} - */ - public function getRequiredPhpVersionId(): int - { - return 50000; - } - - /** - * {@inheritdoc} - */ - public function process(Tokens $tokens, Token $token, int $index): void - { - if (!$tokens[$index]->equals('(') || !$tokens[$tokens->getNextMeaningfulToken($index)]->equals([T_NEW])) { - return; - } - - if ($tokens[$tokens->getPrevMeaningfulToken($index)]->equalsAny([ - ']', - [CT::T_ARRAY_INDEX_CURLY_BRACE_CLOSE], - [CT::T_ARRAY_SQUARE_BRACE_CLOSE], - [T_ARRAY], - [T_CLASS], - [T_ELSEIF], - [T_FOR], - [T_FOREACH], - [T_IF], - [T_STATIC], - [T_STRING], - [T_SWITCH], - [T_VARIABLE], - [T_WHILE], - ])) { - return; - } - - $closeIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $index); - - $tokens[$index] = new Token([CT::T_BRACE_CLASS_INSTANTIATION_OPEN, '(']); - $tokens[$closeIndex] = new Token([CT::T_BRACE_CLASS_INSTANTIATION_CLOSE, ')']); - } - - /** - * {@inheritdoc} - */ - public function getCustomTokens(): array - { - return [CT::T_BRACE_CLASS_INSTANTIATION_OPEN, CT::T_BRACE_CLASS_INSTANTIATION_CLOSE]; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/ClassConstantTransformer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/ClassConstantTransformer.php deleted file mode 100644 index 5a60092..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/ClassConstantTransformer.php +++ /dev/null @@ -1,66 +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\Tokenizer\Transformer; - -use PhpCsFixer\Tokenizer\AbstractTransformer; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Transform `class` class' constant from T_CLASS into CT::T_CLASS_CONSTANT. - * - * @author Dariusz Rumiński - * - * @internal - */ -final class ClassConstantTransformer extends AbstractTransformer -{ - /** - * {@inheritdoc} - */ - public function getRequiredPhpVersionId(): int - { - return 50500; - } - - /** - * {@inheritdoc} - */ - public function process(Tokens $tokens, Token $token, int $index): void - { - if (!$token->equalsAny([ - [T_CLASS, 'class'], - [T_STRING, 'class'], - ], false)) { - return; - } - - $prevIndex = $tokens->getPrevMeaningfulToken($index); - $prevToken = $tokens[$prevIndex]; - - if ($prevToken->isGivenKind(T_DOUBLE_COLON)) { - $tokens[$index] = new Token([CT::T_CLASS_CONSTANT, $token->getContent()]); - } - } - - /** - * {@inheritdoc} - */ - public function getCustomTokens(): array - { - return [CT::T_CLASS_CONSTANT]; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/ConstructorPromotionTransformer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/ConstructorPromotionTransformer.php deleted file mode 100644 index aa3d495..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/ConstructorPromotionTransformer.php +++ /dev/null @@ -1,80 +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\Tokenizer\Transformer; - -use PhpCsFixer\Tokenizer\AbstractTransformer; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Transforms for Constructor Property Promotion. - * - * Transform T_PUBLIC, T_PROTECTED and T_PRIVATE of Constructor Property Promotion into custom tokens. - * - * @internal - */ -final class ConstructorPromotionTransformer extends AbstractTransformer -{ - /** - * {@inheritdoc} - */ - public function getRequiredPhpVersionId(): int - { - return 80000; - } - - /** - * {@inheritdoc} - */ - public function process(Tokens $tokens, Token $token, int $index): void - { - if (!$tokens[$index]->isGivenKind(T_FUNCTION)) { - return; - } - - $index = $tokens->getNextMeaningfulToken($index); - - if (!$tokens[$index]->isGivenKind(T_STRING) || '__construct' !== strtolower($tokens[$index]->getContent())) { - return; - } - - /** @var int $openIndex */ - $openIndex = $tokens->getNextMeaningfulToken($index); // we are @ '(' now - $closeIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $openIndex); - - for ($index = $openIndex; $index < $closeIndex; ++$index) { - if ($tokens[$index]->isGivenKind(T_PUBLIC)) { - $tokens[$index] = new Token([CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PUBLIC, $tokens[$index]->getContent()]); - } elseif ($tokens[$index]->isGivenKind(T_PROTECTED)) { - $tokens[$index] = new Token([CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PROTECTED, $tokens[$index]->getContent()]); - } elseif ($tokens[$index]->isGivenKind(T_PRIVATE)) { - $tokens[$index] = new Token([CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PRIVATE, $tokens[$index]->getContent()]); - } - } - } - - /** - * {@inheritdoc} - */ - public function getCustomTokens(): array - { - return [ - CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PUBLIC, - CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PROTECTED, - CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PRIVATE, - ]; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/CurlyBraceTransformer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/CurlyBraceTransformer.php deleted file mode 100644 index abc4429..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/CurlyBraceTransformer.php +++ /dev/null @@ -1,263 +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\Tokenizer\Transformer; - -use PhpCsFixer\Tokenizer\AbstractTransformer; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Transform discriminate overloaded curly braces tokens. - * - * Performed transformations: - * - closing `}` for T_CURLY_OPEN into CT::T_CURLY_CLOSE, - * - closing `}` for T_DOLLAR_OPEN_CURLY_BRACES into CT::T_DOLLAR_CLOSE_CURLY_BRACES, - * - 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. - * - * @author Dariusz Rumiński - * - * @internal - */ -final class CurlyBraceTransformer extends AbstractTransformer -{ - /** - * {@inheritdoc} - */ - public function getRequiredPhpVersionId(): int - { - return 50000; - } - - /** - * {@inheritdoc} - */ - 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); - - if (\PHP_VERSION_ID >= 70000) { - $this->transformIntoGroupUseBraces($tokens, $token, $index); - } - } - - /** - * {@inheritdoc} - */ - public function getCustomTokens(): array - { - return [ - CT::T_CURLY_CLOSE, - CT::T_DOLLAR_CLOSE_CURLY_BRACES, - CT::T_DYNAMIC_PROP_BRACE_OPEN, - CT::T_DYNAMIC_PROP_BRACE_CLOSE, - CT::T_DYNAMIC_VAR_BRACE_OPEN, - CT::T_DYNAMIC_VAR_BRACE_CLOSE, - CT::T_ARRAY_INDEX_CURLY_BRACE_OPEN, - CT::T_ARRAY_INDEX_CURLY_BRACE_CLOSE, - CT::T_GROUP_IMPORT_BRACE_OPEN, - CT::T_GROUP_IMPORT_BRACE_CLOSE, - ]; - } - - /** - * Transform closing `}` for T_CURLY_OPEN into CT::T_CURLY_CLOSE. - * - * This should be done at very beginning of curly braces transformations. - */ - private function transformIntoCurlyCloseBrace(Tokens $tokens, Token $token, int $index): void - { - if (!$token->isGivenKind(T_CURLY_OPEN)) { - return; - } - - $level = 1; - $nestIndex = $index; - - while (0 < $level) { - ++$nestIndex; - - // we count all kind of { - if ($tokens[$nestIndex]->equals('{')) { - ++$level; - - continue; - } - - // we count all kind of } - if ($tokens[$nestIndex]->equals('}')) { - --$level; - } - } - - $tokens[$nestIndex] = new Token([CT::T_CURLY_CLOSE, '}']); - } - - private function transformIntoDollarCloseBrace(Tokens $tokens, Token $token, int $index): void - { - 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 - { - if (!$token->isObjectOperator()) { - return; - } - - if (!$tokens[$index + 1]->equals('{')) { - return; - } - - $openIndex = $index + 1; - $closeIndex = $this->naivelyFindCurlyBlockEnd($tokens, $openIndex); - - $tokens[$openIndex] = new Token([CT::T_DYNAMIC_PROP_BRACE_OPEN, '{']); - $tokens[$closeIndex] = new Token([CT::T_DYNAMIC_PROP_BRACE_CLOSE, '}']); - } - - private function transformIntoDynamicVarBraces(Tokens $tokens, Token $token, int $index): void - { - if (!$token->equals('$')) { - return; - } - - $openIndex = $tokens->getNextMeaningfulToken($index); - - if (null === $openIndex) { - return; - } - - $openToken = $tokens[$openIndex]; - - if (!$openToken->equals('{')) { - return; - } - - $closeIndex = $this->naivelyFindCurlyBlockEnd($tokens, $openIndex); - - $tokens[$openIndex] = new Token([CT::T_DYNAMIC_VAR_BRACE_OPEN, '{']); - $tokens[$closeIndex] = new Token([CT::T_DYNAMIC_VAR_BRACE_CLOSE, '}']); - } - - private function transformIntoCurlyIndexBraces(Tokens $tokens, Token $token, int $index): void - { - if (!$token->equals('{')) { - return; - } - - $prevIndex = $tokens->getPrevMeaningfulToken($index); - - if (!$tokens[$prevIndex]->equalsAny([ - [T_STRING], - [T_VARIABLE], - [CT::T_ARRAY_INDEX_CURLY_BRACE_CLOSE], - ']', - ')', - ])) { - return; - } - - if ( - $tokens[$prevIndex]->isGivenKind(T_STRING) - && !$tokens[$tokens->getPrevMeaningfulToken($prevIndex)]->isObjectOperator() - ) { - return; - } - - if ( - $tokens[$prevIndex]->equals(')') - && !$tokens[$tokens->getPrevMeaningfulToken( - $tokens->findBlockStart(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $prevIndex) - )]->isGivenKind(T_ARRAY) - ) { - return; - } - - $closeIndex = $this->naivelyFindCurlyBlockEnd($tokens, $index); - - $tokens[$index] = new Token([CT::T_ARRAY_INDEX_CURLY_BRACE_OPEN, '{']); - $tokens[$closeIndex] = new Token([CT::T_ARRAY_INDEX_CURLY_BRACE_CLOSE, '}']); - } - - private function transformIntoGroupUseBraces(Tokens $tokens, Token $token, int $index): void - { - if (!$token->equals('{')) { - return; - } - - $prevIndex = $tokens->getPrevMeaningfulToken($index); - - if (!$tokens[$prevIndex]->isGivenKind(T_NS_SEPARATOR)) { - return; - } - - $closeIndex = $this->naivelyFindCurlyBlockEnd($tokens, $index); - - $tokens[$index] = new Token([CT::T_GROUP_IMPORT_BRACE_OPEN, '{']); - $tokens[$closeIndex] = new Token([CT::T_GROUP_IMPORT_BRACE_CLOSE, '}']); - } - - /** - * We do not want to rely on `$tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $index)` here, - * as it relies on block types that are assuming that `}` tokens are already transformed to Custom Tokens that are allowing to distinguish different block types. - * As we are just about to transform `{` and `}` into Custom Tokens by this transformer, thus we need to compare those tokens manually by content without using `Tokens::findBlockEnd`. - */ - private function naivelyFindCurlyBlockEnd(Tokens $tokens, int $startIndex): int - { - if (!$tokens->offsetExists($startIndex)) { - throw new \OutOfBoundsException(sprintf('Unavailable index: "%s".', $startIndex)); - } - - if ('{' !== $tokens[$startIndex]->getContent()) { - throw new \InvalidArgumentException(sprintf('Wrong start index: "%s".', $startIndex)); - } - - $blockLevel = 1; - $endIndex = $tokens->count() - 1; - for ($index = $startIndex + 1; $index !== $endIndex; ++$index) { - $token = $tokens[$index]; - - if ('{' === $token->getContent()) { - ++$blockLevel; - - continue; - } - - if ('}' === $token->getContent()) { - --$blockLevel; - - 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())); - } - - return $index; - } - } - } - - throw new \UnexpectedValueException(sprintf('Missing block end for index: "%s".', $startIndex)); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/ImportTransformer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/ImportTransformer.php deleted file mode 100644 index fc64f6f..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/ImportTransformer.php +++ /dev/null @@ -1,69 +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\Tokenizer\Transformer; - -use PhpCsFixer\Tokenizer\AbstractTransformer; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Transform const/function import tokens. - * - * Performed transformations: - * - T_CONST into CT::T_CONST_IMPORT - * - T_FUNCTION into CT::T_FUNCTION_IMPORT - * - * @author Gregor Harlan - * - * @internal - */ -final class ImportTransformer extends AbstractTransformer -{ - /** - * {@inheritdoc} - */ - public function getRequiredPhpVersionId(): int - { - return 50600; - } - - /** - * {@inheritdoc} - */ - public function process(Tokens $tokens, Token $token, int $index): void - { - if (!$token->isGivenKind([T_CONST, T_FUNCTION])) { - return; - } - - $prevToken = $tokens[$tokens->getPrevMeaningfulToken($index)]; - - if ($prevToken->isGivenKind(T_USE)) { - $tokens[$index] = new Token([ - $token->isGivenKind(T_FUNCTION) ? CT::T_FUNCTION_IMPORT : CT::T_CONST_IMPORT, - $token->getContent(), - ]); - } - } - - /** - * {@inheritdoc} - */ - public function getCustomTokens(): array - { - return [CT::T_CONST_IMPORT, CT::T_FUNCTION_IMPORT]; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/NameQualifiedTransformer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/NameQualifiedTransformer.php deleted file mode 100644 index fc8e1dc..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/NameQualifiedTransformer.php +++ /dev/null @@ -1,103 +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\Tokenizer\Transformer; - -use PhpCsFixer\Tokenizer\AbstractTransformer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Transform NAME_QUALIFIED, T_NAME_FULLY_QUALIFIED and T_NAME_RELATIVE into T_NAMESPACE T_NS_SEPARATOR T_STRING. - * - * @author SpacePossum - * - * @internal - */ -final class NameQualifiedTransformer extends AbstractTransformer -{ - /** - * {@inheritdoc} - */ - public function getPriority(): int - { - return 1; // must run before NamespaceOperatorTransformer - } - - /** - * {@inheritdoc} - */ - public function getRequiredPhpVersionId(): int - { - return 80000; - } - - /** - * {@inheritdoc} - */ - public function process(Tokens $tokens, Token $token, int $index): void - { - if ($token->isGivenKind([T_NAME_QUALIFIED, T_NAME_FULLY_QUALIFIED])) { - $this->transformQualified($tokens, $token, $index); - } elseif ($token->isGivenKind(T_NAME_RELATIVE)) { - $this->transformRelative($tokens, $token, $index); - } - } - - /** - * {@inheritdoc} - */ - public function getCustomTokens(): array - { - return []; - } - - 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); - - $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); - - $tokens->overrideRange($index, $index, $newTokens); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/NamedArgumentTransformer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/NamedArgumentTransformer.php deleted file mode 100644 index cddb29c..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/NamedArgumentTransformer.php +++ /dev/null @@ -1,87 +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\Tokenizer\Transformer; - -use PhpCsFixer\Tokenizer\AbstractTransformer; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Transform named argument tokens. - * - * @author SpacePossum - * - * @internal - */ -final class NamedArgumentTransformer extends AbstractTransformer -{ - /** - * {@inheritdoc} - */ - public function getPriority(): int - { - // needs to run after TypeColonTransformer - return -15; - } - - /** - * {@inheritdoc} - */ - public function getRequiredPhpVersionId(): int - { - return 80000; - } - - /** - * {@inheritdoc} - */ - public function process(Tokens $tokens, Token $token, int $index): void - { - if (!$tokens[$index]->equals(':')) { - return; - } - - $stringIndex = $tokens->getPrevMeaningfulToken($index); - - if (!$tokens[$stringIndex]->isGivenKind(T_STRING)) { - return; - } - - $preStringIndex = $tokens->getPrevMeaningfulToken($stringIndex); - - // if equals any [';', '{', '}', [T_OPEN_TAG]] than it is a goto label - // if equals ')' than likely it is a type colon, but sure not a name argument - // if equals '?' than it is part of ternary statement - - if (!$tokens[$preStringIndex]->equalsAny([',', '('])) { - return; - } - - $tokens[$stringIndex] = new Token([CT::T_NAMED_ARGUMENT_NAME, $tokens[$stringIndex]->getContent()]); - $tokens[$index] = new Token([CT::T_NAMED_ARGUMENT_COLON, ':']); - } - - /** - * {@inheritdoc} - */ - public function getCustomTokens(): array - { - return [ - CT::T_NAMED_ARGUMENT_COLON, - CT::T_NAMED_ARGUMENT_NAME, - ]; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/NamespaceOperatorTransformer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/NamespaceOperatorTransformer.php deleted file mode 100644 index fc740e2..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/NamespaceOperatorTransformer.php +++ /dev/null @@ -1,62 +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\Tokenizer\Transformer; - -use PhpCsFixer\Tokenizer\AbstractTransformer; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Transform `namespace` operator from T_NAMESPACE into CT::T_NAMESPACE_OPERATOR. - * - * @author Gregor Harlan - * - * @internal - */ -final class NamespaceOperatorTransformer extends AbstractTransformer -{ - /** - * {@inheritdoc} - */ - public function getRequiredPhpVersionId(): int - { - return 50300; - } - - /** - * {@inheritdoc} - */ - public function process(Tokens $tokens, Token $token, int $index): void - { - if (!$token->isGivenKind(T_NAMESPACE)) { - return; - } - - $nextIndex = $tokens->getNextMeaningfulToken($index); - - if ($tokens[$nextIndex]->isGivenKind(T_NS_SEPARATOR)) { - $tokens[$index] = new Token([CT::T_NAMESPACE_OPERATOR, $token->getContent()]); - } - } - - /** - * {@inheritdoc} - */ - public function getCustomTokens(): array - { - return [CT::T_NAMESPACE_OPERATOR]; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/NullableTypeTransformer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/NullableTypeTransformer.php deleted file mode 100644 index 0a7cc7f..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/NullableTypeTransformer.php +++ /dev/null @@ -1,85 +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\Tokenizer\Transformer; - -use PhpCsFixer\Tokenizer\AbstractTransformer; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Transform `?` operator into CT::T_NULLABLE_TYPE in `function foo(?Bar $b) {}`. - * - * @author Dariusz Rumiński - * - * @internal - */ -final class NullableTypeTransformer extends AbstractTransformer -{ - /** - * {@inheritdoc} - */ - public function getPriority(): int - { - // needs to run after TypeColonTransformer - return -20; - } - - /** - * {@inheritdoc} - */ - public function getRequiredPhpVersionId(): int - { - return 70100; - } - - /** - * {@inheritdoc} - */ - public function process(Tokens $tokens, Token $token, int $index): void - { - if (!$token->equals('?')) { - return; - } - - $prevIndex = $tokens->getPrevMeaningfulToken($index); - $prevToken = $tokens[$prevIndex]; - - if ($prevToken->equalsAny([ - '(', - ',', - [CT::T_TYPE_COLON], - [CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PUBLIC], - [CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PROTECTED], - [CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PRIVATE], - [CT::T_ATTRIBUTE_CLOSE], - [T_PRIVATE], - [T_PROTECTED], - [T_PUBLIC], - [T_VAR], - [T_STATIC], - ])) { - $tokens[$index] = new Token([CT::T_NULLABLE_TYPE, '?']); - } - } - - /** - * {@inheritdoc} - */ - public function getCustomTokens(): array - { - return [CT::T_NULLABLE_TYPE]; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/ReturnRefTransformer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/ReturnRefTransformer.php deleted file mode 100644 index dfba409..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/ReturnRefTransformer.php +++ /dev/null @@ -1,64 +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\Tokenizer\Transformer; - -use PhpCsFixer\Tokenizer\AbstractTransformer; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Transform `&` operator into CT::T_RETURN_REF in `function & foo() {}`. - * - * @author Dariusz Rumiński - * - * @internal - */ -final class ReturnRefTransformer extends AbstractTransformer -{ - /** - * {@inheritdoc} - */ - public function getRequiredPhpVersionId(): int - { - return 50000; - } - - /** - * {@inheritdoc} - */ - public function process(Tokens $tokens, Token $token, int $index): void - { - $prevKinds = [T_FUNCTION]; - if (\PHP_VERSION_ID >= 70400) { - $prevKinds[] = T_FN; - } - - if ( - $token->equals('&') - && $tokens[$tokens->getPrevMeaningfulToken($index)]->isGivenKind($prevKinds) - ) { - $tokens[$index] = new Token([CT::T_RETURN_REF, '&']); - } - } - - /** - * {@inheritdoc} - */ - public function getCustomTokens(): array - { - return [CT::T_RETURN_REF]; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/SquareBraceTransformer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/SquareBraceTransformer.php deleted file mode 100644 index 26982ae..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/SquareBraceTransformer.php +++ /dev/null @@ -1,183 +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\Tokenizer\Transformer; - -use PhpCsFixer\Tokenizer\AbstractTransformer; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Transform discriminate overloaded square braces tokens. - * - * Performed transformations: - * - in `[1, 2, 3]` into CT::T_ARRAY_SQUARE_BRACE_OPEN and CT::T_ARRAY_SQUARE_BRACE_CLOSE, - * - in `[$a, &$b, [$c]] = array(1, 2, array(3))` into CT::T_DESTRUCTURING_SQUARE_BRACE_OPEN and CT::T_DESTRUCTURING_SQUARE_BRACE_CLOSE. - * - * @author Dariusz Rumiński - * @author SpacePossum - * - * @internal - */ -final class SquareBraceTransformer extends AbstractTransformer -{ - /** - * {@inheritdoc} - */ - public function getPriority(): int - { - // must run after CurlyBraceTransformer and AttributeTransformer - return -1; - } - - /** - * {@inheritdoc} - */ - public function getRequiredPhpVersionId(): int - { - // Short array syntax was introduced in PHP 5.4, but the fixer is smart - // enough to handle it even before 5.4. - // Same for array destructing syntax sugar `[` introduced in PHP 7.1. - return 50000; - } - - /** - * {@inheritdoc} - */ - public function process(Tokens $tokens, Token $token, int $index): void - { - if ($this->isArrayDestructing($tokens, $index)) { - $this->transformIntoDestructuringSquareBrace($tokens, $index); - - return; - } - - if ($this->isShortArray($tokens, $index)) { - $this->transformIntoArraySquareBrace($tokens, $index); - } - } - - /** - * {@inheritdoc} - */ - public function getCustomTokens(): array - { - return [ - CT::T_ARRAY_SQUARE_BRACE_OPEN, - CT::T_ARRAY_SQUARE_BRACE_CLOSE, - CT::T_DESTRUCTURING_SQUARE_BRACE_OPEN, - CT::T_DESTRUCTURING_SQUARE_BRACE_CLOSE, - ]; - } - - private function transformIntoArraySquareBrace(Tokens $tokens, int $index): void - { - $endIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_INDEX_SQUARE_BRACE, $index); - - $tokens[$index] = new Token([CT::T_ARRAY_SQUARE_BRACE_OPEN, '[']); - $tokens[$endIndex] = new Token([CT::T_ARRAY_SQUARE_BRACE_CLOSE, ']']); - } - - private function transformIntoDestructuringSquareBrace(Tokens $tokens, int $index): void - { - $endIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_INDEX_SQUARE_BRACE, $index); - - $tokens[$index] = new Token([CT::T_DESTRUCTURING_SQUARE_BRACE_OPEN, '[']); - $tokens[$endIndex] = new Token([CT::T_DESTRUCTURING_SQUARE_BRACE_CLOSE, ']']); - - $previousMeaningfulIndex = $index; - $index = $tokens->getNextMeaningfulToken($index); - - while ($index < $endIndex) { - if ($tokens[$index]->equals('[') && $tokens[$previousMeaningfulIndex]->equalsAny([[CT::T_DESTRUCTURING_SQUARE_BRACE_OPEN], ','])) { - $tokens[$tokens->findBlockEnd(Tokens::BLOCK_TYPE_INDEX_SQUARE_BRACE, $index)] = new Token([CT::T_DESTRUCTURING_SQUARE_BRACE_CLOSE, ']']); - $tokens[$index] = new Token([CT::T_DESTRUCTURING_SQUARE_BRACE_OPEN, '[']); - } - - $previousMeaningfulIndex = $index; - $index = $tokens->getNextMeaningfulToken($index); - } - } - - /** - * Check if token under given index is short array opening. - */ - private function isShortArray(Tokens $tokens, int $index): bool - { - if (!$tokens[$index]->equals('[')) { - return false; - } - - static $disallowedPrevTokens = [ - ')', - ']', - '}', - '"', - [T_CONSTANT_ENCAPSED_STRING], - [T_STRING], - [T_STRING_VARNAME], - [T_VARIABLE], - [CT::T_ARRAY_SQUARE_BRACE_CLOSE], - [CT::T_DYNAMIC_PROP_BRACE_CLOSE], - [CT::T_DYNAMIC_VAR_BRACE_CLOSE], - [CT::T_ARRAY_INDEX_CURLY_BRACE_CLOSE], - ]; - - $prevToken = $tokens[$tokens->getPrevMeaningfulToken($index)]; - if ($prevToken->equalsAny($disallowedPrevTokens)) { - return false; - } - - $nextToken = $tokens[$tokens->getNextMeaningfulToken($index)]; - if ($nextToken->equals(']')) { - return true; - } - - return !$this->isArrayDestructing($tokens, $index); - } - - private function isArrayDestructing(Tokens $tokens, int $index): bool - { - if (\PHP_VERSION_ID < 70100 || !$tokens[$index]->equals('[')) { - return false; - } - - static $disallowedPrevTokens = [ - ')', - ']', - '"', - [T_CONSTANT_ENCAPSED_STRING], - [T_STRING], - [T_STRING_VARNAME], - [T_VARIABLE], - [CT::T_ARRAY_SQUARE_BRACE_CLOSE], - [CT::T_DYNAMIC_PROP_BRACE_CLOSE], - [CT::T_DYNAMIC_VAR_BRACE_CLOSE], - [CT::T_ARRAY_INDEX_CURLY_BRACE_CLOSE], - ]; - - $prevToken = $tokens[$tokens->getPrevMeaningfulToken($index)]; - if ($prevToken->equalsAny($disallowedPrevTokens)) { - return false; - } - - $type = Tokens::detectBlockType($tokens[$index]); - $end = $tokens->findBlockEnd($type['type'], $index); - - $nextToken = $tokens[$tokens->getNextMeaningfulToken($end)]; - - return $nextToken->equals('='); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/TypeAlternationTransformer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/TypeAlternationTransformer.php deleted file mode 100644 index 9ebf917..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/TypeAlternationTransformer.php +++ /dev/null @@ -1,119 +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\Tokenizer\Transformer; - -use PhpCsFixer\Tokenizer\AbstractTransformer; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Transform `|` operator into CT::T_TYPE_ALTERNATION in `function foo(Type1 | Type2 $x) {` - * or `} catch (ExceptionType1 | ExceptionType2 $e) {`. - * - * @author Dariusz Rumiński - * - * @internal - */ -final class TypeAlternationTransformer extends AbstractTransformer -{ - /** - * {@inheritdoc} - */ - public function getPriority(): int - { - // needs to run after ArrayTypehintTransformer and TypeColonTransformer - return -15; - } - - /** - * {@inheritdoc} - */ - public function getRequiredPhpVersionId(): int - { - return 70100; - } - - /** - * {@inheritdoc} - */ - public function process(Tokens $tokens, Token $token, int $index): void - { - if (!$token->equals('|')) { - return; - } - - $prevIndex = $tokens->getTokenNotOfKindsSibling($index, -1, [T_CALLABLE, T_NS_SEPARATOR, T_STRING, CT::T_ARRAY_TYPEHINT, T_WHITESPACE, T_COMMENT, T_DOC_COMMENT]); - - /** @var Token $prevToken */ - $prevToken = $tokens[$prevIndex]; - - if ($prevToken->isGivenKind([ - CT::T_TYPE_COLON, // `:` is part of a function return type `foo(): X|Y` - CT::T_TYPE_ALTERNATION, // `|` is part of a union (chain) `X|Y` - T_STATIC, T_VAR, T_PUBLIC, T_PROTECTED, T_PRIVATE, // `var X|Y $a;`, `private X|Y $a` or `public static X|Y $a` - ])) { - $this->replaceToken($tokens, $index); - - return; - } - - if (!$prevToken->equalsAny(['(', ','])) { - return; - } - - $prevPrevTokenIndex = $tokens->getPrevMeaningfulToken($prevIndex); - - if ($tokens[$prevPrevTokenIndex]->isGivenKind([T_CATCH])) { - $this->replaceToken($tokens, $index); - - return; - } - - $functionKinds = [[T_FUNCTION]]; - - if (\defined('T_FN')) { - $functionKinds[] = [T_FN]; - } - - $functionIndex = $tokens->getPrevTokenOfKind($prevIndex, $functionKinds); - - if (null === $functionIndex) { - return; - } - - $braceOpenIndex = $tokens->getNextTokenOfKind($functionIndex, ['(']); - $braceCloseIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $braceOpenIndex); - - if ($braceCloseIndex < $index) { - return; - } - - $this->replaceToken($tokens, $index); - } - - /** - * {@inheritdoc} - */ - public function getCustomTokens(): array - { - return [CT::T_TYPE_ALTERNATION]; - } - - private function replaceToken(Tokens $tokens, int $index): void - { - $tokens[$index] = new Token([CT::T_TYPE_ALTERNATION, '|']); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/TypeColonTransformer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/TypeColonTransformer.php deleted file mode 100644 index 229384d..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/TypeColonTransformer.php +++ /dev/null @@ -1,92 +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\Tokenizer\Transformer; - -use PhpCsFixer\Tokenizer\AbstractTransformer; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Transform `:` operator into CT::T_TYPE_COLON in `function foo() : int {}`. - * - * @author Dariusz Rumiński - * - * @internal - */ -final class TypeColonTransformer extends AbstractTransformer -{ - /** - * {@inheritdoc} - */ - public function getPriority(): int - { - // needs to run after ReturnRefTransformer and UseTransformer - // and before TypeAlternationTransformer - return -10; - } - - /** - * {@inheritdoc} - */ - public function getRequiredPhpVersionId(): int - { - return 70000; - } - - /** - * {@inheritdoc} - */ - public function process(Tokens $tokens, Token $token, int $index): void - { - if (!$token->equals(':')) { - return; - } - - $endIndex = $tokens->getPrevMeaningfulToken($index); - - if (!$tokens[$endIndex]->equals(')')) { - return; - } - - $startIndex = $tokens->findBlockStart(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $endIndex); - $prevIndex = $tokens->getPrevMeaningfulToken($startIndex); - $prevToken = $tokens[$prevIndex]; - - // if this could be a function name we need to take one more step - if ($prevToken->isGivenKind(T_STRING)) { - $prevIndex = $tokens->getPrevMeaningfulToken($prevIndex); - $prevToken = $tokens[$prevIndex]; - } - - $prevKinds = [T_FUNCTION, CT::T_RETURN_REF, CT::T_USE_LAMBDA]; - - if (\PHP_VERSION_ID >= 70400) { - $prevKinds[] = T_FN; - } - - if ($prevToken->isGivenKind($prevKinds)) { - $tokens[$index] = new Token([CT::T_TYPE_COLON, ':']); - } - } - - /** - * {@inheritdoc} - */ - public function getCustomTokens(): array - { - return [CT::T_TYPE_COLON]; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/UseTransformer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/UseTransformer.php deleted file mode 100644 index b5d69c7..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/UseTransformer.php +++ /dev/null @@ -1,108 +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\Tokenizer\Transformer; - -use PhpCsFixer\Tokenizer\AbstractTransformer; -use PhpCsFixer\Tokenizer\CT; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Transform T_USE into: - * - CT::T_USE_TRAIT for imports, - * - CT::T_USE_LAMBDA for lambda variable uses. - * - * @author Dariusz Rumiński - * - * @internal - */ -final class UseTransformer extends AbstractTransformer -{ - /** - * {@inheritdoc} - */ - public function getPriority(): int - { - // Should run after CurlyBraceTransformer and before TypeColonTransformer - return -5; - } - - /** - * {@inheritdoc} - */ - public function getRequiredPhpVersionId(): int - { - return 50300; - } - - /** - * {@inheritdoc} - */ - public function process(Tokens $tokens, Token $token, int $index): void - { - if ($token->isGivenKind(T_USE) && $this->isUseForLambda($tokens, $index)) { - $tokens[$index] = new Token([CT::T_USE_LAMBDA, $token->getContent()]); - - return; - } - - // Only search inside class/trait body for `T_USE` for traits. - // Cannot import traits inside interfaces or anywhere else - - if (!$token->isGivenKind([T_CLASS, T_TRAIT])) { - return; - } - - if ($tokens[$tokens->getPrevMeaningfulToken($index)]->isGivenKind(T_DOUBLE_COLON)) { - return; - } - - $index = $tokens->getNextTokenOfKind($index, ['{']); - $innerLimit = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $index); - - while ($index < $innerLimit) { - $token = $tokens[++$index]; - - if (!$token->isGivenKind(T_USE)) { - continue; - } - - if ($this->isUseForLambda($tokens, $index)) { - $tokens[$index] = new Token([CT::T_USE_LAMBDA, $token->getContent()]); - } else { - $tokens[$index] = new Token([CT::T_USE_TRAIT, $token->getContent()]); - } - } - } - - /** - * {@inheritdoc} - */ - public function getCustomTokens(): array - { - return [CT::T_USE_TRAIT, CT::T_USE_LAMBDA]; - } - - /** - * Check if token under given index is `use` statement for lambda function. - */ - private function isUseForLambda(Tokens $tokens, int $index): bool - { - $nextToken = $tokens[$tokens->getNextMeaningfulToken($index)]; - - // test `function () use ($foo) {}` case - return $nextToken->equals('('); - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/WhitespacyCommentTransformer.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/WhitespacyCommentTransformer.php deleted file mode 100644 index bf81faa..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/WhitespacyCommentTransformer.php +++ /dev/null @@ -1,73 +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\Tokenizer\Transformer; - -use PhpCsFixer\Tokenizer\AbstractTransformer; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; - -/** - * Move trailing whitespaces from comments and docs into following T_WHITESPACE token. - * - * @author Dariusz Rumiński - * - * @internal - */ -final class WhitespacyCommentTransformer extends AbstractTransformer -{ - /** - * {@inheritdoc} - */ - public function getRequiredPhpVersionId(): int - { - return 50000; - } - - /** - * {@inheritdoc} - */ - public function process(Tokens $tokens, Token $token, int $index): void - { - if (!$token->isComment()) { - return; - } - - $content = $token->getContent(); - $trimmedContent = rtrim($content); - - // nothing trimmed, nothing to do - if ($content === $trimmedContent) { - return; - } - - $whitespaces = substr($content, \strlen($trimmedContent)); - - $tokens[$index] = new Token([$token->getId(), $trimmedContent]); - - if (isset($tokens[$index + 1]) && $tokens[$index + 1]->isWhitespace()) { - $tokens[$index + 1] = new Token([T_WHITESPACE, $whitespaces.$tokens[$index + 1]->getContent()]); - } else { - $tokens->insertAt($index + 1, new Token([T_WHITESPACE, $whitespaces])); - } - } - - /** - * {@inheritdoc} - */ - public function getCustomTokens(): array - { - return []; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/TransformerInterface.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/TransformerInterface.php deleted file mode 100644 index d8fb5fe..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/TransformerInterface.php +++ /dev/null @@ -1,68 +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\Tokenizer; - -/** - * Interface for Transformer class. - * - * Transformer role is to register custom tokens and transform Tokens collection to use them. - * - * Custom token is a user defined token type and is used to separate different meaning of original token type. - * For example T_ARRAY is a token for both creating new array and typehinting a parameter. This two meaning should have two token types. - * - * @author Dariusz Rumiński - * - * @internal - */ -interface TransformerInterface -{ - /** - * Get tokens created by Transformer. - * - * @return int[] - */ - public function getCustomTokens(): array; - - /** - * Return the name of the transformer. - * - * The name must be all lowercase and without any spaces. - * - * @return string The name of the fixer - */ - public function getName(): string; - - /** - * Returns the priority of the transformer. - * - * The default priority is 0 and higher priorities are executed first. - */ - public function getPriority(): int; - - /** - * Return minimal required PHP version id to transform the code. - * - * Custom Token kinds from Transformers are always registered, but sometimes - * there is no need to analyse the Tokens if for sure we cannot find examined - * token kind, eg transforming `T_FUNCTION` in ` - * 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; - -use Symfony\Component\Finder\Finder; -use Symfony\Component\Finder\SplFileInfo; - -/** - * Collection of Transformer classes. - * - * @author Dariusz Rumiński - * - * @internal - */ -final class Transformers -{ - /** - * The registered transformers. - * - * @var TransformerInterface[] - */ - private $items = []; - - /** - * Register built in Transformers. - */ - private function __construct() - { - $this->registerBuiltInTransformers(); - - usort($this->items, static function (TransformerInterface $a, TransformerInterface $b) { - return $b->getPriority() <=> $a->getPriority(); - }); - } - - public static function createSingleton(): self - { - static $instance = null; - - if (!$instance) { - $instance = new self(); - } - - return $instance; - } - - /** - * Transform given Tokens collection through all Transformer classes. - * - * @param Tokens $tokens Tokens collection - */ - public function transform(Tokens $tokens): void - { - foreach ($this->items as $transformer) { - foreach ($tokens as $index => $token) { - $transformer->process($tokens, $token, $index); - } - } - } - - /** - * @param TransformerInterface $transformer Transformer - */ - private function registerTransformer(TransformerInterface $transformer): void - { - if (\PHP_VERSION_ID >= $transformer->getRequiredPhpVersionId()) { - $this->items[] = $transformer; - } - } - - private function registerBuiltInTransformers(): void - { - static $registered = false; - - if ($registered) { - return; - } - - $registered = true; - - foreach ($this->findBuiltInTransformers() as $transformer) { - $this->registerTransformer($transformer); - } - } - - /** - * @return \Generator|TransformerInterface[] - */ - 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'); - - yield new $class(); - } - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/ToolInfo.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/ToolInfo.php deleted file mode 100644 index 554f9f4..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/ToolInfo.php +++ /dev/null @@ -1,113 +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; - -use PhpCsFixer\Console\Application; - -/** - * Obtain information about using version of tool. - * - * @author Dariusz Rumiński - * - * @internal - */ -final class ToolInfo implements ToolInfoInterface -{ - public const COMPOSER_PACKAGE_NAME = 'friendsofphp/php-cs-fixer'; - - public const COMPOSER_LEGACY_PACKAGE_NAME = 'fabpot/php-cs-fixer'; - - /** - * @var null|array - */ - private $composerInstallationDetails; - - /** - * @var null|bool - */ - private $isInstalledByComposer; - - public function getComposerInstallationDetails(): array - { - if (!$this->isInstalledByComposer()) { - throw new \LogicException('Cannot get composer version for tool not installed by composer.'); - } - - if (null === $this->composerInstallationDetails) { - $composerInstalled = json_decode(file_get_contents($this->getComposerInstalledFile()), true); - - $packages = $composerInstalled['packages'] ?? $composerInstalled; - - foreach ($packages as $package) { - if (\in_array($package['name'], [self::COMPOSER_PACKAGE_NAME, self::COMPOSER_LEGACY_PACKAGE_NAME], true)) { - $this->composerInstallationDetails = $package; - - break; - } - } - } - - return $this->composerInstallationDetails; - } - - public function getComposerVersion(): string - { - $package = $this->getComposerInstallationDetails(); - - $versionSuffix = ''; - - if (isset($package['dist']['reference'])) { - $versionSuffix = '#'.$package['dist']['reference']; - } - - return $package['version'].$versionSuffix; - } - - public function getVersion(): string - { - if ($this->isInstalledByComposer()) { - return Application::VERSION.':'.$this->getComposerVersion(); - } - - return Application::VERSION; - } - - public function isInstalledAsPhar(): bool - { - return 'phar://' === substr(__DIR__, 0, 7); - } - - public function isInstalledByComposer(): bool - { - if (null === $this->isInstalledByComposer) { - $this->isInstalledByComposer = !$this->isInstalledAsPhar() && file_exists($this->getComposerInstalledFile()); - } - - return $this->isInstalledByComposer; - } - - public function getPharDownloadUri(string $version): string - { - return sprintf( - 'https://github.com/FriendsOfPHP/PHP-CS-Fixer/releases/download/%s/php-cs-fixer.phar', - $version - ); - } - - private function getComposerInstalledFile(): string - { - return __DIR__.'/../../../composer/installed.json'; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/ToolInfoInterface.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/ToolInfoInterface.php deleted file mode 100644 index 4e65411..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/ToolInfoInterface.php +++ /dev/null @@ -1,33 +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; - -/** - * @internal - */ -interface ToolInfoInterface -{ - public function getComposerInstallationDetails(): array; - - public function getComposerVersion(): string; - - public function getVersion(): string; - - public function isInstalledAsPhar(): bool; - - public function isInstalledByComposer(): bool; - - public function getPharDownloadUri(string $version): string; -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Utils.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Utils.php deleted file mode 100644 index d601c6d..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/Utils.php +++ /dev/null @@ -1,168 +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; - -use PhpCsFixer\Fixer\FixerInterface; -use PhpCsFixer\Tokenizer\Token; - -/** - * @author Dariusz Rumiński - * @author Graham Campbell - * @author Odín del Río - * - * @internal - */ -final class Utils -{ - /** - * @var array - */ - private static $deprecations = []; - - /** - * Converts a camel cased string to a snake cased string. - */ - public static function camelCaseToUnderscore(string $string): string - { - return strtolower(Preg::replace('/(?isWhitespace()) { - throw new \InvalidArgumentException(sprintf('The given token must be whitespace, got "%s".', $token->getName())); - } - - $str = strrchr( - str_replace(["\r\n", "\r"], "\n", $token->getContent()), - "\n" - ); - - if (false === $str) { - return ''; - } - - return ltrim($str, "\n"); - } - - /** - * Perform stable sorting using provided comparison function. - * - * 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 - * - * @return mixed[] - */ - public static function stableSort(array $elements, callable $getComparedValue, callable $compareValues): array - { - array_walk($elements, static function (&$element, int $index) use ($getComparedValue): void { - $element = [$element, $index, $getComparedValue($element)]; - }); - - usort($elements, static function ($a, $b) use ($compareValues) { - $comparison = $compareValues($a[2], $b[2]); - - if (0 !== $comparison) { - return $comparison; - } - - return $a[1] <=> $b[1]; - }); - - return array_map(static function (array $item) { - return $item[0]; - }, $elements); - } - - /** - * Sort fixers by their priorities. - * - * @param FixerInterface[] $fixers - * - * @return FixerInterface[] - */ - public static function sortFixers(array $fixers): array - { - // Schwartzian transform is used to improve the efficiency and avoid - // `usort(): Array was modified by the user comparison function` warning for mocked objects. - return self::stableSort( - $fixers, - static function (FixerInterface $fixer) { - return $fixer->getPriority(); - }, - static function (int $a, int $b) { - return $b <=> $a; - } - ); - } - - /** - * Join names in natural language wrapped in backticks, e.g. `a`, `b` and `c`. - * - * @param string[] $names - * - * @throws \InvalidArgumentException - */ - public static function naturalLanguageJoinWithBackticks(array $names): string - { - if (empty($names)) { - throw new \InvalidArgumentException('Array of names cannot be empty.'); - } - - $names = array_map(static function (string $name) { - return sprintf('`%s`', $name); - }, $names); - - $last = array_pop($names); - - if ($names) { - return implode(', ', $names).' and '.$last; - } - - return $last; - } - - public static function triggerDeprecation(\Exception $futureException): void - { - if (getenv('PHP_CS_FIXER_FUTURE_MODE')) { - throw new \RuntimeException( - 'Your are using something deprecated, see previous exception. Aborting execution because `PHP_CS_FIXER_FUTURE_MODE` environment variable is set.', - 0, - $futureException - ); - } - - $message = $futureException->getMessage(); - - self::$deprecations[$message] = true; - @trigger_error($message, E_USER_DEPRECATED); - } - - public static function getTriggeredDeprecations(): array - { - $triggeredDeprecations = array_keys(self::$deprecations); - sort($triggeredDeprecations); - - return $triggeredDeprecations; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/WhitespacesFixerConfig.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/WhitespacesFixerConfig.php deleted file mode 100644 index 0640a05..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/WhitespacesFixerConfig.php +++ /dev/null @@ -1,55 +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; - -/** - * @author Dariusz Rumiński - */ -final class WhitespacesFixerConfig -{ - /** - * @var string - */ - private $indent; - - /** - * @var string - */ - private $lineEnding; - - public function __construct(string $indent = ' ', string $lineEnding = "\n") - { - if (!\in_array($indent, [' ', ' ', "\t"], true)) { - throw new \InvalidArgumentException('Invalid "indent" param, expected tab or two or four spaces.'); - } - - if (!\in_array($lineEnding, ["\n", "\r\n"], true)) { - throw new \InvalidArgumentException('Invalid "lineEnding" param, expected "\n" or "\r\n".'); - } - - $this->indent = $indent; - $this->lineEnding = $lineEnding; - } - - public function getIndent(): string - { - return $this->indent; - } - - public function getLineEnding(): string - { - return $this->lineEnding; - } -} diff --git a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/WordMatcher.php b/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/WordMatcher.php deleted file mode 100644 index 61cb0a1..0000000 --- a/tools/php-cs-fixer/vendor/friendsofphp/php-cs-fixer/src/WordMatcher.php +++ /dev/null @@ -1,54 +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; - -/** - * @author Dariusz Rumiński - * @author SpacePossum - * - * @internal - */ -final class WordMatcher -{ - /** - * @var string[] - */ - private $candidates; - - /** - * @param string[] $candidates - */ - public function __construct(array $candidates) - { - $this->candidates = $candidates; - } - - public function match(string $needle): ?string - { - $word = null; - $distance = ceil(\strlen($needle) * 0.35); - - foreach ($this->candidates as $candidate) { - $candidateDistance = levenshtein($needle, $candidate); - - if ($candidateDistance < $distance) { - $word = $candidate; - $distance = $candidateDistance; - } - } - - return $word; - } -} diff --git a/tools/php-cs-fixer/vendor/php-cs-fixer/diff/LICENSE b/tools/php-cs-fixer/vendor/php-cs-fixer/diff/LICENSE deleted file mode 100644 index 93cf008..0000000 --- a/tools/php-cs-fixer/vendor/php-cs-fixer/diff/LICENSE +++ /dev/null @@ -1,31 +0,0 @@ -Copyright (c) 2002-2017, Sebastian Bergmann . -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - * Neither the name of Sebastian Bergmann nor the names of his - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. diff --git a/tools/php-cs-fixer/vendor/php-cs-fixer/diff/README.md b/tools/php-cs-fixer/vendor/php-cs-fixer/diff/README.md deleted file mode 100644 index 19cddca..0000000 --- a/tools/php-cs-fixer/vendor/php-cs-fixer/diff/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# PHP-CS-Fixer/diff - -This version is for PHP CS Fixer only! Do not use it! - -Code from `sebastian/diff` has been forked a republished by permission of Sebastian Bergmann. -Main change is to make the package compatible with older PHP engines. -Licenced with BSD-3-Clause @ see LICENSE, copyright (c) Sebastian Bergmann -https://github.com/sebastianbergmann/diff - -For questions visit us @ https://gitter.im/PHP-CS-Fixer/Lobby diff --git a/tools/php-cs-fixer/vendor/php-cs-fixer/diff/composer.json b/tools/php-cs-fixer/vendor/php-cs-fixer/diff/composer.json deleted file mode 100644 index 910267f..0000000 --- a/tools/php-cs-fixer/vendor/php-cs-fixer/diff/composer.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "php-cs-fixer/diff", - "description": "sebastian/diff v3 backport support for PHP 5.6+", - "keywords": ["diff"], - "homepage": "https://github.com/PHP-CS-Fixer", - "license": "BSD-3-Clause", - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - } - ], - "require": { - "php": "^5.6 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.7.23 || ^6.4.3 || ^7.0", - "symfony/process": "^3.3" - }, - "config": { - "optimize-autoloader": true, - "sort-packages": true - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "autoload-dev": { - "psr-4": { - "PhpCsFixer\\Diff\\": "tests" - } - } -} diff --git a/tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/Chunk.php b/tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/Chunk.php deleted file mode 100644 index 49c7757..0000000 --- a/tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/Chunk.php +++ /dev/null @@ -1,90 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PhpCsFixer\Diff; - -final class Chunk -{ - /** - * @var int - */ - private $start; - - /** - * @var int - */ - private $startRange; - - /** - * @var int - */ - private $end; - - /** - * @var int - */ - private $endRange; - - /** - * @var Line[] - */ - private $lines; - - public function __construct($start = 0, $startRange = 1, $end = 0, $endRange = 1, array $lines = []) - { - $this->start = $start; - $this->startRange = $startRange; - $this->end = $end; - $this->endRange = $endRange; - $this->lines = $lines; - } - - public function getStart() - { - return $this->start; - } - - public function getStartRange() - { - return $this->startRange; - } - - public function getEnd() - { - return $this->end; - } - - public function getEndRange() - { - return $this->endRange; - } - - /** - * @return Line[] - */ - public function getLines() - { - return $this->lines; - } - - /** - * @param Line[] $lines - */ - public function setLines(array $lines) - { - foreach ($lines as $line) { - if (!$line instanceof Line) { - throw new InvalidArgumentException; - } - } - - $this->lines = $lines; - } -} diff --git a/tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/Diff.php b/tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/Diff.php deleted file mode 100644 index a458d27..0000000 --- a/tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/Diff.php +++ /dev/null @@ -1,67 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PhpCsFixer\Diff; - -final class Diff -{ - /** - * @var string - */ - private $from; - - /** - * @var string - */ - private $to; - - /** - * @var Chunk[] - */ - private $chunks; - - /** - * @param string $from - * @param string $to - * @param Chunk[] $chunks - */ - public function __construct($from, $to, array $chunks = []) - { - $this->from = $from; - $this->to = $to; - $this->chunks = $chunks; - } - - public function getFrom() - { - return $this->from; - } - - public function getTo() - { - return $this->to; - } - - /** - * @return Chunk[] - */ - public function getChunks() - { - return $this->chunks; - } - - /** - * @param Chunk[] $chunks - */ - public function setChunks(array $chunks) - { - $this->chunks = $chunks; - } -} diff --git a/tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/Differ.php b/tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/Differ.php deleted file mode 100644 index d252e39..0000000 --- a/tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/Differ.php +++ /dev/null @@ -1,329 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PhpCsFixer\Diff; - -use PhpCsFixer\Diff\Output\DiffOutputBuilderInterface; -use PhpCsFixer\Diff\Output\UnifiedDiffOutputBuilder; - -/** - * Diff implementation. - */ -final class Differ -{ - const OLD = 0; - const ADDED = 1; - const REMOVED = 2; - const DIFF_LINE_END_WARNING = 3; - const NO_LINE_END_EOF_WARNING = 4; - - /** - * @var DiffOutputBuilderInterface - */ - private $outputBuilder; - - /** - * @param DiffOutputBuilderInterface $outputBuilder - * - * @throws InvalidArgumentException - */ - public function __construct($outputBuilder = null) - { - if ($outputBuilder instanceof DiffOutputBuilderInterface) { - $this->outputBuilder = $outputBuilder; - } elseif (null === $outputBuilder) { - $this->outputBuilder = new UnifiedDiffOutputBuilder; - } elseif (\is_string($outputBuilder)) { - // PHPUnit 6.1.4, 6.2.0, 6.2.1, 6.2.2, and 6.2.3 support - // @see https://github.com/sebastianbergmann/phpunit/issues/2734#issuecomment-314514056 - // @deprecated - $this->outputBuilder = new UnifiedDiffOutputBuilder($outputBuilder); - } else { - throw new InvalidArgumentException( - \sprintf( - 'Expected builder to be an instance of DiffOutputBuilderInterface, or a string, got %s.', - \is_object($outputBuilder) ? 'instance of "' . \get_class($outputBuilder) . '"' : \gettype($outputBuilder) . ' "' . $outputBuilder . '"' - ) - ); - } - } - - /** - * Returns the diff between two arrays or strings as string. - * - * @param array|string $from - * @param array|string $to - * @param null|LongestCommonSubsequenceCalculator $lcs - * - * @return string - */ - public function diff($from, $to, LongestCommonSubsequenceCalculator $lcs = null) - { - $diff = $this->diffToArray( - $this->normalizeDiffInput($from), - $this->normalizeDiffInput($to), - $lcs - ); - - return $this->outputBuilder->getDiff($diff); - } - - /** - * Returns the diff between two arrays or strings as array. - * - * Each array element contains two elements: - * - [0] => mixed $token - * - [1] => 2|1|0 - * - * - 2: REMOVED: $token was removed from $from - * - 1: ADDED: $token was added to $from - * - 0: OLD: $token is not changed in $to - * - * @param array|string $from - * @param array|string $to - * @param LongestCommonSubsequenceCalculator $lcs - * - * @return array - */ - public function diffToArray($from, $to, LongestCommonSubsequenceCalculator $lcs = null) - { - if (\is_string($from)) { - $from = $this->splitStringByLines($from); - } elseif (!\is_array($from)) { - throw new InvalidArgumentException('"from" must be an array or string.'); - } - - if (\is_string($to)) { - $to = $this->splitStringByLines($to); - } elseif (!\is_array($to)) { - throw new InvalidArgumentException('"to" must be an array or string.'); - } - - list($from, $to, $start, $end) = self::getArrayDiffParted($from, $to); - - if ($lcs === null) { - $lcs = $this->selectLcsImplementation($from, $to); - } - - $common = $lcs->calculate(\array_values($from), \array_values($to)); - $diff = []; - - foreach ($start as $token) { - $diff[] = [$token, self::OLD]; - } - - \reset($from); - \reset($to); - - foreach ($common as $token) { - while (($fromToken = \reset($from)) !== $token) { - $diff[] = [\array_shift($from), self::REMOVED]; - } - - while (($toToken = \reset($to)) !== $token) { - $diff[] = [\array_shift($to), self::ADDED]; - } - - $diff[] = [$token, self::OLD]; - - \array_shift($from); - \array_shift($to); - } - - while (($token = \array_shift($from)) !== null) { - $diff[] = [$token, self::REMOVED]; - } - - while (($token = \array_shift($to)) !== null) { - $diff[] = [$token, self::ADDED]; - } - - foreach ($end as $token) { - $diff[] = [$token, self::OLD]; - } - - if ($this->detectUnmatchedLineEndings($diff)) { - \array_unshift($diff, ["#Warnings contain different line endings!\n", self::DIFF_LINE_END_WARNING]); - } - - return $diff; - } - - /** - * Casts variable to string if it is not a string or array. - * - * @param mixed $input - * - * @return array|string - */ - private function normalizeDiffInput($input) - { - if (!\is_array($input) && !\is_string($input)) { - return (string) $input; - } - - return $input; - } - - /** - * Checks if input is string, if so it will split it line-by-line. - * - * @param string $input - * - * @return array - */ - private function splitStringByLines($input) - { - return \preg_split('/(.*\R)/', $input, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); - } - - /** - * @param array $from - * @param array $to - * - * @return LongestCommonSubsequenceCalculator - */ - private function selectLcsImplementation(array $from, array $to) - { - // We do not want to use the time-efficient implementation if its memory - // footprint will probably exceed this value. Note that the footprint - // calculation is only an estimation for the matrix and the LCS method - // will typically allocate a bit more memory than this. - $memoryLimit = 100 * 1024 * 1024; - - if ($this->calculateEstimatedFootprint($from, $to) > $memoryLimit) { - return new MemoryEfficientLongestCommonSubsequenceCalculator; - } - - return new TimeEfficientLongestCommonSubsequenceCalculator; - } - - /** - * Calculates the estimated memory footprint for the DP-based method. - * - * @param array $from - * @param array $to - * - * @return float|int - */ - private function calculateEstimatedFootprint(array $from, array $to) - { - $itemSize = PHP_INT_SIZE === 4 ? 76 : 144; - - return $itemSize * \min(\count($from), \count($to)) ** 2; - } - - /** - * Returns true if line ends don't match in a diff. - * - * @param array $diff - * - * @return bool - */ - private function detectUnmatchedLineEndings(array $diff) - { - $newLineBreaks = ['' => true]; - $oldLineBreaks = ['' => true]; - - foreach ($diff as $entry) { - if (self::OLD === $entry[1]) { - $ln = $this->getLinebreak($entry[0]); - $oldLineBreaks[$ln] = true; - $newLineBreaks[$ln] = true; - } elseif (self::ADDED === $entry[1]) { - $newLineBreaks[$this->getLinebreak($entry[0])] = true; - } elseif (self::REMOVED === $entry[1]) { - $oldLineBreaks[$this->getLinebreak($entry[0])] = true; - } - } - - // if either input or output is a single line without breaks than no warning should be raised - if (['' => true] === $newLineBreaks || ['' => true] === $oldLineBreaks) { - return false; - } - - // two way compare - foreach ($newLineBreaks as $break => $set) { - if (!isset($oldLineBreaks[$break])) { - return true; - } - } - - foreach ($oldLineBreaks as $break => $set) { - if (!isset($newLineBreaks[$break])) { - return true; - } - } - - return false; - } - - private function getLinebreak($line) - { - if (!\is_string($line)) { - return ''; - } - - $lc = \substr($line, -1); - if ("\r" === $lc) { - return "\r"; - } - - if ("\n" !== $lc) { - return ''; - } - - if ("\r\n" === \substr($line, -2)) { - return "\r\n"; - } - - return "\n"; - } - - private static function getArrayDiffParted(array &$from, array &$to) - { - $start = []; - $end = []; - - \reset($to); - - foreach ($from as $k => $v) { - $toK = \key($to); - - if ($toK === $k && $v === $to[$k]) { - $start[$k] = $v; - - unset($from[$k], $to[$k]); - } else { - break; - } - } - - \end($from); - \end($to); - - do { - $fromK = \key($from); - $toK = \key($to); - - if (null === $fromK || null === $toK || \current($from) !== \current($to)) { - break; - } - - \prev($from); - \prev($to); - - $end = [$fromK => $from[$fromK]] + $end; - unset($from[$fromK], $to[$toK]); - } while (true); - - return [$from, $to, $start, $end]; - } -} diff --git a/tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/Exception/ConfigurationException.php b/tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/Exception/ConfigurationException.php deleted file mode 100644 index 0cd0f88..0000000 --- a/tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/Exception/ConfigurationException.php +++ /dev/null @@ -1,40 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PhpCsFixer\Diff; - -final class ConfigurationException extends InvalidArgumentException -{ - /** - * @param string $option - * @param string $expected - * @param mixed $value - * @param int $code - * @param null|\Exception $previous - */ - public function __construct( - $option, - $expected, - $value, - $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/tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/Exception/Exception.php b/tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/Exception/Exception.php deleted file mode 100644 index ba4a609..0000000 --- a/tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/Exception/Exception.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PhpCsFixer\Diff; - -interface Exception -{ -} diff --git a/tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/Exception/InvalidArgumentException.php b/tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/Exception/InvalidArgumentException.php deleted file mode 100644 index e694666..0000000 --- a/tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/Exception/InvalidArgumentException.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PhpCsFixer\Diff; - -class InvalidArgumentException extends \InvalidArgumentException implements Exception -{ -} diff --git a/tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/Line.php b/tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/Line.php deleted file mode 100644 index df9d956..0000000 --- a/tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/Line.php +++ /dev/null @@ -1,44 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PhpCsFixer\Diff; - -final class Line -{ - const ADDED = 1; - const REMOVED = 2; - const UNCHANGED = 3; - - /** - * @var int - */ - private $type; - - /** - * @var string - */ - private $content; - - public function __construct($type = self::UNCHANGED, $content = '') - { - $this->type = $type; - $this->content = $content; - } - - public function getContent() - { - return $this->content; - } - - public function getType() - { - return $this->type; - } -} diff --git a/tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/LongestCommonSubsequenceCalculator.php b/tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/LongestCommonSubsequenceCalculator.php deleted file mode 100644 index d344851..0000000 --- a/tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/LongestCommonSubsequenceCalculator.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PhpCsFixer\Diff; - -interface LongestCommonSubsequenceCalculator -{ - /** - * Calculates the longest common subsequence of two arrays. - * - * @param array $from - * @param array $to - * - * @return array - */ - public function calculate(array $from, array $to); -} diff --git a/tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php b/tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php deleted file mode 100644 index a54e190..0000000 --- a/tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php +++ /dev/null @@ -1,81 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PhpCsFixer\Diff; - -final class MemoryEfficientLongestCommonSubsequenceCalculator implements LongestCommonSubsequenceCalculator -{ - /** - * {@inheritdoc} - */ - public function calculate(array $from, array $to) - { - $cFrom = \count($from); - $cTo = \count($to); - - if ($cFrom === 0) { - return []; - } - - if ($cFrom === 1) { - if (\in_array($from[0], $to, true)) { - return [$from[0]]; - } - - return []; - } - - $i = (int) ($cFrom / 2); - $fromStart = \array_slice($from, 0, $i); - $fromEnd = \array_slice($from, $i); - $llB = $this->length($fromStart, $to); - $llE = $this->length(\array_reverse($fromEnd), \array_reverse($to)); - $jMax = 0; - $max = 0; - - for ($j = 0; $j <= $cTo; $j++) { - $m = $llB[$j] + $llE[$cTo - $j]; - - if ($m >= $max) { - $max = $m; - $jMax = $j; - } - } - - $toStart = \array_slice($to, 0, $jMax); - $toEnd = \array_slice($to, $jMax); - - return \array_merge( - $this->calculate($fromStart, $toStart), - $this->calculate($fromEnd, $toEnd) - ); - } - - private function length(array $from, array $to) - { - $current = \array_fill(0, \count($to) + 1, 0); - $cFrom = \count($from); - $cTo = \count($to); - - for ($i = 0; $i < $cFrom; $i++) { - $prev = $current; - - for ($j = 0; $j < $cTo; $j++) { - if ($from[$i] === $to[$j]) { - $current[$j + 1] = $prev[$j] + 1; - } else { - $current[$j + 1] = \max($current[$j], $prev[$j + 1]); - } - } - } - - return $current; - } -} diff --git a/tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/Output/AbstractChunkOutputBuilder.php b/tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/Output/AbstractChunkOutputBuilder.php deleted file mode 100644 index 6fec704..0000000 --- a/tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/Output/AbstractChunkOutputBuilder.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PhpCsFixer\Diff\Output; - -abstract class AbstractChunkOutputBuilder implements DiffOutputBuilderInterface -{ - /** - * Takes input of the diff array and returns the common parts. - * Iterates through diff line by line. - * - * @param array $diff - * @param int $lineThreshold - * - * @return array - */ - protected function getCommonChunks(array $diff, $lineThreshold = 5) - { - $diffSize = \count($diff); - $capturing = false; - $chunkStart = 0; - $chunkSize = 0; - $commonChunks = []; - - for ($i = 0; $i < $diffSize; ++$i) { - if ($diff[$i][1] === 0 /* OLD */) { - if ($capturing === false) { - $capturing = true; - $chunkStart = $i; - $chunkSize = 0; - } else { - ++$chunkSize; - } - } elseif ($capturing !== false) { - if ($chunkSize >= $lineThreshold) { - $commonChunks[$chunkStart] = $chunkStart + $chunkSize; - } - - $capturing = false; - } - } - - if ($capturing !== false && $chunkSize >= $lineThreshold) { - $commonChunks[$chunkStart] = $chunkStart + $chunkSize; - } - - return $commonChunks; - } -} diff --git a/tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/Output/DiffOnlyOutputBuilder.php b/tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/Output/DiffOnlyOutputBuilder.php deleted file mode 100644 index b010040..0000000 --- a/tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/Output/DiffOnlyOutputBuilder.php +++ /dev/null @@ -1,66 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PhpCsFixer\Diff\Output; - -use PhpCsFixer\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; - - public function __construct($header = "--- Original\n+++ New\n") - { - $this->header = $header; - } - - public function getDiff(array $diff) - { - $buffer = \fopen('php://memory', 'r+b'); - - if ('' !== $this->header) { - \fwrite($buffer, $this->header); - if ("\n" !== \substr($this->header, -1, 1)) { - \fwrite($buffer, "\n"); - } - } - - foreach ($diff as $diffEntry) { - if ($diffEntry[1] === Differ::ADDED) { - \fwrite($buffer, '+' . $diffEntry[0]); - } elseif ($diffEntry[1] === Differ::REMOVED) { - \fwrite($buffer, '-' . $diffEntry[0]); - } elseif ($diffEntry[1] === Differ::DIFF_LINE_END_WARNING) { - \fwrite($buffer, ' ' . $diffEntry[0]); - - continue; // Warnings should not be tested for line break, it will always be there - } else { /* Not changed (old) 0 */ - continue; // we didn't write the non changs line, so do not add a line break either - } - - $lc = \substr($diffEntry[0], -1); - if ($lc !== "\n" && $lc !== "\r") { - \fwrite($buffer, "\n"); // \No newline at end of file - } - } - - $diff = \stream_get_contents($buffer, -1, 0); - \fclose($buffer); - - return $diff; - } -} diff --git a/tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/Output/DiffOutputBuilderInterface.php b/tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/Output/DiffOutputBuilderInterface.php deleted file mode 100644 index d348ed1..0000000 --- a/tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/Output/DiffOutputBuilderInterface.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PhpCsFixer\Diff\Output; - -/** - * Defines how an output builder should take a generated - * diff array and return a string representation of that diff. - */ -interface DiffOutputBuilderInterface -{ - public function getDiff(array $diff); -} diff --git a/tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/Output/StrictUnifiedDiffOutputBuilder.php b/tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/Output/StrictUnifiedDiffOutputBuilder.php deleted file mode 100644 index 4b08055..0000000 --- a/tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/Output/StrictUnifiedDiffOutputBuilder.php +++ /dev/null @@ -1,315 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PhpCsFixer\Diff\Output; - -use PhpCsFixer\Diff\ConfigurationException; -use PhpCsFixer\Diff\Differ; - -/** - * Strict Unified diff output builder. - * - * Generates (strict) Unified diff's (unidiffs) with hunks. - */ -final class StrictUnifiedDiffOutputBuilder implements DiffOutputBuilderInterface -{ - /** - * @var bool - */ - private $changed; - - /** - * @var bool - */ - private $collapseRanges; - - /** - * @var int >= 0 - */ - private $commonLineThreshold; - - /** - * @var string - */ - private $header; - - /** - * @var int >= 0 - */ - private $contextLines; - - private static $default = [ - 'collapseRanges' => true, // ranges of length one are rendered with the trailing `,1` - 'commonLineThreshold' => 6, // number of same lines before ending a new hunk and creating a new one (if needed) - 'contextLines' => 3, // like `diff: -u, -U NUM, --unified[=NUM]`, for patch/git apply compatibility best to keep at least @ 3 - 'fromFile' => null, - 'fromFileDate' => null, - 'toFile' => null, - 'toFileDate' => null, - ]; - - public function __construct(array $options = []) - { - $options = \array_merge(self::$default, $options); - - if (!\is_bool($options['collapseRanges'])) { - throw new ConfigurationException('collapseRanges', 'a bool', $options['collapseRanges']); - } - - if (!\is_int($options['contextLines']) || $options['contextLines'] < 0) { - throw new ConfigurationException('contextLines', 'an int >= 0', $options['contextLines']); - } - - if (!\is_int($options['commonLineThreshold']) || $options['commonLineThreshold'] <= 0) { - throw new ConfigurationException('commonLineThreshold', 'an int > 0', $options['commonLineThreshold']); - } - - foreach (['fromFile', 'toFile'] as $option) { - if (!\is_string($options[$option])) { - throw new ConfigurationException($option, 'a string', $options[$option]); - } - } - - foreach (['fromFileDate', 'toFileDate'] as $option) { - if (null !== $options[$option] && !\is_string($options[$option])) { - throw new ConfigurationException($option, 'a string or ', $options[$option]); - } - } - - $this->header = \sprintf( - "--- %s%s\n+++ %s%s\n", - $options['fromFile'], - null === $options['fromFileDate'] ? '' : "\t" . $options['fromFileDate'], - $options['toFile'], - null === $options['toFileDate'] ? '' : "\t" . $options['toFileDate'] - ); - - $this->collapseRanges = $options['collapseRanges']; - $this->commonLineThreshold = $options['commonLineThreshold']; - $this->contextLines = $options['contextLines']; - } - - public function getDiff(array $diff) - { - if (0 === \count($diff)) { - return ''; - } - - $this->changed = false; - - $buffer = \fopen('php://memory', 'r+b'); - \fwrite($buffer, $this->header); - - $this->writeDiffHunks($buffer, $diff); - - if (!$this->changed) { - \fclose($buffer); - - return ''; - } - - $diff = \stream_get_contents($buffer, -1, 0); - - \fclose($buffer); - - // If the last char is not a linebreak: add it. - // This might happen when both the `from` and `to` do not have a trailing linebreak - $last = \substr($diff, -1); - - return "\n" !== $last && "\r" !== $last - ? $diff . "\n" - : $diff - ; - } - - private function writeDiffHunks($output, array $diff) - { - // detect "No newline at end of file" and insert into `$diff` if needed - - $upperLimit = \count($diff); - - if (0 === $diff[$upperLimit - 1][1]) { - $lc = \substr($diff[$upperLimit - 1][0], -1); - if ("\n" !== $lc) { - \array_splice($diff, $upperLimit, 0, [["\n\\ No newline at end of file\n", Differ::NO_LINE_END_EOF_WARNING]]); - } - } else { - // search back for the last `+` and `-` line, - // check if has trailing linebreak, else add under it warning under it - $toFind = [1 => true, 2 => true]; - for ($i = $upperLimit - 1; $i >= 0; --$i) { - if (isset($toFind[$diff[$i][1]])) { - unset($toFind[$diff[$i][1]]); - $lc = \substr($diff[$i][0], -1); - if ("\n" !== $lc) { - \array_splice($diff, $i + 1, 0, [["\n\\ No newline at end of file\n", Differ::NO_LINE_END_EOF_WARNING]]); - } - - if (!\count($toFind)) { - break; - } - } - } - } - - // write hunks to output buffer - - $cutOff = \max($this->commonLineThreshold, $this->contextLines); - $hunkCapture = false; - $sameCount = $toRange = $fromRange = 0; - $toStart = $fromStart = 1; - - foreach ($diff as $i => $entry) { - if (0 === $entry[1]) { // same - if (false === $hunkCapture) { - ++$fromStart; - ++$toStart; - - continue; - } - - ++$sameCount; - ++$toRange; - ++$fromRange; - - if ($sameCount === $cutOff) { - $contextStartOffset = ($hunkCapture - $this->contextLines) < 0 - ? $hunkCapture - : $this->contextLines - ; - - // note: $contextEndOffset = $this->contextLines; - // - // because we never go beyond the end of the diff. - // with the cutoff/contextlines here the follow is never true; - // - // if ($i - $cutOff + $this->contextLines + 1 > \count($diff)) { - // $contextEndOffset = count($diff) - 1; - // } - // - // ; that would be true for a trailing incomplete hunk case which is dealt with after this loop - - $this->writeHunk( - $diff, - $hunkCapture - $contextStartOffset, - $i - $cutOff + $this->contextLines + 1, - $fromStart - $contextStartOffset, - $fromRange - $cutOff + $contextStartOffset + $this->contextLines, - $toStart - $contextStartOffset, - $toRange - $cutOff + $contextStartOffset + $this->contextLines, - $output - ); - - $fromStart += $fromRange; - $toStart += $toRange; - - $hunkCapture = false; - $sameCount = $toRange = $fromRange = 0; - } - - continue; - } - - $sameCount = 0; - - if ($entry[1] === Differ::NO_LINE_END_EOF_WARNING) { - continue; - } - - $this->changed = true; - - if (false === $hunkCapture) { - $hunkCapture = $i; - } - - if (Differ::ADDED === $entry[1]) { // added - ++$toRange; - } - - if (Differ::REMOVED === $entry[1]) { // removed - ++$fromRange; - } - } - - if (false === $hunkCapture) { - return; - } - - // we end here when cutoff (commonLineThreshold) was not reached, but we where capturing a hunk, - // do not render hunk till end automatically because the number of context lines might be less than the commonLineThreshold - - $contextStartOffset = $hunkCapture - $this->contextLines < 0 - ? $hunkCapture - : $this->contextLines - ; - - // prevent trying to write out more common lines than there are in the diff _and_ - // do not write more than configured through the context lines - $contextEndOffset = \min($sameCount, $this->contextLines); - - $fromRange -= $sameCount; - $toRange -= $sameCount; - - $this->writeHunk( - $diff, - $hunkCapture - $contextStartOffset, - $i - $sameCount + $contextEndOffset + 1, - $fromStart - $contextStartOffset, - $fromRange + $contextStartOffset + $contextEndOffset, - $toStart - $contextStartOffset, - $toRange + $contextStartOffset + $contextEndOffset, - $output - ); - } - - private function writeHunk( - array $diff, - $diffStartIndex, - $diffEndIndex, - $fromStart, - $fromRange, - $toStart, - $toRange, - $output - ) { - \fwrite($output, '@@ -' . $fromStart); - - if (!$this->collapseRanges || 1 !== $fromRange) { - \fwrite($output, ',' . $fromRange); - } - - \fwrite($output, ' +' . $toStart); - if (!$this->collapseRanges || 1 !== $toRange) { - \fwrite($output, ',' . $toRange); - } - - \fwrite($output, " @@\n"); - - for ($i = $diffStartIndex; $i < $diffEndIndex; ++$i) { - if ($diff[$i][1] === Differ::ADDED) { - $this->changed = true; - \fwrite($output, '+' . $diff[$i][0]); - } elseif ($diff[$i][1] === Differ::REMOVED) { - $this->changed = true; - \fwrite($output, '-' . $diff[$i][0]); - } elseif ($diff[$i][1] === Differ::OLD) { - \fwrite($output, ' ' . $diff[$i][0]); - } elseif ($diff[$i][1] === Differ::NO_LINE_END_EOF_WARNING) { - $this->changed = true; - \fwrite($output, $diff[$i][0]); - } - //} elseif ($diff[$i][1] === Differ::DIFF_LINE_END_WARNING) { // custom comment inserted by PHPUnit/diff package - // skip - //} else { - // unknown/invalid - //} - } - } -} diff --git a/tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/Output/UnifiedDiffOutputBuilder.php b/tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/Output/UnifiedDiffOutputBuilder.php deleted file mode 100644 index 13e6636..0000000 --- a/tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/Output/UnifiedDiffOutputBuilder.php +++ /dev/null @@ -1,259 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PhpCsFixer\Diff\Output; - -use PhpCsFixer\Diff\Differ; - -/** - * Builds a diff string representation in unified diff format in chunks. - */ -final class UnifiedDiffOutputBuilder extends AbstractChunkOutputBuilder -{ - /** - * @var bool - */ - private $collapseRanges = true; - - /** - * @var int >= 0 - */ - private $commonLineThreshold = 6; - - /** - * @var int >= 0 - */ - private $contextLines = 3; - - /** - * @var string - */ - private $header; - - /** - * @var bool - */ - private $addLineNumbers; - - public function __construct($header = "--- Original\n+++ New\n", $addLineNumbers = false) - { - $this->header = $header; - $this->addLineNumbers = $addLineNumbers; - } - - public function getDiff(array $diff) - { - $buffer = \fopen('php://memory', 'r+b'); - - if ('' !== $this->header) { - \fwrite($buffer, $this->header); - if ("\n" !== \substr($this->header, -1, 1)) { - \fwrite($buffer, "\n"); - } - } - - if (0 !== \count($diff)) { - $this->writeDiffHunks($buffer, $diff); - } - - $diff = \stream_get_contents($buffer, -1, 0); - - \fclose($buffer); - - // If the diff is non-empty and a linebreak: add it. - // This might happen when both the `from` and `to` do not have a trailing linebreak - $last = \substr($diff, -1); - - return 0 !== \strlen($diff) && "\n" !== $last && "\r" !== $last - ? $diff . "\n" - : $diff - ; - } - - private function writeDiffHunks($output, array $diff) - { - // detect "No newline at end of file" and insert into `$diff` if needed - - $upperLimit = \count($diff); - - if (0 === $diff[$upperLimit - 1][1]) { - $lc = \substr($diff[$upperLimit - 1][0], -1); - if ("\n" !== $lc) { - \array_splice($diff, $upperLimit, 0, [["\n\\ No newline at end of file\n", Differ::NO_LINE_END_EOF_WARNING]]); - } - } else { - // search back for the last `+` and `-` line, - // check if has trailing linebreak, else add under it warning under it - $toFind = [1 => true, 2 => true]; - for ($i = $upperLimit - 1; $i >= 0; --$i) { - if (isset($toFind[$diff[$i][1]])) { - unset($toFind[$diff[$i][1]]); - $lc = \substr($diff[$i][0], -1); - if ("\n" !== $lc) { - \array_splice($diff, $i + 1, 0, [["\n\\ No newline at end of file\n", Differ::NO_LINE_END_EOF_WARNING]]); - } - - if (!\count($toFind)) { - break; - } - } - } - } - - // write hunks to output buffer - - $cutOff = \max($this->commonLineThreshold, $this->contextLines); - $hunkCapture = false; - $sameCount = $toRange = $fromRange = 0; - $toStart = $fromStart = 1; - - foreach ($diff as $i => $entry) { - if (0 === $entry[1]) { // same - if (false === $hunkCapture) { - ++$fromStart; - ++$toStart; - - continue; - } - - ++$sameCount; - ++$toRange; - ++$fromRange; - - if ($sameCount === $cutOff) { - $contextStartOffset = ($hunkCapture - $this->contextLines) < 0 - ? $hunkCapture - : $this->contextLines - ; - - // note: $contextEndOffset = $this->contextLines; - // - // because we never go beyond the end of the diff. - // with the cutoff/contextlines here the follow is never true; - // - // if ($i - $cutOff + $this->contextLines + 1 > \count($diff)) { - // $contextEndOffset = count($diff) - 1; - // } - // - // ; that would be true for a trailing incomplete hunk case which is dealt with after this loop - - $this->writeHunk( - $diff, - $hunkCapture - $contextStartOffset, - $i - $cutOff + $this->contextLines + 1, - $fromStart - $contextStartOffset, - $fromRange - $cutOff + $contextStartOffset + $this->contextLines, - $toStart - $contextStartOffset, - $toRange - $cutOff + $contextStartOffset + $this->contextLines, - $output - ); - - $fromStart += $fromRange; - $toStart += $toRange; - - $hunkCapture = false; - $sameCount = $toRange = $fromRange = 0; - } - - continue; - } - - $sameCount = 0; - - if ($entry[1] === Differ::NO_LINE_END_EOF_WARNING) { - continue; - } - - if (false === $hunkCapture) { - $hunkCapture = $i; - } - - if (Differ::ADDED === $entry[1]) { - ++$toRange; - } - - if (Differ::REMOVED === $entry[1]) { - ++$fromRange; - } - } - - if (false === $hunkCapture) { - return; - } - - // we end here when cutoff (commonLineThreshold) was not reached, but we where capturing a hunk, - // do not render hunk till end automatically because the number of context lines might be less than the commonLineThreshold - - $contextStartOffset = $hunkCapture - $this->contextLines < 0 - ? $hunkCapture - : $this->contextLines - ; - - // prevent trying to write out more common lines than there are in the diff _and_ - // do not write more than configured through the context lines - $contextEndOffset = \min($sameCount, $this->contextLines); - - $fromRange -= $sameCount; - $toRange -= $sameCount; - - $this->writeHunk( - $diff, - $hunkCapture - $contextStartOffset, - $i - $sameCount + $contextEndOffset + 1, - $fromStart - $contextStartOffset, - $fromRange + $contextStartOffset + $contextEndOffset, - $toStart - $contextStartOffset, - $toRange + $contextStartOffset + $contextEndOffset, - $output - ); - } - - private function writeHunk( - array $diff, - $diffStartIndex, - $diffEndIndex, - $fromStart, - $fromRange, - $toStart, - $toRange, - $output - ) { - if ($this->addLineNumbers) { - \fwrite($output, '@@ -' . $fromStart); - - if (!$this->collapseRanges || 1 !== $fromRange) { - \fwrite($output, ',' . $fromRange); - } - - \fwrite($output, ' +' . $toStart); - if (!$this->collapseRanges || 1 !== $toRange) { - \fwrite($output, ',' . $toRange); - } - - \fwrite($output, " @@\n"); - } else { - \fwrite($output, "@@ @@\n"); - } - - for ($i = $diffStartIndex; $i < $diffEndIndex; ++$i) { - if ($diff[$i][1] === Differ::ADDED) { - \fwrite($output, '+' . $diff[$i][0]); - } elseif ($diff[$i][1] === Differ::REMOVED) { - \fwrite($output, '-' . $diff[$i][0]); - } elseif ($diff[$i][1] === Differ::OLD) { - \fwrite($output, ' ' . $diff[$i][0]); - } elseif ($diff[$i][1] === Differ::NO_LINE_END_EOF_WARNING) { - \fwrite($output, "\n"); // $diff[$i][0] - } else { /* Not changed (old) Differ::OLD or Warning Differ::DIFF_LINE_END_WARNING */ - \fwrite($output, ' ' . $diff[$i][0]); - } - } - } -} diff --git a/tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/Parser.php b/tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/Parser.php deleted file mode 100644 index 87afb93..0000000 --- a/tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/Parser.php +++ /dev/null @@ -1,106 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PhpCsFixer\Diff; - -/** - * Unified diff parser. - */ -final class Parser -{ - /** - * @param string $string - * - * @return Diff[] - */ - public function parse($string) - { - $lines = \preg_split('(\r\n|\r|\n)', $string); - - if (!empty($lines) && $lines[\count($lines) - 1] === '') { - \array_pop($lines); - } - - $lineCount = \count($lines); - $diffs = []; - $diff = null; - $collected = []; - - for ($i = 0; $i < $lineCount; ++$i) { - if (\preg_match('(^---\\s+(?P\\S+))', $lines[$i], $fromMatch) && - \preg_match('(^\\+\\+\\+\\s+(?P\\S+))', $lines[$i + 1], $toMatch)) { - if ($diff !== null) { - $this->parseFileDiff($diff, $collected); - - $diffs[] = $diff; - $collected = []; - } - - $diff = new Diff($fromMatch['file'], $toMatch['file']); - - ++$i; - } else { - if (\preg_match('/^(?:diff --git |index [\da-f\.]+|[+-]{3} [ab])/', $lines[$i])) { - continue; - } - - $collected[] = $lines[$i]; - } - } - - if ($diff !== null && \count($collected)) { - $this->parseFileDiff($diff, $collected); - - $diffs[] = $diff; - } - - return $diffs; - } - - private function parseFileDiff(Diff $diff, array $lines) - { - $chunks = []; - $chunk = null; - - foreach ($lines as $line) { - if (\preg_match('/^@@\s+-(?P\d+)(?:,\s*(?P\d+))?\s+\+(?P\d+)(?:,\s*(?P\d+))?\s+@@/', $line, $match)) { - $chunk = new Chunk( - (int) $match['start'], - isset($match['startrange']) ? \max(1, (int) $match['startrange']) : 1, - (int) $match['end'], - isset($match['endrange']) ? \max(1, (int) $match['endrange']) : 1 - ); - - $chunks[] = $chunk; - $diffLines = []; - - continue; - } - - if (\preg_match('/^(?P[+ -])?(?P.*)/', $line, $match)) { - $type = Line::UNCHANGED; - - if ($match['type'] === '+') { - $type = Line::ADDED; - } elseif ($match['type'] === '-') { - $type = Line::REMOVED; - } - - $diffLines[] = new Line($type, $match['line']); - - if (null !== $chunk) { - $chunk->setLines($diffLines); - } - } - } - - $diff->setChunks($chunks); - } -} diff --git a/tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php b/tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php deleted file mode 100644 index 5e4d51d..0000000 --- a/tools/php-cs-fixer/vendor/php-cs-fixer/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php +++ /dev/null @@ -1,66 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PhpCsFixer\Diff; - -final class TimeEfficientLongestCommonSubsequenceCalculator implements LongestCommonSubsequenceCalculator -{ - /** - * {@inheritdoc} - */ - public function calculate(array $from, array $to) - { - $common = []; - $fromLength = \count($from); - $toLength = \count($to); - $width = $fromLength + 1; - $matrix = new \SplFixedArray($width * ($toLength + 1)); - - for ($i = 0; $i <= $fromLength; ++$i) { - $matrix[$i] = 0; - } - - for ($j = 0; $j <= $toLength; ++$j) { - $matrix[$j * $width] = 0; - } - - for ($i = 1; $i <= $fromLength; ++$i) { - for ($j = 1; $j <= $toLength; ++$j) { - $o = ($j * $width) + $i; - $matrix[$o] = \max( - $matrix[$o - 1], - $matrix[$o - $width], - $from[$i - 1] === $to[$j - 1] ? $matrix[$o - $width - 1] + 1 : 0 - ); - } - } - - $i = $fromLength; - $j = $toLength; - - while ($i > 0 && $j > 0) { - if ($from[$i - 1] === $to[$j - 1]) { - $common[] = $from[$i - 1]; - --$i; - --$j; - } else { - $o = ($j * $width) + $i; - - if ($matrix[$o - $width] > $matrix[$o - 1]) { - --$j; - } else { - --$i; - } - } - } - - return \array_reverse($common); - } -} diff --git a/tools/php-cs-fixer/vendor/psr/cache/CHANGELOG.md b/tools/php-cs-fixer/vendor/psr/cache/CHANGELOG.md deleted file mode 100644 index 58ddab0..0000000 --- a/tools/php-cs-fixer/vendor/psr/cache/CHANGELOG.md +++ /dev/null @@ -1,16 +0,0 @@ -# Changelog - -All notable changes to this project will be documented in this file, in reverse chronological order by release. - -## 1.0.1 - 2016-08-06 - -### Fixed - -- Make spacing consistent in phpdoc annotations php-fig/cache#9 - chalasr -- Fix grammar in phpdoc annotations php-fig/cache#10 - chalasr -- Be more specific in docblocks that `getItems()` and `deleteItems()` take an array of strings (`string[]`) compared to just `array` php-fig/cache#8 - GrahamCampbell -- For `expiresAt()` and `expiresAfter()` in CacheItemInterface fix docblock to specify null as a valid parameters as well as an implementation of DateTimeInterface php-fig/cache#7 - GrahamCampbell - -## 1.0.0 - 2015-12-11 - -Initial stable release; reflects accepted PSR-6 specification diff --git a/tools/php-cs-fixer/vendor/psr/cache/LICENSE.txt b/tools/php-cs-fixer/vendor/psr/cache/LICENSE.txt deleted file mode 100644 index b1c2c97..0000000 --- a/tools/php-cs-fixer/vendor/psr/cache/LICENSE.txt +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2015 PHP Framework Interoperability Group - -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/tools/php-cs-fixer/vendor/psr/cache/README.md b/tools/php-cs-fixer/vendor/psr/cache/README.md deleted file mode 100644 index 9855a31..0000000 --- a/tools/php-cs-fixer/vendor/psr/cache/README.md +++ /dev/null @@ -1,12 +0,0 @@ -Caching Interface -============== - -This repository holds all interfaces related to [PSR-6 (Caching Interface)][psr-url]. - -Note that this is not a Caching implementation of its own. It is merely interfaces that describe the components of a Caching mechanism. - -The installable [package][package-url] and [implementations][implementation-url] are listed on Packagist. - -[psr-url]: https://www.php-fig.org/psr/psr-6/ -[package-url]: https://packagist.org/packages/psr/cache -[implementation-url]: https://packagist.org/providers/psr/cache-implementation diff --git a/tools/php-cs-fixer/vendor/psr/cache/composer.json b/tools/php-cs-fixer/vendor/psr/cache/composer.json deleted file mode 100644 index 4b68797..0000000 --- a/tools/php-cs-fixer/vendor/psr/cache/composer.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "name": "psr/cache", - "description": "Common interface for caching libraries", - "keywords": ["psr", "psr-6", "cache"], - "license": "MIT", - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "require": { - "php": ">=8.0.0" - }, - "autoload": { - "psr-4": { - "Psr\\Cache\\": "src/" - } - }, - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - } -} diff --git a/tools/php-cs-fixer/vendor/psr/cache/src/CacheException.php b/tools/php-cs-fixer/vendor/psr/cache/src/CacheException.php deleted file mode 100644 index bb785f4..0000000 --- a/tools/php-cs-fixer/vendor/psr/cache/src/CacheException.php +++ /dev/null @@ -1,10 +0,0 @@ -=7.2.0" - }, - "autoload": { - "psr-4": { - "Psr\\Container\\": "src/" - } - } -} diff --git a/tools/php-cs-fixer/vendor/psr/container/src/ContainerExceptionInterface.php b/tools/php-cs-fixer/vendor/psr/container/src/ContainerExceptionInterface.php deleted file mode 100644 index cf10b8b..0000000 --- a/tools/php-cs-fixer/vendor/psr/container/src/ContainerExceptionInterface.php +++ /dev/null @@ -1,10 +0,0 @@ -=7.2.0" - }, - "autoload": { - "psr-4": { - "Psr\\EventDispatcher\\": "src/" - } - }, - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - } -} diff --git a/tools/php-cs-fixer/vendor/psr/event-dispatcher/src/EventDispatcherInterface.php b/tools/php-cs-fixer/vendor/psr/event-dispatcher/src/EventDispatcherInterface.php deleted file mode 100644 index 4306fa9..0000000 --- a/tools/php-cs-fixer/vendor/psr/event-dispatcher/src/EventDispatcherInterface.php +++ /dev/null @@ -1,21 +0,0 @@ -logger = $logger; - } - - public function doSomething() - { - if ($this->logger) { - $this->logger->info('Doing work'); - } - - try { - $this->doSomethingElse(); - } catch (Exception $exception) { - $this->logger->error('Oh no!', array('exception' => $exception)); - } - - // do something useful - } -} -``` - -You can then pick one of the implementations of the interface to get a logger. - -If you want to implement the interface, you can require this package and -implement `Psr\Log\LoggerInterface` in your code. Please read the -[specification text](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md) -for details. diff --git a/tools/php-cs-fixer/vendor/psr/log/composer.json b/tools/php-cs-fixer/vendor/psr/log/composer.json deleted file mode 100644 index f3f0667..0000000 --- a/tools/php-cs-fixer/vendor/psr/log/composer.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "psr/log", - "description": "Common interface for logging libraries", - "keywords": ["psr", "psr-3", "log"], - "homepage": "https://github.com/php-fig/log", - "license": "MIT", - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "require": { - "php": ">=8.0.0" - }, - "autoload": { - "psr-4": { - "Psr\\Log\\": "src" - } - }, - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - } -} diff --git a/tools/php-cs-fixer/vendor/psr/log/src/AbstractLogger.php b/tools/php-cs-fixer/vendor/psr/log/src/AbstractLogger.php deleted file mode 100644 index d60a091..0000000 --- a/tools/php-cs-fixer/vendor/psr/log/src/AbstractLogger.php +++ /dev/null @@ -1,15 +0,0 @@ -logger = $logger; - } -} diff --git a/tools/php-cs-fixer/vendor/psr/log/src/LoggerInterface.php b/tools/php-cs-fixer/vendor/psr/log/src/LoggerInterface.php deleted file mode 100644 index b4d062b..0000000 --- a/tools/php-cs-fixer/vendor/psr/log/src/LoggerInterface.php +++ /dev/null @@ -1,125 +0,0 @@ -log(LogLevel::EMERGENCY, $message, $context); - } - - /** - * Action must be taken immediately. - * - * Example: Entire website down, database unavailable, etc. This should - * trigger the SMS alerts and wake you up. - * - * @param string|\Stringable $message - * @param array $context - * - * @return void - */ - public function alert(string|\Stringable $message, array $context = []) - { - $this->log(LogLevel::ALERT, $message, $context); - } - - /** - * Critical conditions. - * - * Example: Application component unavailable, unexpected exception. - * - * @param string|\Stringable $message - * @param array $context - * - * @return void - */ - public function critical(string|\Stringable $message, array $context = []) - { - $this->log(LogLevel::CRITICAL, $message, $context); - } - - /** - * Runtime errors that do not require immediate action but should typically - * be logged and monitored. - * - * @param string|\Stringable $message - * @param array $context - * - * @return void - */ - public function error(string|\Stringable $message, array $context = []) - { - $this->log(LogLevel::ERROR, $message, $context); - } - - /** - * Exceptional occurrences that are not errors. - * - * Example: Use of deprecated APIs, poor use of an API, undesirable things - * that are not necessarily wrong. - * - * @param string|\Stringable $message - * @param array $context - * - * @return void - */ - public function warning(string|\Stringable $message, array $context = []) - { - $this->log(LogLevel::WARNING, $message, $context); - } - - /** - * Normal but significant events. - * - * @param string|\Stringable $message - * @param array $context - * - * @return void - */ - public function notice(string|\Stringable $message, array $context = []) - { - $this->log(LogLevel::NOTICE, $message, $context); - } - - /** - * Interesting events. - * - * Example: User logs in, SQL logs. - * - * @param string|\Stringable $message - * @param array $context - * - * @return void - */ - public function info(string|\Stringable $message, array $context = []) - { - $this->log(LogLevel::INFO, $message, $context); - } - - /** - * Detailed debug information. - * - * @param string|\Stringable $message - * @param array $context - * - * @return void - */ - public function debug(string|\Stringable $message, array $context = []) - { - $this->log(LogLevel::DEBUG, $message, $context); - } - - /** - * Logs with an arbitrary level. - * - * @param mixed $level - * @param string|\Stringable $message - * @param array $context - * - * @return void - * - * @throws \Psr\Log\InvalidArgumentException - */ - abstract public function log($level, string|\Stringable $message, array $context = []); -} diff --git a/tools/php-cs-fixer/vendor/psr/log/src/NullLogger.php b/tools/php-cs-fixer/vendor/psr/log/src/NullLogger.php deleted file mode 100644 index 5607705..0000000 --- a/tools/php-cs-fixer/vendor/psr/log/src/NullLogger.php +++ /dev/null @@ -1,30 +0,0 @@ -logger) { }` - * blocks. - */ -class NullLogger extends AbstractLogger -{ - /** - * Logs with an arbitrary level. - * - * @param mixed $level - * @param string|\Stringable $message - * @param array $context - * - * @return void - * - * @throws \Psr\Log\InvalidArgumentException - */ - public function log($level, string|\Stringable $message, array $context = []) - { - // noop - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Application.php b/tools/php-cs-fixer/vendor/symfony/console/Application.php deleted file mode 100644 index 769c65d..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Application.php +++ /dev/null @@ -1,1239 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console; - -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Command\HelpCommand; -use Symfony\Component\Console\Command\LazyCommand; -use Symfony\Component\Console\Command\ListCommand; -use Symfony\Component\Console\Command\SignalableCommandInterface; -use Symfony\Component\Console\CommandLoader\CommandLoaderInterface; -use Symfony\Component\Console\Event\ConsoleCommandEvent; -use Symfony\Component\Console\Event\ConsoleErrorEvent; -use Symfony\Component\Console\Event\ConsoleSignalEvent; -use Symfony\Component\Console\Event\ConsoleTerminateEvent; -use Symfony\Component\Console\Exception\CommandNotFoundException; -use Symfony\Component\Console\Exception\ExceptionInterface; -use Symfony\Component\Console\Exception\LogicException; -use Symfony\Component\Console\Exception\NamespaceNotFoundException; -use Symfony\Component\Console\Exception\RuntimeException; -use Symfony\Component\Console\Formatter\OutputFormatter; -use Symfony\Component\Console\Helper\DebugFormatterHelper; -use Symfony\Component\Console\Helper\FormatterHelper; -use Symfony\Component\Console\Helper\Helper; -use Symfony\Component\Console\Helper\HelperSet; -use Symfony\Component\Console\Helper\ProcessHelper; -use Symfony\Component\Console\Helper\QuestionHelper; -use Symfony\Component\Console\Input\ArgvInput; -use Symfony\Component\Console\Input\ArrayInput; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputAwareInterface; -use Symfony\Component\Console\Input\InputDefinition; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Output\ConsoleOutput; -use Symfony\Component\Console\Output\ConsoleOutputInterface; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\SignalRegistry\SignalRegistry; -use Symfony\Component\Console\Style\SymfonyStyle; -use Symfony\Component\ErrorHandler\ErrorHandler; -use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; -use Symfony\Contracts\Service\ResetInterface; - -/** - * An Application is the container for a collection of commands. - * - * It is the main entry point of a Console application. - * - * This class is optimized for a standard CLI environment. - * - * Usage: - * - * $app = new Application('myapp', '1.0 (stable)'); - * $app->add(new SimpleCommand()); - * $app->run(); - * - * @author Fabien Potencier - */ -class Application implements ResetInterface -{ - private $commands = []; - private $wantHelps = false; - private $runningCommand; - private $name; - private $version; - private $commandLoader; - private $catchExceptions = true; - private $autoExit = true; - private $definition; - private $helperSet; - private $dispatcher; - private $terminal; - private $defaultCommand; - private $singleCommand = false; - private $initialized; - private $signalRegistry; - private $signalsToDispatchEvent = []; - - public function __construct(string $name = 'UNKNOWN', string $version = 'UNKNOWN') - { - $this->name = $name; - $this->version = $version; - $this->terminal = new Terminal(); - $this->defaultCommand = 'list'; - if (\defined('SIGINT') && SignalRegistry::isSupported()) { - $this->signalRegistry = new SignalRegistry(); - $this->signalsToDispatchEvent = [\SIGINT, \SIGTERM, \SIGUSR1, \SIGUSR2]; - } - } - - /** - * @final - */ - public function setDispatcher(EventDispatcherInterface $dispatcher) - { - $this->dispatcher = $dispatcher; - } - - public function setCommandLoader(CommandLoaderInterface $commandLoader) - { - $this->commandLoader = $commandLoader; - } - - public function getSignalRegistry(): SignalRegistry - { - if (!$this->signalRegistry) { - throw new RuntimeException('Signals are not supported. Make sure that the `pcntl` extension is installed and that "pcntl_*" functions are not disabled by your php.ini\'s "disable_functions" directive.'); - } - - return $this->signalRegistry; - } - - public function setSignalsToDispatchEvent(int ...$signalsToDispatchEvent) - { - $this->signalsToDispatchEvent = $signalsToDispatchEvent; - } - - /** - * Runs the current application. - * - * @return int 0 if everything went fine, or an error code - * - * @throws \Exception When running fails. Bypass this when {@link setCatchExceptions()}. - */ - public function run(InputInterface $input = null, OutputInterface $output = null) - { - if (\function_exists('putenv')) { - @putenv('LINES='.$this->terminal->getHeight()); - @putenv('COLUMNS='.$this->terminal->getWidth()); - } - - if (null === $input) { - $input = new ArgvInput(); - } - - if (null === $output) { - $output = new ConsoleOutput(); - } - - $renderException = function (\Throwable $e) use ($output) { - if ($output instanceof ConsoleOutputInterface) { - $this->renderThrowable($e, $output->getErrorOutput()); - } else { - $this->renderThrowable($e, $output); - } - }; - if ($phpHandler = set_exception_handler($renderException)) { - restore_exception_handler(); - if (!\is_array($phpHandler) || !$phpHandler[0] instanceof ErrorHandler) { - $errorHandler = true; - } elseif ($errorHandler = $phpHandler[0]->setExceptionHandler($renderException)) { - $phpHandler[0]->setExceptionHandler($errorHandler); - } - } - - $this->configureIO($input, $output); - - try { - $exitCode = $this->doRun($input, $output); - } catch (\Exception $e) { - if (!$this->catchExceptions) { - throw $e; - } - - $renderException($e); - - $exitCode = $e->getCode(); - if (is_numeric($exitCode)) { - $exitCode = (int) $exitCode; - if (0 === $exitCode) { - $exitCode = 1; - } - } else { - $exitCode = 1; - } - } finally { - // if the exception handler changed, keep it - // otherwise, unregister $renderException - if (!$phpHandler) { - if (set_exception_handler($renderException) === $renderException) { - restore_exception_handler(); - } - restore_exception_handler(); - } elseif (!$errorHandler) { - $finalHandler = $phpHandler[0]->setExceptionHandler(null); - if ($finalHandler !== $renderException) { - $phpHandler[0]->setExceptionHandler($finalHandler); - } - } - } - - if ($this->autoExit) { - if ($exitCode > 255) { - $exitCode = 255; - } - - exit($exitCode); - } - - return $exitCode; - } - - /** - * Runs the current application. - * - * @return int 0 if everything went fine, or an error code - */ - public function doRun(InputInterface $input, OutputInterface $output) - { - if (true === $input->hasParameterOption(['--version', '-V'], true)) { - $output->writeln($this->getLongVersion()); - - return 0; - } - - try { - // Makes ArgvInput::getFirstArgument() able to distinguish an option from an argument. - $input->bind($this->getDefinition()); - } catch (ExceptionInterface $e) { - // Errors must be ignored, full binding/validation happens later when the command is known. - } - - $name = $this->getCommandName($input); - if (true === $input->hasParameterOption(['--help', '-h'], true)) { - if (!$name) { - $name = 'help'; - $input = new ArrayInput(['command_name' => $this->defaultCommand]); - } else { - $this->wantHelps = true; - } - } - - if (!$name) { - $name = $this->defaultCommand; - $definition = $this->getDefinition(); - $definition->setArguments(array_merge( - $definition->getArguments(), - [ - 'command' => new InputArgument('command', InputArgument::OPTIONAL, $definition->getArgument('command')->getDescription(), $name), - ] - )); - } - - try { - $this->runningCommand = null; - // the command name MUST be the first element of the input - $command = $this->find($name); - } catch (\Throwable $e) { - if (!($e instanceof CommandNotFoundException && !$e instanceof NamespaceNotFoundException) || 1 !== \count($alternatives = $e->getAlternatives()) || !$input->isInteractive()) { - if (null !== $this->dispatcher) { - $event = new ConsoleErrorEvent($input, $output, $e); - $this->dispatcher->dispatch($event, ConsoleEvents::ERROR); - - if (0 === $event->getExitCode()) { - return 0; - } - - $e = $event->getError(); - } - - throw $e; - } - - $alternative = $alternatives[0]; - - $style = new SymfonyStyle($input, $output); - $style->block(sprintf("\nCommand \"%s\" is not defined.\n", $name), null, 'error'); - if (!$style->confirm(sprintf('Do you want to run "%s" instead? ', $alternative), false)) { - if (null !== $this->dispatcher) { - $event = new ConsoleErrorEvent($input, $output, $e); - $this->dispatcher->dispatch($event, ConsoleEvents::ERROR); - - return $event->getExitCode(); - } - - return 1; - } - - $command = $this->find($alternative); - } - - if ($command instanceof LazyCommand) { - $command = $command->getCommand(); - } - - $this->runningCommand = $command; - $exitCode = $this->doRunCommand($command, $input, $output); - $this->runningCommand = null; - - return $exitCode; - } - - /** - * {@inheritdoc} - */ - public function reset() - { - } - - public function setHelperSet(HelperSet $helperSet) - { - $this->helperSet = $helperSet; - } - - /** - * Get the helper set associated with the command. - * - * @return HelperSet The HelperSet instance associated with this command - */ - public function getHelperSet() - { - if (!$this->helperSet) { - $this->helperSet = $this->getDefaultHelperSet(); - } - - return $this->helperSet; - } - - public function setDefinition(InputDefinition $definition) - { - $this->definition = $definition; - } - - /** - * Gets the InputDefinition related to this Application. - * - * @return InputDefinition The InputDefinition instance - */ - public function getDefinition() - { - if (!$this->definition) { - $this->definition = $this->getDefaultInputDefinition(); - } - - if ($this->singleCommand) { - $inputDefinition = $this->definition; - $inputDefinition->setArguments(); - - return $inputDefinition; - } - - return $this->definition; - } - - /** - * Gets the help message. - * - * @return string A help message - */ - public function getHelp() - { - return $this->getLongVersion(); - } - - /** - * Gets whether to catch exceptions or not during commands execution. - * - * @return bool Whether to catch exceptions or not during commands execution - */ - public function areExceptionsCaught() - { - return $this->catchExceptions; - } - - /** - * Sets whether to catch exceptions or not during commands execution. - */ - public function setCatchExceptions(bool $boolean) - { - $this->catchExceptions = $boolean; - } - - /** - * Gets whether to automatically exit after a command execution or not. - * - * @return bool Whether to automatically exit after a command execution or not - */ - public function isAutoExitEnabled() - { - return $this->autoExit; - } - - /** - * Sets whether to automatically exit after a command execution or not. - */ - public function setAutoExit(bool $boolean) - { - $this->autoExit = $boolean; - } - - /** - * Gets the name of the application. - * - * @return string The application name - */ - public function getName() - { - return $this->name; - } - - /** - * Sets the application name. - **/ - public function setName(string $name) - { - $this->name = $name; - } - - /** - * Gets the application version. - * - * @return string The application version - */ - public function getVersion() - { - return $this->version; - } - - /** - * Sets the application version. - */ - public function setVersion(string $version) - { - $this->version = $version; - } - - /** - * Returns the long version of the application. - * - * @return string The long application version - */ - public function getLongVersion() - { - if ('UNKNOWN' !== $this->getName()) { - if ('UNKNOWN' !== $this->getVersion()) { - return sprintf('%s %s', $this->getName(), $this->getVersion()); - } - - return $this->getName(); - } - - return 'Console Tool'; - } - - /** - * Registers a new command. - * - * @return Command The newly created command - */ - public function register(string $name) - { - return $this->add(new Command($name)); - } - - /** - * Adds an array of command objects. - * - * If a Command is not enabled it will not be added. - * - * @param Command[] $commands An array of commands - */ - public function addCommands(array $commands) - { - foreach ($commands as $command) { - $this->add($command); - } - } - - /** - * Adds a command object. - * - * If a command with the same name already exists, it will be overridden. - * If the command is not enabled it will not be added. - * - * @return Command|null The registered command if enabled or null - */ - public function add(Command $command) - { - $this->init(); - - $command->setApplication($this); - - if (!$command->isEnabled()) { - $command->setApplication(null); - - return null; - } - - if (!$command instanceof LazyCommand) { - // Will throw if the command is not correctly initialized. - $command->getDefinition(); - } - - if (!$command->getName()) { - throw new LogicException(sprintf('The command defined in "%s" cannot have an empty name.', get_debug_type($command))); - } - - $this->commands[$command->getName()] = $command; - - foreach ($command->getAliases() as $alias) { - $this->commands[$alias] = $command; - } - - return $command; - } - - /** - * Returns a registered command by name or alias. - * - * @return Command A Command object - * - * @throws CommandNotFoundException When given command name does not exist - */ - public function get(string $name) - { - $this->init(); - - if (!$this->has($name)) { - throw new CommandNotFoundException(sprintf('The command "%s" does not exist.', $name)); - } - - // When the command has a different name than the one used at the command loader level - if (!isset($this->commands[$name])) { - throw new CommandNotFoundException(sprintf('The "%s" command cannot be found because it is registered under multiple names. Make sure you don\'t set a different name via constructor or "setName()".', $name)); - } - - $command = $this->commands[$name]; - - if ($this->wantHelps) { - $this->wantHelps = false; - - $helpCommand = $this->get('help'); - $helpCommand->setCommand($command); - - return $helpCommand; - } - - return $command; - } - - /** - * Returns true if the command exists, false otherwise. - * - * @return bool true if the command exists, false otherwise - */ - public function has(string $name) - { - $this->init(); - - return isset($this->commands[$name]) || ($this->commandLoader && $this->commandLoader->has($name) && $this->add($this->commandLoader->get($name))); - } - - /** - * Returns an array of all unique namespaces used by currently registered commands. - * - * It does not return the global namespace which always exists. - * - * @return string[] An array of namespaces - */ - public function getNamespaces() - { - $namespaces = []; - foreach ($this->all() as $command) { - if ($command->isHidden()) { - continue; - } - - $namespaces = array_merge($namespaces, $this->extractAllNamespaces($command->getName())); - - foreach ($command->getAliases() as $alias) { - $namespaces = array_merge($namespaces, $this->extractAllNamespaces($alias)); - } - } - - return array_values(array_unique(array_filter($namespaces))); - } - - /** - * Finds a registered namespace by a name or an abbreviation. - * - * @return string A registered namespace - * - * @throws NamespaceNotFoundException When namespace is incorrect or ambiguous - */ - public function findNamespace(string $namespace) - { - $allNamespaces = $this->getNamespaces(); - $expr = implode('[^:]*:', array_map('preg_quote', explode(':', $namespace))).'[^:]*'; - $namespaces = preg_grep('{^'.$expr.'}', $allNamespaces); - - if (empty($namespaces)) { - $message = sprintf('There are no commands defined in the "%s" namespace.', $namespace); - - if ($alternatives = $this->findAlternatives($namespace, $allNamespaces)) { - if (1 == \count($alternatives)) { - $message .= "\n\nDid you mean this?\n "; - } else { - $message .= "\n\nDid you mean one of these?\n "; - } - - $message .= implode("\n ", $alternatives); - } - - throw new NamespaceNotFoundException($message, $alternatives); - } - - $exact = \in_array($namespace, $namespaces, true); - if (\count($namespaces) > 1 && !$exact) { - throw new NamespaceNotFoundException(sprintf("The namespace \"%s\" is ambiguous.\nDid you mean one of these?\n%s.", $namespace, $this->getAbbreviationSuggestions(array_values($namespaces))), array_values($namespaces)); - } - - return $exact ? $namespace : reset($namespaces); - } - - /** - * Finds a command by name or alias. - * - * Contrary to get, this command tries to find the best - * match if you give it an abbreviation of a name or alias. - * - * @return Command A Command instance - * - * @throws CommandNotFoundException When command name is incorrect or ambiguous - */ - public function find(string $name) - { - $this->init(); - - $aliases = []; - - foreach ($this->commands as $command) { - foreach ($command->getAliases() as $alias) { - if (!$this->has($alias)) { - $this->commands[$alias] = $command; - } - } - } - - if ($this->has($name)) { - return $this->get($name); - } - - $allCommands = $this->commandLoader ? array_merge($this->commandLoader->getNames(), array_keys($this->commands)) : array_keys($this->commands); - $expr = implode('[^:]*:', array_map('preg_quote', explode(':', $name))).'[^:]*'; - $commands = preg_grep('{^'.$expr.'}', $allCommands); - - if (empty($commands)) { - $commands = preg_grep('{^'.$expr.'}i', $allCommands); - } - - // if no commands matched or we just matched namespaces - if (empty($commands) || \count(preg_grep('{^'.$expr.'$}i', $commands)) < 1) { - if (false !== $pos = strrpos($name, ':')) { - // check if a namespace exists and contains commands - $this->findNamespace(substr($name, 0, $pos)); - } - - $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(); - }); - - if (1 == \count($alternatives)) { - $message .= "\n\nDid you mean this?\n "; - } else { - $message .= "\n\nDid you mean one of these?\n "; - } - $message .= implode("\n ", $alternatives); - } - - throw new CommandNotFoundException($message, array_values($alternatives)); - } - - // filter out aliases for commands which are already on the list - if (\count($commands) > 1) { - $commandList = $this->commandLoader ? array_merge(array_flip($this->commandLoader->getNames()), $this->commands) : $this->commands; - $commands = array_unique(array_filter($commands, function ($nameOrAlias) use (&$commandList, $commands, &$aliases) { - if (!$commandList[$nameOrAlias] instanceof Command) { - $commandList[$nameOrAlias] = $this->commandLoader->get($nameOrAlias); - } - - $commandName = $commandList[$nameOrAlias]->getName(); - - $aliases[$nameOrAlias] = $commandName; - - return $commandName === $nameOrAlias || !\in_array($commandName, $commands); - })); - } - - if (\count($commands) > 1) { - $usableWidth = $this->terminal->getWidth() - 10; - $abbrevs = array_values($commands); - $maxLen = 0; - foreach ($abbrevs as $abbrev) { - $maxLen = max(Helper::width($abbrev), $maxLen); - } - $abbrevs = array_map(function ($cmd) use ($commandList, $usableWidth, $maxLen, &$commands) { - if ($commandList[$cmd]->isHidden()) { - unset($commands[array_search($cmd, $commands)]); - - return false; - } - - $abbrev = str_pad($cmd, $maxLen, ' ').' '.$commandList[$cmd]->getDescription(); - - return Helper::width($abbrev) > $usableWidth ? Helper::substr($abbrev, 0, $usableWidth - 3).'...' : $abbrev; - }, array_values($commands)); - - if (\count($commands) > 1) { - $suggestions = $this->getAbbreviationSuggestions(array_filter($abbrevs)); - - throw new CommandNotFoundException(sprintf("Command \"%s\" is ambiguous.\nDid you mean one of these?\n%s.", $name, $suggestions), array_values($commands)); - } - } - - $command = $this->get(reset($commands)); - - if ($command->isHidden()) { - throw new CommandNotFoundException(sprintf('The command "%s" does not exist.', $name)); - } - - return $command; - } - - /** - * Gets the commands (registered in the given namespace if provided). - * - * The array keys are the full names and the values the command instances. - * - * @return Command[] An array of Command instances - */ - public function all(string $namespace = null) - { - $this->init(); - - if (null === $namespace) { - if (!$this->commandLoader) { - return $this->commands; - } - - $commands = $this->commands; - foreach ($this->commandLoader->getNames() as $name) { - if (!isset($commands[$name]) && $this->has($name)) { - $commands[$name] = $this->get($name); - } - } - - return $commands; - } - - $commands = []; - foreach ($this->commands as $name => $command) { - if ($namespace === $this->extractNamespace($name, substr_count($namespace, ':') + 1)) { - $commands[$name] = $command; - } - } - - if ($this->commandLoader) { - foreach ($this->commandLoader->getNames() as $name) { - if (!isset($commands[$name]) && $namespace === $this->extractNamespace($name, substr_count($namespace, ':') + 1) && $this->has($name)) { - $commands[$name] = $this->get($name); - } - } - } - - return $commands; - } - - /** - * Returns an array of possible abbreviations given a set of names. - * - * @return string[][] An array of abbreviations - */ - public static function getAbbreviations(array $names) - { - $abbrevs = []; - foreach ($names as $name) { - for ($len = \strlen($name); $len > 0; --$len) { - $abbrev = substr($name, 0, $len); - $abbrevs[$abbrev][] = $name; - } - } - - return $abbrevs; - } - - public function renderThrowable(\Throwable $e, OutputInterface $output): void - { - $output->writeln('', OutputInterface::VERBOSITY_QUIET); - - $this->doRenderThrowable($e, $output); - - if (null !== $this->runningCommand) { - $output->writeln(sprintf('%s', OutputFormatter::escape(sprintf($this->runningCommand->getSynopsis(), $this->getName()))), OutputInterface::VERBOSITY_QUIET); - $output->writeln('', OutputInterface::VERBOSITY_QUIET); - } - } - - protected function doRenderThrowable(\Throwable $e, OutputInterface $output): void - { - do { - $message = trim($e->getMessage()); - if ('' === $message || OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) { - $class = get_debug_type($e); - $title = sprintf(' [%s%s] ', $class, 0 !== ($code = $e->getCode()) ? ' ('.$code.')' : ''); - $len = Helper::width($title); - } else { - $len = 0; - } - - 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) { - return 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 = []; - foreach ('' !== $message ? preg_split('/\r?\n/', $message) : [] as $line) { - foreach ($this->splitStringByWidth($line, $width - 4) as $line) { - // pre-format lines to get the right string length - $lineLength = Helper::width($line) + 4; - $lines[] = [$line, $lineLength]; - - $len = max($lineLength, $len); - } - } - - $messages = []; - if (!$e instanceof ExceptionInterface || OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) { - $messages[] = sprintf('%s', OutputFormatter::escape(sprintf('In %s line %s:', basename($e->getFile()) ?: 'n/a', $e->getLine() ?: 'n/a'))); - } - $messages[] = $emptyLine = sprintf('%s', str_repeat(' ', $len)); - if ('' === $message || OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) { - $messages[] = sprintf('%s%s', $title, str_repeat(' ', max(0, $len - Helper::width($title)))); - } - foreach ($lines as $line) { - $messages[] = sprintf(' %s %s', OutputFormatter::escape($line[0]), str_repeat(' ', $len - $line[1])); - } - $messages[] = $emptyLine; - $messages[] = ''; - - $output->writeln($messages, OutputInterface::VERBOSITY_QUIET); - - if (OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) { - $output->writeln('Exception trace:', OutputInterface::VERBOSITY_QUIET); - - // exception related properties - $trace = $e->getTrace(); - - array_unshift($trace, [ - 'function' => '', - 'file' => $e->getFile() ?: 'n/a', - 'line' => $e->getLine() ?: 'n/a', - 'args' => [], - ]); - - for ($i = 0, $count = \count($trace); $i < $count; ++$i) { - $class = $trace[$i]['class'] ?? ''; - $type = $trace[$i]['type'] ?? ''; - $function = $trace[$i]['function'] ?? ''; - $file = $trace[$i]['file'] ?? 'n/a'; - $line = $trace[$i]['line'] ?? 'n/a'; - - $output->writeln(sprintf(' %s%s at %s:%s', $class, $function ? $type.$function.'()' : '', $file, $line), OutputInterface::VERBOSITY_QUIET); - } - - $output->writeln('', OutputInterface::VERBOSITY_QUIET); - } - } while ($e = $e->getPrevious()); - } - - /** - * Configures the input and output instances based on the user arguments and options. - */ - protected function configureIO(InputInterface $input, OutputInterface $output) - { - if (true === $input->hasParameterOption(['--ansi'], true)) { - $output->setDecorated(true); - } elseif (true === $input->hasParameterOption(['--no-ansi'], true)) { - $output->setDecorated(false); - } - - if (true === $input->hasParameterOption(['--no-interaction', '-n'], true)) { - $input->setInteractive(false); - } - - switch ($shellVerbosity = (int) getenv('SHELL_VERBOSITY')) { - case -1: $output->setVerbosity(OutputInterface::VERBOSITY_QUIET); break; - case 1: $output->setVerbosity(OutputInterface::VERBOSITY_VERBOSE); break; - case 2: $output->setVerbosity(OutputInterface::VERBOSITY_VERY_VERBOSE); break; - case 3: $output->setVerbosity(OutputInterface::VERBOSITY_DEBUG); break; - default: $shellVerbosity = 0; break; - } - - if (true === $input->hasParameterOption(['--quiet', '-q'], true)) { - $output->setVerbosity(OutputInterface::VERBOSITY_QUIET); - $shellVerbosity = -1; - } else { - if ($input->hasParameterOption('-vvv', true) || $input->hasParameterOption('--verbose=3', true) || 3 === $input->getParameterOption('--verbose', false, true)) { - $output->setVerbosity(OutputInterface::VERBOSITY_DEBUG); - $shellVerbosity = 3; - } elseif ($input->hasParameterOption('-vv', true) || $input->hasParameterOption('--verbose=2', true) || 2 === $input->getParameterOption('--verbose', false, true)) { - $output->setVerbosity(OutputInterface::VERBOSITY_VERY_VERBOSE); - $shellVerbosity = 2; - } elseif ($input->hasParameterOption('-v', true) || $input->hasParameterOption('--verbose=1', true) || $input->hasParameterOption('--verbose', true) || $input->getParameterOption('--verbose', false, true)) { - $output->setVerbosity(OutputInterface::VERBOSITY_VERBOSE); - $shellVerbosity = 1; - } - } - - if (-1 === $shellVerbosity) { - $input->setInteractive(false); - } - - if (\function_exists('putenv')) { - @putenv('SHELL_VERBOSITY='.$shellVerbosity); - } - $_ENV['SHELL_VERBOSITY'] = $shellVerbosity; - $_SERVER['SHELL_VERBOSITY'] = $shellVerbosity; - } - - /** - * Runs the current command. - * - * If an event dispatcher has been attached to the application, - * events are also dispatched during the life-cycle of the command. - * - * @return int 0 if everything went fine, or an error code - */ - protected function doRunCommand(Command $command, InputInterface $input, OutputInterface $output) - { - foreach ($command->getHelperSet() as $helper) { - if ($helper instanceof InputAwareInterface) { - $helper->setInput($input); - } - } - - if ($command instanceof SignalableCommandInterface && ($this->signalsToDispatchEvent || $command->getSubscribedSignals())) { - if (!$this->signalRegistry) { - throw new RuntimeException('Unable to subscribe to signal events. Make sure that the `pcntl` extension is installed and that "pcntl_*" functions are not disabled by your php.ini\'s "disable_functions" directive.'); - } - - if ($this->dispatcher) { - foreach ($this->signalsToDispatchEvent as $signal) { - $event = new ConsoleSignalEvent($command, $input, $output, $signal); - - $this->signalRegistry->register($signal, function ($signal, $hasNext) use ($event) { - $this->dispatcher->dispatch($event, ConsoleEvents::SIGNAL); - - // No more handlers, we try to simulate PHP default behavior - if (!$hasNext) { - if (!\in_array($signal, [\SIGUSR1, \SIGUSR2], true)) { - exit(0); - } - } - }); - } - } - - foreach ($command->getSubscribedSignals() as $signal) { - $this->signalRegistry->register($signal, [$command, 'handleSignal']); - } - } - - if (null === $this->dispatcher) { - return $command->run($input, $output); - } - - // bind before the console.command event, so the listeners have access to input options/arguments - try { - $command->mergeApplicationDefinition(); - $input->bind($command->getDefinition()); - } catch (ExceptionInterface $e) { - // ignore invalid options/arguments for now, to allow the event listeners to customize the InputDefinition - } - - $event = new ConsoleCommandEvent($command, $input, $output); - $e = null; - - try { - $this->dispatcher->dispatch($event, ConsoleEvents::COMMAND); - - if ($event->commandShouldRun()) { - $exitCode = $command->run($input, $output); - } else { - $exitCode = ConsoleCommandEvent::RETURN_CODE_DISABLED; - } - } catch (\Throwable $e) { - $event = new ConsoleErrorEvent($input, $output, $e, $command); - $this->dispatcher->dispatch($event, ConsoleEvents::ERROR); - $e = $event->getError(); - - if (0 === $exitCode = $event->getExitCode()) { - $e = null; - } - } - - $event = new ConsoleTerminateEvent($command, $input, $output, $exitCode); - $this->dispatcher->dispatch($event, ConsoleEvents::TERMINATE); - - if (null !== $e) { - throw $e; - } - - return $event->getExitCode(); - } - - /** - * Gets the name of the command based on input. - * - * @return string|null - */ - protected function getCommandName(InputInterface $input) - { - return $this->singleCommand ? $this->defaultCommand : $input->getFirstArgument(); - } - - /** - * Gets the default input definition. - * - * @return InputDefinition An InputDefinition instance - */ - protected function getDefaultInputDefinition() - { - return new InputDefinition([ - new InputArgument('command', InputArgument::REQUIRED, 'The command to execute'), - new InputOption('--help', '-h', InputOption::VALUE_NONE, 'Display help for the given command. When no command is given display help for the '.$this->defaultCommand.' command'), - new InputOption('--quiet', '-q', InputOption::VALUE_NONE, 'Do not output any message'), - new InputOption('--verbose', '-v|vv|vvv', InputOption::VALUE_NONE, 'Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug'), - new InputOption('--version', '-V', InputOption::VALUE_NONE, 'Display this application version'), - new InputOption('--ansi', '', InputOption::VALUE_NEGATABLE, 'Force (or disable --no-ansi) ANSI output', false), - new InputOption('--no-interaction', '-n', InputOption::VALUE_NONE, 'Do not ask any interactive question'), - ]); - } - - /** - * Gets the default commands that should always be available. - * - * @return Command[] An array of default Command instances - */ - protected function getDefaultCommands() - { - return [new HelpCommand(), new ListCommand()]; - } - - /** - * Gets the default helper set with the helpers that should always be available. - * - * @return HelperSet A HelperSet instance - */ - protected function getDefaultHelperSet() - { - return new HelperSet([ - new FormatterHelper(), - new DebugFormatterHelper(), - new ProcessHelper(), - new QuestionHelper(), - ]); - } - - /** - * Returns abbreviated suggestions in string format. - */ - private function getAbbreviationSuggestions(array $abbrevs): string - { - return ' '.implode("\n ", $abbrevs); - } - - /** - * Returns the namespace part of the command name. - * - * This method is not part of public API and should not be used directly. - * - * @return string The namespace of the command - */ - public function extractNamespace(string $name, int $limit = null) - { - $parts = explode(':', $name, -1); - - return implode(':', null === $limit ? $parts : \array_slice($parts, 0, $limit)); - } - - /** - * Finds alternative of $name among $collection, - * if nothing is found in $collection, try in $abbrevs. - * - * @return string[] A sorted array of similar string - */ - private function findAlternatives(string $name, iterable $collection): array - { - $threshold = 1e3; - $alternatives = []; - - $collectionParts = []; - foreach ($collection as $item) { - $collectionParts[$item] = explode(':', $item); - } - - foreach (explode(':', $name) as $i => $subname) { - foreach ($collectionParts as $collectionName => $parts) { - $exists = isset($alternatives[$collectionName]); - if (!isset($parts[$i]) && $exists) { - $alternatives[$collectionName] += $threshold; - continue; - } elseif (!isset($parts[$i])) { - continue; - } - - $lev = levenshtein($subname, $parts[$i]); - if ($lev <= \strlen($subname) / 3 || '' !== $subname && str_contains($parts[$i], $subname)) { - $alternatives[$collectionName] = $exists ? $alternatives[$collectionName] + $lev : $lev; - } elseif ($exists) { - $alternatives[$collectionName] += $threshold; - } - } - } - - foreach ($collection as $item) { - $lev = levenshtein($name, $item); - if ($lev <= \strlen($name) / 3 || str_contains($item, $name)) { - $alternatives[$item] = isset($alternatives[$item]) ? $alternatives[$item] - $lev : $lev; - } - } - - $alternatives = array_filter($alternatives, function ($lev) use ($threshold) { return $lev < 2 * $threshold; }); - ksort($alternatives, \SORT_NATURAL | \SORT_FLAG_CASE); - - return array_keys($alternatives); - } - - /** - * Sets the default Command name. - * - * @return self - */ - public function setDefaultCommand(string $commandName, bool $isSingleCommand = false) - { - $this->defaultCommand = explode('|', ltrim($commandName, '|'))[0]; - - if ($isSingleCommand) { - // Ensure the command exist - $this->find($commandName); - - $this->singleCommand = true; - } - - return $this; - } - - /** - * @internal - */ - public function isSingleCommand(): bool - { - return $this->singleCommand; - } - - private function splitStringByWidth(string $string, int $width): array - { - // str_split is not suitable for multi-byte characters, we should use preg_split to get char array properly. - // additionally, array_slice() is not enough as some character has doubled width. - // we need a function to split string not by character count but by string width - if (false === $encoding = mb_detect_encoding($string, null, true)) { - return str_split($string, $width); - } - - $utf8String = mb_convert_encoding($string, 'utf8', $encoding); - $lines = []; - $line = ''; - - $offset = 0; - while (preg_match('/.{1,10000}/u', $utf8String, $m, 0, $offset)) { - $offset += \strlen($m[0]); - - foreach (preg_split('//u', $m[0]) as $char) { - // test if $char could be appended to current line - if (mb_strwidth($line.$char, 'utf8') <= $width) { - $line .= $char; - continue; - } - // if not, push current line to array and make new line - $lines[] = str_pad($line, $width); - $line = $char; - } - } - - $lines[] = \count($lines) ? str_pad($line, $width) : $line; - - mb_convert_variables($encoding, 'utf8', $lines); - - return $lines; - } - - /** - * Returns all namespaces of the command name. - * - * @return string[] The namespaces of the command - */ - private function extractAllNamespaces(string $name): array - { - // -1 as third argument is needed to skip the command short name when exploding - $parts = explode(':', $name, -1); - $namespaces = []; - - foreach ($parts as $part) { - if (\count($namespaces)) { - $namespaces[] = end($namespaces).':'.$part; - } else { - $namespaces[] = $part; - } - } - - return $namespaces; - } - - private function init() - { - if ($this->initialized) { - return; - } - $this->initialized = true; - - foreach ($this->getDefaultCommands() as $command) { - $this->add($command); - } - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Attribute/AsCommand.php b/tools/php-cs-fixer/vendor/symfony/console/Attribute/AsCommand.php deleted file mode 100644 index b337f54..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Attribute/AsCommand.php +++ /dev/null @@ -1,39 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Attribute; - -/** - * Service tag to autoconfigure commands. - */ -#[\Attribute(\Attribute::TARGET_CLASS)] -class AsCommand -{ - public function __construct( - public string $name, - public ?string $description = null, - array $aliases = [], - bool $hidden = false, - ) { - if (!$hidden && !$aliases) { - return; - } - - $name = explode('|', $name); - $name = array_merge($name, $aliases); - - if ($hidden && '' !== $name[0]) { - array_unshift($name, ''); - } - - $this->name = implode('|', $name); - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/CHANGELOG.md b/tools/php-cs-fixer/vendor/symfony/console/CHANGELOG.md deleted file mode 100644 index 8808563..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/CHANGELOG.md +++ /dev/null @@ -1,210 +0,0 @@ -CHANGELOG -========= - -5.3 ---- - - * Add `GithubActionReporter` to render annotations in a Github Action - * Add `InputOption::VALUE_NEGATABLE` flag to handle `--foo`/`--no-foo` options - * Add the `Command::$defaultDescription` static property and the `description` attribute - on the `console.command` tag to allow the `list` command to instantiate commands lazily - * Add option `--short` to the `list` command - * Add support for bright colors - * Add `#[AsCommand]` attribute for declaring commands on PHP 8 - * Add `Helper::width()` and `Helper::length()` - -5.2.0 ------ - - * Added `SingleCommandApplication::setAutoExit()` to allow testing via `CommandTester` - * added support for multiline responses to questions through `Question::setMultiline()` - and `Question::isMultiline()` - * Added `SignalRegistry` class to stack signals handlers - * Added support for signals: - * Added `Application::getSignalRegistry()` and `Application::setSignalsToDispatchEvent()` methods - * Added `SignalableCommandInterface` interface - * Added `TableCellStyle` class to customize table cell - * Removed `php ` prefix invocation from help messages. - -5.1.0 ------ - - * `Command::setHidden()` is final since Symfony 5.1 - * Add `SingleCommandApplication` - * Add `Cursor` class - -5.0.0 ------ - - * removed support for finding hidden commands using an abbreviation, use the full name instead - * removed `TableStyle::setCrossingChar()` method in favor of `TableStyle::setDefaultCrossingChar()` - * removed `TableStyle::setHorizontalBorderChar()` method in favor of `TableStyle::setDefaultCrossingChars()` - * removed `TableStyle::getHorizontalBorderChar()` method in favor of `TableStyle::getBorderChars()` - * removed `TableStyle::setVerticalBorderChar()` method in favor of `TableStyle::setVerticalBorderChars()` - * removed `TableStyle::getVerticalBorderChar()` method in favor of `TableStyle::getBorderChars()` - * removed support for returning `null` from `Command::execute()`, return `0` instead - * `ProcessHelper::run()` accepts only `array|Symfony\Component\Process\Process` for its `command` argument - * `Application::setDispatcher` accepts only `Symfony\Contracts\EventDispatcher\EventDispatcherInterface` - for its `dispatcher` argument - * renamed `Application::renderException()` and `Application::doRenderException()` - to `renderThrowable()` and `doRenderThrowable()` respectively. - -4.4.0 ------ - - * deprecated finding hidden commands using an abbreviation, use the full name instead - * added `Question::setTrimmable` default to true to allow the answer to be trimmed - * added method `minSecondsBetweenRedraws()` and `maxSecondsBetweenRedraws()` on `ProgressBar` - * `Application` implements `ResetInterface` - * marked all dispatched event classes as `@final` - * added support for displaying table horizontally - * deprecated returning `null` from `Command::execute()`, return `0` instead - * Deprecated the `Application::renderException()` and `Application::doRenderException()` methods, - use `renderThrowable()` and `doRenderThrowable()` instead. - * added support for the `NO_COLOR` env var (https://no-color.org/) - -4.3.0 ------ - - * added support for hyperlinks - * added `ProgressBar::iterate()` method that simplify updating the progress bar when iterating - * added `Question::setAutocompleterCallback()` to provide a callback function - that dynamically generates suggestions as the user types - -4.2.0 ------ - - * allowed passing commands as `[$process, 'ENV_VAR' => 'value']` to - `ProcessHelper::run()` to pass environment variables - * deprecated passing a command as a string to `ProcessHelper::run()`, - pass it the command as an array of its arguments instead - * made the `ProcessHelper` class final - * added `WrappableOutputFormatterInterface::formatAndWrap()` (implemented in `OutputFormatter`) - * added `capture_stderr_separately` option to `CommandTester::execute()` - -4.1.0 ------ - - * added option to run suggested command if command is not found and only 1 alternative is available - * added option to modify console output and print multiple modifiable sections - * added support for iterable messages in output `write` and `writeln` methods - -4.0.0 ------ - - * `OutputFormatter` throws an exception when unknown options are used - * removed `QuestionHelper::setInputStream()/getInputStream()` - * removed `Application::getTerminalWidth()/getTerminalHeight()` and - `Application::setTerminalDimensions()/getTerminalDimensions()` - * removed `ConsoleExceptionEvent` - * removed `ConsoleEvents::EXCEPTION` - -3.4.0 ------ - - * added `SHELL_VERBOSITY` env var to control verbosity - * added `CommandLoaderInterface`, `FactoryCommandLoader` and PSR-11 - `ContainerCommandLoader` for commands lazy-loading - * added a case-insensitive command name matching fallback - * added static `Command::$defaultName/getDefaultName()`, allowing for - commands to be registered at compile time in the application command loader. - Setting the `$defaultName` property avoids the need for filling the `command` - attribute on the `console.command` tag when using `AddConsoleCommandPass`. - -3.3.0 ------ - - * added `ExceptionListener` - * added `AddConsoleCommandPass` (originally in FrameworkBundle) - * [BC BREAK] `Input::getOption()` no longer returns the default value for options - with value optional explicitly passed empty - * added console.error event to catch exceptions thrown by other listeners - * deprecated console.exception event in favor of console.error - * added ability to handle `CommandNotFoundException` through the - `console.error` event - * deprecated default validation in `SymfonyQuestionHelper::ask` - -3.2.0 ------- - - * added `setInputs()` method to CommandTester for ease testing of commands expecting inputs - * added `setStream()` and `getStream()` methods to Input (implement StreamableInputInterface) - * added StreamableInputInterface - * added LockableTrait - -3.1.0 ------ - - * added truncate method to FormatterHelper - * added setColumnWidth(s) method to Table - -2.8.3 ------ - - * remove readline support from the question helper as it caused issues - -2.8.0 ------ - - * use readline for user input in the question helper when available to allow - the use of arrow keys - -2.6.0 ------ - - * added a Process helper - * added a DebugFormatter helper - -2.5.0 ------ - - * deprecated the dialog helper (use the question helper instead) - * deprecated TableHelper in favor of Table - * deprecated ProgressHelper in favor of ProgressBar - * added ConsoleLogger - * added a question helper - * added a way to set the process name of a command - * added a way to set a default command instead of `ListCommand` - -2.4.0 ------ - - * added a way to force terminal dimensions - * added a convenient method to detect verbosity level - * [BC BREAK] made descriptors use output instead of returning a string - -2.3.0 ------ - - * added multiselect support to the select dialog helper - * added Table Helper for tabular data rendering - * added support for events in `Application` - * added a way to normalize EOLs in `ApplicationTester::getDisplay()` and `CommandTester::getDisplay()` - * added a way to set the progress bar progress via the `setCurrent` method - * added support for multiple InputOption shortcuts, written as `'-a|-b|-c'` - * added two additional verbosity levels, VERBOSITY_VERY_VERBOSE and VERBOSITY_DEBUG - -2.2.0 ------ - - * added support for colorization on Windows via ConEmu - * add a method to Dialog Helper to ask for a question and hide the response - * added support for interactive selections in console (DialogHelper::select()) - * added support for autocompletion as you type in Dialog Helper - -2.1.0 ------ - - * added ConsoleOutputInterface - * added the possibility to disable a command (Command::isEnabled()) - * added suggestions when a command does not exist - * added a --raw option to the list command - * added support for STDERR in the console output class (errors are now sent - to STDERR) - * made the defaults (helper set, commands, input definition) in Application - more easily customizable - * added support for the shell even if readline is not available - * added support for process isolation in Symfony shell via - `--process-isolation` switch - * added support for `--`, which disables options parsing after that point - (tokens will be parsed as arguments) diff --git a/tools/php-cs-fixer/vendor/symfony/console/CI/GithubActionReporter.php b/tools/php-cs-fixer/vendor/symfony/console/CI/GithubActionReporter.php deleted file mode 100644 index a15c1ff..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/CI/GithubActionReporter.php +++ /dev/null @@ -1,99 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\CI; - -use Symfony\Component\Console\Output\OutputInterface; - -/** - * Utility class for Github actions. - * - * @author Maxime Steinhausser - */ -class GithubActionReporter -{ - private $output; - - /** - * @see https://github.com/actions/toolkit/blob/5e5e1b7aacba68a53836a34db4a288c3c1c1585b/packages/core/src/command.ts#L80-L85 - */ - private const ESCAPED_DATA = [ - '%' => '%25', - "\r" => '%0D', - "\n" => '%0A', - ]; - - /** - * @see https://github.com/actions/toolkit/blob/5e5e1b7aacba68a53836a34db4a288c3c1c1585b/packages/core/src/command.ts#L87-L94 - */ - private const ESCAPED_PROPERTIES = [ - '%' => '%25', - "\r" => '%0D', - "\n" => '%0A', - ':' => '%3A', - ',' => '%2C', - ]; - - public function __construct(OutputInterface $output) - { - $this->output = $output; - } - - public static function isGithubActionEnvironment(): bool - { - return false !== getenv('GITHUB_ACTIONS'); - } - - /** - * Output an error using the Github annotations format. - * - * @see https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-commands-for-github-actions#setting-an-error-message - */ - public function error(string $message, string $file = null, int $line = null, int $col = null): void - { - $this->log('error', $message, $file, $line, $col); - } - - /** - * Output a warning using the Github annotations format. - * - * @see https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-commands-for-github-actions#setting-a-warning-message - */ - public function warning(string $message, string $file = null, int $line = null, int $col = null): void - { - $this->log('warning', $message, $file, $line, $col); - } - - /** - * Output a debug log using the Github annotations format. - * - * @see https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-commands-for-github-actions#setting-a-debug-message - */ - public function debug(string $message, string $file = null, int $line = null, int $col = null): void - { - $this->log('debug', $message, $file, $line, $col); - } - - private function log(string $type, string $message, string $file = null, int $line = null, int $col = null): void - { - // Some values must be encoded. - $message = strtr($message, self::ESCAPED_DATA); - - if (!$file) { - // No file provided, output the message solely: - $this->output->writeln(sprintf('::%s::%s', $type, $message)); - - return; - } - - $this->output->writeln(sprintf('::%s file=%s,line=%s,col=%s::%s', $type, strtr($file, self::ESCAPED_PROPERTIES), strtr($line ?? 1, self::ESCAPED_PROPERTIES), strtr($col ?? 0, self::ESCAPED_PROPERTIES), $message)); - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Color.php b/tools/php-cs-fixer/vendor/symfony/console/Color.php deleted file mode 100644 index 22a4ce9..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Color.php +++ /dev/null @@ -1,180 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console; - -use Symfony\Component\Console\Exception\InvalidArgumentException; - -/** - * @author Fabien Potencier - */ -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], - ]; - - private $foreground; - private $background; - private $options = []; - - public function __construct(string $foreground = '', string $background = '', array $options = []) - { - $this->foreground = $this->parseColor($foreground); - $this->background = $this->parseColor($background, true); - - foreach ($options as $option) { - if (!isset(self::AVAILABLE_OPTIONS[$option])) { - throw new InvalidArgumentException(sprintf('Invalid option specified: "%s". Expected one of (%s).', $option, implode(', ', array_keys(self::AVAILABLE_OPTIONS)))); - } - - $this->options[$option] = self::AVAILABLE_OPTIONS[$option]; - } - } - - public function apply(string $text): string - { - return $this->set().$text.$this->unset(); - } - - public function set(): string - { - $setCodes = []; - if ('' !== $this->foreground) { - $setCodes[] = $this->foreground; - } - if ('' !== $this->background) { - $setCodes[] = $this->background; - } - foreach ($this->options as $option) { - $setCodes[] = $option['set']; - } - if (0 === \count($setCodes)) { - return ''; - } - - return sprintf("\033[%sm", implode(';', $setCodes)); - } - - public function unset(): string - { - $unsetCodes = []; - if ('' !== $this->foreground) { - $unsetCodes[] = 39; - } - if ('' !== $this->background) { - $unsetCodes[] = 49; - } - foreach ($this->options as $option) { - $unsetCodes[] = $option['unset']; - } - if (0 === \count($unsetCodes)) { - return ''; - } - - return sprintf("\033[%sm", implode(';', $unsetCodes)); - } - - private function parseColor(string $color, bool $background = false): string - { - if ('' === $color) { - return ''; - } - - if ('#' === $color[0]) { - $color = substr($color, 1); - - if (3 === \strlen($color)) { - $color = $color[0].$color[0].$color[1].$color[1].$color[2].$color[2]; - } - - if (6 !== \strlen($color)) { - throw new InvalidArgumentException(sprintf('Invalid "%s" color.', $color)); - } - - return ($background ? '4' : '3').$this->convertHexColorToAnsi(hexdec($color)); - } - - if (isset(self::COLORS[$color])) { - return ($background ? '4' : '3').self::COLORS[$color]; - } - - if (isset(self::BRIGHT_COLORS[$color])) { - return ($background ? '10' : '9').self::BRIGHT_COLORS[$color]; - } - - throw new InvalidArgumentException(sprintf('Invalid "%s" color; expected one of (%s).', $color, implode(', ', array_merge(array_keys(self::COLORS), array_keys(self::BRIGHT_COLORS))))); - } - - private function convertHexColorToAnsi(int $color): string - { - $r = ($color >> 16) & 255; - $g = ($color >> 8) & 255; - $b = $color & 255; - - // see https://github.com/termstandard/colors/ for more information about true color support - if ('truecolor' !== getenv('COLORTERM')) { - return (string) $this->degradeHexColorToAnsi($r, $g, $b); - } - - return sprintf('8;2;%d;%d;%d', $r, $g, $b); - } - - private function degradeHexColorToAnsi(int $r, int $g, int $b): int - { - if (0 === round($this->getSaturation($r, $g, $b) / 50)) { - return 0; - } - - return (round($b / 255) << 2) | (round($g / 255) << 1) | round($r / 255); - } - - private function getSaturation(int $r, int $g, int $b): int - { - $r = $r / 255; - $g = $g / 255; - $b = $b / 255; - $v = max($r, $g, $b); - - if (0 === $diff = $v - min($r, $g, $b)) { - return 0; - } - - return (int) $diff * 100 / $v; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Command/Command.php b/tools/php-cs-fixer/vendor/symfony/console/Command/Command.php deleted file mode 100644 index 3b09d99..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Command/Command.php +++ /dev/null @@ -1,704 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Command; - -use Symfony\Component\Console\Application; -use Symfony\Component\Console\Attribute\AsCommand; -use Symfony\Component\Console\Exception\ExceptionInterface; -use Symfony\Component\Console\Exception\InvalidArgumentException; -use Symfony\Component\Console\Exception\LogicException; -use Symfony\Component\Console\Helper\HelperSet; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputDefinition; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * Base class for all commands. - * - * @author Fabien Potencier - */ -class Command -{ - // see https://tldp.org/LDP/abs/html/exitcodes.html - public const SUCCESS = 0; - public const FAILURE = 1; - public const INVALID = 2; - - /** - * @var string|null The default command name - */ - protected static $defaultName; - - /** - * @var string|null The default command description - */ - protected static $defaultDescription; - - private $application; - private $name; - private $processTitle; - private $aliases = []; - private $definition; - private $hidden = false; - private $help = ''; - private $description = ''; - private $fullDefinition; - private $ignoreValidationErrors = false; - private $code; - private $synopsis = []; - private $usages = []; - private $helperSet; - - /** - * @return string|null The default command name or null when no default name is set - */ - public static function getDefaultName() - { - $class = static::class; - - if (\PHP_VERSION_ID >= 80000 && $attribute = (new \ReflectionClass($class))->getAttributes(AsCommand::class)) { - return $attribute[0]->newInstance()->name; - } - - $r = new \ReflectionProperty($class, 'defaultName'); - - return $class === $r->class ? static::$defaultName : null; - } - - /** - * @return string|null The default command description or null when no default description is set - */ - public static function getDefaultDescription(): ?string - { - $class = static::class; - - if (\PHP_VERSION_ID >= 80000 && $attribute = (new \ReflectionClass($class))->getAttributes(AsCommand::class)) { - return $attribute[0]->newInstance()->description; - } - - $r = new \ReflectionProperty($class, 'defaultDescription'); - - return $class === $r->class ? static::$defaultDescription : null; - } - - /** - * @param string|null $name The name of the command; passing null means it must be set in configure() - * - * @throws LogicException When the command name is empty - */ - public function __construct(string $name = null) - { - $this->definition = new InputDefinition(); - - if (null === $name && null !== $name = static::getDefaultName()) { - $aliases = explode('|', $name); - - if ('' === $name = array_shift($aliases)) { - $this->setHidden(true); - $name = array_shift($aliases); - } - - $this->setAliases($aliases); - } - - if (null !== $name) { - $this->setName($name); - } - - if ('' === $this->description) { - $this->setDescription(static::getDefaultDescription() ?? ''); - } - - $this->configure(); - } - - /** - * Ignores validation errors. - * - * This is mainly useful for the help command. - */ - public function ignoreValidationErrors() - { - $this->ignoreValidationErrors = true; - } - - public function setApplication(Application $application = null) - { - $this->application = $application; - if ($application) { - $this->setHelperSet($application->getHelperSet()); - } else { - $this->helperSet = null; - } - - $this->fullDefinition = null; - } - - public function setHelperSet(HelperSet $helperSet) - { - $this->helperSet = $helperSet; - } - - /** - * Gets the helper set. - * - * @return HelperSet|null A HelperSet instance - */ - public function getHelperSet() - { - return $this->helperSet; - } - - /** - * Gets the application instance for this command. - * - * @return Application|null An Application instance - */ - public function getApplication() - { - return $this->application; - } - - /** - * Checks whether the command is enabled or not in the current environment. - * - * Override this to check for x or y and return false if the command can not - * run properly under the current conditions. - * - * @return bool - */ - public function isEnabled() - { - return true; - } - - /** - * Configures the current command. - */ - protected function configure() - { - } - - /** - * Executes the current command. - * - * This method is not abstract because you can use this class - * as a concrete class. In this case, instead of defining the - * execute() method, you set the code to execute by passing - * a Closure to the setCode() method. - * - * @return int 0 if everything went fine, or an exit code - * - * @throws LogicException When this abstract method is not implemented - * - * @see setCode() - */ - protected function execute(InputInterface $input, OutputInterface $output) - { - throw new LogicException('You must override the execute() method in the concrete command class.'); - } - - /** - * Interacts with the user. - * - * This method is executed before the InputDefinition is validated. - * This means that this is the only place where the command can - * interactively ask for values of missing required arguments. - */ - protected function interact(InputInterface $input, OutputInterface $output) - { - } - - /** - * Initializes the command after the input has been bound and before the input - * is validated. - * - * This is mainly useful when a lot of commands extends one main command - * where some things need to be initialized based on the input arguments and options. - * - * @see InputInterface::bind() - * @see InputInterface::validate() - */ - protected function initialize(InputInterface $input, OutputInterface $output) - { - } - - /** - * Runs the command. - * - * The code to execute is either defined directly with the - * setCode() method or by overriding the execute() method - * in a sub-class. - * - * @return int The command exit code - * - * @throws \Exception When binding input fails. Bypass this by calling {@link ignoreValidationErrors()}. - * - * @see setCode() - * @see execute() - */ - public function run(InputInterface $input, OutputInterface $output) - { - // add the application arguments and options - $this->mergeApplicationDefinition(); - - // bind the input against the command specific arguments/options - try { - $input->bind($this->getDefinition()); - } catch (ExceptionInterface $e) { - if (!$this->ignoreValidationErrors) { - throw $e; - } - } - - $this->initialize($input, $output); - - if (null !== $this->processTitle) { - if (\function_exists('cli_set_process_title')) { - if (!@cli_set_process_title($this->processTitle)) { - if ('Darwin' === \PHP_OS) { - $output->writeln('Running "cli_set_process_title" as an unprivileged user is not supported on MacOS.', OutputInterface::VERBOSITY_VERY_VERBOSE); - } else { - cli_set_process_title($this->processTitle); - } - } - } elseif (\function_exists('setproctitle')) { - setproctitle($this->processTitle); - } elseif (OutputInterface::VERBOSITY_VERY_VERBOSE === $output->getVerbosity()) { - $output->writeln('Install the proctitle PECL to be able to change the process title.'); - } - } - - if ($input->isInteractive()) { - $this->interact($input, $output); - } - - // The command name argument is often omitted when a command is executed directly with its run() method. - // It would fail the validation if we didn't make sure the command argument is present, - // since it's required by the application. - if ($input->hasArgument('command') && null === $input->getArgument('command')) { - $input->setArgument('command', $this->getName()); - } - - $input->validate(); - - if ($this->code) { - $statusCode = ($this->code)($input, $output); - } else { - $statusCode = $this->execute($input, $output); - - if (!\is_int($statusCode)) { - throw new \TypeError(sprintf('Return value of "%s::execute()" must be of the type int, "%s" returned.', static::class, get_debug_type($statusCode))); - } - } - - return is_numeric($statusCode) ? (int) $statusCode : 0; - } - - /** - * Sets the code to execute when running this command. - * - * If this method is used, it overrides the code defined - * in the execute() method. - * - * @param callable $code A callable(InputInterface $input, OutputInterface $output) - * - * @return $this - * - * @throws InvalidArgumentException - * - * @see execute() - */ - public function setCode(callable $code) - { - if ($code instanceof \Closure) { - $r = new \ReflectionFunction($code); - if (null === $r->getClosureThis()) { - set_error_handler(static function () {}); - try { - if ($c = \Closure::bind($code, $this)) { - $code = $c; - } - } finally { - restore_error_handler(); - } - } - } - - $this->code = $code; - - return $this; - } - - /** - * Merges the application definition with the command definition. - * - * This method is not part of public API and should not be used directly. - * - * @param bool $mergeArgs Whether to merge or not the Application definition arguments to Command definition arguments - * - * @internal - */ - public function mergeApplicationDefinition(bool $mergeArgs = true) - { - if (null === $this->application) { - return; - } - - $this->fullDefinition = new InputDefinition(); - $this->fullDefinition->setOptions($this->definition->getOptions()); - $this->fullDefinition->addOptions($this->application->getDefinition()->getOptions()); - - if ($mergeArgs) { - $this->fullDefinition->setArguments($this->application->getDefinition()->getArguments()); - $this->fullDefinition->addArguments($this->definition->getArguments()); - } else { - $this->fullDefinition->setArguments($this->definition->getArguments()); - } - } - - /** - * Sets an array of argument and option instances. - * - * @param array|InputDefinition $definition An array of argument and option instances or a definition instance - * - * @return $this - */ - public function setDefinition($definition) - { - if ($definition instanceof InputDefinition) { - $this->definition = $definition; - } else { - $this->definition->setDefinition($definition); - } - - $this->fullDefinition = null; - - return $this; - } - - /** - * Gets the InputDefinition attached to this Command. - * - * @return InputDefinition An InputDefinition instance - */ - public function getDefinition() - { - return $this->fullDefinition ?? $this->getNativeDefinition(); - } - - /** - * Gets the InputDefinition to be used to create representations of this Command. - * - * Can be overridden to provide the original command representation when it would otherwise - * be changed by merging with the application InputDefinition. - * - * This method is not part of public API and should not be used directly. - * - * @return InputDefinition An InputDefinition instance - */ - public function getNativeDefinition() - { - if (null === $this->definition) { - throw new LogicException(sprintf('Command class "%s" is not correctly initialized. You probably forgot to call the parent constructor.', static::class)); - } - - return $this->definition; - } - - /** - * Adds an argument. - * - * @param int|null $mode The argument mode: InputArgument::REQUIRED or InputArgument::OPTIONAL - * @param mixed $default The default value (for InputArgument::OPTIONAL mode only) - * - * @throws InvalidArgumentException When argument mode is not valid - * - * @return $this - */ - public function addArgument(string $name, int $mode = null, string $description = '', $default = null) - { - $this->definition->addArgument(new InputArgument($name, $mode, $description, $default)); - if (null !== $this->fullDefinition) { - $this->fullDefinition->addArgument(new InputArgument($name, $mode, $description, $default)); - } - - return $this; - } - - /** - * Adds an option. - * - * @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 InputOption::VALUE_* constants - * @param mixed $default The default value (must be null for InputOption::VALUE_NONE) - * - * @throws InvalidArgumentException If option mode is invalid or incompatible - * - * @return $this - */ - public function addOption(string $name, $shortcut = null, int $mode = null, string $description = '', $default = null) - { - $this->definition->addOption(new InputOption($name, $shortcut, $mode, $description, $default)); - if (null !== $this->fullDefinition) { - $this->fullDefinition->addOption(new InputOption($name, $shortcut, $mode, $description, $default)); - } - - return $this; - } - - /** - * Sets the name of the command. - * - * This method can set both the namespace and the name if - * you separate them by a colon (:) - * - * $command->setName('foo:bar'); - * - * @return $this - * - * @throws InvalidArgumentException When the name is invalid - */ - public function setName(string $name) - { - $this->validateName($name); - - $this->name = $name; - - return $this; - } - - /** - * Sets the process title of the command. - * - * This feature should be used only when creating a long process command, - * like a daemon. - * - * @return $this - */ - public function setProcessTitle(string $title) - { - $this->processTitle = $title; - - return $this; - } - - /** - * Returns the command name. - * - * @return string|null - */ - public function getName() - { - return $this->name; - } - - /** - * @param bool $hidden Whether or not the command should be hidden from the list of commands - * The default value will be true in Symfony 6.0 - * - * @return $this - * - * @final since Symfony 5.1 - */ - public function setHidden(bool $hidden /*= true*/) - { - $this->hidden = $hidden; - - return $this; - } - - /** - * @return bool whether the command should be publicly shown or not - */ - public function isHidden() - { - return $this->hidden; - } - - /** - * Sets the description for the command. - * - * @return $this - */ - public function setDescription(string $description) - { - $this->description = $description; - - return $this; - } - - /** - * Returns the description for the command. - * - * @return string The description for the command - */ - public function getDescription() - { - return $this->description; - } - - /** - * Sets the help for the command. - * - * @return $this - */ - public function setHelp(string $help) - { - $this->help = $help; - - return $this; - } - - /** - * Returns the help for the command. - * - * @return string The help for the command - */ - public function getHelp() - { - return $this->help; - } - - /** - * Returns the processed help for the command replacing the %command.name% and - * %command.full_name% patterns with the real values dynamically. - * - * @return string The processed help for the command - */ - public function getProcessedHelp() - { - $name = $this->name; - $isSingleCommand = $this->application && $this->application->isSingleCommand(); - - $placeholders = [ - '%command.name%', - '%command.full_name%', - ]; - $replacements = [ - $name, - $isSingleCommand ? $_SERVER['PHP_SELF'] : $_SERVER['PHP_SELF'].' '.$name, - ]; - - return str_replace($placeholders, $replacements, $this->getHelp() ?: $this->getDescription()); - } - - /** - * Sets the aliases for the command. - * - * @param string[] $aliases An array of aliases for the command - * - * @return $this - * - * @throws InvalidArgumentException When an alias is invalid - */ - public function setAliases(iterable $aliases) - { - $list = []; - - foreach ($aliases as $alias) { - $this->validateName($alias); - $list[] = $alias; - } - - $this->aliases = \is_array($aliases) ? $aliases : $list; - - return $this; - } - - /** - * Returns the aliases for the command. - * - * @return array An array of aliases for the command - */ - public function getAliases() - { - return $this->aliases; - } - - /** - * Returns the synopsis for the command. - * - * @param bool $short Whether to show the short version of the synopsis (with options folded) or not - * - * @return string The synopsis - */ - public function getSynopsis(bool $short = false) - { - $key = $short ? 'short' : 'long'; - - if (!isset($this->synopsis[$key])) { - $this->synopsis[$key] = trim(sprintf('%s %s', $this->name, $this->definition->getSynopsis($short))); - } - - return $this->synopsis[$key]; - } - - /** - * Add a command usage example, it'll be prefixed with the command name. - * - * @return $this - */ - public function addUsage(string $usage) - { - if (!str_starts_with($usage, $this->name)) { - $usage = sprintf('%s %s', $this->name, $usage); - } - - $this->usages[] = $usage; - - return $this; - } - - /** - * Returns alternative usages of the command. - * - * @return array - */ - public function getUsages() - { - return $this->usages; - } - - /** - * Gets a helper instance by name. - * - * @return mixed The helper value - * - * @throws LogicException if no HelperSet is defined - * @throws InvalidArgumentException if the helper is not defined - */ - public function getHelper(string $name) - { - if (null === $this->helperSet) { - throw new LogicException(sprintf('Cannot retrieve helper "%s" because there is no HelperSet defined. Did you forget to add your command to the application or to set the application on the command using the setApplication() method? You can also set the HelperSet directly using the setHelperSet() method.', $name)); - } - - return $this->helperSet->get($name); - } - - /** - * Validates a command name. - * - * It must be non-empty and parts can optionally be separated by ":". - * - * @throws InvalidArgumentException When the name is invalid - */ - private function validateName(string $name) - { - if (!preg_match('/^[^\:]++(\:[^\:]++)*$/', $name)) { - throw new InvalidArgumentException(sprintf('Command name "%s" is invalid.', $name)); - } - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Command/HelpCommand.php b/tools/php-cs-fixer/vendor/symfony/console/Command/HelpCommand.php deleted file mode 100644 index 9bcd776..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Command/HelpCommand.php +++ /dev/null @@ -1,83 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Command; - -use Symfony\Component\Console\Helper\DescriptorHelper; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * HelpCommand displays the help for a given command. - * - * @author Fabien Potencier - */ -class HelpCommand extends Command -{ - private $command; - - /** - * {@inheritdoc} - */ - protected function configure() - { - $this->ignoreValidationErrors(); - - $this - ->setName('help') - ->setDefinition([ - new InputArgument('command_name', InputArgument::OPTIONAL, 'The command name', 'help'), - new InputOption('format', null, InputOption::VALUE_REQUIRED, 'The output format (txt, xml, json, or md)', 'txt'), - 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 - -You can also output the help in other formats by using the --format option: - - %command.full_name% --format=xml list - -To display the list of available commands, please use the list command. -EOF - ) - ; - } - - public function setCommand(Command $command) - { - $this->command = $command; - } - - /** - * {@inheritdoc} - */ - protected function execute(InputInterface $input, OutputInterface $output) - { - if (null === $this->command) { - $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'), - ]); - - $this->command = null; - - return 0; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Command/LazyCommand.php b/tools/php-cs-fixer/vendor/symfony/console/Command/LazyCommand.php deleted file mode 100644 index 763133e..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Command/LazyCommand.php +++ /dev/null @@ -1,211 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Command; - -use Symfony\Component\Console\Application; -use Symfony\Component\Console\Helper\HelperSet; -use Symfony\Component\Console\Input\InputDefinition; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * @author Nicolas Grekas - */ -final class LazyCommand extends Command -{ - private $command; - private $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); - - $this->command = $commandFactory; - $this->isEnabled = $isEnabled; - } - - public function ignoreValidationErrors(): void - { - $this->getCommand()->ignoreValidationErrors(); - } - - public function setApplication(Application $application = null): void - { - if ($this->command instanceof parent) { - $this->command->setApplication($application); - } - - parent::setApplication($application); - } - - public function setHelperSet(HelperSet $helperSet): void - { - if ($this->command instanceof parent) { - $this->command->setHelperSet($helperSet); - } - - parent::setHelperSet($helperSet); - } - - public function isEnabled(): bool - { - return $this->isEnabled ?? $this->getCommand()->isEnabled(); - } - - public function run(InputInterface $input, OutputInterface $output): int - { - return $this->getCommand()->run($input, $output); - } - - /** - * @return $this - */ - public function setCode(callable $code): self - { - $this->getCommand()->setCode($code); - - return $this; - } - - /** - * @internal - */ - public function mergeApplicationDefinition(bool $mergeArgs = true): void - { - $this->getCommand()->mergeApplicationDefinition($mergeArgs); - } - - /** - * @return $this - */ - public function setDefinition($definition): self - { - $this->getCommand()->setDefinition($definition); - - return $this; - } - - public function getDefinition(): InputDefinition - { - return $this->getCommand()->getDefinition(); - } - - public function getNativeDefinition(): InputDefinition - { - return $this->getCommand()->getNativeDefinition(); - } - - /** - * @return $this - */ - public function addArgument(string $name, int $mode = null, string $description = '', $default = null): self - { - $this->getCommand()->addArgument($name, $mode, $description, $default); - - return $this; - } - - /** - * @return $this - */ - public function addOption(string $name, $shortcut = null, int $mode = null, string $description = '', $default = null): self - { - $this->getCommand()->addOption($name, $shortcut, $mode, $description, $default); - - return $this; - } - - /** - * @return $this - */ - public function setProcessTitle(string $title): self - { - $this->getCommand()->setProcessTitle($title); - - return $this; - } - - /** - * @return $this - */ - public function setHelp(string $help): self - { - $this->getCommand()->setHelp($help); - - return $this; - } - - public function getHelp(): string - { - return $this->getCommand()->getHelp(); - } - - public function getProcessedHelp(): string - { - return $this->getCommand()->getProcessedHelp(); - } - - public function getSynopsis(bool $short = false): string - { - return $this->getCommand()->getSynopsis($short); - } - - /** - * @return $this - */ - public function addUsage(string $usage): self - { - $this->getCommand()->addUsage($usage); - - return $this; - } - - public function getUsages(): array - { - return $this->getCommand()->getUsages(); - } - - /** - * @return mixed - */ - public function getHelper(string $name) - { - return $this->getCommand()->getHelper($name); - } - - public function getCommand(): parent - { - if (!$this->command instanceof \Closure) { - return $this->command; - } - - $command = $this->command = ($this->command)(); - $command->setApplication($this->getApplication()); - - if (null !== $this->getHelperSet()) { - $command->setHelperSet($this->getHelperSet()); - } - - $command->setName($this->getName()) - ->setAliases($this->getAliases()) - ->setHidden($this->isHidden()) - ->setDescription($this->getDescription()); - - // Will throw if the command is not correctly initialized. - $command->getDefinition(); - - return $command; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Command/ListCommand.php b/tools/php-cs-fixer/vendor/symfony/console/Command/ListCommand.php deleted file mode 100644 index a192285..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Command/ListCommand.php +++ /dev/null @@ -1,77 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Command; - -use Symfony\Component\Console\Helper\DescriptorHelper; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * ListCommand displays the list of all available commands for the application. - * - * @author Fabien Potencier - */ -class ListCommand extends Command -{ - /** - * {@inheritdoc} - */ - protected function configure() - { - $this - ->setName('list') - ->setDefinition([ - new InputArgument('namespace', InputArgument::OPTIONAL, 'The namespace name'), - 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'), - 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% - -You can also display the commands for a specific namespace: - - %command.full_name% test - -You can also output the information in other formats by using the --format option: - - %command.full_name% --format=xml - -It's also possible to get raw list of commands (useful for embedding command runner): - - %command.full_name% --raw -EOF - ) - ; - } - - /** - * {@inheritdoc} - */ - protected function execute(InputInterface $input, OutputInterface $output) - { - $helper = new DescriptorHelper(); - $helper->describe($output, $this->getApplication(), [ - 'format' => $input->getOption('format'), - 'raw_text' => $input->getOption('raw'), - 'namespace' => $input->getArgument('namespace'), - 'short' => $input->getOption('short'), - ]); - - return 0; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Command/LockableTrait.php b/tools/php-cs-fixer/vendor/symfony/console/Command/LockableTrait.php deleted file mode 100644 index 60cfe36..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Command/LockableTrait.php +++ /dev/null @@ -1,69 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Command; - -use Symfony\Component\Console\Exception\LogicException; -use Symfony\Component\Lock\Lock; -use Symfony\Component\Lock\LockFactory; -use Symfony\Component\Lock\Store\FlockStore; -use Symfony\Component\Lock\Store\SemaphoreStore; - -/** - * Basic lock feature for commands. - * - * @author Geoffrey Brier - */ -trait LockableTrait -{ - /** @var Lock */ - private $lock; - - /** - * Locks a command. - */ - private function lock(string $name = null, bool $blocking = false): bool - { - if (!class_exists(SemaphoreStore::class)) { - throw new LogicException('To enable the locking feature you must install the symfony/lock component.'); - } - - if (null !== $this->lock) { - throw new LogicException('A lock is already in place.'); - } - - if (SemaphoreStore::isSupported()) { - $store = new SemaphoreStore(); - } else { - $store = new FlockStore(); - } - - $this->lock = (new LockFactory($store))->createLock($name ?: $this->getName()); - if (!$this->lock->acquire($blocking)) { - $this->lock = null; - - return false; - } - - return true; - } - - /** - * Releases the command lock if there is one. - */ - private function release() - { - if ($this->lock) { - $this->lock->release(); - $this->lock = null; - } - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Command/SignalableCommandInterface.php b/tools/php-cs-fixer/vendor/symfony/console/Command/SignalableCommandInterface.php deleted file mode 100644 index d439728..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Command/SignalableCommandInterface.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Command; - -/** - * Interface for command reacting to signal. - * - * @author Grégoire Pineau - */ -interface SignalableCommandInterface -{ - /** - * Returns the list of signals to subscribe. - */ - public function getSubscribedSignals(): array; - - /** - * The method will be called when the application is signaled. - */ - public function handleSignal(int $signal): void; -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/CommandLoader/CommandLoaderInterface.php b/tools/php-cs-fixer/vendor/symfony/console/CommandLoader/CommandLoaderInterface.php deleted file mode 100644 index d4f44e8..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/CommandLoader/CommandLoaderInterface.php +++ /dev/null @@ -1,42 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\CommandLoader; - -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Exception\CommandNotFoundException; - -/** - * @author Robin Chalas - */ -interface CommandLoaderInterface -{ - /** - * Loads a command. - * - * @return Command - * - * @throws CommandNotFoundException - */ - public function get(string $name); - - /** - * Checks if a command exists. - * - * @return bool - */ - public function has(string $name); - - /** - * @return string[] All registered command names - */ - public function getNames(); -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/CommandLoader/ContainerCommandLoader.php b/tools/php-cs-fixer/vendor/symfony/console/CommandLoader/ContainerCommandLoader.php deleted file mode 100644 index ddccb3d..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/CommandLoader/ContainerCommandLoader.php +++ /dev/null @@ -1,63 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\CommandLoader; - -use Psr\Container\ContainerInterface; -use Symfony\Component\Console\Exception\CommandNotFoundException; - -/** - * Loads commands from a PSR-11 container. - * - * @author Robin Chalas - */ -class ContainerCommandLoader implements CommandLoaderInterface -{ - private $container; - private $commandMap; - - /** - * @param array $commandMap An array with command names as keys and service ids as values - */ - public function __construct(ContainerInterface $container, array $commandMap) - { - $this->container = $container; - $this->commandMap = $commandMap; - } - - /** - * {@inheritdoc} - */ - public function get(string $name) - { - if (!$this->has($name)) { - throw new CommandNotFoundException(sprintf('Command "%s" does not exist.', $name)); - } - - return $this->container->get($this->commandMap[$name]); - } - - /** - * {@inheritdoc} - */ - public function has(string $name) - { - return isset($this->commandMap[$name]) && $this->container->has($this->commandMap[$name]); - } - - /** - * {@inheritdoc} - */ - public function getNames() - { - return array_keys($this->commandMap); - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/CommandLoader/FactoryCommandLoader.php b/tools/php-cs-fixer/vendor/symfony/console/CommandLoader/FactoryCommandLoader.php deleted file mode 100644 index 7e2db34..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/CommandLoader/FactoryCommandLoader.php +++ /dev/null @@ -1,62 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\CommandLoader; - -use Symfony\Component\Console\Exception\CommandNotFoundException; - -/** - * A simple command loader using factories to instantiate commands lazily. - * - * @author Maxime Steinhausser - */ -class FactoryCommandLoader implements CommandLoaderInterface -{ - private $factories; - - /** - * @param callable[] $factories Indexed by command names - */ - public function __construct(array $factories) - { - $this->factories = $factories; - } - - /** - * {@inheritdoc} - */ - public function has(string $name) - { - return isset($this->factories[$name]); - } - - /** - * {@inheritdoc} - */ - public function get(string $name) - { - if (!isset($this->factories[$name])) { - throw new CommandNotFoundException(sprintf('Command "%s" does not exist.', $name)); - } - - $factory = $this->factories[$name]; - - return $factory(); - } - - /** - * {@inheritdoc} - */ - public function getNames() - { - return array_keys($this->factories); - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/ConsoleEvents.php b/tools/php-cs-fixer/vendor/symfony/console/ConsoleEvents.php deleted file mode 100644 index 6ae8f32..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/ConsoleEvents.php +++ /dev/null @@ -1,72 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console; - -use Symfony\Component\Console\Event\ConsoleCommandEvent; -use Symfony\Component\Console\Event\ConsoleErrorEvent; -use Symfony\Component\Console\Event\ConsoleSignalEvent; -use Symfony\Component\Console\Event\ConsoleTerminateEvent; - -/** - * Contains all events dispatched by an Application. - * - * @author Francesco Levorato - */ -final class ConsoleEvents -{ - /** - * The COMMAND event allows you to attach listeners before any command is - * executed by the console. It also allows you to modify the command, input and output - * before they are handed to the command. - * - * @Event("Symfony\Component\Console\Event\ConsoleCommandEvent") - */ - public const COMMAND = 'console.command'; - - /** - * The SIGNAL event allows you to perform some actions - * after the command execution was interrupted. - * - * @Event("Symfony\Component\Console\Event\ConsoleSignalEvent") - */ - public const SIGNAL = 'console.signal'; - - /** - * The TERMINATE event allows you to attach listeners after a command is - * executed by the console. - * - * @Event("Symfony\Component\Console\Event\ConsoleTerminateEvent") - */ - public const TERMINATE = 'console.terminate'; - - /** - * The ERROR event occurs when an uncaught exception or error appears. - * - * This event allows you to deal with the exception/error or - * to modify the thrown exception. - * - * @Event("Symfony\Component\Console\Event\ConsoleErrorEvent") - */ - public const ERROR = 'console.error'; - - /** - * Event aliases. - * - * These aliases can be consumed by RegisterListenersPass. - */ - public const ALIASES = [ - ConsoleCommandEvent::class => self::COMMAND, - ConsoleErrorEvent::class => self::ERROR, - ConsoleSignalEvent::class => self::SIGNAL, - ConsoleTerminateEvent::class => self::TERMINATE, - ]; -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Cursor.php b/tools/php-cs-fixer/vendor/symfony/console/Cursor.php deleted file mode 100644 index dcb5b5a..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Cursor.php +++ /dev/null @@ -1,168 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console; - -use Symfony\Component\Console\Output\OutputInterface; - -/** - * @author Pierre du Plessis - */ -final class Cursor -{ - private $output; - private $input; - - public function __construct(OutputInterface $output, $input = null) - { - $this->output = $output; - $this->input = $input ?? (\defined('STDIN') ? \STDIN : fopen('php://input', 'r+')); - } - - public function moveUp(int $lines = 1): self - { - $this->output->write(sprintf("\x1b[%dA", $lines)); - - return $this; - } - - public function moveDown(int $lines = 1): self - { - $this->output->write(sprintf("\x1b[%dB", $lines)); - - return $this; - } - - public function moveRight(int $columns = 1): self - { - $this->output->write(sprintf("\x1b[%dC", $columns)); - - return $this; - } - - public function moveLeft(int $columns = 1): self - { - $this->output->write(sprintf("\x1b[%dD", $columns)); - - return $this; - } - - public function moveToColumn(int $column): self - { - $this->output->write(sprintf("\x1b[%dG", $column)); - - return $this; - } - - public function moveToPosition(int $column, int $row): self - { - $this->output->write(sprintf("\x1b[%d;%dH", $row + 1, $column)); - - return $this; - } - - public function savePosition(): self - { - $this->output->write("\x1b7"); - - return $this; - } - - public function restorePosition(): self - { - $this->output->write("\x1b8"); - - return $this; - } - - public function hide(): self - { - $this->output->write("\x1b[?25l"); - - return $this; - } - - public function show(): self - { - $this->output->write("\x1b[?25h\x1b[?0c"); - - return $this; - } - - /** - * Clears all the output from the current line. - */ - public function clearLine(): self - { - $this->output->write("\x1b[2K"); - - return $this; - } - - /** - * Clears all the output from the current line after the current position. - */ - public function clearLineAfter(): self - { - $this->output->write("\x1b[K"); - - return $this; - } - - /** - * Clears all the output from the cursors' current position to the end of the screen. - */ - public function clearOutput(): self - { - $this->output->write("\x1b[0J"); - - return $this; - } - - /** - * Clears the entire screen. - */ - public function clearScreen(): self - { - $this->output->write("\x1b[2J"); - - return $this; - } - - /** - * Returns the current cursor position as x,y coordinates. - */ - public function getCurrentPosition(): array - { - static $isTtySupported; - - if (null === $isTtySupported && \function_exists('proc_open')) { - $isTtySupported = (bool) @proc_open('echo 1 >/dev/null', [['file', '/dev/tty', 'r'], ['file', '/dev/tty', 'w'], ['file', '/dev/tty', 'w']], $pipes); - } - - if (!$isTtySupported) { - return [1, 1]; - } - - $sttyMode = shell_exec('stty -g'); - shell_exec('stty -icanon -echo'); - - @fwrite($this->input, "\033[6n"); - - $code = trim(fread($this->input, 1024)); - - shell_exec(sprintf('stty %s', $sttyMode)); - - sscanf($code, "\033[%d;%dR", $row, $col); - - return [$col, $row]; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/DependencyInjection/AddConsoleCommandPass.php b/tools/php-cs-fixer/vendor/symfony/console/DependencyInjection/AddConsoleCommandPass.php deleted file mode 100644 index 743e306..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/DependencyInjection/AddConsoleCommandPass.php +++ /dev/null @@ -1,148 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\DependencyInjection; - -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Command\LazyCommand; -use Symfony\Component\Console\CommandLoader\ContainerCommandLoader; -use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument; -use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; -use Symfony\Component\DependencyInjection\Compiler\ServiceLocatorTagPass; -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; -use Symfony\Component\DependencyInjection\Reference; -use Symfony\Component\DependencyInjection\TypedReference; - -/** - * Registers console commands. - * - * @author Grégoire Pineau - */ -class AddConsoleCommandPass implements CompilerPassInterface -{ - private $commandLoaderServiceId; - private $commandTag; - private $noPreloadTag; - private $privateTagName; - - public function __construct(string $commandLoaderServiceId = 'console.command_loader', string $commandTag = 'console.command', string $noPreloadTag = 'container.no_preload', string $privateTagName = 'container.private') - { - if (0 < \func_num_args()) { - trigger_deprecation('symfony/console', '5.3', 'Configuring "%s" is deprecated.', __CLASS__); - } - - $this->commandLoaderServiceId = $commandLoaderServiceId; - $this->commandTag = $commandTag; - $this->noPreloadTag = $noPreloadTag; - $this->privateTagName = $privateTagName; - } - - public function process(ContainerBuilder $container) - { - $commandServices = $container->findTaggedServiceIds($this->commandTag, true); - $lazyCommandMap = []; - $lazyCommandRefs = []; - $serviceIds = []; - - foreach ($commandServices as $id => $tags) { - $definition = $container->getDefinition($id); - $definition->addTag($this->noPreloadTag); - $class = $container->getParameterBag()->resolveValue($definition->getClass()); - - if (isset($tags[0]['command'])) { - $aliases = $tags[0]['command']; - } else { - if (!$r = $container->getReflectionClass($class)) { - throw new InvalidArgumentException(sprintf('Class "%s" used for service "%s" cannot be found.', $class, $id)); - } - if (!$r->isSubclassOf(Command::class)) { - throw new InvalidArgumentException(sprintf('The service "%s" tagged "%s" must be a subclass of "%s".', $id, $this->commandTag, Command::class)); - } - $aliases = $class::getDefaultName(); - } - - $aliases = explode('|', $aliases ?? ''); - $commandName = array_shift($aliases); - - if ($isHidden = '' === $commandName) { - $commandName = array_shift($aliases); - } - - if (null === $commandName) { - if (!$definition->isPublic() || $definition->isPrivate() || $definition->hasTag($this->privateTagName)) { - $commandId = 'console.command.public_alias.'.$id; - $container->setAlias($commandId, $id)->setPublic(true); - $id = $commandId; - } - $serviceIds[] = $id; - - continue; - } - - $description = $tags[0]['description'] ?? null; - - unset($tags[0]); - $lazyCommandMap[$commandName] = $id; - $lazyCommandRefs[$id] = new TypedReference($id, $class); - - foreach ($aliases as $alias) { - $lazyCommandMap[$alias] = $id; - } - - foreach ($tags as $tag) { - if (isset($tag['command'])) { - $aliases[] = $tag['command']; - $lazyCommandMap[$tag['command']] = $id; - } - - $description = $description ?? $tag['description'] ?? null; - } - - $definition->addMethodCall('setName', [$commandName]); - - if ($aliases) { - $definition->addMethodCall('setAliases', [$aliases]); - } - - if ($isHidden) { - $definition->addMethodCall('setHidden', [true]); - } - - if (!$description) { - if (!$r = $container->getReflectionClass($class)) { - throw new InvalidArgumentException(sprintf('Class "%s" used for service "%s" cannot be found.', $class, $id)); - } - if (!$r->isSubclassOf(Command::class)) { - throw new InvalidArgumentException(sprintf('The service "%s" tagged "%s" must be a subclass of "%s".', $id, $this->commandTag, Command::class)); - } - $description = $class::getDefaultDescription(); - } - - if ($description) { - $definition->addMethodCall('setDescription', [$description]); - - $container->register('.'.$id.'.lazy', LazyCommand::class) - ->setArguments([$commandName, $aliases, $description, $isHidden, new ServiceClosureArgument($lazyCommandRefs[$id])]); - - $lazyCommandRefs[$id] = new Reference('.'.$id.'.lazy'); - } - } - - $container - ->register($this->commandLoaderServiceId, ContainerCommandLoader::class) - ->setPublic(true) - ->addTag($this->noPreloadTag) - ->setArguments([ServiceLocatorTagPass::register($container, $lazyCommandRefs), $lazyCommandMap]); - - $container->setParameter('console.command.ids', $serviceIds); - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Descriptor/ApplicationDescription.php b/tools/php-cs-fixer/vendor/symfony/console/Descriptor/ApplicationDescription.php deleted file mode 100644 index 3970b90..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Descriptor/ApplicationDescription.php +++ /dev/null @@ -1,143 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Descriptor; - -use Symfony\Component\Console\Application; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Exception\CommandNotFoundException; - -/** - * @author Jean-François Simon - * - * @internal - */ -class ApplicationDescription -{ - public const GLOBAL_NAMESPACE = '_global'; - - private $application; - private $namespace; - private $showHidden; - - /** - * @var array - */ - private $namespaces; - - /** - * @var Command[] - */ - private $commands; - - /** - * @var Command[] - */ - private $aliases; - - public function __construct(Application $application, string $namespace = null, bool $showHidden = false) - { - $this->application = $application; - $this->namespace = $namespace; - $this->showHidden = $showHidden; - } - - public function getNamespaces(): array - { - if (null === $this->namespaces) { - $this->inspectApplication(); - } - - return $this->namespaces; - } - - /** - * @return Command[] - */ - public function getCommands(): array - { - if (null === $this->commands) { - $this->inspectApplication(); - } - - return $this->commands; - } - - /** - * @throws CommandNotFoundException - */ - public function getCommand(string $name): Command - { - if (!isset($this->commands[$name]) && !isset($this->aliases[$name])) { - throw new CommandNotFoundException(sprintf('Command "%s" does not exist.', $name)); - } - - return $this->commands[$name] ?? $this->aliases[$name]; - } - - private function inspectApplication() - { - $this->commands = []; - $this->namespaces = []; - - $all = $this->application->all($this->namespace ? $this->application->findNamespace($this->namespace) : null); - foreach ($this->sortCommands($all) as $namespace => $commands) { - $names = []; - - /** @var Command $command */ - foreach ($commands as $name => $command) { - if (!$command->getName() || (!$this->showHidden && $command->isHidden())) { - continue; - } - - if ($command->getName() === $name) { - $this->commands[$name] = $command; - } else { - $this->aliases[$name] = $command; - } - - $names[] = $name; - } - - $this->namespaces[$namespace] = ['id' => $namespace, 'commands' => $names]; - } - } - - private function sortCommands(array $commands): array - { - $namespacedCommands = []; - $globalCommands = []; - $sortedCommands = []; - foreach ($commands as $name => $command) { - $key = $this->application->extractNamespace($name, 1); - if (\in_array($key, ['', self::GLOBAL_NAMESPACE], true)) { - $globalCommands[$name] = $command; - } else { - $namespacedCommands[$key][$name] = $command; - } - } - - if ($globalCommands) { - ksort($globalCommands); - $sortedCommands[self::GLOBAL_NAMESPACE] = $globalCommands; - } - - if ($namespacedCommands) { - ksort($namespacedCommands); - foreach ($namespacedCommands as $key => $commandsSet) { - ksort($commandsSet); - $sortedCommands[$key] = $commandsSet; - } - } - - return $sortedCommands; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Descriptor/Descriptor.php b/tools/php-cs-fixer/vendor/symfony/console/Descriptor/Descriptor.php deleted file mode 100644 index a364830..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Descriptor/Descriptor.php +++ /dev/null @@ -1,94 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Descriptor; - -use Symfony\Component\Console\Application; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Exception\InvalidArgumentException; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputDefinition; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * @author Jean-François Simon - * - * @internal - */ -abstract class Descriptor implements DescriptorInterface -{ - /** - * @var OutputInterface - */ - protected $output; - - /** - * {@inheritdoc} - */ - public function describe(OutputInterface $output, object $object, array $options = []) - { - $this->output = $output; - - switch (true) { - case $object instanceof InputArgument: - $this->describeInputArgument($object, $options); - break; - case $object instanceof InputOption: - $this->describeInputOption($object, $options); - break; - case $object instanceof InputDefinition: - $this->describeInputDefinition($object, $options); - break; - case $object instanceof Command: - $this->describeCommand($object, $options); - break; - case $object instanceof Application: - $this->describeApplication($object, $options); - break; - default: - throw new InvalidArgumentException(sprintf('Object of type "%s" is not describable.', get_debug_type($object))); - } - } - - /** - * Writes content to output. - */ - protected function write(string $content, bool $decorated = false) - { - $this->output->write($content, false, $decorated ? OutputInterface::OUTPUT_NORMAL : OutputInterface::OUTPUT_RAW); - } - - /** - * Describes an InputArgument instance. - */ - abstract protected function describeInputArgument(InputArgument $argument, array $options = []); - - /** - * Describes an InputOption instance. - */ - abstract protected function describeInputOption(InputOption $option, array $options = []); - - /** - * Describes an InputDefinition instance. - */ - abstract protected function describeInputDefinition(InputDefinition $definition, array $options = []); - - /** - * Describes a Command instance. - */ - abstract protected function describeCommand(Command $command, array $options = []); - - /** - * Describes an Application instance. - */ - abstract protected function describeApplication(Application $application, array $options = []); -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Descriptor/DescriptorInterface.php b/tools/php-cs-fixer/vendor/symfony/console/Descriptor/DescriptorInterface.php deleted file mode 100644 index ebea303..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Descriptor/DescriptorInterface.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Descriptor; - -use Symfony\Component\Console\Output\OutputInterface; - -/** - * Descriptor interface. - * - * @author Jean-François Simon - */ -interface DescriptorInterface -{ - public function describe(OutputInterface $output, object $object, array $options = []); -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Descriptor/JsonDescriptor.php b/tools/php-cs-fixer/vendor/symfony/console/Descriptor/JsonDescriptor.php deleted file mode 100644 index 1d28659..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Descriptor/JsonDescriptor.php +++ /dev/null @@ -1,181 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Descriptor; - -use Symfony\Component\Console\Application; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputDefinition; -use Symfony\Component\Console\Input\InputOption; - -/** - * JSON descriptor. - * - * @author Jean-François Simon - * - * @internal - */ -class JsonDescriptor extends Descriptor -{ - /** - * {@inheritdoc} - */ - protected function describeInputArgument(InputArgument $argument, array $options = []) - { - $this->writeData($this->getInputArgumentData($argument), $options); - } - - /** - * {@inheritdoc} - */ - protected function describeInputOption(InputOption $option, array $options = []) - { - $this->writeData($this->getInputOptionData($option), $options); - if ($option->isNegatable()) { - $this->writeData($this->getInputOptionData($option, true), $options); - } - } - - /** - * {@inheritdoc} - */ - protected function describeInputDefinition(InputDefinition $definition, array $options = []) - { - $this->writeData($this->getInputDefinitionData($definition), $options); - } - - /** - * {@inheritdoc} - */ - protected function describeCommand(Command $command, array $options = []) - { - $this->writeData($this->getCommandData($command, $options['short'] ?? false), $options); - } - - /** - * {@inheritdoc} - */ - protected function describeApplication(Application $application, array $options = []) - { - $describedNamespace = $options['namespace'] ?? null; - $description = new ApplicationDescription($application, $describedNamespace, true); - $commands = []; - - foreach ($description->getCommands() as $command) { - $commands[] = $this->getCommandData($command, $options['short'] ?? false); - } - - $data = []; - if ('UNKNOWN' !== $application->getName()) { - $data['application']['name'] = $application->getName(); - if ('UNKNOWN' !== $application->getVersion()) { - $data['application']['version'] = $application->getVersion(); - } - } - - $data['commands'] = $commands; - - if ($describedNamespace) { - $data['namespace'] = $describedNamespace; - } else { - $data['namespaces'] = array_values($description->getNamespaces()); - } - - $this->writeData($data, $options); - } - - /** - * Writes data as json. - */ - private function writeData(array $data, array $options) - { - $flags = $options['json_encoding'] ?? 0; - - $this->write(json_encode($data, $flags)); - } - - private function getInputArgumentData(InputArgument $argument): array - { - return [ - 'name' => $argument->getName(), - 'is_required' => $argument->isRequired(), - 'is_array' => $argument->isArray(), - 'description' => preg_replace('/\s*[\r\n]\s*/', ' ', $argument->getDescription()), - 'default' => \INF === $argument->getDefault() ? 'INF' : $argument->getDefault(), - ]; - } - - private function getInputOptionData(InputOption $option, bool $negated = false): array - { - return $negated ? [ - 'name' => '--no-'.$option->getName(), - 'shortcut' => '', - 'accept_value' => false, - 'is_value_required' => false, - 'is_multiple' => false, - 'description' => 'Negate the "--'.$option->getName().'" option', - 'default' => false, - ] : [ - 'name' => '--'.$option->getName(), - 'shortcut' => $option->getShortcut() ? '-'.str_replace('|', '|-', $option->getShortcut()) : '', - 'accept_value' => $option->acceptValue(), - 'is_value_required' => $option->isValueRequired(), - 'is_multiple' => $option->isArray(), - 'description' => preg_replace('/\s*[\r\n]\s*/', ' ', $option->getDescription()), - 'default' => \INF === $option->getDefault() ? 'INF' : $option->getDefault(), - ]; - } - - private function getInputDefinitionData(InputDefinition $definition): array - { - $inputArguments = []; - foreach ($definition->getArguments() as $name => $argument) { - $inputArguments[$name] = $this->getInputArgumentData($argument); - } - - $inputOptions = []; - foreach ($definition->getOptions() as $name => $option) { - $inputOptions[$name] = $this->getInputOptionData($option); - if ($option->isNegatable()) { - $inputOptions['no-'.$name] = $this->getInputOptionData($option, true); - } - } - - return ['arguments' => $inputArguments, 'options' => $inputOptions]; - } - - private function getCommandData(Command $command, bool $short = false): array - { - $data = [ - 'name' => $command->getName(), - 'description' => $command->getDescription(), - ]; - - if ($short) { - $data += [ - 'usage' => $command->getAliases(), - ]; - } else { - $command->mergeApplicationDefinition(false); - - $data += [ - 'usage' => array_merge([$command->getSynopsis()], $command->getUsages(), $command->getAliases()), - 'help' => $command->getProcessedHelp(), - 'definition' => $this->getInputDefinitionData($command->getDefinition()), - ]; - } - - $data['hidden'] = $command->isHidden(); - - return $data; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Descriptor/MarkdownDescriptor.php b/tools/php-cs-fixer/vendor/symfony/console/Descriptor/MarkdownDescriptor.php deleted file mode 100644 index 21ceca6..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Descriptor/MarkdownDescriptor.php +++ /dev/null @@ -1,206 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Descriptor; - -use Symfony\Component\Console\Application; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Helper\Helper; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputDefinition; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * Markdown descriptor. - * - * @author Jean-François Simon - * - * @internal - */ -class MarkdownDescriptor extends Descriptor -{ - /** - * {@inheritdoc} - */ - public function describe(OutputInterface $output, object $object, array $options = []) - { - $decorated = $output->isDecorated(); - $output->setDecorated(false); - - parent::describe($output, $object, $options); - - $output->setDecorated($decorated); - } - - /** - * {@inheritdoc} - */ - protected function write(string $content, bool $decorated = true) - { - parent::write($content, $decorated); - } - - /** - * {@inheritdoc} - */ - protected function describeInputArgument(InputArgument $argument, array $options = []) - { - $this->write( - '#### `'.($argument->getName() ?: '')."`\n\n" - .($argument->getDescription() ? preg_replace('/\s*[\r\n]\s*/', "\n", $argument->getDescription())."\n\n" : '') - .'* Is required: '.($argument->isRequired() ? 'yes' : 'no')."\n" - .'* Is array: '.($argument->isArray() ? 'yes' : 'no')."\n" - .'* Default: `'.str_replace("\n", '', var_export($argument->getDefault(), true)).'`' - ); - } - - /** - * {@inheritdoc} - */ - protected function describeInputOption(InputOption $option, array $options = []) - { - $name = '--'.$option->getName(); - if ($option->isNegatable()) { - $name .= '|--no-'.$option->getName(); - } - if ($option->getShortcut()) { - $name .= '|-'.str_replace('|', '|-', $option->getShortcut()).''; - } - - $this->write( - '#### `'.$name.'`'."\n\n" - .($option->getDescription() ? preg_replace('/\s*[\r\n]\s*/', "\n", $option->getDescription())."\n\n" : '') - .'* Accept value: '.($option->acceptValue() ? 'yes' : 'no')."\n" - .'* Is value required: '.($option->isValueRequired() ? 'yes' : 'no')."\n" - .'* Is multiple: '.($option->isArray() ? 'yes' : 'no')."\n" - .'* Is negatable: '.($option->isNegatable() ? 'yes' : 'no')."\n" - .'* Default: `'.str_replace("\n", '', var_export($option->getDefault(), true)).'`' - ); - } - - /** - * {@inheritdoc} - */ - protected function describeInputDefinition(InputDefinition $definition, array $options = []) - { - if ($showArguments = \count($definition->getArguments()) > 0) { - $this->write('### Arguments'); - foreach ($definition->getArguments() as $argument) { - $this->write("\n\n"); - if (null !== $describeInputArgument = $this->describeInputArgument($argument)) { - $this->write($describeInputArgument); - } - } - } - - if (\count($definition->getOptions()) > 0) { - if ($showArguments) { - $this->write("\n\n"); - } - - $this->write('### Options'); - foreach ($definition->getOptions() as $option) { - $this->write("\n\n"); - if (null !== $describeInputOption = $this->describeInputOption($option)) { - $this->write($describeInputOption); - } - } - } - } - - /** - * {@inheritdoc} - */ - protected function describeCommand(Command $command, array $options = []) - { - 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"; - }) - ); - - 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"; - }) - ); - - if ($help = $command->getProcessedHelp()) { - $this->write("\n"); - $this->write($help); - } - - $definition = $command->getDefinition(); - if ($definition->getOptions() || $definition->getArguments()) { - $this->write("\n\n"); - $this->describeInputDefinition($definition); - } - } - - /** - * {@inheritdoc} - */ - protected function describeApplication(Application $application, array $options = []) - { - $describedNamespace = $options['namespace'] ?? null; - $description = new ApplicationDescription($application, $describedNamespace); - $title = $this->getApplicationTitle($application); - - $this->write($title."\n".str_repeat('=', Helper::width($title))); - - foreach ($description->getNamespaces() as $namespace) { - if (ApplicationDescription::GLOBAL_NAMESPACE !== $namespace['id']) { - $this->write("\n\n"); - $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']))); - } - - foreach ($description->getCommands() as $command) { - $this->write("\n\n"); - if (null !== $describeCommand = $this->describeCommand($command, $options)) { - $this->write($describeCommand); - } - } - } - - private function getApplicationTitle(Application $application): string - { - if ('UNKNOWN' !== $application->getName()) { - if ('UNKNOWN' !== $application->getVersion()) { - return sprintf('%s %s', $application->getName(), $application->getVersion()); - } - - return $application->getName(); - } - - return 'Console Tool'; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Descriptor/TextDescriptor.php b/tools/php-cs-fixer/vendor/symfony/console/Descriptor/TextDescriptor.php deleted file mode 100644 index fbb140a..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Descriptor/TextDescriptor.php +++ /dev/null @@ -1,341 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Descriptor; - -use Symfony\Component\Console\Application; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Formatter\OutputFormatter; -use Symfony\Component\Console\Helper\Helper; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputDefinition; -use Symfony\Component\Console\Input\InputOption; - -/** - * Text descriptor. - * - * @author Jean-François Simon - * - * @internal - */ -class TextDescriptor extends Descriptor -{ - /** - * {@inheritdoc} - */ - protected function describeInputArgument(InputArgument $argument, array $options = []) - { - if (null !== $argument->getDefault() && (!\is_array($argument->getDefault()) || \count($argument->getDefault()))) { - $default = sprintf(' [default: %s]', $this->formatDefaultValue($argument->getDefault())); - } else { - $default = ''; - } - - $totalWidth = $options['total_width'] ?? Helper::width($argument->getName()); - $spacingWidth = $totalWidth - \strlen($argument->getName()); - - $this->writeText(sprintf(' %s %s%s%s', - $argument->getName(), - str_repeat(' ', $spacingWidth), - // + 4 = 2 spaces before , 2 spaces after - preg_replace('/\s*[\r\n]\s*/', "\n".str_repeat(' ', $totalWidth + 4), $argument->getDescription()), - $default - ), $options); - } - - /** - * {@inheritdoc} - */ - protected function describeInputOption(InputOption $option, array $options = []) - { - if ($option->acceptValue() && null !== $option->getDefault() && (!\is_array($option->getDefault()) || \count($option->getDefault()))) { - $default = sprintf(' [default: %s]', $this->formatDefaultValue($option->getDefault())); - } else { - $default = ''; - } - - $value = ''; - if ($option->acceptValue()) { - $value = '='.strtoupper($option->getName()); - - if ($option->isValueOptional()) { - $value = '['.$value.']'; - } - } - - $totalWidth = $options['total_width'] ?? $this->calculateTotalWidthForOptions([$option]); - $synopsis = sprintf('%s%s', - $option->getShortcut() ? sprintf('-%s, ', $option->getShortcut()) : ' ', - sprintf($option->isNegatable() ? '--%1$s|--no-%1$s' : '--%1$s%2$s', $option->getName(), $value) - ); - - $spacingWidth = $totalWidth - Helper::width($synopsis); - - $this->writeText(sprintf(' %s %s%s%s%s', - $synopsis, - str_repeat(' ', $spacingWidth), - // + 4 = 2 spaces before , 2 spaces after - preg_replace('/\s*[\r\n]\s*/', "\n".str_repeat(' ', $totalWidth + 4), $option->getDescription()), - $default, - $option->isArray() ? ' (multiple values allowed)' : '' - ), $options); - } - - /** - * {@inheritdoc} - */ - protected function describeInputDefinition(InputDefinition $definition, array $options = []) - { - $totalWidth = $this->calculateTotalWidthForOptions($definition->getOptions()); - foreach ($definition->getArguments() as $argument) { - $totalWidth = max($totalWidth, Helper::width($argument->getName())); - } - - if ($definition->getArguments()) { - $this->writeText('Arguments:', $options); - $this->writeText("\n"); - foreach ($definition->getArguments() as $argument) { - $this->describeInputArgument($argument, array_merge($options, ['total_width' => $totalWidth])); - $this->writeText("\n"); - } - } - - if ($definition->getArguments() && $definition->getOptions()) { - $this->writeText("\n"); - } - - if ($definition->getOptions()) { - $laterOptions = []; - - $this->writeText('Options:', $options); - foreach ($definition->getOptions() as $option) { - if (\strlen($option->getShortcut() ?? '') > 1) { - $laterOptions[] = $option; - continue; - } - $this->writeText("\n"); - $this->describeInputOption($option, array_merge($options, ['total_width' => $totalWidth])); - } - foreach ($laterOptions as $option) { - $this->writeText("\n"); - $this->describeInputOption($option, array_merge($options, ['total_width' => $totalWidth])); - } - } - } - - /** - * {@inheritdoc} - */ - protected function describeCommand(Command $command, array $options = []) - { - $command->mergeApplicationDefinition(false); - - if ($description = $command->getDescription()) { - $this->writeText('Description:', $options); - $this->writeText("\n"); - $this->writeText(' '.$description); - $this->writeText("\n\n"); - } - - $this->writeText('Usage:', $options); - foreach (array_merge([$command->getSynopsis(true)], $command->getAliases(), $command->getUsages()) as $usage) { - $this->writeText("\n"); - $this->writeText(' '.OutputFormatter::escape($usage), $options); - } - $this->writeText("\n"); - - $definition = $command->getDefinition(); - if ($definition->getOptions() || $definition->getArguments()) { - $this->writeText("\n"); - $this->describeInputDefinition($definition, $options); - $this->writeText("\n"); - } - - $help = $command->getProcessedHelp(); - if ($help && $help !== $description) { - $this->writeText("\n"); - $this->writeText('Help:', $options); - $this->writeText("\n"); - $this->writeText(' '.str_replace("\n", "\n ", $help), $options); - $this->writeText("\n"); - } - } - - /** - * {@inheritdoc} - */ - protected function describeApplication(Application $application, array $options = []) - { - $describedNamespace = $options['namespace'] ?? null; - $description = new ApplicationDescription($application, $describedNamespace); - - if (isset($options['raw_text']) && $options['raw_text']) { - $width = $this->getColumnWidth($description->getCommands()); - - foreach ($description->getCommands() as $command) { - $this->writeText(sprintf("%-{$width}s %s", $command->getName(), $command->getDescription()), $options); - $this->writeText("\n"); - } - } else { - if ('' != $help = $application->getHelp()) { - $this->writeText("$help\n\n", $options); - } - - $this->writeText("Usage:\n", $options); - $this->writeText(" command [options] [arguments]\n\n", $options); - - $this->describeInputDefinition(new InputDefinition($application->getDefinition()->getOptions()), $options); - - $this->writeText("\n"); - $this->writeText("\n"); - - $commands = $description->getCommands(); - $namespaces = $description->getNamespaces(); - if ($describedNamespace && $namespaces) { - // make sure all alias commands are included when describing a specific namespace - $describedNamespaceInfo = reset($namespaces); - foreach ($describedNamespaceInfo['commands'] as $name) { - $commands[$name] = $description->getCommand($name); - } - } - - // 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))))); - - 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]); - }); - - if (!$namespace['commands']) { - continue; - } - - if (!$describedNamespace && ApplicationDescription::GLOBAL_NAMESPACE !== $namespace['id']) { - $this->writeText("\n"); - $this->writeText(' '.$namespace['id'].'', $options); - } - - foreach ($namespace['commands'] as $name) { - $this->writeText("\n"); - $spacingWidth = $width - Helper::width($name); - $command = $commands[$name]; - $commandAliases = $name === $command->getName() ? $this->getCommandAliasesText($command) : ''; - $this->writeText(sprintf(' %s%s%s', $name, str_repeat(' ', $spacingWidth), $commandAliases.$command->getDescription()), $options); - } - } - - $this->writeText("\n"); - } - } - - /** - * {@inheritdoc} - */ - private function writeText(string $content, array $options = []) - { - $this->write( - isset($options['raw_text']) && $options['raw_text'] ? strip_tags($content) : $content, - isset($options['raw_output']) ? !$options['raw_output'] : true - ); - } - - /** - * Formats command aliases to show them in the command description. - */ - private function getCommandAliasesText(Command $command): string - { - $text = ''; - $aliases = $command->getAliases(); - - if ($aliases) { - $text = '['.implode('|', $aliases).'] '; - } - - return $text; - } - - /** - * Formats input option/argument default value. - * - * @param mixed $default - */ - private function formatDefaultValue($default): string - { - if (\INF === $default) { - return 'INF'; - } - - if (\is_string($default)) { - $default = OutputFormatter::escape($default); - } elseif (\is_array($default)) { - foreach ($default as $key => $value) { - if (\is_string($value)) { - $default[$key] = OutputFormatter::escape($value); - } - } - } - - return str_replace('\\\\', '\\', json_encode($default, \JSON_UNESCAPED_SLASHES | \JSON_UNESCAPED_UNICODE)); - } - - /** - * @param array $commands - */ - private function getColumnWidth(array $commands): int - { - $widths = []; - - foreach ($commands as $command) { - if ($command instanceof Command) { - $widths[] = Helper::width($command->getName()); - foreach ($command->getAliases() as $alias) { - $widths[] = Helper::width($alias); - } - } else { - $widths[] = Helper::width($command); - } - } - - return $widths ? max($widths) + 2 : 0; - } - - /** - * @param InputOption[] $options - */ - private function calculateTotalWidthForOptions(array $options): int - { - $totalWidth = 0; - foreach ($options as $option) { - // "-" + shortcut + ", --" + name - $nameLength = 1 + max(Helper::width($option->getShortcut()), 1) + 4 + Helper::width($option->getName()); - if ($option->isNegatable()) { - $nameLength += 6 + Helper::width($option->getName()); // |--no- + name - } elseif ($option->acceptValue()) { - $valueLength = 1 + Helper::width($option->getName()); // = + value - $valueLength += $option->isValueOptional() ? 2 : 0; // [ + ] - - $nameLength += $valueLength; - } - $totalWidth = max($totalWidth, $nameLength); - } - - return $totalWidth; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Descriptor/XmlDescriptor.php b/tools/php-cs-fixer/vendor/symfony/console/Descriptor/XmlDescriptor.php deleted file mode 100644 index 4f7cd8b..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Descriptor/XmlDescriptor.php +++ /dev/null @@ -1,247 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Descriptor; - -use Symfony\Component\Console\Application; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputDefinition; -use Symfony\Component\Console\Input\InputOption; - -/** - * XML descriptor. - * - * @author Jean-François Simon - * - * @internal - */ -class XmlDescriptor extends Descriptor -{ - public function getInputDefinitionDocument(InputDefinition $definition): \DOMDocument - { - $dom = new \DOMDocument('1.0', 'UTF-8'); - $dom->appendChild($definitionXML = $dom->createElement('definition')); - - $definitionXML->appendChild($argumentsXML = $dom->createElement('arguments')); - foreach ($definition->getArguments() as $argument) { - $this->appendDocument($argumentsXML, $this->getInputArgumentDocument($argument)); - } - - $definitionXML->appendChild($optionsXML = $dom->createElement('options')); - foreach ($definition->getOptions() as $option) { - $this->appendDocument($optionsXML, $this->getInputOptionDocument($option)); - } - - return $dom; - } - - public function getCommandDocument(Command $command, bool $short = false): \DOMDocument - { - $dom = new \DOMDocument('1.0', 'UTF-8'); - $dom->appendChild($commandXML = $dom->createElement('command')); - - $commandXML->setAttribute('id', $command->getName()); - $commandXML->setAttribute('name', $command->getName()); - $commandXML->setAttribute('hidden', $command->isHidden() ? 1 : 0); - - $commandXML->appendChild($usagesXML = $dom->createElement('usages')); - - $commandXML->appendChild($descriptionXML = $dom->createElement('description')); - $descriptionXML->appendChild($dom->createTextNode(str_replace("\n", "\n ", $command->getDescription()))); - - if ($short) { - foreach ($command->getAliases() as $usage) { - $usagesXML->appendChild($dom->createElement('usage', $usage)); - } - } else { - $command->mergeApplicationDefinition(false); - - foreach (array_merge([$command->getSynopsis()], $command->getAliases(), $command->getUsages()) as $usage) { - $usagesXML->appendChild($dom->createElement('usage', $usage)); - } - - $commandXML->appendChild($helpXML = $dom->createElement('help')); - $helpXML->appendChild($dom->createTextNode(str_replace("\n", "\n ", $command->getProcessedHelp()))); - - $definitionXML = $this->getInputDefinitionDocument($command->getDefinition()); - $this->appendDocument($commandXML, $definitionXML->getElementsByTagName('definition')->item(0)); - } - - return $dom; - } - - public function getApplicationDocument(Application $application, string $namespace = null, bool $short = false): \DOMDocument - { - $dom = new \DOMDocument('1.0', 'UTF-8'); - $dom->appendChild($rootXml = $dom->createElement('symfony')); - - if ('UNKNOWN' !== $application->getName()) { - $rootXml->setAttribute('name', $application->getName()); - if ('UNKNOWN' !== $application->getVersion()) { - $rootXml->setAttribute('version', $application->getVersion()); - } - } - - $rootXml->appendChild($commandsXML = $dom->createElement('commands')); - - $description = new ApplicationDescription($application, $namespace, true); - - if ($namespace) { - $commandsXML->setAttribute('namespace', $namespace); - } - - foreach ($description->getCommands() as $command) { - $this->appendDocument($commandsXML, $this->getCommandDocument($command, $short)); - } - - if (!$namespace) { - $rootXml->appendChild($namespacesXML = $dom->createElement('namespaces')); - - foreach ($description->getNamespaces() as $namespaceDescription) { - $namespacesXML->appendChild($namespaceArrayXML = $dom->createElement('namespace')); - $namespaceArrayXML->setAttribute('id', $namespaceDescription['id']); - - foreach ($namespaceDescription['commands'] as $name) { - $namespaceArrayXML->appendChild($commandXML = $dom->createElement('command')); - $commandXML->appendChild($dom->createTextNode($name)); - } - } - } - - return $dom; - } - - /** - * {@inheritdoc} - */ - protected function describeInputArgument(InputArgument $argument, array $options = []) - { - $this->writeDocument($this->getInputArgumentDocument($argument)); - } - - /** - * {@inheritdoc} - */ - protected function describeInputOption(InputOption $option, array $options = []) - { - $this->writeDocument($this->getInputOptionDocument($option)); - } - - /** - * {@inheritdoc} - */ - protected function describeInputDefinition(InputDefinition $definition, array $options = []) - { - $this->writeDocument($this->getInputDefinitionDocument($definition)); - } - - /** - * {@inheritdoc} - */ - protected function describeCommand(Command $command, array $options = []) - { - $this->writeDocument($this->getCommandDocument($command, $options['short'] ?? false)); - } - - /** - * {@inheritdoc} - */ - protected function describeApplication(Application $application, array $options = []) - { - $this->writeDocument($this->getApplicationDocument($application, $options['namespace'] ?? null, $options['short'] ?? false)); - } - - /** - * Appends document children to parent node. - */ - private function appendDocument(\DOMNode $parentNode, \DOMNode $importedParent) - { - foreach ($importedParent->childNodes as $childNode) { - $parentNode->appendChild($parentNode->ownerDocument->importNode($childNode, true)); - } - } - - /** - * Writes DOM document. - */ - private function writeDocument(\DOMDocument $dom) - { - $dom->formatOutput = true; - $this->write($dom->saveXML()); - } - - private function getInputArgumentDocument(InputArgument $argument): \DOMDocument - { - $dom = new \DOMDocument('1.0', 'UTF-8'); - - $dom->appendChild($objectXML = $dom->createElement('argument')); - $objectXML->setAttribute('name', $argument->getName()); - $objectXML->setAttribute('is_required', $argument->isRequired() ? 1 : 0); - $objectXML->setAttribute('is_array', $argument->isArray() ? 1 : 0); - $objectXML->appendChild($descriptionXML = $dom->createElement('description')); - $descriptionXML->appendChild($dom->createTextNode($argument->getDescription())); - - $objectXML->appendChild($defaultsXML = $dom->createElement('defaults')); - $defaults = \is_array($argument->getDefault()) ? $argument->getDefault() : (\is_bool($argument->getDefault()) ? [var_export($argument->getDefault(), true)] : ($argument->getDefault() ? [$argument->getDefault()] : [])); - foreach ($defaults as $default) { - $defaultsXML->appendChild($defaultXML = $dom->createElement('default')); - $defaultXML->appendChild($dom->createTextNode($default)); - } - - return $dom; - } - - private function getInputOptionDocument(InputOption $option): \DOMDocument - { - $dom = new \DOMDocument('1.0', 'UTF-8'); - - $dom->appendChild($objectXML = $dom->createElement('option')); - $objectXML->setAttribute('name', '--'.$option->getName()); - $pos = strpos($option->getShortcut() ?? '', '|'); - if (false !== $pos) { - $objectXML->setAttribute('shortcut', '-'.substr($option->getShortcut(), 0, $pos)); - $objectXML->setAttribute('shortcuts', '-'.str_replace('|', '|-', $option->getShortcut())); - } else { - $objectXML->setAttribute('shortcut', $option->getShortcut() ? '-'.$option->getShortcut() : ''); - } - $objectXML->setAttribute('accept_value', $option->acceptValue() ? 1 : 0); - $objectXML->setAttribute('is_value_required', $option->isValueRequired() ? 1 : 0); - $objectXML->setAttribute('is_multiple', $option->isArray() ? 1 : 0); - $objectXML->appendChild($descriptionXML = $dom->createElement('description')); - $descriptionXML->appendChild($dom->createTextNode($option->getDescription())); - - if ($option->acceptValue()) { - $defaults = \is_array($option->getDefault()) ? $option->getDefault() : (\is_bool($option->getDefault()) ? [var_export($option->getDefault(), true)] : ($option->getDefault() ? [$option->getDefault()] : [])); - $objectXML->appendChild($defaultsXML = $dom->createElement('defaults')); - - if (!empty($defaults)) { - foreach ($defaults as $default) { - $defaultsXML->appendChild($defaultXML = $dom->createElement('default')); - $defaultXML->appendChild($dom->createTextNode($default)); - } - } - } - - if ($option->isNegatable()) { - $dom->appendChild($objectXML = $dom->createElement('option')); - $objectXML->setAttribute('name', '--no-'.$option->getName()); - $objectXML->setAttribute('shortcut', ''); - $objectXML->setAttribute('accept_value', 0); - $objectXML->setAttribute('is_value_required', 0); - $objectXML->setAttribute('is_multiple', 0); - $objectXML->appendChild($descriptionXML = $dom->createElement('description')); - $descriptionXML->appendChild($dom->createTextNode('Negate the "--'.$option->getName().'" option')); - } - - return $dom; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Event/ConsoleCommandEvent.php b/tools/php-cs-fixer/vendor/symfony/console/Event/ConsoleCommandEvent.php deleted file mode 100644 index 08bd18f..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Event/ConsoleCommandEvent.php +++ /dev/null @@ -1,51 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Event; - -/** - * Allows to do things before the command is executed, like skipping the command or changing the input. - * - * @author Fabien Potencier - */ -final class ConsoleCommandEvent extends ConsoleEvent -{ - /** - * The return code for skipped commands, this will also be passed into the terminate event. - */ - public const RETURN_CODE_DISABLED = 113; - - /** - * Indicates if the command should be run or skipped. - */ - private $commandShouldRun = true; - - /** - * Disables the command, so it won't be run. - */ - public function disableCommand(): bool - { - return $this->commandShouldRun = false; - } - - public function enableCommand(): bool - { - return $this->commandShouldRun = true; - } - - /** - * Returns true if the command is runnable, false otherwise. - */ - public function commandShouldRun(): bool - { - return $this->commandShouldRun; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Event/ConsoleErrorEvent.php b/tools/php-cs-fixer/vendor/symfony/console/Event/ConsoleErrorEvent.php deleted file mode 100644 index 57d9b38..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Event/ConsoleErrorEvent.php +++ /dev/null @@ -1,58 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Event; - -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * Allows to handle throwables thrown while running a command. - * - * @author Wouter de Jong - */ -final class ConsoleErrorEvent extends ConsoleEvent -{ - private $error; - private $exitCode; - - public function __construct(InputInterface $input, OutputInterface $output, \Throwable $error, Command $command = null) - { - parent::__construct($command, $input, $output); - - $this->error = $error; - } - - public function getError(): \Throwable - { - return $this->error; - } - - public function setError(\Throwable $error): void - { - $this->error = $error; - } - - public function setExitCode(int $exitCode): void - { - $this->exitCode = $exitCode; - - $r = new \ReflectionProperty($this->error, 'code'); - $r->setAccessible(true); - $r->setValue($this->error, $this->exitCode); - } - - public function getExitCode(): int - { - return $this->exitCode ?? (\is_int($this->error->getCode()) && 0 !== $this->error->getCode() ? $this->error->getCode() : 1); - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Event/ConsoleEvent.php b/tools/php-cs-fixer/vendor/symfony/console/Event/ConsoleEvent.php deleted file mode 100644 index 4e00f7c..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Event/ConsoleEvent.php +++ /dev/null @@ -1,67 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Event; - -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Contracts\EventDispatcher\Event; - -/** - * Allows to inspect input and output of a command. - * - * @author Francesco Levorato - */ -class ConsoleEvent extends Event -{ - protected $command; - - private $input; - private $output; - - public function __construct(?Command $command, InputInterface $input, OutputInterface $output) - { - $this->command = $command; - $this->input = $input; - $this->output = $output; - } - - /** - * Gets the command that is executed. - * - * @return Command|null A Command instance - */ - public function getCommand() - { - return $this->command; - } - - /** - * Gets the input instance. - * - * @return InputInterface An InputInterface instance - */ - public function getInput() - { - return $this->input; - } - - /** - * Gets the output instance. - * - * @return OutputInterface An OutputInterface instance - */ - public function getOutput() - { - return $this->output; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Event/ConsoleSignalEvent.php b/tools/php-cs-fixer/vendor/symfony/console/Event/ConsoleSignalEvent.php deleted file mode 100644 index ef13ed2..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Event/ConsoleSignalEvent.php +++ /dev/null @@ -1,35 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Event; - -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * @author marie - */ -final class ConsoleSignalEvent extends ConsoleEvent -{ - private $handlingSignal; - - public function __construct(Command $command, InputInterface $input, OutputInterface $output, int $handlingSignal) - { - parent::__construct($command, $input, $output); - $this->handlingSignal = $handlingSignal; - } - - public function getHandlingSignal(): int - { - return $this->handlingSignal; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Event/ConsoleTerminateEvent.php b/tools/php-cs-fixer/vendor/symfony/console/Event/ConsoleTerminateEvent.php deleted file mode 100644 index 190038d..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Event/ConsoleTerminateEvent.php +++ /dev/null @@ -1,43 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Event; - -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * Allows to manipulate the exit code of a command after its execution. - * - * @author Francesco Levorato - */ -final class ConsoleTerminateEvent extends ConsoleEvent -{ - private $exitCode; - - public function __construct(Command $command, InputInterface $input, OutputInterface $output, int $exitCode) - { - parent::__construct($command, $input, $output); - - $this->setExitCode($exitCode); - } - - public function setExitCode(int $exitCode): void - { - $this->exitCode = $exitCode; - } - - public function getExitCode(): int - { - return $this->exitCode; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/EventListener/ErrorListener.php b/tools/php-cs-fixer/vendor/symfony/console/EventListener/ErrorListener.php deleted file mode 100644 index 897d985..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/EventListener/ErrorListener.php +++ /dev/null @@ -1,95 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\EventListener; - -use Psr\Log\LoggerInterface; -use Symfony\Component\Console\ConsoleEvents; -use Symfony\Component\Console\Event\ConsoleErrorEvent; -use Symfony\Component\Console\Event\ConsoleEvent; -use Symfony\Component\Console\Event\ConsoleTerminateEvent; -use Symfony\Component\EventDispatcher\EventSubscriberInterface; - -/** - * @author James Halsall - * @author Robin Chalas - */ -class ErrorListener implements EventSubscriberInterface -{ - private $logger; - - public function __construct(LoggerInterface $logger = null) - { - $this->logger = $logger; - } - - public function onConsoleError(ConsoleErrorEvent $event) - { - if (null === $this->logger) { - return; - } - - $error = $event->getError(); - - if (!$inputString = $this->getInputString($event)) { - $this->logger->critical('An error occurred while using the console. Message: "{message}"', ['exception' => $error, 'message' => $error->getMessage()]); - - return; - } - - $this->logger->critical('Error thrown while running command "{command}". Message: "{message}"', ['exception' => $error, 'command' => $inputString, 'message' => $error->getMessage()]); - } - - public function onConsoleTerminate(ConsoleTerminateEvent $event) - { - if (null === $this->logger) { - return; - } - - $exitCode = $event->getExitCode(); - - if (0 === $exitCode) { - return; - } - - if (!$inputString = $this->getInputString($event)) { - $this->logger->debug('The console exited with code "{code}"', ['code' => $exitCode]); - - return; - } - - $this->logger->debug('Command "{command}" exited with code "{code}"', ['command' => $inputString, 'code' => $exitCode]); - } - - public static function getSubscribedEvents() - { - return [ - ConsoleEvents::ERROR => ['onConsoleError', -128], - ConsoleEvents::TERMINATE => ['onConsoleTerminate', -128], - ]; - } - - private static function getInputString(ConsoleEvent $event): ?string - { - $commandName = $event->getCommand() ? $event->getCommand()->getName() : null; - $input = $event->getInput(); - - if (method_exists($input, '__toString')) { - if ($commandName) { - return str_replace(["'$commandName'", "\"$commandName\""], $commandName, (string) $input); - } - - return (string) $input; - } - - return $commandName; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Exception/CommandNotFoundException.php b/tools/php-cs-fixer/vendor/symfony/console/Exception/CommandNotFoundException.php deleted file mode 100644 index 590a71c..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Exception/CommandNotFoundException.php +++ /dev/null @@ -1,43 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Exception; - -/** - * Represents an incorrect command name typed in the console. - * - * @author Jérôme Tamarelle - */ -class CommandNotFoundException extends \InvalidArgumentException implements ExceptionInterface -{ - private $alternatives; - - /** - * @param string $message Exception message to throw - * @param string[] $alternatives List of similar defined names - * @param int $code Exception code - * @param \Throwable|null $previous Previous exception used for the exception chaining - */ - public function __construct(string $message, array $alternatives = [], int $code = 0, \Throwable $previous = null) - { - parent::__construct($message, $code, $previous); - - $this->alternatives = $alternatives; - } - - /** - * @return string[] A list of similar defined names - */ - public function getAlternatives() - { - return $this->alternatives; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Exception/ExceptionInterface.php b/tools/php-cs-fixer/vendor/symfony/console/Exception/ExceptionInterface.php deleted file mode 100644 index 1624e13..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Exception/ExceptionInterface.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Exception; - -/** - * ExceptionInterface. - * - * @author Jérôme Tamarelle - */ -interface ExceptionInterface extends \Throwable -{ -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Exception/InvalidArgumentException.php b/tools/php-cs-fixer/vendor/symfony/console/Exception/InvalidArgumentException.php deleted file mode 100644 index 07cc0b6..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Exception/InvalidArgumentException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Exception; - -/** - * @author Jérôme Tamarelle - */ -class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface -{ -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Exception/InvalidOptionException.php b/tools/php-cs-fixer/vendor/symfony/console/Exception/InvalidOptionException.php deleted file mode 100644 index b2eec61..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Exception/InvalidOptionException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Exception; - -/** - * Represents an incorrect option name typed in the console. - * - * @author Jérôme Tamarelle - */ -class InvalidOptionException extends \InvalidArgumentException implements ExceptionInterface -{ -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Exception/LogicException.php b/tools/php-cs-fixer/vendor/symfony/console/Exception/LogicException.php deleted file mode 100644 index fc37b8d..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Exception/LogicException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Exception; - -/** - * @author Jérôme Tamarelle - */ -class LogicException extends \LogicException implements ExceptionInterface -{ -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Exception/MissingInputException.php b/tools/php-cs-fixer/vendor/symfony/console/Exception/MissingInputException.php deleted file mode 100644 index 04f02ad..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Exception/MissingInputException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Exception; - -/** - * Represents failure to read input from stdin. - * - * @author Gabriel Ostrolucký - */ -class MissingInputException extends RuntimeException implements ExceptionInterface -{ -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Exception/NamespaceNotFoundException.php b/tools/php-cs-fixer/vendor/symfony/console/Exception/NamespaceNotFoundException.php deleted file mode 100644 index dd16e45..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Exception/NamespaceNotFoundException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Exception; - -/** - * Represents an incorrect namespace typed in the console. - * - * @author Pierre du Plessis - */ -class NamespaceNotFoundException extends CommandNotFoundException -{ -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Exception/RuntimeException.php b/tools/php-cs-fixer/vendor/symfony/console/Exception/RuntimeException.php deleted file mode 100644 index 51d7d80..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Exception/RuntimeException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Exception; - -/** - * @author Jérôme Tamarelle - */ -class RuntimeException extends \RuntimeException implements ExceptionInterface -{ -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Formatter/NullOutputFormatter.php b/tools/php-cs-fixer/vendor/symfony/console/Formatter/NullOutputFormatter.php deleted file mode 100644 index 0aa0a5c..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Formatter/NullOutputFormatter.php +++ /dev/null @@ -1,72 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Formatter; - -/** - * @author Tien Xuan Vo - */ -final class NullOutputFormatter implements OutputFormatterInterface -{ - private $style; - - /** - * {@inheritdoc} - */ - public function format(?string $message): void - { - // do nothing - } - - /** - * {@inheritdoc} - */ - public function getStyle(string $name): OutputFormatterStyleInterface - { - if ($this->style) { - return $this->style; - } - // to comply with the interface we must return a OutputFormatterStyleInterface - return $this->style = new NullOutputFormatterStyle(); - } - - /** - * {@inheritdoc} - */ - public function hasStyle(string $name): bool - { - return false; - } - - /** - * {@inheritdoc} - */ - public function isDecorated(): bool - { - return false; - } - - /** - * {@inheritdoc} - */ - public function setDecorated(bool $decorated): void - { - // do nothing - } - - /** - * {@inheritdoc} - */ - public function setStyle(string $name, OutputFormatterStyleInterface $style): void - { - // do nothing - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Formatter/NullOutputFormatterStyle.php b/tools/php-cs-fixer/vendor/symfony/console/Formatter/NullOutputFormatterStyle.php deleted file mode 100644 index bfd0afe..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Formatter/NullOutputFormatterStyle.php +++ /dev/null @@ -1,65 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Formatter; - -/** - * @author Tien Xuan Vo - */ -final class NullOutputFormatterStyle implements OutputFormatterStyleInterface -{ - /** - * {@inheritdoc} - */ - public function apply(string $text): string - { - return $text; - } - - /** - * {@inheritdoc} - */ - public function setBackground(string $color = null): void - { - // do nothing - } - - /** - * {@inheritdoc} - */ - public function setForeground(string $color = null): void - { - // do nothing - } - - /** - * {@inheritdoc} - */ - public function setOption(string $option): void - { - // do nothing - } - - /** - * {@inheritdoc} - */ - public function setOptions(array $options): void - { - // do nothing - } - - /** - * {@inheritdoc} - */ - public function unsetOption(string $option): void - { - // do nothing - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Formatter/OutputFormatter.php b/tools/php-cs-fixer/vendor/symfony/console/Formatter/OutputFormatter.php deleted file mode 100644 index 80d59b3..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Formatter/OutputFormatter.php +++ /dev/null @@ -1,283 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Formatter; - -use Symfony\Component\Console\Exception\InvalidArgumentException; - -/** - * Formatter class for console output. - * - * @author Konstantin Kudryashov - * @author Roland Franssen - */ -class OutputFormatter implements WrappableOutputFormatterInterface -{ - private $decorated; - private $styles = []; - private $styleStack; - - public function __clone() - { - $this->styleStack = clone $this->styleStack; - foreach ($this->styles as $key => $value) { - $this->styles[$key] = clone $value; - } - } - - /** - * Escapes "<" special char in given text. - * - * @return string Escaped text - */ - public static function escape(string $text) - { - $text = preg_replace('/([^\\\\]?) FormatterStyle" instances - */ - public function __construct(bool $decorated = false, array $styles = []) - { - $this->decorated = $decorated; - - $this->setStyle('error', new OutputFormatterStyle('white', 'red')); - $this->setStyle('info', new OutputFormatterStyle('green')); - $this->setStyle('comment', new OutputFormatterStyle('yellow')); - $this->setStyle('question', new OutputFormatterStyle('black', 'cyan')); - - foreach ($styles as $name => $style) { - $this->setStyle($name, $style); - } - - $this->styleStack = new OutputFormatterStyleStack(); - } - - /** - * {@inheritdoc} - */ - public function setDecorated(bool $decorated) - { - $this->decorated = $decorated; - } - - /** - * {@inheritdoc} - */ - public function isDecorated() - { - return $this->decorated; - } - - /** - * {@inheritdoc} - */ - public function setStyle(string $name, OutputFormatterStyleInterface $style) - { - $this->styles[strtolower($name)] = $style; - } - - /** - * {@inheritdoc} - */ - public function hasStyle(string $name) - { - return isset($this->styles[strtolower($name)]); - } - - /** - * {@inheritdoc} - */ - public function getStyle(string $name) - { - if (!$this->hasStyle($name)) { - throw new InvalidArgumentException(sprintf('Undefined style: "%s".', $name)); - } - - return $this->styles[strtolower($name)]; - } - - /** - * {@inheritdoc} - */ - public function format(?string $message) - { - return $this->formatAndWrap($message, 0); - } - - /** - * {@inheritdoc} - */ - public function formatAndWrap(?string $message, int $width) - { - $offset = 0; - $output = ''; - $tagRegex = '[a-z][^<>]*+'; - $currentLineLength = 0; - preg_match_all("#<(($tagRegex) | /($tagRegex)?)>#ix", $message, $matches, \PREG_OFFSET_CAPTURE); - foreach ($matches[0] as $i => $match) { - $pos = $match[1]; - $text = $match[0]; - - if (0 != $pos && '\\' == $message[$pos - 1]) { - continue; - } - - // add the text up to the next tag - $output .= $this->applyCurrentStyle(substr($message, $offset, $pos - $offset), $output, $width, $currentLineLength); - $offset = $pos + \strlen($text); - - // opening tag? - if ($open = '/' != $text[1]) { - $tag = $matches[1][$i][0]; - } else { - $tag = $matches[3][$i][0] ?? ''; - } - - if (!$open && !$tag) { - // - $this->styleStack->pop(); - } elseif (null === $style = $this->createStyleFromString($tag)) { - $output .= $this->applyCurrentStyle($text, $output, $width, $currentLineLength); - } elseif ($open) { - $this->styleStack->push($style); - } else { - $this->styleStack->pop($style); - } - } - - $output .= $this->applyCurrentStyle(substr($message, $offset), $output, $width, $currentLineLength); - - if (str_contains($output, "\0")) { - return strtr($output, ["\0" => '\\', '\\<' => '<']); - } - - return str_replace('\\<', '<', $output); - } - - /** - * @return OutputFormatterStyleStack - */ - public function getStyleStack() - { - return $this->styleStack; - } - - /** - * Tries to create new style instance from string. - */ - private function createStyleFromString(string $string): ?OutputFormatterStyleInterface - { - if (isset($this->styles[$string])) { - return $this->styles[$string]; - } - - if (!preg_match_all('/([^=]+)=([^;]+)(;|$)/', $string, $matches, \PREG_SET_ORDER)) { - return null; - } - - $style = new OutputFormatterStyle(); - foreach ($matches as $match) { - array_shift($match); - $match[0] = strtolower($match[0]); - - if ('fg' == $match[0]) { - $style->setForeground(strtolower($match[1])); - } elseif ('bg' == $match[0]) { - $style->setBackground(strtolower($match[1])); - } elseif ('href' === $match[0]) { - $style->setHref($match[1]); - } elseif ('options' === $match[0]) { - preg_match_all('([^,;]+)', strtolower($match[1]), $options); - $options = array_shift($options); - foreach ($options as $option) { - $style->setOption($option); - } - } else { - return null; - } - } - - return $style; - } - - /** - * Applies current style from stack to text, if must be applied. - */ - private function applyCurrentStyle(string $text, string $current, int $width, int &$currentLineLength): string - { - if ('' === $text) { - return ''; - } - - if (!$width) { - return $this->isDecorated() ? $this->styleStack->getCurrent()->apply($text) : $text; - } - - if (!$currentLineLength && '' !== $current) { - $text = ltrim($text); - } - - if ($currentLineLength) { - $prefix = substr($text, 0, $i = $width - $currentLineLength)."\n"; - $text = substr($text, $i); - } else { - $prefix = ''; - } - - preg_match('~(\\n)$~', $text, $matches); - $text = $prefix.preg_replace('~([^\\n]{'.$width.'})\\ *~', "\$1\n", $text); - $text = rtrim($text, "\n").($matches[1] ?? ''); - - if (!$currentLineLength && '' !== $current && "\n" !== substr($current, -1)) { - $text = "\n".$text; - } - - $lines = explode("\n", $text); - - foreach ($lines as $line) { - $currentLineLength += \strlen($line); - if ($width <= $currentLineLength) { - $currentLineLength = 0; - } - } - - if ($this->isDecorated()) { - foreach ($lines as $i => $line) { - $lines[$i] = $this->styleStack->getCurrent()->apply($line); - } - } - - return implode("\n", $lines); - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Formatter/OutputFormatterInterface.php b/tools/php-cs-fixer/vendor/symfony/console/Formatter/OutputFormatterInterface.php deleted file mode 100644 index 8c50d41..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Formatter/OutputFormatterInterface.php +++ /dev/null @@ -1,58 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Formatter; - -/** - * Formatter interface for console output. - * - * @author Konstantin Kudryashov - */ -interface OutputFormatterInterface -{ - /** - * Sets the decorated flag. - */ - public function setDecorated(bool $decorated); - - /** - * Gets the decorated flag. - * - * @return bool true if the output will decorate messages, false otherwise - */ - public function isDecorated(); - - /** - * Sets a new style. - */ - public function setStyle(string $name, OutputFormatterStyleInterface $style); - - /** - * Checks if output formatter has style with specified name. - * - * @return bool - */ - public function hasStyle(string $name); - - /** - * Gets style options from style with specified name. - * - * @return OutputFormatterStyleInterface - * - * @throws \InvalidArgumentException When style isn't defined - */ - public function getStyle(string $name); - - /** - * Formats a message according to the given styles. - */ - public function format(?string $message); -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Formatter/OutputFormatterStyle.php b/tools/php-cs-fixer/vendor/symfony/console/Formatter/OutputFormatterStyle.php deleted file mode 100644 index 0fb36ac..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Formatter/OutputFormatterStyle.php +++ /dev/null @@ -1,108 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Formatter; - -use Symfony\Component\Console\Color; - -/** - * Formatter style class for defining styles. - * - * @author Konstantin Kudryashov - */ -class OutputFormatterStyle implements OutputFormatterStyleInterface -{ - private $color; - private $foreground; - private $background; - private $options; - private $href; - private $handlesHrefGracefully; - - /** - * Initializes output formatter style. - * - * @param string|null $foreground The style foreground color name - * @param string|null $background The style background color name - */ - public function __construct(string $foreground = null, string $background = null, array $options = []) - { - $this->color = new Color($this->foreground = $foreground ?: '', $this->background = $background ?: '', $this->options = $options); - } - - /** - * {@inheritdoc} - */ - public function setForeground(string $color = null) - { - $this->color = new Color($this->foreground = $color ?: '', $this->background, $this->options); - } - - /** - * {@inheritdoc} - */ - public function setBackground(string $color = null) - { - $this->color = new Color($this->foreground, $this->background = $color ?: '', $this->options); - } - - public function setHref(string $url): void - { - $this->href = $url; - } - - /** - * {@inheritdoc} - */ - public function setOption(string $option) - { - $this->options[] = $option; - $this->color = new Color($this->foreground, $this->background, $this->options); - } - - /** - * {@inheritdoc} - */ - public function unsetOption(string $option) - { - $pos = array_search($option, $this->options); - if (false !== $pos) { - unset($this->options[$pos]); - } - - $this->color = new Color($this->foreground, $this->background, $this->options); - } - - /** - * {@inheritdoc} - */ - public function setOptions(array $options) - { - $this->color = new Color($this->foreground, $this->background, $this->options = $options); - } - - /** - * {@inheritdoc} - */ - public function apply(string $text) - { - if (null === $this->handlesHrefGracefully) { - $this->handlesHrefGracefully = 'JetBrains-JediTerm' !== getenv('TERMINAL_EMULATOR') - && (!getenv('KONSOLE_VERSION') || (int) getenv('KONSOLE_VERSION') > 201100); - } - - if (null !== $this->href && $this->handlesHrefGracefully) { - $text = "\033]8;;$this->href\033\\$text\033]8;;\033\\"; - } - - return $this->color->apply($text); - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Formatter/OutputFormatterStyleInterface.php b/tools/php-cs-fixer/vendor/symfony/console/Formatter/OutputFormatterStyleInterface.php deleted file mode 100644 index b30560d..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Formatter/OutputFormatterStyleInterface.php +++ /dev/null @@ -1,52 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Formatter; - -/** - * Formatter style interface for defining styles. - * - * @author Konstantin Kudryashov - */ -interface OutputFormatterStyleInterface -{ - /** - * Sets style foreground color. - */ - public function setForeground(string $color = null); - - /** - * Sets style background color. - */ - public function setBackground(string $color = null); - - /** - * Sets some specific style option. - */ - public function setOption(string $option); - - /** - * Unsets some specific style option. - */ - public function unsetOption(string $option); - - /** - * Sets multiple style options at once. - */ - public function setOptions(array $options); - - /** - * Applies the style to a given text. - * - * @return string - */ - public function apply(string $text); -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Formatter/OutputFormatterStyleStack.php b/tools/php-cs-fixer/vendor/symfony/console/Formatter/OutputFormatterStyleStack.php deleted file mode 100644 index fc48dc0..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Formatter/OutputFormatterStyleStack.php +++ /dev/null @@ -1,110 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Formatter; - -use Symfony\Component\Console\Exception\InvalidArgumentException; -use Symfony\Contracts\Service\ResetInterface; - -/** - * @author Jean-François Simon - */ -class OutputFormatterStyleStack implements ResetInterface -{ - /** - * @var OutputFormatterStyleInterface[] - */ - private $styles; - - private $emptyStyle; - - public function __construct(OutputFormatterStyleInterface $emptyStyle = null) - { - $this->emptyStyle = $emptyStyle ?? new OutputFormatterStyle(); - $this->reset(); - } - - /** - * Resets stack (ie. empty internal arrays). - */ - public function reset() - { - $this->styles = []; - } - - /** - * Pushes a style in the stack. - */ - public function push(OutputFormatterStyleInterface $style) - { - $this->styles[] = $style; - } - - /** - * Pops a style from the stack. - * - * @return OutputFormatterStyleInterface - * - * @throws InvalidArgumentException When style tags incorrectly nested - */ - public function pop(OutputFormatterStyleInterface $style = null) - { - if (empty($this->styles)) { - return $this->emptyStyle; - } - - if (null === $style) { - return array_pop($this->styles); - } - - foreach (array_reverse($this->styles, true) as $index => $stackedStyle) { - if ($style->apply('') === $stackedStyle->apply('')) { - $this->styles = \array_slice($this->styles, 0, $index); - - return $stackedStyle; - } - } - - throw new InvalidArgumentException('Incorrectly nested style tag found.'); - } - - /** - * Computes current style with stacks top codes. - * - * @return OutputFormatterStyle - */ - public function getCurrent() - { - if (empty($this->styles)) { - return $this->emptyStyle; - } - - return $this->styles[\count($this->styles) - 1]; - } - - /** - * @return $this - */ - public function setEmptyStyle(OutputFormatterStyleInterface $emptyStyle) - { - $this->emptyStyle = $emptyStyle; - - return $this; - } - - /** - * @return OutputFormatterStyleInterface - */ - public function getEmptyStyle() - { - return $this->emptyStyle; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Formatter/WrappableOutputFormatterInterface.php b/tools/php-cs-fixer/vendor/symfony/console/Formatter/WrappableOutputFormatterInterface.php deleted file mode 100644 index 42319ee..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Formatter/WrappableOutputFormatterInterface.php +++ /dev/null @@ -1,25 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Formatter; - -/** - * Formatter interface for console output that supports word wrapping. - * - * @author Roland Franssen - */ -interface WrappableOutputFormatterInterface extends OutputFormatterInterface -{ - /** - * Formats a message according to the given styles, wrapping at `$width` (0 means no wrapping). - */ - public function formatAndWrap(?string $message, int $width); -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Helper/DebugFormatterHelper.php b/tools/php-cs-fixer/vendor/symfony/console/Helper/DebugFormatterHelper.php deleted file mode 100644 index 9d07ec2..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Helper/DebugFormatterHelper.php +++ /dev/null @@ -1,107 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -/** - * Helps outputting debug information when running an external program from a command. - * - * An external program can be a Process, an HTTP request, or anything else. - * - * @author Fabien Potencier - */ -class DebugFormatterHelper extends Helper -{ - private $colors = ['black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white', 'default']; - private $started = []; - private $count = -1; - - /** - * Starts a debug formatting session. - * - * @return string - */ - public function start(string $id, string $message, string $prefix = 'RUN') - { - $this->started[$id] = ['border' => ++$this->count % \count($this->colors)]; - - return sprintf("%s %s %s\n", $this->getBorder($id), $prefix, $message); - } - - /** - * Adds progress to a formatting session. - * - * @return string - */ - public function progress(string $id, string $buffer, bool $error = false, string $prefix = 'OUT', string $errorPrefix = 'ERR') - { - $message = ''; - - if ($error) { - if (isset($this->started[$id]['out'])) { - $message .= "\n"; - unset($this->started[$id]['out']); - } - if (!isset($this->started[$id]['err'])) { - $message .= sprintf('%s %s ', $this->getBorder($id), $errorPrefix); - $this->started[$id]['err'] = true; - } - - $message .= str_replace("\n", sprintf("\n%s %s ", $this->getBorder($id), $errorPrefix), $buffer); - } else { - if (isset($this->started[$id]['err'])) { - $message .= "\n"; - unset($this->started[$id]['err']); - } - if (!isset($this->started[$id]['out'])) { - $message .= sprintf('%s %s ', $this->getBorder($id), $prefix); - $this->started[$id]['out'] = true; - } - - $message .= str_replace("\n", sprintf("\n%s %s ", $this->getBorder($id), $prefix), $buffer); - } - - return $message; - } - - /** - * Stops a formatting session. - * - * @return string - */ - public function stop(string $id, string $message, bool $successful, string $prefix = 'RES') - { - $trailingEOL = isset($this->started[$id]['out']) || isset($this->started[$id]['err']) ? "\n" : ''; - - if ($successful) { - return sprintf("%s%s %s %s\n", $trailingEOL, $this->getBorder($id), $prefix, $message); - } - - $message = sprintf("%s%s %s %s\n", $trailingEOL, $this->getBorder($id), $prefix, $message); - - unset($this->started[$id]['out'], $this->started[$id]['err']); - - return $message; - } - - private function getBorder(string $id): string - { - return sprintf(' ', $this->colors[$this->started[$id]['border']]); - } - - /** - * {@inheritdoc} - */ - public function getName() - { - return 'debug_formatter'; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Helper/DescriptorHelper.php b/tools/php-cs-fixer/vendor/symfony/console/Helper/DescriptorHelper.php deleted file mode 100644 index f2ad9db..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Helper/DescriptorHelper.php +++ /dev/null @@ -1,87 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -use Symfony\Component\Console\Descriptor\DescriptorInterface; -use Symfony\Component\Console\Descriptor\JsonDescriptor; -use Symfony\Component\Console\Descriptor\MarkdownDescriptor; -use Symfony\Component\Console\Descriptor\TextDescriptor; -use Symfony\Component\Console\Descriptor\XmlDescriptor; -use Symfony\Component\Console\Exception\InvalidArgumentException; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * This class adds helper method to describe objects in various formats. - * - * @author Jean-François Simon - */ -class DescriptorHelper extends Helper -{ - /** - * @var DescriptorInterface[] - */ - private $descriptors = []; - - public function __construct() - { - $this - ->register('txt', new TextDescriptor()) - ->register('xml', new XmlDescriptor()) - ->register('json', new JsonDescriptor()) - ->register('md', new MarkdownDescriptor()) - ; - } - - /** - * Describes an object if supported. - * - * Available options are: - * * format: string, the output format name - * * raw_text: boolean, sets output type as raw - * - * @throws InvalidArgumentException when the given format is not supported - */ - public function describe(OutputInterface $output, ?object $object, array $options = []) - { - $options = array_merge([ - 'raw_text' => false, - 'format' => 'txt', - ], $options); - - if (!isset($this->descriptors[$options['format']])) { - throw new InvalidArgumentException(sprintf('Unsupported format "%s".', $options['format'])); - } - - $descriptor = $this->descriptors[$options['format']]; - $descriptor->describe($output, $object, $options); - } - - /** - * Registers a descriptor. - * - * @return $this - */ - public function register(string $format, DescriptorInterface $descriptor) - { - $this->descriptors[$format] = $descriptor; - - return $this; - } - - /** - * {@inheritdoc} - */ - public function getName() - { - return 'descriptor'; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Helper/Dumper.php b/tools/php-cs-fixer/vendor/symfony/console/Helper/Dumper.php deleted file mode 100644 index b013b6c..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Helper/Dumper.php +++ /dev/null @@ -1,64 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\VarDumper\Cloner\ClonerInterface; -use Symfony\Component\VarDumper\Cloner\VarCloner; -use Symfony\Component\VarDumper\Dumper\CliDumper; - -/** - * @author Roland Franssen - */ -final class Dumper -{ - private $output; - private $dumper; - private $cloner; - private $handler; - - public function __construct(OutputInterface $output, CliDumper $dumper = null, ClonerInterface $cloner = null) - { - $this->output = $output; - $this->dumper = $dumper; - $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->setColors($this->output->isDecorated()); - - return rtrim($dumper->dump(($this->cloner ?? $this->cloner = new VarCloner())->cloneVar($var)->withRefHandles(false), true)); - }; - } else { - $this->handler = function ($var): string { - switch (true) { - case null === $var: - return 'null'; - case true === $var: - return 'true'; - case false === $var: - return 'false'; - case \is_string($var): - return '"'.$var.'"'; - default: - return rtrim(print_r($var, true)); - } - }; - } - } - - public function __invoke($var): string - { - return ($this->handler)($var); - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Helper/FormatterHelper.php b/tools/php-cs-fixer/vendor/symfony/console/Helper/FormatterHelper.php deleted file mode 100644 index a1c33c2..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Helper/FormatterHelper.php +++ /dev/null @@ -1,92 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -use Symfony\Component\Console\Formatter\OutputFormatter; - -/** - * The Formatter class provides helpers to format messages. - * - * @author Fabien Potencier - */ -class FormatterHelper extends Helper -{ - /** - * Formats a message within a section. - * - * @return string The format section - */ - public function formatSection(string $section, string $message, string $style = 'info') - { - return sprintf('<%s>[%s] %s', $style, $section, $style, $message); - } - - /** - * Formats a message as a block of text. - * - * @param string|array $messages The message to write in the block - * - * @return string The formatter message - */ - public function formatBlock($messages, string $style, bool $large = false) - { - if (!\is_array($messages)) { - $messages = [$messages]; - } - - $len = 0; - $lines = []; - foreach ($messages as $message) { - $message = OutputFormatter::escape($message); - $lines[] = sprintf($large ? ' %s ' : ' %s ', $message); - $len = max(self::width($message) + ($large ? 4 : 2), $len); - } - - $messages = $large ? [str_repeat(' ', $len)] : []; - for ($i = 0; isset($lines[$i]); ++$i) { - $messages[] = $lines[$i].str_repeat(' ', $len - self::width($lines[$i])); - } - if ($large) { - $messages[] = str_repeat(' ', $len); - } - - for ($i = 0; isset($messages[$i]); ++$i) { - $messages[$i] = sprintf('<%s>%s', $style, $messages[$i], $style); - } - - return implode("\n", $messages); - } - - /** - * Truncates a message to the given length. - * - * @return string - */ - public function truncate(string $message, int $length, string $suffix = '...') - { - $computedLength = $length - self::width($suffix); - - if ($computedLength > self::width($message)) { - return $message; - } - - return self::substr($message, 0, $length).$suffix; - } - - /** - * {@inheritdoc} - */ - public function getName() - { - return 'formatter'; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Helper/Helper.php b/tools/php-cs-fixer/vendor/symfony/console/Helper/Helper.php deleted file mode 100644 index cfcbbd9..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Helper/Helper.php +++ /dev/null @@ -1,178 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -use Symfony\Component\Console\Formatter\OutputFormatterInterface; -use Symfony\Component\String\UnicodeString; - -/** - * Helper is the base class for all helper classes. - * - * @author Fabien Potencier - */ -abstract class Helper implements HelperInterface -{ - protected $helperSet = null; - - /** - * {@inheritdoc} - */ - public function setHelperSet(HelperSet $helperSet = null) - { - $this->helperSet = $helperSet; - } - - /** - * {@inheritdoc} - */ - public function getHelperSet() - { - return $this->helperSet; - } - - /** - * Returns the length of a string, using mb_strwidth if it is available. - * - * @deprecated since Symfony 5.3 - * - * @return int The length of the string - */ - public static function strlen(?string $string) - { - trigger_deprecation('symfony/console', '5.3', 'Method "%s()" is deprecated and will be removed in Symfony 6.0. Use Helper::width() or Helper::length() instead.', __METHOD__); - - return self::width($string); - } - - /** - * Returns the width of a string, using mb_strwidth if it is available. - * The width is how many characters positions the string will use. - */ - public static function width(?string $string): int - { - $string ?? $string = ''; - - if (preg_match('//u', $string)) { - return (new UnicodeString($string))->width(false); - } - - if (false === $encoding = mb_detect_encoding($string, null, true)) { - return \strlen($string); - } - - return mb_strwidth($string, $encoding); - } - - /** - * Returns the length of a string, using mb_strlen if it is available. - * The length is related to how many bytes the string will use. - */ - public static function length(?string $string): int - { - $string ?? $string = ''; - - if (preg_match('//u', $string)) { - return (new UnicodeString($string))->length(); - } - - if (false === $encoding = mb_detect_encoding($string, null, true)) { - return \strlen($string); - } - - return mb_strlen($string, $encoding); - } - - /** - * Returns the subset of a string, using mb_substr if it is available. - * - * @return string The string subset - */ - public static function substr(?string $string, int $from, int $length = null) - { - $string ?? $string = ''; - - if (false === $encoding = mb_detect_encoding($string, null, true)) { - return substr($string, $from, $length); - } - - return mb_substr($string, $from, $length, $encoding); - } - - public static function formatTime($secs) - { - static $timeFormats = [ - [0, '< 1 sec'], - [1, '1 sec'], - [2, 'secs', 1], - [60, '1 min'], - [120, 'mins', 60], - [3600, '1 hr'], - [7200, 'hrs', 3600], - [86400, '1 day'], - [172800, 'days', 86400], - ]; - - foreach ($timeFormats as $index => $format) { - if ($secs >= $format[0]) { - if ((isset($timeFormats[$index + 1]) && $secs < $timeFormats[$index + 1][0]) - || $index == \count($timeFormats) - 1 - ) { - if (2 == \count($format)) { - return $format[1]; - } - - return floor($secs / $format[2]).' '.$format[1]; - } - } - } - } - - public static function formatMemory(int $memory) - { - if ($memory >= 1024 * 1024 * 1024) { - return sprintf('%.1f GiB', $memory / 1024 / 1024 / 1024); - } - - if ($memory >= 1024 * 1024) { - return sprintf('%.1f MiB', $memory / 1024 / 1024); - } - - if ($memory >= 1024) { - return sprintf('%d KiB', $memory / 1024); - } - - return sprintf('%d B', $memory); - } - - /** - * @deprecated since Symfony 5.3 - */ - public static function strlenWithoutDecoration(OutputFormatterInterface $formatter, ?string $string) - { - trigger_deprecation('symfony/console', '5.3', 'Method "%s()" is deprecated and will be removed in Symfony 6.0. Use Helper::removeDecoration() instead.', __METHOD__); - - return self::width(self::removeDecoration($formatter, $string)); - } - - public static function removeDecoration(OutputFormatterInterface $formatter, ?string $string) - { - $isDecorated = $formatter->isDecorated(); - $formatter->setDecorated(false); - // remove <...> formatting - $string = $formatter->format($string ?? ''); - // remove already formatted characters - $string = preg_replace("/\033\[[^m]*m/", '', $string ?? ''); - $formatter->setDecorated($isDecorated); - - return $string; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Helper/HelperInterface.php b/tools/php-cs-fixer/vendor/symfony/console/Helper/HelperInterface.php deleted file mode 100644 index 1ce8235..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Helper/HelperInterface.php +++ /dev/null @@ -1,39 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -/** - * HelperInterface is the interface all helpers must implement. - * - * @author Fabien Potencier - */ -interface HelperInterface -{ - /** - * Sets the helper set associated with this helper. - */ - public function setHelperSet(HelperSet $helperSet = null); - - /** - * Gets the helper set associated with this helper. - * - * @return HelperSet A HelperSet instance - */ - public function getHelperSet(); - - /** - * Returns the canonical name of this helper. - * - * @return string The canonical name - */ - public function getName(); -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Helper/HelperSet.php b/tools/php-cs-fixer/vendor/symfony/console/Helper/HelperSet.php deleted file mode 100644 index 679dcea..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Helper/HelperSet.php +++ /dev/null @@ -1,99 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Exception\InvalidArgumentException; - -/** - * HelperSet represents a set of helpers to be used with a command. - * - * @author Fabien Potencier - */ -class HelperSet implements \IteratorAggregate -{ - /** - * @var Helper[] - */ - private $helpers = []; - private $command; - - /** - * @param Helper[] $helpers An array of helper - */ - public function __construct(array $helpers = []) - { - foreach ($helpers as $alias => $helper) { - $this->set($helper, \is_int($alias) ? null : $alias); - } - } - - public function set(HelperInterface $helper, string $alias = null) - { - $this->helpers[$helper->getName()] = $helper; - if (null !== $alias) { - $this->helpers[$alias] = $helper; - } - - $helper->setHelperSet($this); - } - - /** - * Returns true if the helper if defined. - * - * @return bool true if the helper is defined, false otherwise - */ - public function has(string $name) - { - return isset($this->helpers[$name]); - } - - /** - * Gets a helper value. - * - * @return HelperInterface The helper instance - * - * @throws InvalidArgumentException if the helper is not defined - */ - public function get(string $name) - { - if (!$this->has($name)) { - throw new InvalidArgumentException(sprintf('The helper "%s" is not defined.', $name)); - } - - return $this->helpers[$name]; - } - - public function setCommand(Command $command = null) - { - $this->command = $command; - } - - /** - * Gets the command associated with this helper set. - * - * @return Command A Command instance - */ - public function getCommand() - { - return $this->command; - } - - /** - * @return \Traversable - */ - #[\ReturnTypeWillChange] - public function getIterator() - { - return new \ArrayIterator($this->helpers); - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Helper/InputAwareHelper.php b/tools/php-cs-fixer/vendor/symfony/console/Helper/InputAwareHelper.php deleted file mode 100644 index 0d0dba2..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Helper/InputAwareHelper.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -use Symfony\Component\Console\Input\InputAwareInterface; -use Symfony\Component\Console\Input\InputInterface; - -/** - * An implementation of InputAwareInterface for Helpers. - * - * @author Wouter J - */ -abstract class InputAwareHelper extends Helper implements InputAwareInterface -{ - protected $input; - - /** - * {@inheritdoc} - */ - public function setInput(InputInterface $input) - { - $this->input = $input; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Helper/ProcessHelper.php b/tools/php-cs-fixer/vendor/symfony/console/Helper/ProcessHelper.php deleted file mode 100644 index f82c16b..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Helper/ProcessHelper.php +++ /dev/null @@ -1,148 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -use Symfony\Component\Console\Output\ConsoleOutputInterface; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Process\Exception\ProcessFailedException; -use Symfony\Component\Process\Process; - -/** - * The ProcessHelper class provides helpers to run external processes. - * - * @author Fabien Potencier - * - * @final - */ -class ProcessHelper extends Helper -{ - /** - * Runs an external process. - * - * @param array|Process $cmd An instance of Process or an array of the command and arguments - * @param callable|null $callback A PHP callback to run whenever there is some - * output available on STDOUT or STDERR - * - * @return Process The process that ran - */ - public function run(OutputInterface $output, $cmd, string $error = null, callable $callback = null, int $verbosity = OutputInterface::VERBOSITY_VERY_VERBOSE): Process - { - if (!class_exists(Process::class)) { - throw new \LogicException('The ProcessHelper cannot be run as the Process component is not installed. Try running "compose require symfony/process".'); - } - - if ($output instanceof ConsoleOutputInterface) { - $output = $output->getErrorOutput(); - } - - $formatter = $this->getHelperSet()->get('debug_formatter'); - - if ($cmd instanceof Process) { - $cmd = [$cmd]; - } - - if (!\is_array($cmd)) { - throw new \TypeError(sprintf('The "command" argument of "%s()" must be an array or a "%s" instance, "%s" given.', __METHOD__, Process::class, get_debug_type($cmd))); - } - - if (\is_string($cmd[0] ?? null)) { - $process = new Process($cmd); - $cmd = []; - } elseif (($cmd[0] ?? null) instanceof Process) { - $process = $cmd[0]; - unset($cmd[0]); - } else { - throw new \InvalidArgumentException(sprintf('Invalid command provided to "%s()": the command should be an array whose first element is either the path to the binary to run or a "Process" object.', __METHOD__)); - } - - if ($verbosity <= $output->getVerbosity()) { - $output->write($formatter->start(spl_object_hash($process), $this->escapeString($process->getCommandLine()))); - } - - if ($output->isDebug()) { - $callback = $this->wrapCallback($output, $process, $callback); - } - - $process->run($callback, $cmd); - - if ($verbosity <= $output->getVerbosity()) { - $message = $process->isSuccessful() ? 'Command ran successfully' : sprintf('%s Command did not run successfully', $process->getExitCode()); - $output->write($formatter->stop(spl_object_hash($process), $message, $process->isSuccessful())); - } - - if (!$process->isSuccessful() && null !== $error) { - $output->writeln(sprintf('%s', $this->escapeString($error))); - } - - return $process; - } - - /** - * Runs the process. - * - * This is identical to run() except that an exception is thrown if the process - * exits with a non-zero exit code. - * - * @param string|Process $cmd An instance of Process or a command to run - * @param callable|null $callback A PHP callback to run whenever there is some - * output available on STDOUT or STDERR - * - * @return Process The process that ran - * - * @throws ProcessFailedException - * - * @see run() - */ - public function mustRun(OutputInterface $output, $cmd, string $error = null, callable $callback = null): Process - { - $process = $this->run($output, $cmd, $error, $callback); - - if (!$process->isSuccessful()) { - throw new ProcessFailedException($process); - } - - return $process; - } - - /** - * Wraps a Process callback to add debugging output. - */ - public function wrapCallback(OutputInterface $output, Process $process, callable $callback = null): callable - { - if ($output instanceof ConsoleOutputInterface) { - $output = $output->getErrorOutput(); - } - - $formatter = $this->getHelperSet()->get('debug_formatter'); - - return function ($type, $buffer) use ($output, $process, $callback, $formatter) { - $output->write($formatter->progress(spl_object_hash($process), $this->escapeString($buffer), Process::ERR === $type)); - - if (null !== $callback) { - $callback($type, $buffer); - } - }; - } - - private function escapeString(string $str): string - { - return str_replace('<', '\\<', $str); - } - - /** - * {@inheritdoc} - */ - public function getName(): string - { - return 'process'; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Helper/ProgressBar.php b/tools/php-cs-fixer/vendor/symfony/console/Helper/ProgressBar.php deleted file mode 100644 index 1c03a1d..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Helper/ProgressBar.php +++ /dev/null @@ -1,619 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -use Symfony\Component\Console\Cursor; -use Symfony\Component\Console\Exception\LogicException; -use Symfony\Component\Console\Output\ConsoleOutputInterface; -use Symfony\Component\Console\Output\ConsoleSectionOutput; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\Terminal; - -/** - * The ProgressBar provides helpers to display progress output. - * - * @author Fabien Potencier - * @author Chris Jones - */ -final class ProgressBar -{ - public const FORMAT_VERBOSE = 'verbose'; - public const FORMAT_VERY_VERBOSE = 'very_verbose'; - public const FORMAT_DEBUG = 'debug'; - public const FORMAT_NORMAL = 'normal'; - - private const FORMAT_VERBOSE_NOMAX = 'verbose_nomax'; - private const FORMAT_VERY_VERBOSE_NOMAX = 'very_verbose_nomax'; - private const FORMAT_DEBUG_NOMAX = 'debug_nomax'; - private const FORMAT_NORMAL_NOMAX = 'normal_nomax'; - - private $barWidth = 28; - private $barChar; - private $emptyBarChar = '-'; - private $progressChar = '>'; - private $format; - private $internalFormat; - private $redrawFreq = 1; - private $writeCount; - private $lastWriteTime; - private $minSecondsBetweenRedraws = 0; - private $maxSecondsBetweenRedraws = 1; - private $output; - private $step = 0; - private $max; - private $startTime; - private $stepWidth; - private $percent = 0.0; - private $formatLineCount; - private $messages = []; - private $overwrite = true; - private $terminal; - private $previousMessage; - private $cursor; - - private static $formatters; - private static $formats; - - /** - * @param int $max Maximum steps (0 if unknown) - */ - public function __construct(OutputInterface $output, int $max = 0, float $minSecondsBetweenRedraws = 1 / 25) - { - if ($output instanceof ConsoleOutputInterface) { - $output = $output->getErrorOutput(); - } - - $this->output = $output; - $this->setMaxSteps($max); - $this->terminal = new Terminal(); - - if (0 < $minSecondsBetweenRedraws) { - $this->redrawFreq = null; - $this->minSecondsBetweenRedraws = $minSecondsBetweenRedraws; - } - - if (!$this->output->isDecorated()) { - // disable overwrite when output does not support ANSI codes. - $this->overwrite = false; - - // set a reasonable redraw frequency so output isn't flooded - $this->redrawFreq = null; - } - - $this->startTime = time(); - $this->cursor = new Cursor($output); - } - - /** - * Sets a placeholder formatter for a given name. - * - * This method also allow you to override an existing placeholder. - * - * @param string $name The placeholder name (including the delimiter char like %) - * @param callable $callable A PHP callable - */ - public static function setPlaceholderFormatterDefinition(string $name, callable $callable): void - { - if (!self::$formatters) { - self::$formatters = self::initPlaceholderFormatters(); - } - - self::$formatters[$name] = $callable; - } - - /** - * Gets the placeholder formatter for a given name. - * - * @param string $name The placeholder name (including the delimiter char like %) - * - * @return callable|null A PHP callable - */ - public static function getPlaceholderFormatterDefinition(string $name): ?callable - { - if (!self::$formatters) { - self::$formatters = self::initPlaceholderFormatters(); - } - - return self::$formatters[$name] ?? null; - } - - /** - * Sets a format for a given name. - * - * This method also allow you to override an existing format. - * - * @param string $name The format name - * @param string $format A format string - */ - public static function setFormatDefinition(string $name, string $format): void - { - if (!self::$formats) { - self::$formats = self::initFormats(); - } - - self::$formats[$name] = $format; - } - - /** - * Gets the format for a given name. - * - * @param string $name The format name - * - * @return string|null A format string - */ - public static function getFormatDefinition(string $name): ?string - { - if (!self::$formats) { - self::$formats = self::initFormats(); - } - - return self::$formats[$name] ?? null; - } - - /** - * Associates a text with a named placeholder. - * - * The text is displayed when the progress bar is rendered but only - * when the corresponding placeholder is part of the custom format line - * (by wrapping the name with %). - * - * @param string $message The text to associate with the placeholder - * @param string $name The name of the placeholder - */ - public function setMessage(string $message, string $name = 'message') - { - $this->messages[$name] = $message; - } - - public function getMessage(string $name = 'message') - { - return $this->messages[$name]; - } - - public function getStartTime(): int - { - return $this->startTime; - } - - public function getMaxSteps(): int - { - return $this->max; - } - - public function getProgress(): int - { - return $this->step; - } - - private function getStepWidth(): int - { - return $this->stepWidth; - } - - public function getProgressPercent(): float - { - return $this->percent; - } - - public function getBarOffset(): float - { - return floor($this->max ? $this->percent * $this->barWidth : (null === $this->redrawFreq ? (int) (min(5, $this->barWidth / 15) * $this->writeCount) : $this->step) % $this->barWidth); - } - - public function getEstimated(): float - { - if (!$this->step) { - return 0; - } - - return round((time() - $this->startTime) / $this->step * $this->max); - } - - public function getRemaining(): float - { - if (!$this->step) { - return 0; - } - - return round((time() - $this->startTime) / $this->step * ($this->max - $this->step)); - } - - public function setBarWidth(int $size) - { - $this->barWidth = max(1, $size); - } - - public function getBarWidth(): int - { - return $this->barWidth; - } - - public function setBarCharacter(string $char) - { - $this->barChar = $char; - } - - public function getBarCharacter(): string - { - if (null === $this->barChar) { - return $this->max ? '=' : $this->emptyBarChar; - } - - return $this->barChar; - } - - public function setEmptyBarCharacter(string $char) - { - $this->emptyBarChar = $char; - } - - public function getEmptyBarCharacter(): string - { - return $this->emptyBarChar; - } - - public function setProgressCharacter(string $char) - { - $this->progressChar = $char; - } - - public function getProgressCharacter(): string - { - return $this->progressChar; - } - - public function setFormat(string $format) - { - $this->format = null; - $this->internalFormat = $format; - } - - /** - * Sets the redraw frequency. - * - * @param int|null $freq The frequency in steps - */ - public function setRedrawFrequency(?int $freq) - { - $this->redrawFreq = null !== $freq ? max(1, $freq) : null; - } - - public function minSecondsBetweenRedraws(float $seconds): void - { - $this->minSecondsBetweenRedraws = $seconds; - } - - public function maxSecondsBetweenRedraws(float $seconds): void - { - $this->maxSecondsBetweenRedraws = $seconds; - } - - /** - * Returns an iterator that will automatically update the progress bar when iterated. - * - * @param int|null $max Number of steps to complete the bar (0 if indeterminate), if null it will be inferred from $iterable - */ - public function iterate(iterable $iterable, int $max = null): iterable - { - $this->start($max ?? (is_countable($iterable) ? \count($iterable) : 0)); - - foreach ($iterable as $key => $value) { - yield $key => $value; - - $this->advance(); - } - - $this->finish(); - } - - /** - * Starts the progress output. - * - * @param int|null $max Number of steps to complete the bar (0 if indeterminate), null to leave unchanged - */ - public function start(int $max = null) - { - $this->startTime = time(); - $this->step = 0; - $this->percent = 0.0; - - if (null !== $max) { - $this->setMaxSteps($max); - } - - $this->display(); - } - - /** - * Advances the progress output X steps. - * - * @param int $step Number of steps to advance - */ - public function advance(int $step = 1) - { - $this->setProgress($this->step + $step); - } - - /** - * Sets whether to overwrite the progressbar, false for new line. - */ - public function setOverwrite(bool $overwrite) - { - $this->overwrite = $overwrite; - } - - public function setProgress(int $step) - { - if ($this->max && $step > $this->max) { - $this->max = $step; - } elseif ($step < 0) { - $step = 0; - } - - $redrawFreq = $this->redrawFreq ?? (($this->max ?: 10) / 10); - $prevPeriod = (int) ($this->step / $redrawFreq); - $currPeriod = (int) ($step / $redrawFreq); - $this->step = $step; - $this->percent = $this->max ? (float) $this->step / $this->max : 0; - $timeInterval = microtime(true) - $this->lastWriteTime; - - // Draw regardless of other limits - if ($this->max === $step) { - $this->display(); - - return; - } - - // Throttling - if ($timeInterval < $this->minSecondsBetweenRedraws) { - return; - } - - // Draw each step period, but not too late - if ($prevPeriod !== $currPeriod || $timeInterval >= $this->maxSecondsBetweenRedraws) { - $this->display(); - } - } - - public function setMaxSteps(int $max) - { - $this->format = null; - $this->max = max(0, $max); - $this->stepWidth = $this->max ? Helper::width((string) $this->max) : 4; - } - - /** - * Finishes the progress output. - */ - public function finish(): void - { - if (!$this->max) { - $this->max = $this->step; - } - - if ($this->step === $this->max && !$this->overwrite) { - // prevent double 100% output - return; - } - - $this->setProgress($this->max); - } - - /** - * Outputs the current progress string. - */ - public function display(): void - { - if (OutputInterface::VERBOSITY_QUIET === $this->output->getVerbosity()) { - return; - } - - if (null === $this->format) { - $this->setRealFormat($this->internalFormat ?: $this->determineBestFormat()); - } - - $this->overwrite($this->buildLine()); - } - - /** - * Removes the progress bar from the current line. - * - * This is useful if you wish to write some output - * while a progress bar is running. - * Call display() to show the progress bar again. - */ - public function clear(): void - { - if (!$this->overwrite) { - return; - } - - if (null === $this->format) { - $this->setRealFormat($this->internalFormat ?: $this->determineBestFormat()); - } - - $this->overwrite(''); - } - - private function setRealFormat(string $format) - { - // try to use the _nomax variant if available - if (!$this->max && null !== self::getFormatDefinition($format.'_nomax')) { - $this->format = self::getFormatDefinition($format.'_nomax'); - } elseif (null !== self::getFormatDefinition($format)) { - $this->format = self::getFormatDefinition($format); - } else { - $this->format = $format; - } - - $this->formatLineCount = substr_count($this->format, "\n"); - } - - /** - * Overwrites a previous message to the output. - */ - private function overwrite(string $message): void - { - if ($this->previousMessage === $message) { - return; - } - - $originalMessage = $message; - - if ($this->overwrite) { - if (null !== $this->previousMessage) { - if ($this->output instanceof ConsoleSectionOutput) { - $messageLines = explode("\n", $message); - $lineCount = \count($messageLines); - foreach ($messageLines as $messageLine) { - $messageLineLength = Helper::width(Helper::removeDecoration($this->output->getFormatter(), $messageLine)); - if ($messageLineLength > $this->terminal->getWidth()) { - $lineCount += floor($messageLineLength / $this->terminal->getWidth()); - } - } - $this->output->clear($lineCount); - } else { - for ($i = 0; $i < $this->formatLineCount; ++$i) { - $this->cursor->moveToColumn(1); - $this->cursor->clearLine(); - $this->cursor->moveUp(); - } - - $this->cursor->moveToColumn(1); - $this->cursor->clearLine(); - } - } - } elseif ($this->step > 0) { - $message = \PHP_EOL.$message; - } - - $this->previousMessage = $originalMessage; - $this->lastWriteTime = microtime(true); - - $this->output->write($message); - ++$this->writeCount; - } - - private function determineBestFormat(): string - { - switch ($this->output->getVerbosity()) { - // OutputInterface::VERBOSITY_QUIET: display is disabled anyway - case OutputInterface::VERBOSITY_VERBOSE: - return $this->max ? self::FORMAT_VERBOSE : self::FORMAT_VERBOSE_NOMAX; - case OutputInterface::VERBOSITY_VERY_VERBOSE: - return $this->max ? self::FORMAT_VERY_VERBOSE : self::FORMAT_VERY_VERBOSE_NOMAX; - case OutputInterface::VERBOSITY_DEBUG: - return $this->max ? self::FORMAT_DEBUG : self::FORMAT_DEBUG_NOMAX; - default: - return $this->max ? self::FORMAT_NORMAL : self::FORMAT_NORMAL_NOMAX; - } - } - - private static function initPlaceholderFormatters(): array - { - return [ - 'bar' => function (self $bar, OutputInterface $output) { - $completeBars = $bar->getBarOffset(); - $display = str_repeat($bar->getBarCharacter(), $completeBars); - if ($completeBars < $bar->getBarWidth()) { - $emptyBars = $bar->getBarWidth() - $completeBars - Helper::length(Helper::removeDecoration($output->getFormatter(), $bar->getProgressCharacter())); - $display .= $bar->getProgressCharacter().str_repeat($bar->getEmptyBarCharacter(), $emptyBars); - } - - return $display; - }, - 'elapsed' => function (self $bar) { - return Helper::formatTime(time() - $bar->getStartTime()); - }, - '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.'); - } - - return Helper::formatTime($bar->getRemaining()); - }, - 'estimated' => function (self $bar) { - if (!$bar->getMaxSteps()) { - throw new LogicException('Unable to display the estimated time if the maximum number of steps is not set.'); - } - - return Helper::formatTime($bar->getEstimated()); - }, - '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); - }, - ]; - } - - private static function initFormats(): array - { - return [ - self::FORMAT_NORMAL => ' %current%/%max% [%bar%] %percent:3s%%', - self::FORMAT_NORMAL_NOMAX => ' %current% [%bar%]', - - self::FORMAT_VERBOSE => ' %current%/%max% [%bar%] %percent:3s%% %elapsed:6s%', - self::FORMAT_VERBOSE_NOMAX => ' %current% [%bar%] %elapsed:6s%', - - self::FORMAT_VERY_VERBOSE => ' %current%/%max% [%bar%] %percent:3s%% %elapsed:6s%/%estimated:-6s%', - self::FORMAT_VERY_VERBOSE_NOMAX => ' %current% [%bar%] %elapsed:6s%', - - self::FORMAT_DEBUG => ' %current%/%max% [%bar%] %percent:3s%% %elapsed:6s%/%estimated:-6s% %memory:6s%', - self::FORMAT_DEBUG_NOMAX => ' %current% [%bar%] %elapsed:6s% %memory:6s%', - ]; - } - - private function buildLine(): string - { - $regex = "{%([a-z\-_]+)(?:\:([^%]+))?%}i"; - $callback = function ($matches) { - if ($formatter = $this::getPlaceholderFormatterDefinition($matches[1])) { - $text = $formatter($this, $this->output); - } elseif (isset($this->messages[$matches[1]])) { - $text = $this->messages[$matches[1]]; - } else { - return $matches[0]; - } - - if (isset($matches[2])) { - $text = sprintf('%'.$matches[2], $text); - } - - return $text; - }; - $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)); - - $linesWidth = max($linesLength); - - $terminalWidth = $this->terminal->getWidth(); - if ($linesWidth <= $terminalWidth) { - return $line; - } - - $this->setBarWidth($this->barWidth - $linesWidth + $terminalWidth); - - return preg_replace_callback($regex, $callback, $this->format); - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Helper/ProgressIndicator.php b/tools/php-cs-fixer/vendor/symfony/console/Helper/ProgressIndicator.php deleted file mode 100644 index 2d87742..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Helper/ProgressIndicator.php +++ /dev/null @@ -1,254 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -use Symfony\Component\Console\Exception\InvalidArgumentException; -use Symfony\Component\Console\Exception\LogicException; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * @author Kevin Bond - */ -class ProgressIndicator -{ - private $output; - private $startTime; - private $format; - private $message; - private $indicatorValues; - private $indicatorCurrent; - private $indicatorChangeInterval; - private $indicatorUpdateTime; - private $started = false; - - private static $formatters; - private static $formats; - - /** - * @param int $indicatorChangeInterval Change interval in milliseconds - * @param array|null $indicatorValues Animated indicator characters - */ - public function __construct(OutputInterface $output, string $format = null, int $indicatorChangeInterval = 100, array $indicatorValues = null) - { - $this->output = $output; - - if (null === $format) { - $format = $this->determineBestFormat(); - } - - if (null === $indicatorValues) { - $indicatorValues = ['-', '\\', '|', '/']; - } - - $indicatorValues = array_values($indicatorValues); - - if (2 > \count($indicatorValues)) { - throw new InvalidArgumentException('Must have at least 2 indicator value characters.'); - } - - $this->format = self::getFormatDefinition($format); - $this->indicatorChangeInterval = $indicatorChangeInterval; - $this->indicatorValues = $indicatorValues; - $this->startTime = time(); - } - - /** - * Sets the current indicator message. - */ - public function setMessage(?string $message) - { - $this->message = $message; - - $this->display(); - } - - /** - * Starts the indicator output. - */ - public function start(string $message) - { - if ($this->started) { - throw new LogicException('Progress indicator already started.'); - } - - $this->message = $message; - $this->started = true; - $this->startTime = time(); - $this->indicatorUpdateTime = $this->getCurrentTimeInMilliseconds() + $this->indicatorChangeInterval; - $this->indicatorCurrent = 0; - - $this->display(); - } - - /** - * Advances the indicator. - */ - public function advance() - { - if (!$this->started) { - throw new LogicException('Progress indicator has not yet been started.'); - } - - if (!$this->output->isDecorated()) { - return; - } - - $currentTime = $this->getCurrentTimeInMilliseconds(); - - if ($currentTime < $this->indicatorUpdateTime) { - return; - } - - $this->indicatorUpdateTime = $currentTime + $this->indicatorChangeInterval; - ++$this->indicatorCurrent; - - $this->display(); - } - - /** - * Finish the indicator with message. - * - * @param $message - */ - public function finish(string $message) - { - if (!$this->started) { - throw new LogicException('Progress indicator has not yet been started.'); - } - - $this->message = $message; - $this->display(); - $this->output->writeln(''); - $this->started = false; - } - - /** - * Gets the format for a given name. - * - * @return string|null A format string - */ - public static function getFormatDefinition(string $name) - { - if (!self::$formats) { - self::$formats = self::initFormats(); - } - - return self::$formats[$name] ?? null; - } - - /** - * Sets a placeholder formatter for a given name. - * - * This method also allow you to override an existing placeholder. - */ - public static function setPlaceholderFormatterDefinition(string $name, callable $callable) - { - if (!self::$formatters) { - self::$formatters = self::initPlaceholderFormatters(); - } - - self::$formatters[$name] = $callable; - } - - /** - * Gets the placeholder formatter for a given name (including the delimiter char like %). - * - * @return callable|null A PHP callable - */ - public static function getPlaceholderFormatterDefinition(string $name) - { - if (!self::$formatters) { - self::$formatters = self::initPlaceholderFormatters(); - } - - return self::$formatters[$name] ?? null; - } - - private function display() - { - if (OutputInterface::VERBOSITY_QUIET === $this->output->getVerbosity()) { - return; - } - - $this->overwrite(preg_replace_callback("{%([a-z\-_]+)(?:\:([^%]+))?%}i", function ($matches) { - if ($formatter = self::getPlaceholderFormatterDefinition($matches[1])) { - return $formatter($this); - } - - return $matches[0]; - }, $this->format ?? '')); - } - - private function determineBestFormat(): string - { - switch ($this->output->getVerbosity()) { - // OutputInterface::VERBOSITY_QUIET: display is disabled anyway - case OutputInterface::VERBOSITY_VERBOSE: - return $this->output->isDecorated() ? 'verbose' : 'verbose_no_ansi'; - case OutputInterface::VERBOSITY_VERY_VERBOSE: - case OutputInterface::VERBOSITY_DEBUG: - return $this->output->isDecorated() ? 'very_verbose' : 'very_verbose_no_ansi'; - default: - return $this->output->isDecorated() ? 'normal' : 'normal_no_ansi'; - } - } - - /** - * Overwrites a previous message to the output. - */ - private function overwrite(string $message) - { - if ($this->output->isDecorated()) { - $this->output->write("\x0D\x1B[2K"); - $this->output->write($message); - } else { - $this->output->writeln($message); - } - } - - private function getCurrentTimeInMilliseconds(): float - { - return round(microtime(true) * 1000); - } - - 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); - }, - 'memory' => function () { - return Helper::formatMemory(memory_get_usage(true)); - }, - ]; - } - - private static function initFormats(): array - { - return [ - '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%)', - ]; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Helper/QuestionHelper.php b/tools/php-cs-fixer/vendor/symfony/console/Helper/QuestionHelper.php deleted file mode 100644 index fd90959..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Helper/QuestionHelper.php +++ /dev/null @@ -1,605 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -use Symfony\Component\Console\Cursor; -use Symfony\Component\Console\Exception\MissingInputException; -use Symfony\Component\Console\Exception\RuntimeException; -use Symfony\Component\Console\Formatter\OutputFormatter; -use Symfony\Component\Console\Formatter\OutputFormatterStyle; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\StreamableInputInterface; -use Symfony\Component\Console\Output\ConsoleOutputInterface; -use Symfony\Component\Console\Output\ConsoleSectionOutput; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\Question\ChoiceQuestion; -use Symfony\Component\Console\Question\Question; -use Symfony\Component\Console\Terminal; -use function Symfony\Component\String\s; - -/** - * The QuestionHelper class provides helpers to interact with the user. - * - * @author Fabien Potencier - */ -class QuestionHelper extends Helper -{ - private $inputStream; - private static $shell; - private static $stty = true; - private static $stdinIsInteractive; - - /** - * Asks a question to the user. - * - * @return mixed The user answer - * - * @throws RuntimeException If there is no data to read in the input stream - */ - public function ask(InputInterface $input, OutputInterface $output, Question $question) - { - if ($output instanceof ConsoleOutputInterface) { - $output = $output->getErrorOutput(); - } - - if (!$input->isInteractive()) { - return $this->getDefaultAnswer($question); - } - - if ($input instanceof StreamableInputInterface && $stream = $input->getStream()) { - $this->inputStream = $stream; - } - - try { - if (!$question->getValidator()) { - return $this->doAsk($output, $question); - } - - $interviewer = function () use ($output, $question) { - return $this->doAsk($output, $question); - }; - - return $this->validateAttempts($interviewer, $output, $question); - } catch (MissingInputException $exception) { - $input->setInteractive(false); - - if (null === $fallbackOutput = $this->getDefaultAnswer($question)) { - throw $exception; - } - - return $fallbackOutput; - } - } - - /** - * {@inheritdoc} - */ - public function getName() - { - return 'question'; - } - - /** - * Prevents usage of stty. - */ - public static function disableStty() - { - self::$stty = false; - } - - /** - * Asks the question to the user. - * - * @return mixed - * - * @throws RuntimeException In case the fallback is deactivated and the response cannot be hidden - */ - private function doAsk(OutputInterface $output, Question $question) - { - $this->writePrompt($output, $question); - - $inputStream = $this->inputStream ?: \STDIN; - $autocomplete = $question->getAutocompleterCallback(); - - if (null === $autocomplete || !self::$stty || !Terminal::hasSttyAvailable()) { - $ret = false; - if ($question->isHidden()) { - try { - $hiddenResponse = $this->getHiddenResponse($output, $inputStream, $question->isTrimmable()); - $ret = $question->isTrimmable() ? trim($hiddenResponse) : $hiddenResponse; - } catch (RuntimeException $e) { - if (!$question->isHiddenFallback()) { - throw $e; - } - } - } - - if (false === $ret) { - $ret = $this->readInput($inputStream, $question); - if (false === $ret) { - throw new MissingInputException('Aborted.'); - } - if ($question->isTrimmable()) { - $ret = trim($ret); - } - } - } else { - $autocomplete = $this->autocomplete($output, $question, $inputStream, $autocomplete); - $ret = $question->isTrimmable() ? trim($autocomplete) : $autocomplete; - } - - if ($output instanceof ConsoleSectionOutput) { - $output->addContent($ret); - } - - $ret = \strlen($ret) > 0 ? $ret : $question->getDefault(); - - if ($normalizer = $question->getNormalizer()) { - return $normalizer($ret); - } - - return $ret; - } - - /** - * @return mixed - */ - private function getDefaultAnswer(Question $question) - { - $default = $question->getDefault(); - - if (null === $default) { - return $default; - } - - if ($validator = $question->getValidator()) { - return \call_user_func($question->getValidator(), $default); - } elseif ($question instanceof ChoiceQuestion) { - $choices = $question->getChoices(); - - if (!$question->isMultiselect()) { - return $choices[$default] ?? $default; - } - - $default = explode(',', $default); - foreach ($default as $k => $v) { - $v = $question->isTrimmable() ? trim($v) : $v; - $default[$k] = $choices[$v] ?? $v; - } - } - - return $default; - } - - /** - * Outputs the question prompt. - */ - protected function writePrompt(OutputInterface $output, Question $question) - { - $message = $question->getQuestion(); - - if ($question instanceof ChoiceQuestion) { - $output->writeln(array_merge([ - $question->getQuestion(), - ], $this->formatChoiceQuestionChoices($question, 'info'))); - - $message = $question->getPrompt(); - } - - $output->write($message); - } - - /** - * @return string[] - */ - protected function formatChoiceQuestionChoices(ChoiceQuestion $question, string $tag) - { - $messages = []; - - $maxWidth = max(array_map('self::width', array_keys($choices = $question->getChoices()))); - - foreach ($choices as $key => $value) { - $padding = str_repeat(' ', $maxWidth - self::width($key)); - - $messages[] = sprintf(" [<$tag>%s$padding] %s", $key, $value); - } - - return $messages; - } - - /** - * Outputs an error message. - */ - protected function writeError(OutputInterface $output, \Exception $error) - { - if (null !== $this->getHelperSet() && $this->getHelperSet()->has('formatter')) { - $message = $this->getHelperSet()->get('formatter')->formatBlock($error->getMessage(), 'error'); - } else { - $message = ''.$error->getMessage().''; - } - - $output->writeln($message); - } - - /** - * Autocompletes a question. - * - * @param resource $inputStream - */ - private function autocomplete(OutputInterface $output, Question $question, $inputStream, callable $autocomplete): string - { - $cursor = new Cursor($output, $inputStream); - - $fullChoice = ''; - $ret = ''; - - $i = 0; - $ofs = -1; - $matches = $autocomplete($ret); - $numMatches = \count($matches); - - $sttyMode = shell_exec('stty -g'); - - // Disable icanon (so we can fread each keypress) and echo (we'll do echoing here instead) - shell_exec('stty -icanon -echo'); - - // Add highlighted text style - $output->getFormatter()->setStyle('hl', new OutputFormatterStyle('black', 'white')); - - // Read a keypress - while (!feof($inputStream)) { - $c = fread($inputStream, 1); - - // as opposed to fgets(), fread() returns an empty string when the stream content is empty, not false. - if (false === $c || ('' === $ret && '' === $c && null === $question->getDefault())) { - shell_exec(sprintf('stty %s', $sttyMode)); - throw new MissingInputException('Aborted.'); - } elseif ("\177" === $c) { // Backspace Character - if (0 === $numMatches && 0 !== $i) { - --$i; - $cursor->moveLeft(s($fullChoice)->slice(-1)->width(false)); - - $fullChoice = self::substr($fullChoice, 0, $i); - } - - if (0 === $i) { - $ofs = -1; - $matches = $autocomplete($ret); - $numMatches = \count($matches); - } else { - $numMatches = 0; - } - - // Pop the last character off the end of our string - $ret = self::substr($ret, 0, $i); - } elseif ("\033" === $c) { - // Did we read an escape sequence? - $c .= fread($inputStream, 2); - - // A = Up Arrow. B = Down Arrow - if (isset($c[2]) && ('A' === $c[2] || 'B' === $c[2])) { - if ('A' === $c[2] && -1 === $ofs) { - $ofs = 0; - } - - if (0 === $numMatches) { - continue; - } - - $ofs += ('A' === $c[2]) ? -1 : 1; - $ofs = ($numMatches + $ofs) % $numMatches; - } - } elseif (\ord($c) < 32) { - if ("\t" === $c || "\n" === $c) { - if ($numMatches > 0 && -1 !== $ofs) { - $ret = (string) $matches[$ofs]; - // Echo out remaining chars for current match - $remainingCharacters = substr($ret, \strlen(trim($this->mostRecentlyEnteredValue($fullChoice)))); - $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 || str_starts_with($match, $ret); - } - ); - $numMatches = \count($matches); - $ofs = -1; - } - - if ("\n" === $c) { - $output->write($c); - break; - } - - $numMatches = 0; - } - - continue; - } else { - if ("\x80" <= $c) { - $c .= fread($inputStream, ["\xC0" => 1, "\xD0" => 1, "\xE0" => 2, "\xF0" => 3][$c & "\xF0"]); - } - - $output->write($c); - $ret .= $c; - $fullChoice .= $c; - ++$i; - - $tempRet = $ret; - - if ($question instanceof ChoiceQuestion && $question->isMultiselect()) { - $tempRet = $this->mostRecentlyEnteredValue($fullChoice); - } - - $numMatches = 0; - $ofs = 0; - - foreach ($autocomplete($ret) as $value) { - // If typed characters match the beginning chunk of value (e.g. [AcmeDe]moBundle) - if (str_starts_with($value, $tempRet)) { - $matches[$numMatches++] = $value; - } - } - } - - $cursor->clearLineAfter(); - - if ($numMatches > 0 && -1 !== $ofs) { - $cursor->savePosition(); - // Write highlighted text, complete the partially entered response - $charactersEntered = \strlen(trim($this->mostRecentlyEnteredValue($fullChoice))); - $output->write(''.OutputFormatter::escapeTrailingBackslash(substr($matches[$ofs], $charactersEntered)).''); - $cursor->restorePosition(); - } - } - - // Reset stty so it behaves normally again - shell_exec(sprintf('stty %s', $sttyMode)); - - return $fullChoice; - } - - private function mostRecentlyEnteredValue(string $entered): string - { - // Determine the most recent value that the user entered - if (!str_contains($entered, ',')) { - return $entered; - } - - $choices = explode(',', $entered); - if ('' !== $lastChoice = trim($choices[\count($choices) - 1])) { - return $lastChoice; - } - - return $entered; - } - - /** - * Gets a hidden response from user. - * - * @param resource $inputStream The handler resource - * @param bool $trimmable Is the answer trimmable - * - * @throws RuntimeException In case the fallback is deactivated and the response cannot be hidden - */ - private function getHiddenResponse(OutputInterface $output, $inputStream, bool $trimmable = true): string - { - if ('\\' === \DIRECTORY_SEPARATOR) { - $exe = __DIR__.'/../Resources/bin/hiddeninput.exe'; - - // handle code running from a phar - if ('phar:' === substr(__FILE__, 0, 5)) { - $tmpExe = sys_get_temp_dir().'/hiddeninput.exe'; - copy($exe, $tmpExe); - $exe = $tmpExe; - } - - $sExec = shell_exec('"'.$exe.'"'); - $value = $trimmable ? rtrim($sExec) : $sExec; - $output->writeln(''); - - if (isset($tmpExe)) { - unlink($tmpExe); - } - - return $value; - } - - if (self::$stty && Terminal::hasSttyAvailable()) { - $sttyMode = shell_exec('stty -g'); - shell_exec('stty -echo'); - } elseif ($this->isInteractiveInput($inputStream)) { - throw new RuntimeException('Unable to hide the response.'); - } - - $value = fgets($inputStream, 4096); - - if (self::$stty && Terminal::hasSttyAvailable()) { - shell_exec(sprintf('stty %s', $sttyMode)); - } - - if (false === $value) { - throw new MissingInputException('Aborted.'); - } - if ($trimmable) { - $value = trim($value); - } - $output->writeln(''); - - return $value; - } - - /** - * Validates an attempt. - * - * @param callable $interviewer A callable that will ask for a question and return the result - * - * @return mixed The validated response - * - * @throws \Exception In case the max number of attempts has been reached and no valid response has been given - */ - private function validateAttempts(callable $interviewer, OutputInterface $output, Question $question) - { - $error = null; - $attempts = $question->getMaxAttempts(); - - while (null === $attempts || $attempts--) { - if (null !== $error) { - $this->writeError($output, $error); - } - - try { - return $question->getValidator()($interviewer()); - } catch (RuntimeException $e) { - throw $e; - } catch (\Exception $error) { - } - } - - throw $error; - } - - private function isInteractiveInput($inputStream): bool - { - if ('php://stdin' !== (stream_get_meta_data($inputStream)['uri'] ?? null)) { - return false; - } - - if (null !== self::$stdinIsInteractive) { - return self::$stdinIsInteractive; - } - - if (\function_exists('stream_isatty')) { - return self::$stdinIsInteractive = stream_isatty(fopen('php://stdin', 'r')); - } - - if (\function_exists('posix_isatty')) { - return self::$stdinIsInteractive = posix_isatty(fopen('php://stdin', 'r')); - } - - if (!\function_exists('exec')) { - return self::$stdinIsInteractive = true; - } - - exec('stty 2> /dev/null', $output, $status); - - return self::$stdinIsInteractive = 1 !== $status; - } - - /** - * Reads one or more lines of input and returns what is read. - * - * @param resource $inputStream The handler resource - * @param Question $question The question being asked - * - * @return string|false The input received, false in case input could not be read - */ - private function readInput($inputStream, Question $question) - { - if (!$question->isMultiline()) { - $cp = $this->setIOCodepage(); - $ret = fgets($inputStream, 4096); - - return $this->resetIOCodepage($cp, $ret); - } - - $multiLineStreamReader = $this->cloneInputStream($inputStream); - if (null === $multiLineStreamReader) { - return false; - } - - $ret = ''; - $cp = $this->setIOCodepage(); - while (false !== ($char = fgetc($multiLineStreamReader))) { - if (\PHP_EOL === "{$ret}{$char}") { - break; - } - $ret .= $char; - } - - return $this->resetIOCodepage($cp, $ret); - } - - /** - * Sets console I/O to the host code page. - * - * @return int Previous code page in IBM/EBCDIC format - */ - private function setIOCodepage(): int - { - if (\function_exists('sapi_windows_cp_set')) { - $cp = sapi_windows_cp_get(); - sapi_windows_cp_set(sapi_windows_cp_get('oem')); - - return $cp; - } - - return 0; - } - - /** - * Sets console I/O to the specified code page and converts the user input. - * - * @param string|false $input - * - * @return string|false - */ - private function resetIOCodepage(int $cp, $input) - { - if (0 !== $cp) { - sapi_windows_cp_set($cp); - - if (false !== $input && '' !== $input) { - $input = sapi_windows_cp_conv(sapi_windows_cp_get('oem'), $cp, $input); - } - } - - return $input; - } - - /** - * Clones an input stream in order to act on one instance of the same - * stream without affecting the other instance. - * - * @param resource $inputStream The handler resource - * - * @return resource|null The cloned resource, null in case it could not be cloned - */ - private function cloneInputStream($inputStream) - { - $streamMetaData = stream_get_meta_data($inputStream); - $seekable = $streamMetaData['seekable'] ?? false; - $mode = $streamMetaData['mode'] ?? 'rb'; - $uri = $streamMetaData['uri'] ?? null; - - if (null === $uri) { - return null; - } - - $cloneStream = fopen($uri, $mode); - - // For seekable and writable streams, add all the same data to the - // cloned stream and then seek to the same offset. - if (true === $seekable && !\in_array($mode, ['r', 'rb', 'rt'])) { - $offset = ftell($inputStream); - rewind($inputStream); - stream_copy_to_stream($inputStream, $cloneStream); - fseek($inputStream, $offset); - fseek($cloneStream, $offset); - } - - return $cloneStream; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Helper/SymfonyQuestionHelper.php b/tools/php-cs-fixer/vendor/symfony/console/Helper/SymfonyQuestionHelper.php deleted file mode 100644 index 01f94ab..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Helper/SymfonyQuestionHelper.php +++ /dev/null @@ -1,109 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -use Symfony\Component\Console\Formatter\OutputFormatter; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\Question\ChoiceQuestion; -use Symfony\Component\Console\Question\ConfirmationQuestion; -use Symfony\Component\Console\Question\Question; -use Symfony\Component\Console\Style\SymfonyStyle; - -/** - * Symfony Style Guide compliant question helper. - * - * @author Kevin Bond - */ -class SymfonyQuestionHelper extends QuestionHelper -{ - /** - * {@inheritdoc} - */ - protected function writePrompt(OutputInterface $output, Question $question) - { - $text = OutputFormatter::escapeTrailingBackslash($question->getQuestion()); - $default = $question->getDefault(); - - if ($question->isMultiline()) { - $text .= sprintf(' (press %s to continue)', $this->getEofShortcut()); - } - - switch (true) { - case null === $default: - $text = sprintf(' %s:', $text); - - break; - - case $question instanceof ConfirmationQuestion: - $text = sprintf(' %s (yes/no) [%s]:', $text, $default ? 'yes' : 'no'); - - break; - - case $question instanceof ChoiceQuestion && $question->isMultiselect(): - $choices = $question->getChoices(); - $default = explode(',', $default); - - foreach ($default as $key => $value) { - $default[$key] = $choices[trim($value)]; - } - - $text = sprintf(' %s [%s]:', $text, OutputFormatter::escape(implode(', ', $default))); - - break; - - case $question instanceof ChoiceQuestion: - $choices = $question->getChoices(); - $text = sprintf(' %s [%s]:', $text, OutputFormatter::escape($choices[$default] ?? $default)); - - break; - - default: - $text = sprintf(' %s [%s]:', $text, OutputFormatter::escape($default)); - } - - $output->writeln($text); - - $prompt = ' > '; - - if ($question instanceof ChoiceQuestion) { - $output->writeln($this->formatChoiceQuestionChoices($question, 'comment')); - - $prompt = $question->getPrompt(); - } - - $output->write($prompt); - } - - /** - * {@inheritdoc} - */ - protected function writeError(OutputInterface $output, \Exception $error) - { - if ($output instanceof SymfonyStyle) { - $output->newLine(); - $output->error($error->getMessage()); - - return; - } - - parent::writeError($output, $error); - } - - private function getEofShortcut(): string - { - if ('Windows' === \PHP_OS_FAMILY) { - return 'Ctrl+Z then Enter'; - } - - return 'Ctrl+D'; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Helper/Table.php b/tools/php-cs-fixer/vendor/symfony/console/Helper/Table.php deleted file mode 100644 index 15c515e..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Helper/Table.php +++ /dev/null @@ -1,865 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -use Symfony\Component\Console\Exception\InvalidArgumentException; -use Symfony\Component\Console\Exception\RuntimeException; -use Symfony\Component\Console\Formatter\OutputFormatter; -use Symfony\Component\Console\Formatter\WrappableOutputFormatterInterface; -use Symfony\Component\Console\Output\ConsoleSectionOutput; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * Provides helpers to display a table. - * - * @author Fabien Potencier - * @author Саша Стаменковић - * @author Abdellatif Ait boudad - * @author Max Grigorian - * @author Dany Maillard - */ -class Table -{ - private const SEPARATOR_TOP = 0; - private const SEPARATOR_TOP_BOTTOM = 1; - private const SEPARATOR_MID = 2; - private const SEPARATOR_BOTTOM = 3; - private const BORDER_OUTSIDE = 0; - private const BORDER_INSIDE = 1; - - private $headerTitle; - private $footerTitle; - - /** - * Table headers. - */ - private $headers = []; - - /** - * Table rows. - */ - private $rows = []; - private $horizontal = false; - - /** - * Column widths cache. - */ - private $effectiveColumnWidths = []; - - /** - * Number of columns cache. - * - * @var int - */ - private $numberOfColumns; - - /** - * @var OutputInterface - */ - private $output; - - /** - * @var TableStyle - */ - private $style; - - /** - * @var array - */ - private $columnStyles = []; - - /** - * User set column widths. - * - * @var array - */ - private $columnWidths = []; - private $columnMaxWidths = []; - - private static $styles; - - private $rendered = false; - - public function __construct(OutputInterface $output) - { - $this->output = $output; - - if (!self::$styles) { - self::$styles = self::initStyles(); - } - - $this->setStyle('default'); - } - - /** - * Sets a style definition. - */ - public static function setStyleDefinition(string $name, TableStyle $style) - { - if (!self::$styles) { - self::$styles = self::initStyles(); - } - - self::$styles[$name] = $style; - } - - /** - * Gets a style definition by name. - * - * @return TableStyle - */ - public static function getStyleDefinition(string $name) - { - if (!self::$styles) { - self::$styles = self::initStyles(); - } - - if (isset(self::$styles[$name])) { - return self::$styles[$name]; - } - - throw new InvalidArgumentException(sprintf('Style "%s" is not defined.', $name)); - } - - /** - * Sets table style. - * - * @param TableStyle|string $name The style name or a TableStyle instance - * - * @return $this - */ - public function setStyle($name) - { - $this->style = $this->resolveStyle($name); - - return $this; - } - - /** - * Gets the current table style. - * - * @return TableStyle - */ - public function getStyle() - { - return $this->style; - } - - /** - * Sets table column style. - * - * @param TableStyle|string $name The style name or a TableStyle instance - * - * @return $this - */ - public function setColumnStyle(int $columnIndex, $name) - { - $this->columnStyles[$columnIndex] = $this->resolveStyle($name); - - return $this; - } - - /** - * Gets the current style for a column. - * - * If style was not set, it returns the global table style. - * - * @return TableStyle - */ - public function getColumnStyle(int $columnIndex) - { - return $this->columnStyles[$columnIndex] ?? $this->getStyle(); - } - - /** - * Sets the minimum width of a column. - * - * @return $this - */ - public function setColumnWidth(int $columnIndex, int $width) - { - $this->columnWidths[$columnIndex] = $width; - - return $this; - } - - /** - * Sets the minimum width of all columns. - * - * @return $this - */ - public function setColumnWidths(array $widths) - { - $this->columnWidths = []; - foreach ($widths as $index => $width) { - $this->setColumnWidth($index, $width); - } - - return $this; - } - - /** - * Sets the maximum width of a column. - * - * Any cell within this column which contents exceeds the specified width will be wrapped into multiple lines, while - * formatted strings are preserved. - * - * @return $this - */ - public function setColumnMaxWidth(int $columnIndex, int $width): self - { - if (!$this->output->getFormatter() instanceof WrappableOutputFormatterInterface) { - throw new \LogicException(sprintf('Setting a maximum column width is only supported when using a "%s" formatter, got "%s".', WrappableOutputFormatterInterface::class, get_debug_type($this->output->getFormatter()))); - } - - $this->columnMaxWidths[$columnIndex] = $width; - - return $this; - } - - public function setHeaders(array $headers) - { - $headers = array_values($headers); - if (!empty($headers) && !\is_array($headers[0])) { - $headers = [$headers]; - } - - $this->headers = $headers; - - return $this; - } - - public function setRows(array $rows) - { - $this->rows = []; - - return $this->addRows($rows); - } - - public function addRows(array $rows) - { - foreach ($rows as $row) { - $this->addRow($row); - } - - return $this; - } - - public function addRow($row) - { - if ($row instanceof TableSeparator) { - $this->rows[] = $row; - - return $this; - } - - if (!\is_array($row)) { - throw new InvalidArgumentException('A row must be an array or a TableSeparator instance.'); - } - - $this->rows[] = array_values($row); - - return $this; - } - - /** - * Adds a row to the table, and re-renders the table. - */ - public function appendRow($row): self - { - if (!$this->output instanceof ConsoleSectionOutput) { - throw new RuntimeException(sprintf('Output should be an instance of "%s" when calling "%s".', ConsoleSectionOutput::class, __METHOD__)); - } - - if ($this->rendered) { - $this->output->clear($this->calculateRowCount()); - } - - $this->addRow($row); - $this->render(); - - return $this; - } - - public function setRow($column, array $row) - { - $this->rows[$column] = $row; - - return $this; - } - - public function setHeaderTitle(?string $title): self - { - $this->headerTitle = $title; - - return $this; - } - - public function setFooterTitle(?string $title): self - { - $this->footerTitle = $title; - - return $this; - } - - public function setHorizontal(bool $horizontal = true): self - { - $this->horizontal = $horizontal; - - return $this; - } - - /** - * Renders table to output. - * - * Example: - * - * +---------------+-----------------------+------------------+ - * | ISBN | Title | Author | - * +---------------+-----------------------+------------------+ - * | 99921-58-10-7 | Divine Comedy | Dante Alighieri | - * | 9971-5-0210-0 | A Tale of Two Cities | Charles Dickens | - * | 960-425-059-0 | The Lord of the Rings | J. R. R. Tolkien | - * +---------------+-----------------------+------------------+ - */ - public function render() - { - $divider = new TableSeparator(); - if ($this->horizontal) { - $rows = []; - foreach ($this->headers[0] ?? [] as $i => $header) { - $rows[$i] = [$header]; - foreach ($this->rows as $row) { - if ($row instanceof TableSeparator) { - continue; - } - if (isset($row[$i])) { - $rows[$i][] = $row[$i]; - } elseif ($rows[$i][0] instanceof TableCell && $rows[$i][0]->getColspan() >= 2) { - // Noop, there is a "title" - } else { - $rows[$i][] = null; - } - } - } - } else { - $rows = array_merge($this->headers, [$divider], $this->rows); - } - - $this->calculateNumberOfColumns($rows); - - $rows = $this->buildTableRows($rows); - $this->calculateColumnsWidth($rows); - - $isHeader = !$this->horizontal; - $isFirstRow = $this->horizontal; - $hasTitle = (bool) $this->headerTitle; - foreach ($rows as $row) { - if ($divider === $row) { - $isHeader = false; - $isFirstRow = true; - - continue; - } - if ($row instanceof TableSeparator) { - $this->renderRowSeparator(); - - continue; - } - if (!$row) { - continue; - } - - if ($isHeader || $isFirstRow) { - $this->renderRowSeparator( - $isHeader ? self::SEPARATOR_TOP : self::SEPARATOR_TOP_BOTTOM, - $hasTitle ? $this->headerTitle : null, - $hasTitle ? $this->style->getHeaderTitleFormat() : null - ); - $isFirstRow = false; - $hasTitle = false; - } - if ($this->horizontal) { - $this->renderRow($row, $this->style->getCellRowFormat(), $this->style->getCellHeaderFormat()); - } else { - $this->renderRow($row, $isHeader ? $this->style->getCellHeaderFormat() : $this->style->getCellRowFormat()); - } - } - $this->renderRowSeparator(self::SEPARATOR_BOTTOM, $this->footerTitle, $this->style->getFooterTitleFormat()); - - $this->cleanup(); - $this->rendered = true; - } - - /** - * Renders horizontal header separator. - * - * Example: - * - * +-----+-----------+-------+ - */ - private function renderRowSeparator(int $type = self::SEPARATOR_MID, string $title = null, string $titleFormat = null) - { - if (0 === $count = $this->numberOfColumns) { - return; - } - - $borders = $this->style->getBorderChars(); - if (!$borders[0] && !$borders[2] && !$this->style->getCrossingChar()) { - return; - } - - $crossings = $this->style->getCrossingChars(); - if (self::SEPARATOR_MID === $type) { - [$horizontal, $leftChar, $midChar, $rightChar] = [$borders[2], $crossings[8], $crossings[0], $crossings[4]]; - } elseif (self::SEPARATOR_TOP === $type) { - [$horizontal, $leftChar, $midChar, $rightChar] = [$borders[0], $crossings[1], $crossings[2], $crossings[3]]; - } elseif (self::SEPARATOR_TOP_BOTTOM === $type) { - [$horizontal, $leftChar, $midChar, $rightChar] = [$borders[0], $crossings[9], $crossings[10], $crossings[11]]; - } else { - [$horizontal, $leftChar, $midChar, $rightChar] = [$borders[0], $crossings[7], $crossings[6], $crossings[5]]; - } - - $markup = $leftChar; - for ($column = 0; $column < $count; ++$column) { - $markup .= str_repeat($horizontal, $this->effectiveColumnWidths[$column]); - $markup .= $column === $count - 1 ? $rightChar : $midChar; - } - - if (null !== $title) { - $titleLength = Helper::width(Helper::removeDecoration($formatter = $this->output->getFormatter(), $formattedTitle = sprintf($titleFormat, $title))); - $markupLength = Helper::width($markup); - if ($titleLength > $limit = $markupLength - 4) { - $titleLength = $limit; - $formatLength = Helper::width(Helper::removeDecoration($formatter, sprintf($titleFormat, ''))); - $formattedTitle = sprintf($titleFormat, Helper::substr($title, 0, $limit - $formatLength - 3).'...'); - } - - $titleStart = intdiv($markupLength - $titleLength, 2); - if (false === mb_detect_encoding($markup, null, true)) { - $markup = substr_replace($markup, $formattedTitle, $titleStart, $titleLength); - } else { - $markup = mb_substr($markup, 0, $titleStart).$formattedTitle.mb_substr($markup, $titleStart + $titleLength); - } - } - - $this->output->writeln(sprintf($this->style->getBorderFormat(), $markup)); - } - - /** - * Renders vertical column separator. - */ - private function renderColumnSeparator(int $type = self::BORDER_OUTSIDE): string - { - $borders = $this->style->getBorderChars(); - - return sprintf($this->style->getBorderFormat(), self::BORDER_OUTSIDE === $type ? $borders[1] : $borders[3]); - } - - /** - * Renders table row. - * - * Example: - * - * | 9971-5-0210-0 | A Tale of Two Cities | Charles Dickens | - */ - private function renderRow(array $row, string $cellFormat, string $firstCellFormat = null) - { - $rowContent = $this->renderColumnSeparator(self::BORDER_OUTSIDE); - $columns = $this->getRowColumns($row); - $last = \count($columns) - 1; - foreach ($columns as $i => $column) { - if ($firstCellFormat && 0 === $i) { - $rowContent .= $this->renderCell($row, $column, $firstCellFormat); - } else { - $rowContent .= $this->renderCell($row, $column, $cellFormat); - } - $rowContent .= $this->renderColumnSeparator($last === $i ? self::BORDER_OUTSIDE : self::BORDER_INSIDE); - } - $this->output->writeln($rowContent); - } - - /** - * Renders table cell with padding. - */ - private function renderCell(array $row, int $column, string $cellFormat): string - { - $cell = $row[$column] ?? ''; - $width = $this->effectiveColumnWidths[$column]; - if ($cell instanceof TableCell && $cell->getColspan() > 1) { - // add the width of the following columns(numbers of colspan). - foreach (range($column + 1, $column + $cell->getColspan() - 1) as $nextColumn) { - $width += $this->getColumnSeparatorWidth() + $this->effectiveColumnWidths[$nextColumn]; - } - } - - // str_pad won't work properly with multi-byte strings, we need to fix the padding - if (false !== $encoding = mb_detect_encoding($cell, null, true)) { - $width += \strlen($cell) - mb_strwidth($cell, $encoding); - } - - $style = $this->getColumnStyle($column); - - if ($cell instanceof TableSeparator) { - return sprintf($style->getBorderFormat(), str_repeat($style->getBorderChars()[2], $width)); - } - - $width += Helper::length($cell) - Helper::length(Helper::removeDecoration($this->output->getFormatter(), $cell)); - $content = sprintf($style->getCellRowContentFormat(), $cell); - - $padType = $style->getPadType(); - if ($cell instanceof TableCell && $cell->getStyle() instanceof TableCellStyle) { - $isNotStyledByTag = !preg_match('/^<(\w+|(\w+=[\w,]+;?)*)>.+<\/(\w+|(\w+=\w+;?)*)?>$/', $cell); - if ($isNotStyledByTag) { - $cellFormat = $cell->getStyle()->getCellFormat(); - if (!\is_string($cellFormat)) { - $tag = http_build_query($cell->getStyle()->getTagOptions(), '', ';'); - $cellFormat = '<'.$tag.'>%s'; - } - - if (strstr($content, '')) { - $content = str_replace('', '', $content); - $width -= 3; - } - if (strstr($content, '')) { - $content = str_replace('', '', $content); - $width -= \strlen(''); - } - } - - $padType = $cell->getStyle()->getPadByAlign(); - } - - return sprintf($cellFormat, str_pad($content, $width, $style->getPaddingChar(), $padType)); - } - - /** - * Calculate number of columns for this table. - */ - private function calculateNumberOfColumns(array $rows) - { - $columns = [0]; - foreach ($rows as $row) { - if ($row instanceof TableSeparator) { - continue; - } - - $columns[] = $this->getNumberOfColumns($row); - } - - $this->numberOfColumns = max($columns); - } - - private function buildTableRows(array $rows): TableRows - { - /** @var WrappableOutputFormatterInterface $formatter */ - $formatter = $this->output->getFormatter(); - $unmergedRows = []; - for ($rowKey = 0; $rowKey < \count($rows); ++$rowKey) { - $rows = $this->fillNextRows($rows, $rowKey); - - // Remove any new line breaks and replace it with a new line - foreach ($rows[$rowKey] as $column => $cell) { - $colspan = $cell instanceof TableCell ? $cell->getColspan() : 1; - - if (isset($this->columnMaxWidths[$column]) && Helper::width(Helper::removeDecoration($formatter, $cell)) > $this->columnMaxWidths[$column]) { - $cell = $formatter->formatAndWrap($cell, $this->columnMaxWidths[$column] * $colspan); - } - if (!strstr($cell ?? '', "\n")) { - continue; - } - $escaped = implode("\n", array_map([OutputFormatter::class, 'escapeTrailingBackslash'], explode("\n", $cell))); - $cell = $cell instanceof TableCell ? new TableCell($escaped, ['colspan' => $cell->getColspan()]) : $escaped; - $lines = explode("\n", str_replace("\n", "\n", $cell)); - foreach ($lines as $lineKey => $line) { - if ($colspan > 1) { - $line = new TableCell($line, ['colspan' => $colspan]); - } - if (0 === $lineKey) { - $rows[$rowKey][$column] = $line; - } else { - if (!\array_key_exists($rowKey, $unmergedRows) || !\array_key_exists($lineKey, $unmergedRows[$rowKey])) { - $unmergedRows[$rowKey][$lineKey] = $this->copyRow($rows, $rowKey); - } - $unmergedRows[$rowKey][$lineKey][$column] = $line; - } - } - } - } - - return new TableRows(function () use ($rows, $unmergedRows): \Traversable { - foreach ($rows as $rowKey => $row) { - yield $row instanceof TableSeparator ? $row : $this->fillCells($row); - - if (isset($unmergedRows[$rowKey])) { - foreach ($unmergedRows[$rowKey] as $row) { - yield $row instanceof TableSeparator ? $row : $this->fillCells($row); - } - } - } - }); - } - - private function calculateRowCount(): int - { - $numberOfRows = \count(iterator_to_array($this->buildTableRows(array_merge($this->headers, [new TableSeparator()], $this->rows)))); - - if ($this->headers) { - ++$numberOfRows; // Add row for header separator - } - - if (\count($this->rows) > 0) { - ++$numberOfRows; // Add row for footer separator - } - - return $numberOfRows; - } - - /** - * fill rows that contains rowspan > 1. - * - * @throws InvalidArgumentException - */ - private function fillNextRows(array $rows, int $line): array - { - $unmergedRows = []; - foreach ($rows[$line] as $column => $cell) { - 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) { - $nbLines = $cell->getRowspan() - 1; - $lines = [$cell]; - if (strstr($cell, "\n")) { - $lines = explode("\n", str_replace("\n", "\n", $cell)); - $nbLines = \count($lines) > $nbLines ? substr_count($cell, "\n") : $nbLines; - - $rows[$line][$column] = new TableCell($lines[0], ['colspan' => $cell->getColspan(), 'style' => $cell->getStyle()]); - unset($lines[0]); - } - - // create a two dimensional array (rowspan x colspan) - $unmergedRows = array_replace_recursive(array_fill($line + 1, $nbLines, []), $unmergedRows); - foreach ($unmergedRows as $unmergedRowKey => $unmergedRow) { - $value = $lines[$unmergedRowKey - $line] ?? ''; - $unmergedRows[$unmergedRowKey][$column] = new TableCell($value, ['colspan' => $cell->getColspan(), 'style' => $cell->getStyle()]); - if ($nbLines === $unmergedRowKey - $line) { - break; - } - } - } - } - - foreach ($unmergedRows as $unmergedRowKey => $unmergedRow) { - // we need to know if $unmergedRow will be merged or inserted into $rows - if (isset($rows[$unmergedRowKey]) && \is_array($rows[$unmergedRowKey]) && ($this->getNumberOfColumns($rows[$unmergedRowKey]) + $this->getNumberOfColumns($unmergedRows[$unmergedRowKey]) <= $this->numberOfColumns)) { - foreach ($unmergedRow as $cellKey => $cell) { - // insert cell into row at cellKey position - array_splice($rows[$unmergedRowKey], $cellKey, 0, [$cell]); - } - } else { - $row = $this->copyRow($rows, $unmergedRowKey - 1); - foreach ($unmergedRow as $column => $cell) { - if (!empty($cell)) { - $row[$column] = $unmergedRow[$column]; - } - } - array_splice($rows, $unmergedRowKey, 0, [$row]); - } - } - - return $rows; - } - - /** - * fill cells for a row that contains colspan > 1. - */ - private function fillCells(iterable $row) - { - $newRow = []; - - foreach ($row as $column => $cell) { - $newRow[] = $cell; - if ($cell instanceof TableCell && $cell->getColspan() > 1) { - foreach (range($column + 1, $column + $cell->getColspan() - 1) as $position) { - // insert empty value at column position - $newRow[] = ''; - } - } - } - - return $newRow ?: $row; - } - - private function copyRow(array $rows, int $line): array - { - $row = $rows[$line]; - foreach ($row as $cellKey => $cellValue) { - $row[$cellKey] = ''; - if ($cellValue instanceof TableCell) { - $row[$cellKey] = new TableCell('', ['colspan' => $cellValue->getColspan()]); - } - } - - return $row; - } - - /** - * Gets number of columns by row. - */ - private function getNumberOfColumns(array $row): int - { - $columns = \count($row); - foreach ($row as $column) { - $columns += $column instanceof TableCell ? ($column->getColspan() - 1) : 0; - } - - return $columns; - } - - /** - * Gets list of columns for the given row. - */ - private function getRowColumns(array $row): array - { - $columns = range(0, $this->numberOfColumns - 1); - foreach ($row as $cellKey => $cell) { - if ($cell instanceof TableCell && $cell->getColspan() > 1) { - // exclude grouped columns. - $columns = array_diff($columns, range($cellKey + 1, $cellKey + $cell->getColspan() - 1)); - } - } - - return $columns; - } - - /** - * Calculates columns widths. - */ - private function calculateColumnsWidth(iterable $rows) - { - for ($column = 0; $column < $this->numberOfColumns; ++$column) { - $lengths = []; - foreach ($rows as $row) { - if ($row instanceof TableSeparator) { - continue; - } - - foreach ($row as $i => $cell) { - if ($cell instanceof TableCell) { - $textContent = Helper::removeDecoration($this->output->getFormatter(), $cell); - $textLength = Helper::width($textContent); - if ($textLength > 0) { - $contentColumns = str_split($textContent, ceil($textLength / $cell->getColspan())); - foreach ($contentColumns as $position => $content) { - $row[$i + $position] = $content; - } - } - } - } - - $lengths[] = $this->getCellWidth($row, $column); - } - - $this->effectiveColumnWidths[$column] = max($lengths) + Helper::width($this->style->getCellRowContentFormat()) - 2; - } - } - - private function getColumnSeparatorWidth(): int - { - return Helper::width(sprintf($this->style->getBorderFormat(), $this->style->getBorderChars()[3])); - } - - private function getCellWidth(array $row, int $column): int - { - $cellWidth = 0; - - if (isset($row[$column])) { - $cell = $row[$column]; - $cellWidth = Helper::width(Helper::removeDecoration($this->output->getFormatter(), $cell)); - } - - $columnWidth = $this->columnWidths[$column] ?? 0; - $cellWidth = max($cellWidth, $columnWidth); - - return isset($this->columnMaxWidths[$column]) ? min($this->columnMaxWidths[$column], $cellWidth) : $cellWidth; - } - - /** - * Called after rendering to cleanup cache data. - */ - private function cleanup() - { - $this->effectiveColumnWidths = []; - $this->numberOfColumns = null; - } - - private static function initStyles(): array - { - $borderless = new TableStyle(); - $borderless - ->setHorizontalBorderChars('=') - ->setVerticalBorderChars(' ') - ->setDefaultCrossingChar(' ') - ; - - $compact = new TableStyle(); - $compact - ->setHorizontalBorderChars('') - ->setVerticalBorderChars(' ') - ->setDefaultCrossingChar('') - ->setCellRowContentFormat('%s') - ; - - $styleGuide = new TableStyle(); - $styleGuide - ->setHorizontalBorderChars('-') - ->setVerticalBorderChars(' ') - ->setDefaultCrossingChar(' ') - ->setCellHeaderFormat('%s') - ; - - $box = (new TableStyle()) - ->setHorizontalBorderChars('─') - ->setVerticalBorderChars('│') - ->setCrossingChars('┼', '┌', '┬', '┐', '┤', '┘', '┴', '└', '├') - ; - - $boxDouble = (new TableStyle()) - ->setHorizontalBorderChars('═', '─') - ->setVerticalBorderChars('║', '│') - ->setCrossingChars('┼', '╔', '╤', '╗', '╢', '╝', '╧', '╚', '╟', '╠', '╪', '╣') - ; - - return [ - 'default' => new TableStyle(), - 'borderless' => $borderless, - 'compact' => $compact, - 'symfony-style-guide' => $styleGuide, - 'box' => $box, - 'box-double' => $boxDouble, - ]; - } - - private function resolveStyle($name): TableStyle - { - if ($name instanceof TableStyle) { - return $name; - } - - if (isset(self::$styles[$name])) { - return self::$styles[$name]; - } - - throw new InvalidArgumentException(sprintf('Style "%s" is not defined.', $name)); - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Helper/TableCell.php b/tools/php-cs-fixer/vendor/symfony/console/Helper/TableCell.php deleted file mode 100644 index 1a7bc6e..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Helper/TableCell.php +++ /dev/null @@ -1,78 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -use Symfony\Component\Console\Exception\InvalidArgumentException; - -/** - * @author Abdellatif Ait boudad - */ -class TableCell -{ - private $value; - private $options = [ - 'rowspan' => 1, - 'colspan' => 1, - 'style' => null, - ]; - - public function __construct(string $value = '', array $options = []) - { - $this->value = $value; - - // check option names - if ($diff = array_diff(array_keys($options), array_keys($this->options))) { - throw new InvalidArgumentException(sprintf('The TableCell does not support the following options: \'%s\'.', implode('\', \'', $diff))); - } - - if (isset($options['style']) && !$options['style'] instanceof TableCellStyle) { - throw new InvalidArgumentException('The style option must be an instance of "TableCellStyle".'); - } - - $this->options = array_merge($this->options, $options); - } - - /** - * Returns the cell value. - * - * @return string - */ - public function __toString() - { - return $this->value; - } - - /** - * Gets number of colspan. - * - * @return int - */ - public function getColspan() - { - return (int) $this->options['colspan']; - } - - /** - * Gets number of rowspan. - * - * @return int - */ - public function getRowspan() - { - return (int) $this->options['rowspan']; - } - - public function getStyle(): ?TableCellStyle - { - return $this->options['style']; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Helper/TableCellStyle.php b/tools/php-cs-fixer/vendor/symfony/console/Helper/TableCellStyle.php deleted file mode 100644 index ad9aea8..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Helper/TableCellStyle.php +++ /dev/null @@ -1,86 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -use Symfony\Component\Console\Exception\InvalidArgumentException; - -/** - * @author Yewhen Khoptynskyi - */ -class TableCellStyle -{ - public const DEFAULT_ALIGN = 'left'; - - private $options = [ - 'fg' => 'default', - 'bg' => 'default', - 'options' => null, - 'align' => self::DEFAULT_ALIGN, - 'cellFormat' => null, - ]; - - private $tagOptions = [ - 'fg', - 'bg', - 'options', - ]; - - private $alignMap = [ - 'left' => \STR_PAD_RIGHT, - 'center' => \STR_PAD_BOTH, - 'right' => \STR_PAD_LEFT, - ]; - - public function __construct(array $options = []) - { - if ($diff = array_diff(array_keys($options), array_keys($this->options))) { - throw new InvalidArgumentException(sprintf('The TableCellStyle does not support the following options: \'%s\'.', implode('\', \'', $diff))); - } - - if (isset($options['align']) && !\array_key_exists($options['align'], $this->alignMap)) { - throw new InvalidArgumentException(sprintf('Wrong align value. Value must be following: \'%s\'.', implode('\', \'', array_keys($this->alignMap)))); - } - - $this->options = array_merge($this->options, $options); - } - - public function getOptions(): array - { - return $this->options; - } - - /** - * Gets options we need for tag for example fg, bg. - * - * @return string[] - */ - public function getTagOptions() - { - return array_filter( - $this->getOptions(), - function ($key) { - return \in_array($key, $this->tagOptions) && isset($this->options[$key]); - }, - \ARRAY_FILTER_USE_KEY - ); - } - - public function getPadByAlign() - { - return $this->alignMap[$this->getOptions()['align']]; - } - - public function getCellFormat(): ?string - { - return $this->getOptions()['cellFormat']; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Helper/TableRows.php b/tools/php-cs-fixer/vendor/symfony/console/Helper/TableRows.php deleted file mode 100644 index 16aabb3..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Helper/TableRows.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -/** - * @internal - */ -class TableRows implements \IteratorAggregate -{ - private $generator; - - public function __construct(callable $generator) - { - $this->generator = $generator; - } - - public function getIterator(): \Traversable - { - $g = $this->generator; - - return $g(); - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Helper/TableSeparator.php b/tools/php-cs-fixer/vendor/symfony/console/Helper/TableSeparator.php deleted file mode 100644 index e541c53..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Helper/TableSeparator.php +++ /dev/null @@ -1,25 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -/** - * Marks a row as being a separator. - * - * @author Fabien Potencier - */ -class TableSeparator extends TableCell -{ - public function __construct(array $options = []) - { - parent::__construct('', $options); - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Helper/TableStyle.php b/tools/php-cs-fixer/vendor/symfony/console/Helper/TableStyle.php deleted file mode 100644 index 07265b4..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Helper/TableStyle.php +++ /dev/null @@ -1,364 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -use Symfony\Component\Console\Exception\InvalidArgumentException; -use Symfony\Component\Console\Exception\LogicException; - -/** - * Defines the styles for a Table. - * - * @author Fabien Potencier - * @author Саша Стаменковић - * @author Dany Maillard - */ -class TableStyle -{ - private $paddingChar = ' '; - private $horizontalOutsideBorderChar = '-'; - private $horizontalInsideBorderChar = '-'; - private $verticalOutsideBorderChar = '|'; - private $verticalInsideBorderChar = '|'; - private $crossingChar = '+'; - private $crossingTopRightChar = '+'; - private $crossingTopMidChar = '+'; - private $crossingTopLeftChar = '+'; - private $crossingMidRightChar = '+'; - private $crossingBottomRightChar = '+'; - private $crossingBottomMidChar = '+'; - private $crossingBottomLeftChar = '+'; - private $crossingMidLeftChar = '+'; - private $crossingTopLeftBottomChar = '+'; - private $crossingTopMidBottomChar = '+'; - private $crossingTopRightBottomChar = '+'; - private $headerTitleFormat = ' %s '; - private $footerTitleFormat = ' %s '; - private $cellHeaderFormat = '%s'; - private $cellRowFormat = '%s'; - private $cellRowContentFormat = ' %s '; - private $borderFormat = '%s'; - private $padType = \STR_PAD_RIGHT; - - /** - * Sets padding character, used for cell padding. - * - * @return $this - */ - public function setPaddingChar(string $paddingChar) - { - if (!$paddingChar) { - throw new LogicException('The padding char must not be empty.'); - } - - $this->paddingChar = $paddingChar; - - return $this; - } - - /** - * Gets padding character, used for cell padding. - * - * @return string - */ - public function getPaddingChar() - { - return $this->paddingChar; - } - - /** - * Sets horizontal border characters. - * - * - * ╔═══════════════╤══════════════════════════╤══════════════════╗ - * 1 ISBN 2 Title │ Author ║ - * ╠═══════════════╪══════════════════════════╪══════════════════╣ - * ║ 99921-58-10-7 │ Divine Comedy │ Dante Alighieri ║ - * ║ 9971-5-0210-0 │ A Tale of Two Cities │ Charles Dickens ║ - * ║ 960-425-059-0 │ The Lord of the Rings │ J. R. R. Tolkien ║ - * ║ 80-902734-1-6 │ And Then There Were None │ Agatha Christie ║ - * ╚═══════════════╧══════════════════════════╧══════════════════╝ - * - */ - public function setHorizontalBorderChars(string $outside, string $inside = null): self - { - $this->horizontalOutsideBorderChar = $outside; - $this->horizontalInsideBorderChar = $inside ?? $outside; - - return $this; - } - - /** - * Sets vertical border characters. - * - * - * ╔═══════════════╤══════════════════════════╤══════════════════╗ - * ║ ISBN │ Title │ Author ║ - * ╠═══════1═══════╪══════════════════════════╪══════════════════╣ - * ║ 99921-58-10-7 │ Divine Comedy │ Dante Alighieri ║ - * ║ 9971-5-0210-0 │ A Tale of Two Cities │ Charles Dickens ║ - * ╟───────2───────┼──────────────────────────┼──────────────────╢ - * ║ 960-425-059-0 │ The Lord of the Rings │ J. R. R. Tolkien ║ - * ║ 80-902734-1-6 │ And Then There Were None │ Agatha Christie ║ - * ╚═══════════════╧══════════════════════════╧══════════════════╝ - * - */ - public function setVerticalBorderChars(string $outside, string $inside = null): self - { - $this->verticalOutsideBorderChar = $outside; - $this->verticalInsideBorderChar = $inside ?? $outside; - - return $this; - } - - /** - * Gets border characters. - * - * @internal - */ - public function getBorderChars(): array - { - return [ - $this->horizontalOutsideBorderChar, - $this->verticalOutsideBorderChar, - $this->horizontalInsideBorderChar, - $this->verticalInsideBorderChar, - ]; - } - - /** - * Sets crossing characters. - * - * Example: - * - * 1═══════════════2══════════════════════════2══════════════════3 - * ║ ISBN │ Title │ Author ║ - * 8'══════════════0'═════════════════════════0'═════════════════4' - * ║ 99921-58-10-7 │ Divine Comedy │ Dante Alighieri ║ - * ║ 9971-5-0210-0 │ A Tale of Two Cities │ Charles Dickens ║ - * 8───────────────0──────────────────────────0──────────────────4 - * ║ 960-425-059-0 │ The Lord of the Rings │ J. R. R. Tolkien ║ - * ║ 80-902734-1-6 │ And Then There Were None │ Agatha Christie ║ - * 7═══════════════6══════════════════════════6══════════════════5 - * - * - * @param string $cross Crossing char (see #0 of example) - * @param string $topLeft Top left char (see #1 of example) - * @param string $topMid Top mid char (see #2 of example) - * @param string $topRight Top right char (see #3 of example) - * @param string $midRight Mid right char (see #4 of example) - * @param string $bottomRight Bottom right char (see #5 of example) - * @param string $bottomMid Bottom mid char (see #6 of example) - * @param string $bottomLeft Bottom left char (see #7 of example) - * @param string $midLeft Mid left char (see #8 of example) - * @param string|null $topLeftBottom Top left bottom char (see #8' of example), equals to $midLeft if null - * @param string|null $topMidBottom Top mid bottom char (see #0' of example), equals to $cross if null - * @param string|null $topRightBottom Top right bottom char (see #4' of example), equals to $midRight if null - */ - public function setCrossingChars(string $cross, string $topLeft, string $topMid, string $topRight, string $midRight, string $bottomRight, string $bottomMid, string $bottomLeft, string $midLeft, string $topLeftBottom = null, string $topMidBottom = null, string $topRightBottom = null): self - { - $this->crossingChar = $cross; - $this->crossingTopLeftChar = $topLeft; - $this->crossingTopMidChar = $topMid; - $this->crossingTopRightChar = $topRight; - $this->crossingMidRightChar = $midRight; - $this->crossingBottomRightChar = $bottomRight; - $this->crossingBottomMidChar = $bottomMid; - $this->crossingBottomLeftChar = $bottomLeft; - $this->crossingMidLeftChar = $midLeft; - $this->crossingTopLeftBottomChar = $topLeftBottom ?? $midLeft; - $this->crossingTopMidBottomChar = $topMidBottom ?? $cross; - $this->crossingTopRightBottomChar = $topRightBottom ?? $midRight; - - return $this; - } - - /** - * Sets default crossing character used for each cross. - * - * @see {@link setCrossingChars()} for setting each crossing individually. - */ - public function setDefaultCrossingChar(string $char): self - { - return $this->setCrossingChars($char, $char, $char, $char, $char, $char, $char, $char, $char); - } - - /** - * Gets crossing character. - * - * @return string - */ - public function getCrossingChar() - { - return $this->crossingChar; - } - - /** - * Gets crossing characters. - * - * @internal - */ - public function getCrossingChars(): array - { - return [ - $this->crossingChar, - $this->crossingTopLeftChar, - $this->crossingTopMidChar, - $this->crossingTopRightChar, - $this->crossingMidRightChar, - $this->crossingBottomRightChar, - $this->crossingBottomMidChar, - $this->crossingBottomLeftChar, - $this->crossingMidLeftChar, - $this->crossingTopLeftBottomChar, - $this->crossingTopMidBottomChar, - $this->crossingTopRightBottomChar, - ]; - } - - /** - * Sets header cell format. - * - * @return $this - */ - public function setCellHeaderFormat(string $cellHeaderFormat) - { - $this->cellHeaderFormat = $cellHeaderFormat; - - return $this; - } - - /** - * Gets header cell format. - * - * @return string - */ - public function getCellHeaderFormat() - { - return $this->cellHeaderFormat; - } - - /** - * Sets row cell format. - * - * @return $this - */ - public function setCellRowFormat(string $cellRowFormat) - { - $this->cellRowFormat = $cellRowFormat; - - return $this; - } - - /** - * Gets row cell format. - * - * @return string - */ - public function getCellRowFormat() - { - return $this->cellRowFormat; - } - - /** - * Sets row cell content format. - * - * @return $this - */ - public function setCellRowContentFormat(string $cellRowContentFormat) - { - $this->cellRowContentFormat = $cellRowContentFormat; - - return $this; - } - - /** - * Gets row cell content format. - * - * @return string - */ - public function getCellRowContentFormat() - { - return $this->cellRowContentFormat; - } - - /** - * Sets table border format. - * - * @return $this - */ - public function setBorderFormat(string $borderFormat) - { - $this->borderFormat = $borderFormat; - - return $this; - } - - /** - * Gets table border format. - * - * @return string - */ - public function getBorderFormat() - { - return $this->borderFormat; - } - - /** - * Sets cell padding type. - * - * @return $this - */ - public function setPadType(int $padType) - { - if (!\in_array($padType, [\STR_PAD_LEFT, \STR_PAD_RIGHT, \STR_PAD_BOTH], true)) { - throw new InvalidArgumentException('Invalid padding type. Expected one of (STR_PAD_LEFT, STR_PAD_RIGHT, STR_PAD_BOTH).'); - } - - $this->padType = $padType; - - return $this; - } - - /** - * Gets cell padding type. - * - * @return int - */ - public function getPadType() - { - return $this->padType; - } - - public function getHeaderTitleFormat(): string - { - return $this->headerTitleFormat; - } - - public function setHeaderTitleFormat(string $format): self - { - $this->headerTitleFormat = $format; - - return $this; - } - - public function getFooterTitleFormat(): string - { - return $this->footerTitleFormat; - } - - public function setFooterTitleFormat(string $format): self - { - $this->footerTitleFormat = $format; - - return $this; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Input/ArgvInput.php b/tools/php-cs-fixer/vendor/symfony/console/Input/ArgvInput.php deleted file mode 100644 index a33ca35..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Input/ArgvInput.php +++ /dev/null @@ -1,371 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Input; - -use Symfony\Component\Console\Exception\RuntimeException; - -/** - * ArgvInput represents an input coming from the CLI arguments. - * - * Usage: - * - * $input = new ArgvInput(); - * - * By default, the `$_SERVER['argv']` array is used for the input values. - * - * This can be overridden by explicitly passing the input values in the constructor: - * - * $input = new ArgvInput($_SERVER['argv']); - * - * If you pass it yourself, don't forget that the first element of the array - * is the name of the running application. - * - * When passing an argument to the constructor, be sure that it respects - * the same rules as the argv one. It's almost always better to use the - * `StringInput` when you want to provide your own input. - * - * @author Fabien Potencier - * - * @see http://www.gnu.org/software/libc/manual/html_node/Argument-Syntax.html - * @see http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap12.html#tag_12_02 - */ -class ArgvInput extends Input -{ - private $tokens; - private $parsed; - - public function __construct(array $argv = null, InputDefinition $definition = null) - { - $argv = $argv ?? $_SERVER['argv'] ?? []; - - // strip the application name - array_shift($argv); - - $this->tokens = $argv; - - parent::__construct($definition); - } - - protected function setTokens(array $tokens) - { - $this->tokens = $tokens; - } - - /** - * {@inheritdoc} - */ - protected function parse() - { - $parseOptions = true; - $this->parsed = $this->tokens; - while (null !== $token = array_shift($this->parsed)) { - if ($parseOptions && '' == $token) { - $this->parseArgument($token); - } elseif ($parseOptions && '--' == $token) { - $parseOptions = false; - } elseif ($parseOptions && str_starts_with($token, '--')) { - $this->parseLongOption($token); - } elseif ($parseOptions && '-' === $token[0] && '-' !== $token) { - $this->parseShortOption($token); - } else { - $this->parseArgument($token); - } - } - } - - /** - * Parses a short option. - */ - private function parseShortOption(string $token) - { - $name = substr($token, 1); - - if (\strlen($name) > 1) { - if ($this->definition->hasShortcut($name[0]) && $this->definition->getOptionForShortcut($name[0])->acceptValue()) { - // an option with a value (with no space) - $this->addShortOption($name[0], substr($name, 1)); - } else { - $this->parseShortOptionSet($name); - } - } else { - $this->addShortOption($name, null); - } - } - - /** - * Parses a short option set. - * - * @throws RuntimeException When option given doesn't exist - */ - private function parseShortOptionSet(string $name) - { - $len = \strlen($name); - for ($i = 0; $i < $len; ++$i) { - if (!$this->definition->hasShortcut($name[$i])) { - $encoding = mb_detect_encoding($name, null, true); - throw new RuntimeException(sprintf('The "-%s" option does not exist.', false === $encoding ? $name[$i] : mb_substr($name, $i, 1, $encoding))); - } - - $option = $this->definition->getOptionForShortcut($name[$i]); - if ($option->acceptValue()) { - $this->addLongOption($option->getName(), $i === $len - 1 ? null : substr($name, $i + 1)); - - break; - } else { - $this->addLongOption($option->getName(), null); - } - } - } - - /** - * Parses a long option. - */ - private function parseLongOption(string $token) - { - $name = substr($token, 2); - - if (false !== $pos = strpos($name, '=')) { - if (0 === \strlen($value = substr($name, $pos + 1))) { - array_unshift($this->parsed, $value); - } - $this->addLongOption(substr($name, 0, $pos), $value); - } else { - $this->addLongOption($name, null); - } - } - - /** - * Parses an argument. - * - * @throws RuntimeException When too many arguments are given - */ - private function parseArgument(string $token) - { - $c = \count($this->arguments); - - // if input is expecting another argument, add it - if ($this->definition->hasArgument($c)) { - $arg = $this->definition->getArgument($c); - $this->arguments[$arg->getName()] = $arg->isArray() ? [$token] : $token; - - // if last argument isArray(), append token to last argument - } elseif ($this->definition->hasArgument($c - 1) && $this->definition->getArgument($c - 1)->isArray()) { - $arg = $this->definition->getArgument($c - 1); - $this->arguments[$arg->getName()][] = $token; - - // unexpected argument - } else { - $all = $this->definition->getArguments(); - $symfonyCommandName = null; - if (($inputArgument = $all[$key = array_key_first($all)] ?? null) && 'command' === $inputArgument->getName()) { - $symfonyCommandName = $this->arguments['command'] ?? null; - unset($all[$key]); - } - - if (\count($all)) { - if ($symfonyCommandName) { - $message = sprintf('Too many arguments to "%s" command, expected arguments "%s".', $symfonyCommandName, implode('" "', array_keys($all))); - } else { - $message = sprintf('Too many arguments, expected arguments "%s".', implode('" "', array_keys($all))); - } - } elseif ($symfonyCommandName) { - $message = sprintf('No arguments expected for "%s" command, got "%s".', $symfonyCommandName, $token); - } else { - $message = sprintf('No arguments expected, got "%s".', $token); - } - - throw new RuntimeException($message); - } - } - - /** - * Adds a short option value. - * - * @throws RuntimeException When option given doesn't exist - */ - private function addShortOption(string $shortcut, $value) - { - if (!$this->definition->hasShortcut($shortcut)) { - throw new RuntimeException(sprintf('The "-%s" option does not exist.', $shortcut)); - } - - $this->addLongOption($this->definition->getOptionForShortcut($shortcut)->getName(), $value); - } - - /** - * Adds a long option value. - * - * @throws RuntimeException When option given doesn't exist - */ - private function addLongOption(string $name, $value) - { - if (!$this->definition->hasOption($name)) { - if (!$this->definition->hasNegation($name)) { - throw new RuntimeException(sprintf('The "--%s" option does not exist.', $name)); - } - - $optionName = $this->definition->negationToName($name); - if (null !== $value) { - throw new RuntimeException(sprintf('The "--%s" option does not accept a value.', $name)); - } - $this->options[$optionName] = false; - - return; - } - - $option = $this->definition->getOption($name); - - if (null !== $value && !$option->acceptValue()) { - throw new RuntimeException(sprintf('The "--%s" option does not accept a value.', $name)); - } - - if (\in_array($value, ['', null], true) && $option->acceptValue() && \count($this->parsed)) { - // if option accepts an optional or mandatory argument - // let's see if there is one provided - $next = array_shift($this->parsed); - if ((isset($next[0]) && '-' !== $next[0]) || \in_array($next, ['', null], true)) { - $value = $next; - } else { - array_unshift($this->parsed, $next); - } - } - - if (null === $value) { - if ($option->isValueRequired()) { - throw new RuntimeException(sprintf('The "--%s" option requires a value.', $name)); - } - - if (!$option->isArray() && !$option->isValueOptional()) { - $value = true; - } - } - - if ($option->isArray()) { - $this->options[$name][] = $value; - } else { - $this->options[$name] = $value; - } - } - - /** - * {@inheritdoc} - */ - public function getFirstArgument() - { - $isOption = false; - foreach ($this->tokens as $i => $token) { - if ($token && '-' === $token[0]) { - if (str_contains($token, '=') || !isset($this->tokens[$i + 1])) { - continue; - } - - // If it's a long option, consider that everything after "--" is the option name. - // Otherwise, use the last char (if it's a short option set, only the last one can take a value with space separator) - $name = '-' === $token[1] ? substr($token, 2) : substr($token, -1); - if (!isset($this->options[$name]) && !$this->definition->hasShortcut($name)) { - // noop - } elseif ((isset($this->options[$name]) || isset($this->options[$name = $this->definition->shortcutToName($name)])) && $this->tokens[$i + 1] === $this->options[$name]) { - $isOption = true; - } - - continue; - } - - if ($isOption) { - $isOption = false; - continue; - } - - return $token; - } - - return null; - } - - /** - * {@inheritdoc} - */ - public function hasParameterOption($values, bool $onlyParams = false) - { - $values = (array) $values; - - foreach ($this->tokens as $token) { - if ($onlyParams && '--' === $token) { - return false; - } - foreach ($values as $value) { - // Options with values: - // For long options, test for '--option=' at beginning - // For short options, test for '-o' at beginning - $leading = str_starts_with($value, '--') ? $value.'=' : $value; - if ($token === $value || '' !== $leading && str_starts_with($token, $leading)) { - return true; - } - } - } - - return false; - } - - /** - * {@inheritdoc} - */ - public function getParameterOption($values, $default = false, bool $onlyParams = false) - { - $values = (array) $values; - $tokens = $this->tokens; - - while (0 < \count($tokens)) { - $token = array_shift($tokens); - if ($onlyParams && '--' === $token) { - return $default; - } - - foreach ($values as $value) { - if ($token === $value) { - return array_shift($tokens); - } - // Options with values: - // For long options, test for '--option=' at beginning - // For short options, test for '-o' at beginning - $leading = str_starts_with($value, '--') ? $value.'=' : $value; - if ('' !== $leading && str_starts_with($token, $leading)) { - return substr($token, \strlen($leading)); - } - } - } - - return $default; - } - - /** - * Returns a stringified representation of the args passed to the command. - * - * @return string - */ - public function __toString() - { - $tokens = array_map(function ($token) { - if (preg_match('{^(-[^=]+=)(.+)}', $token, $match)) { - return $match[1].$this->escapeToken($match[2]); - } - - if ($token && '-' !== $token[0]) { - return $this->escapeToken($token); - } - - return $token; - }, $this->tokens); - - return implode(' ', $tokens); - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Input/ArrayInput.php b/tools/php-cs-fixer/vendor/symfony/console/Input/ArrayInput.php deleted file mode 100644 index c651614..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Input/ArrayInput.php +++ /dev/null @@ -1,210 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Input; - -use Symfony\Component\Console\Exception\InvalidArgumentException; -use Symfony\Component\Console\Exception\InvalidOptionException; - -/** - * ArrayInput represents an input provided as an array. - * - * Usage: - * - * $input = new ArrayInput(['command' => 'foo:bar', 'foo' => 'bar', '--bar' => 'foobar']); - * - * @author Fabien Potencier - */ -class ArrayInput extends Input -{ - private $parameters; - - public function __construct(array $parameters, InputDefinition $definition = null) - { - $this->parameters = $parameters; - - parent::__construct($definition); - } - - /** - * {@inheritdoc} - */ - public function getFirstArgument() - { - foreach ($this->parameters as $param => $value) { - if ($param && \is_string($param) && '-' === $param[0]) { - continue; - } - - return $value; - } - - return null; - } - - /** - * {@inheritdoc} - */ - public function hasParameterOption($values, bool $onlyParams = false) - { - $values = (array) $values; - - foreach ($this->parameters as $k => $v) { - if (!\is_int($k)) { - $v = $k; - } - - if ($onlyParams && '--' === $v) { - return false; - } - - if (\in_array($v, $values)) { - return true; - } - } - - return false; - } - - /** - * {@inheritdoc} - */ - public function getParameterOption($values, $default = false, bool $onlyParams = false) - { - $values = (array) $values; - - foreach ($this->parameters as $k => $v) { - if ($onlyParams && ('--' === $k || (\is_int($k) && '--' === $v))) { - return $default; - } - - if (\is_int($k)) { - if (\in_array($v, $values)) { - return true; - } - } elseif (\in_array($k, $values)) { - return $v; - } - } - - return $default; - } - - /** - * Returns a stringified representation of the args passed to the command. - * - * @return string - */ - public function __toString() - { - $params = []; - foreach ($this->parameters as $param => $val) { - if ($param && \is_string($param) && '-' === $param[0]) { - $glue = ('-' === $param[1]) ? '=' : ' '; - if (\is_array($val)) { - foreach ($val as $v) { - $params[] = $param.('' != $v ? $glue.$this->escapeToken($v) : ''); - } - } else { - $params[] = $param.('' != $val ? $glue.$this->escapeToken($val) : ''); - } - } else { - $params[] = \is_array($val) ? implode(' ', array_map([$this, 'escapeToken'], $val)) : $this->escapeToken($val); - } - } - - return implode(' ', $params); - } - - /** - * {@inheritdoc} - */ - protected function parse() - { - foreach ($this->parameters as $key => $value) { - if ('--' === $key) { - return; - } - if (str_starts_with($key, '--')) { - $this->addLongOption(substr($key, 2), $value); - } elseif (str_starts_with($key, '-')) { - $this->addShortOption(substr($key, 1), $value); - } else { - $this->addArgument($key, $value); - } - } - } - - /** - * Adds a short option value. - * - * @throws InvalidOptionException When option given doesn't exist - */ - private function addShortOption(string $shortcut, $value) - { - if (!$this->definition->hasShortcut($shortcut)) { - throw new InvalidOptionException(sprintf('The "-%s" option does not exist.', $shortcut)); - } - - $this->addLongOption($this->definition->getOptionForShortcut($shortcut)->getName(), $value); - } - - /** - * Adds a long option value. - * - * @throws InvalidOptionException When option given doesn't exist - * @throws InvalidOptionException When a required value is missing - */ - private function addLongOption(string $name, $value) - { - if (!$this->definition->hasOption($name)) { - if (!$this->definition->hasNegation($name)) { - throw new InvalidOptionException(sprintf('The "--%s" option does not exist.', $name)); - } - - $optionName = $this->definition->negationToName($name); - $this->options[$optionName] = false; - - return; - } - - $option = $this->definition->getOption($name); - - if (null === $value) { - if ($option->isValueRequired()) { - throw new InvalidOptionException(sprintf('The "--%s" option requires a value.', $name)); - } - - if (!$option->isValueOptional()) { - $value = true; - } - } - - $this->options[$name] = $value; - } - - /** - * Adds an argument value. - * - * @param string|int $name The argument name - * @param mixed $value The value for the argument - * - * @throws InvalidArgumentException When argument given doesn't exist - */ - private function addArgument($name, $value) - { - if (!$this->definition->hasArgument($name)) { - throw new InvalidArgumentException(sprintf('The "%s" argument does not exist.', $name)); - } - - $this->arguments[$name] = $value; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Input/Input.php b/tools/php-cs-fixer/vendor/symfony/console/Input/Input.php deleted file mode 100644 index d37460e..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Input/Input.php +++ /dev/null @@ -1,213 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Input; - -use Symfony\Component\Console\Exception\InvalidArgumentException; -use Symfony\Component\Console\Exception\RuntimeException; - -/** - * Input is the base class for all concrete Input classes. - * - * Three concrete classes are provided by default: - * - * * `ArgvInput`: The input comes from the CLI arguments (argv) - * * `StringInput`: The input is provided as a string - * * `ArrayInput`: The input is provided as an array - * - * @author Fabien Potencier - */ -abstract class Input implements InputInterface, StreamableInputInterface -{ - protected $definition; - protected $stream; - protected $options = []; - protected $arguments = []; - protected $interactive = true; - - public function __construct(InputDefinition $definition = null) - { - if (null === $definition) { - $this->definition = new InputDefinition(); - } else { - $this->bind($definition); - $this->validate(); - } - } - - /** - * {@inheritdoc} - */ - public function bind(InputDefinition $definition) - { - $this->arguments = []; - $this->options = []; - $this->definition = $definition; - - $this->parse(); - } - - /** - * Processes command line arguments. - */ - abstract protected function parse(); - - /** - * {@inheritdoc} - */ - public function validate() - { - $definition = $this->definition; - $givenArguments = $this->arguments; - - $missingArguments = array_filter(array_keys($definition->getArguments()), function ($argument) use ($definition, $givenArguments) { - return !\array_key_exists($argument, $givenArguments) && $definition->getArgument($argument)->isRequired(); - }); - - if (\count($missingArguments) > 0) { - throw new RuntimeException(sprintf('Not enough arguments (missing: "%s").', implode(', ', $missingArguments))); - } - } - - /** - * {@inheritdoc} - */ - public function isInteractive() - { - return $this->interactive; - } - - /** - * {@inheritdoc} - */ - public function setInteractive(bool $interactive) - { - $this->interactive = $interactive; - } - - /** - * {@inheritdoc} - */ - public function getArguments() - { - return array_merge($this->definition->getArgumentDefaults(), $this->arguments); - } - - /** - * {@inheritdoc} - */ - public function getArgument(string $name) - { - if (!$this->definition->hasArgument($name)) { - throw new InvalidArgumentException(sprintf('The "%s" argument does not exist.', $name)); - } - - return $this->arguments[$name] ?? $this->definition->getArgument($name)->getDefault(); - } - - /** - * {@inheritdoc} - */ - public function setArgument(string $name, $value) - { - if (!$this->definition->hasArgument($name)) { - throw new InvalidArgumentException(sprintf('The "%s" argument does not exist.', $name)); - } - - $this->arguments[$name] = $value; - } - - /** - * {@inheritdoc} - */ - public function hasArgument(string $name) - { - return $this->definition->hasArgument($name); - } - - /** - * {@inheritdoc} - */ - public function getOptions() - { - return array_merge($this->definition->getOptionDefaults(), $this->options); - } - - /** - * {@inheritdoc} - */ - public function getOption(string $name) - { - if ($this->definition->hasNegation($name)) { - if (null === $value = $this->getOption($this->definition->negationToName($name))) { - return $value; - } - - return !$value; - } - - if (!$this->definition->hasOption($name)) { - throw new InvalidArgumentException(sprintf('The "%s" option does not exist.', $name)); - } - - return \array_key_exists($name, $this->options) ? $this->options[$name] : $this->definition->getOption($name)->getDefault(); - } - - /** - * {@inheritdoc} - */ - public function setOption(string $name, $value) - { - if ($this->definition->hasNegation($name)) { - $this->options[$this->definition->negationToName($name)] = !$value; - - return; - } elseif (!$this->definition->hasOption($name)) { - throw new InvalidArgumentException(sprintf('The "%s" option does not exist.', $name)); - } - - $this->options[$name] = $value; - } - - /** - * {@inheritdoc} - */ - public function hasOption(string $name) - { - return $this->definition->hasOption($name) || $this->definition->hasNegation($name); - } - - /** - * Escapes a token through escapeshellarg if it contains unsafe chars. - * - * @return string - */ - public function escapeToken(string $token) - { - return preg_match('{^[\w-]+$}', $token) ? $token : escapeshellarg($token); - } - - /** - * {@inheritdoc} - */ - public function setStream($stream) - { - $this->stream = $stream; - } - - /** - * {@inheritdoc} - */ - public function getStream() - { - return $this->stream; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Input/InputArgument.php b/tools/php-cs-fixer/vendor/symfony/console/Input/InputArgument.php deleted file mode 100644 index 085aca5..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Input/InputArgument.php +++ /dev/null @@ -1,129 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Input; - -use Symfony\Component\Console\Exception\InvalidArgumentException; -use Symfony\Component\Console\Exception\LogicException; - -/** - * Represents a command line argument. - * - * @author Fabien Potencier - */ -class InputArgument -{ - public const REQUIRED = 1; - public const OPTIONAL = 2; - public const IS_ARRAY = 4; - - private $name; - private $mode; - private $default; - private $description; - - /** - * @param string $name The argument name - * @param int|null $mode The argument mode: self::REQUIRED or self::OPTIONAL - * @param string $description A description text - * @param string|bool|int|float|array|null $default The default value (for self::OPTIONAL mode only) - * - * @throws InvalidArgumentException When argument mode is not valid - */ - public function __construct(string $name, int $mode = null, string $description = '', $default = null) - { - if (null === $mode) { - $mode = self::OPTIONAL; - } elseif ($mode > 7 || $mode < 1) { - throw new InvalidArgumentException(sprintf('Argument mode "%s" is not valid.', $mode)); - } - - $this->name = $name; - $this->mode = $mode; - $this->description = $description; - - $this->setDefault($default); - } - - /** - * Returns the argument name. - * - * @return string The argument name - */ - public function getName() - { - return $this->name; - } - - /** - * Returns true if the argument is required. - * - * @return bool true if parameter mode is self::REQUIRED, false otherwise - */ - public function isRequired() - { - return self::REQUIRED === (self::REQUIRED & $this->mode); - } - - /** - * Returns true if the argument can take multiple values. - * - * @return bool true if mode is self::IS_ARRAY, false otherwise - */ - public function isArray() - { - return self::IS_ARRAY === (self::IS_ARRAY & $this->mode); - } - - /** - * Sets the default value. - * - * @param string|bool|int|float|array|null $default - * - * @throws LogicException When incorrect default value is given - */ - public function setDefault($default = null) - { - if (self::REQUIRED === $this->mode && null !== $default) { - throw new LogicException('Cannot set a default value except for InputArgument::OPTIONAL mode.'); - } - - if ($this->isArray()) { - if (null === $default) { - $default = []; - } elseif (!\is_array($default)) { - throw new LogicException('A default value for an array argument must be an array.'); - } - } - - $this->default = $default; - } - - /** - * Returns the default value. - * - * @return string|bool|int|float|array|null - */ - public function getDefault() - { - return $this->default; - } - - /** - * Returns the description text. - * - * @return string The description text - */ - public function getDescription() - { - return $this->description; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Input/InputAwareInterface.php b/tools/php-cs-fixer/vendor/symfony/console/Input/InputAwareInterface.php deleted file mode 100644 index 5a288de..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Input/InputAwareInterface.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Input; - -/** - * InputAwareInterface should be implemented by classes that depends on the - * Console Input. - * - * @author Wouter J - */ -interface InputAwareInterface -{ - /** - * Sets the Console Input. - */ - public function setInput(InputInterface $input); -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Input/InputDefinition.php b/tools/php-cs-fixer/vendor/symfony/console/Input/InputDefinition.php deleted file mode 100644 index fcbfd52..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Input/InputDefinition.php +++ /dev/null @@ -1,424 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Input; - -use Symfony\Component\Console\Exception\InvalidArgumentException; -use Symfony\Component\Console\Exception\LogicException; - -/** - * A InputDefinition represents a set of valid command line arguments and options. - * - * Usage: - * - * $definition = new InputDefinition([ - * new InputArgument('name', InputArgument::REQUIRED), - * new InputOption('foo', 'f', InputOption::VALUE_REQUIRED), - * ]); - * - * @author Fabien Potencier - */ -class InputDefinition -{ - private $arguments; - private $requiredCount; - private $lastArrayArgument; - private $lastOptionalArgument; - private $options; - private $negations; - private $shortcuts; - - /** - * @param array $definition An array of InputArgument and InputOption instance - */ - public function __construct(array $definition = []) - { - $this->setDefinition($definition); - } - - /** - * Sets the definition of the input. - */ - public function setDefinition(array $definition) - { - $arguments = []; - $options = []; - foreach ($definition as $item) { - if ($item instanceof InputOption) { - $options[] = $item; - } else { - $arguments[] = $item; - } - } - - $this->setArguments($arguments); - $this->setOptions($options); - } - - /** - * Sets the InputArgument objects. - * - * @param InputArgument[] $arguments An array of InputArgument objects - */ - public function setArguments(array $arguments = []) - { - $this->arguments = []; - $this->requiredCount = 0; - $this->lastOptionalArgument = null; - $this->lastArrayArgument = null; - $this->addArguments($arguments); - } - - /** - * Adds an array of InputArgument objects. - * - * @param InputArgument[] $arguments An array of InputArgument objects - */ - public function addArguments(?array $arguments = []) - { - if (null !== $arguments) { - foreach ($arguments as $argument) { - $this->addArgument($argument); - } - } - } - - /** - * @throws LogicException When incorrect argument is given - */ - public function addArgument(InputArgument $argument) - { - if (isset($this->arguments[$argument->getName()])) { - throw new LogicException(sprintf('An argument with name "%s" already exists.', $argument->getName())); - } - - if (null !== $this->lastArrayArgument) { - throw new LogicException(sprintf('Cannot add a required argument "%s" after an array argument "%s".', $argument->getName(), $this->lastArrayArgument->getName())); - } - - if ($argument->isRequired() && null !== $this->lastOptionalArgument) { - throw new LogicException(sprintf('Cannot add a required argument "%s" after an optional one "%s".', $argument->getName(), $this->lastOptionalArgument->getName())); - } - - if ($argument->isArray()) { - $this->lastArrayArgument = $argument; - } - - if ($argument->isRequired()) { - ++$this->requiredCount; - } else { - $this->lastOptionalArgument = $argument; - } - - $this->arguments[$argument->getName()] = $argument; - } - - /** - * Returns an InputArgument by name or by position. - * - * @param string|int $name The InputArgument name or position - * - * @return InputArgument An InputArgument object - * - * @throws InvalidArgumentException When argument given doesn't exist - */ - public function getArgument($name) - { - if (!$this->hasArgument($name)) { - throw new InvalidArgumentException(sprintf('The "%s" argument does not exist.', $name)); - } - - $arguments = \is_int($name) ? array_values($this->arguments) : $this->arguments; - - return $arguments[$name]; - } - - /** - * Returns true if an InputArgument object exists by name or position. - * - * @param string|int $name The InputArgument name or position - * - * @return bool true if the InputArgument object exists, false otherwise - */ - public function hasArgument($name) - { - $arguments = \is_int($name) ? array_values($this->arguments) : $this->arguments; - - return isset($arguments[$name]); - } - - /** - * Gets the array of InputArgument objects. - * - * @return InputArgument[] An array of InputArgument objects - */ - public function getArguments() - { - return $this->arguments; - } - - /** - * Returns the number of InputArguments. - * - * @return int The number of InputArguments - */ - public function getArgumentCount() - { - return null !== $this->lastArrayArgument ? \PHP_INT_MAX : \count($this->arguments); - } - - /** - * Returns the number of required InputArguments. - * - * @return int The number of required InputArguments - */ - public function getArgumentRequiredCount() - { - return $this->requiredCount; - } - - /** - * @return array - */ - public function getArgumentDefaults() - { - $values = []; - foreach ($this->arguments as $argument) { - $values[$argument->getName()] = $argument->getDefault(); - } - - return $values; - } - - /** - * Sets the InputOption objects. - * - * @param InputOption[] $options An array of InputOption objects - */ - public function setOptions(array $options = []) - { - $this->options = []; - $this->shortcuts = []; - $this->negations = []; - $this->addOptions($options); - } - - /** - * Adds an array of InputOption objects. - * - * @param InputOption[] $options An array of InputOption objects - */ - public function addOptions(array $options = []) - { - foreach ($options as $option) { - $this->addOption($option); - } - } - - /** - * @throws LogicException When option given already exist - */ - public function addOption(InputOption $option) - { - if (isset($this->options[$option->getName()]) && !$option->equals($this->options[$option->getName()])) { - throw new LogicException(sprintf('An option named "%s" already exists.', $option->getName())); - } - if (isset($this->negations[$option->getName()])) { - throw new LogicException(sprintf('An option named "%s" already exists.', $option->getName())); - } - - if ($option->getShortcut()) { - foreach (explode('|', $option->getShortcut()) as $shortcut) { - if (isset($this->shortcuts[$shortcut]) && !$option->equals($this->options[$this->shortcuts[$shortcut]])) { - throw new LogicException(sprintf('An option with shortcut "%s" already exists.', $shortcut)); - } - } - } - - $this->options[$option->getName()] = $option; - if ($option->getShortcut()) { - foreach (explode('|', $option->getShortcut()) as $shortcut) { - $this->shortcuts[$shortcut] = $option->getName(); - } - } - - if ($option->isNegatable()) { - $negatedName = 'no-'.$option->getName(); - if (isset($this->options[$negatedName])) { - throw new LogicException(sprintf('An option named "%s" already exists.', $negatedName)); - } - $this->negations[$negatedName] = $option->getName(); - } - } - - /** - * Returns an InputOption by name. - * - * @return InputOption A InputOption object - * - * @throws InvalidArgumentException When option given doesn't exist - */ - public function getOption(string $name) - { - if (!$this->hasOption($name)) { - throw new InvalidArgumentException(sprintf('The "--%s" option does not exist.', $name)); - } - - return $this->options[$name]; - } - - /** - * Returns true if an InputOption object exists by name. - * - * This method can't be used to check if the user included the option when - * executing the command (use getOption() instead). - * - * @return bool true if the InputOption object exists, false otherwise - */ - public function hasOption(string $name) - { - return isset($this->options[$name]); - } - - /** - * Gets the array of InputOption objects. - * - * @return InputOption[] An array of InputOption objects - */ - public function getOptions() - { - return $this->options; - } - - /** - * Returns true if an InputOption object exists by shortcut. - * - * @return bool true if the InputOption object exists, false otherwise - */ - public function hasShortcut(string $name) - { - return isset($this->shortcuts[$name]); - } - - /** - * Returns true if an InputOption object exists by negated name. - */ - public function hasNegation(string $name): bool - { - return isset($this->negations[$name]); - } - - /** - * Gets an InputOption by shortcut. - * - * @return InputOption An InputOption object - */ - public function getOptionForShortcut(string $shortcut) - { - return $this->getOption($this->shortcutToName($shortcut)); - } - - /** - * @return array - */ - public function getOptionDefaults() - { - $values = []; - foreach ($this->options as $option) { - $values[$option->getName()] = $option->getDefault(); - } - - return $values; - } - - /** - * Returns the InputOption name given a shortcut. - * - * @throws InvalidArgumentException When option given does not exist - * - * @internal - */ - public function shortcutToName(string $shortcut): string - { - if (!isset($this->shortcuts[$shortcut])) { - throw new InvalidArgumentException(sprintf('The "-%s" option does not exist.', $shortcut)); - } - - return $this->shortcuts[$shortcut]; - } - - /** - * Returns the InputOption name given a negation. - * - * @throws InvalidArgumentException When option given does not exist - * - * @internal - */ - public function negationToName(string $negation): string - { - if (!isset($this->negations[$negation])) { - throw new InvalidArgumentException(sprintf('The "--%s" option does not exist.', $negation)); - } - - return $this->negations[$negation]; - } - - /** - * Gets the synopsis. - * - * @return string The synopsis - */ - public function getSynopsis(bool $short = false) - { - $elements = []; - - if ($short && $this->getOptions()) { - $elements[] = '[options]'; - } elseif (!$short) { - foreach ($this->getOptions() as $option) { - $value = ''; - if ($option->acceptValue()) { - $value = sprintf( - ' %s%s%s', - $option->isValueOptional() ? '[' : '', - strtoupper($option->getName()), - $option->isValueOptional() ? ']' : '' - ); - } - - $shortcut = $option->getShortcut() ? sprintf('-%s|', $option->getShortcut()) : ''; - $negation = $option->isNegatable() ? sprintf('|--no-%s', $option->getName()) : ''; - $elements[] = sprintf('[%s--%s%s%s]', $shortcut, $option->getName(), $value, $negation); - } - } - - if (\count($elements) && $this->getArguments()) { - $elements[] = '[--]'; - } - - $tail = ''; - foreach ($this->getArguments() as $argument) { - $element = '<'.$argument->getName().'>'; - if ($argument->isArray()) { - $element .= '...'; - } - - if (!$argument->isRequired()) { - $element = '['.$element; - $tail .= ']'; - } - - $elements[] = $element; - } - - return implode(' ', $elements).$tail; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Input/InputInterface.php b/tools/php-cs-fixer/vendor/symfony/console/Input/InputInterface.php deleted file mode 100644 index d01da85..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Input/InputInterface.php +++ /dev/null @@ -1,151 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Input; - -use Symfony\Component\Console\Exception\InvalidArgumentException; -use Symfony\Component\Console\Exception\RuntimeException; - -/** - * InputInterface is the interface implemented by all input classes. - * - * @author Fabien Potencier - */ -interface InputInterface -{ - /** - * Returns the first argument from the raw parameters (not parsed). - * - * @return string|null The value of the first argument or null otherwise - */ - public function getFirstArgument(); - - /** - * Returns true if the raw parameters (not parsed) contain a value. - * - * This method is to be used to introspect the input parameters - * before they have been validated. It must be used carefully. - * Does not necessarily return the correct result for short options - * when multiple flags are combined in the same option. - * - * @param string|array $values The values to look for in the raw parameters (can be an array) - * @param bool $onlyParams Only check real parameters, skip those following an end of options (--) signal - * - * @return bool true if the value is contained in the raw parameters - */ - public function hasParameterOption($values, bool $onlyParams = false); - - /** - * Returns the value of a raw option (not parsed). - * - * This method is to be used to introspect the input parameters - * before they have been validated. It must be used carefully. - * Does not necessarily return the correct result for short options - * when multiple flags are combined in the same option. - * - * @param string|array $values The value(s) to look for in the raw parameters (can be an array) - * @param string|bool|int|float|array|null $default The default value to return if no result is found - * @param bool $onlyParams Only check real parameters, skip those following an end of options (--) signal - * - * @return mixed The option value - */ - public function getParameterOption($values, $default = false, bool $onlyParams = false); - - /** - * Binds the current Input instance with the given arguments and options. - * - * @throws RuntimeException - */ - public function bind(InputDefinition $definition); - - /** - * Validates the input. - * - * @throws RuntimeException When not enough arguments are given - */ - public function validate(); - - /** - * Returns all the given arguments merged with the default values. - * - * @return array - */ - public function getArguments(); - - /** - * Returns the argument value for a given argument name. - * - * @return mixed - * - * @throws InvalidArgumentException When argument given doesn't exist - */ - public function getArgument(string $name); - - /** - * Sets an argument value by name. - * - * @param mixed $value The argument value - * - * @throws InvalidArgumentException When argument given doesn't exist - */ - public function setArgument(string $name, $value); - - /** - * Returns true if an InputArgument object exists by name or position. - * - * @return bool true if the InputArgument object exists, false otherwise - */ - public function hasArgument(string $name); - - /** - * Returns all the given options merged with the default values. - * - * @return array - */ - public function getOptions(); - - /** - * Returns the option value for a given option name. - * - * @return mixed - * - * @throws InvalidArgumentException When option given doesn't exist - */ - public function getOption(string $name); - - /** - * Sets an option value by name. - * - * @param mixed $value The option value - * - * @throws InvalidArgumentException When option given doesn't exist - */ - public function setOption(string $name, $value); - - /** - * Returns true if an InputOption object exists by name. - * - * @return bool true if the InputOption object exists, false otherwise - */ - public function hasOption(string $name); - - /** - * Is this input means interactive? - * - * @return bool - */ - public function isInteractive(); - - /** - * Sets the input interactivity. - */ - public function setInteractive(bool $interactive); -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Input/InputOption.php b/tools/php-cs-fixer/vendor/symfony/console/Input/InputOption.php deleted file mode 100644 index 72b1b74..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Input/InputOption.php +++ /dev/null @@ -1,233 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Input; - -use Symfony\Component\Console\Exception\InvalidArgumentException; -use Symfony\Component\Console\Exception\LogicException; - -/** - * Represents a command line option. - * - * @author Fabien Potencier - */ -class InputOption -{ - /** - * Do not accept input for the option (e.g. --yell). This is the default behavior of options. - */ - public const VALUE_NONE = 1; - - /** - * A value must be passed when the option is used (e.g. --iterations=5 or -i5). - */ - public const VALUE_REQUIRED = 2; - - /** - * The option may or may not have a value (e.g. --yell or --yell=loud). - */ - public const VALUE_OPTIONAL = 4; - - /** - * The option accepts multiple values (e.g. --dir=/foo --dir=/bar). - */ - public const VALUE_IS_ARRAY = 8; - - /** - * The option may have either positive or negative value (e.g. --ansi or --no-ansi). - */ - public const VALUE_NEGATABLE = 16; - - private $name; - private $shortcut; - private $mode; - private $default; - private $description; - - /** - * @param string $name The option name - * @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 - * @param string $description A description text - * @param string|bool|int|float|array|null $default The default value (must be null for self::VALUE_NONE) - * - * @throws InvalidArgumentException If option mode is invalid or incompatible - */ - public function __construct(string $name, $shortcut = null, int $mode = null, string $description = '', $default = null) - { - if (str_starts_with($name, '--')) { - $name = substr($name, 2); - } - - if (empty($name)) { - throw new InvalidArgumentException('An option name cannot be empty.'); - } - - if (empty($shortcut)) { - $shortcut = null; - } - - if (null !== $shortcut) { - if (\is_array($shortcut)) { - $shortcut = implode('|', $shortcut); - } - $shortcuts = preg_split('{(\|)-?}', ltrim($shortcut, '-')); - $shortcuts = array_filter($shortcuts); - $shortcut = implode('|', $shortcuts); - - if (empty($shortcut)) { - throw new InvalidArgumentException('An option shortcut cannot be empty.'); - } - } - - if (null === $mode) { - $mode = self::VALUE_NONE; - } elseif ($mode >= (self::VALUE_NEGATABLE << 1) || $mode < 1) { - throw new InvalidArgumentException(sprintf('Option mode "%s" is not valid.', $mode)); - } - - $this->name = $name; - $this->shortcut = $shortcut; - $this->mode = $mode; - $this->description = $description; - - if ($this->isArray() && !$this->acceptValue()) { - throw new InvalidArgumentException('Impossible to have an option mode VALUE_IS_ARRAY if the option does not accept a value.'); - } - if ($this->isNegatable() && $this->acceptValue()) { - throw new InvalidArgumentException('Impossible to have an option mode VALUE_NEGATABLE if the option also accepts a value.'); - } - - $this->setDefault($default); - } - - /** - * Returns the option shortcut. - * - * @return string|null The shortcut - */ - public function getShortcut() - { - return $this->shortcut; - } - - /** - * Returns the option name. - * - * @return string The name - */ - public function getName() - { - return $this->name; - } - - /** - * Returns true if the option accepts a value. - * - * @return bool true if value mode is not self::VALUE_NONE, false otherwise - */ - public function acceptValue() - { - return $this->isValueRequired() || $this->isValueOptional(); - } - - /** - * Returns true if the option requires a value. - * - * @return bool true if value mode is self::VALUE_REQUIRED, false otherwise - */ - public function isValueRequired() - { - return self::VALUE_REQUIRED === (self::VALUE_REQUIRED & $this->mode); - } - - /** - * Returns true if the option takes an optional value. - * - * @return bool true if value mode is self::VALUE_OPTIONAL, false otherwise - */ - public function isValueOptional() - { - return self::VALUE_OPTIONAL === (self::VALUE_OPTIONAL & $this->mode); - } - - /** - * Returns true if the option can take multiple values. - * - * @return bool true if mode is self::VALUE_IS_ARRAY, false otherwise - */ - public function isArray() - { - return self::VALUE_IS_ARRAY === (self::VALUE_IS_ARRAY & $this->mode); - } - - public function isNegatable(): bool - { - return self::VALUE_NEGATABLE === (self::VALUE_NEGATABLE & $this->mode); - } - - /** - * @param string|bool|int|float|array|null $default - */ - public function setDefault($default = null) - { - if (self::VALUE_NONE === (self::VALUE_NONE & $this->mode) && null !== $default) { - throw new LogicException('Cannot set a default value when using InputOption::VALUE_NONE mode.'); - } - - if ($this->isArray()) { - if (null === $default) { - $default = []; - } elseif (!\is_array($default)) { - throw new LogicException('A default value for an array option must be an array.'); - } - } - - $this->default = $this->acceptValue() || $this->isNegatable() ? $default : false; - } - - /** - * Returns the default value. - * - * @return string|bool|int|float|array|null - */ - public function getDefault() - { - return $this->default; - } - - /** - * Returns the description text. - * - * @return string The description text - */ - public function getDescription() - { - return $this->description; - } - - /** - * Checks whether the given option equals this one. - * - * @return bool - */ - public function equals(self $option) - { - return $option->getName() === $this->getName() - && $option->getShortcut() === $this->getShortcut() - && $option->getDefault() === $this->getDefault() - && $option->isNegatable() === $this->isNegatable() - && $option->isArray() === $this->isArray() - && $option->isValueRequired() === $this->isValueRequired() - && $option->isValueOptional() === $this->isValueOptional() - ; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Input/StreamableInputInterface.php b/tools/php-cs-fixer/vendor/symfony/console/Input/StreamableInputInterface.php deleted file mode 100644 index d7e462f..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Input/StreamableInputInterface.php +++ /dev/null @@ -1,37 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Input; - -/** - * StreamableInputInterface is the interface implemented by all input classes - * that have an input stream. - * - * @author Robin Chalas - */ -interface StreamableInputInterface extends InputInterface -{ - /** - * Sets the input stream to read from when interacting with the user. - * - * This is mainly useful for testing purpose. - * - * @param resource $stream The input stream - */ - public function setStream($stream); - - /** - * Returns the input stream. - * - * @return resource|null - */ - public function getStream(); -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Input/StringInput.php b/tools/php-cs-fixer/vendor/symfony/console/Input/StringInput.php deleted file mode 100644 index eb5c07f..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Input/StringInput.php +++ /dev/null @@ -1,68 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Input; - -use Symfony\Component\Console\Exception\InvalidArgumentException; - -/** - * StringInput represents an input provided as a string. - * - * Usage: - * - * $input = new StringInput('foo --bar="foobar"'); - * - * @author Fabien Potencier - */ -class StringInput extends ArgvInput -{ - public const REGEX_STRING = '([^\s]+?)(?:\s|(?setTokens($this->tokenize($input)); - } - - /** - * Tokenizes a string. - * - * @throws InvalidArgumentException When unable to parse input (should never happen) - */ - private function tokenize(string $input): array - { - $tokens = []; - $length = \strlen($input); - $cursor = 0; - while ($cursor < $length) { - if (preg_match('/\s+/A', $input, $match, 0, $cursor)) { - } elseif (preg_match('/([^="\'\s]+?)(=?)('.self::REGEX_QUOTED_STRING.'+)/A', $input, $match, 0, $cursor)) { - $tokens[] = $match[1].$match[2].stripcslashes(str_replace(['"\'', '\'"', '\'\'', '""'], '', substr($match[3], 1, -1))); - } elseif (preg_match('/'.self::REGEX_QUOTED_STRING.'/A', $input, $match, 0, $cursor)) { - $tokens[] = stripcslashes(substr($match[0], 1, -1)); - } elseif (preg_match('/'.self::REGEX_STRING.'/A', $input, $match, 0, $cursor)) { - $tokens[] = stripcslashes($match[1]); - } else { - // should never happen - throw new InvalidArgumentException(sprintf('Unable to parse input near "... %s ...".', substr($input, $cursor, 10))); - } - - $cursor += \strlen($match[0]); - } - - return $tokens; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/LICENSE b/tools/php-cs-fixer/vendor/symfony/console/LICENSE deleted file mode 100644 index 9ff2d0d..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2004-2021 Fabien Potencier - -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/tools/php-cs-fixer/vendor/symfony/console/Logger/ConsoleLogger.php b/tools/php-cs-fixer/vendor/symfony/console/Logger/ConsoleLogger.php deleted file mode 100644 index c9ee035..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Logger/ConsoleLogger.php +++ /dev/null @@ -1,126 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Logger; - -use Psr\Log\AbstractLogger; -use Psr\Log\InvalidArgumentException; -use Psr\Log\LogLevel; -use Symfony\Component\Console\Output\ConsoleOutputInterface; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * PSR-3 compliant console logger. - * - * @author Kévin Dunglas - * - * @see https://www.php-fig.org/psr/psr-3/ - */ -class ConsoleLogger extends AbstractLogger -{ - public const INFO = 'info'; - public const ERROR = 'error'; - - private $output; - 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, - ]; - 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, - ]; - private $errored = false; - - public function __construct(OutputInterface $output, array $verbosityLevelMap = [], array $formatLevelMap = []) - { - $this->output = $output; - $this->verbosityLevelMap = $verbosityLevelMap + $this->verbosityLevelMap; - $this->formatLevelMap = $formatLevelMap + $this->formatLevelMap; - } - - /** - * {@inheritdoc} - * - * @return void - */ - public function log($level, $message, array $context = []) - { - if (!isset($this->verbosityLevelMap[$level])) { - throw new InvalidArgumentException(sprintf('The log level "%s" does not exist.', $level)); - } - - $output = $this->output; - - // Write to the error output if necessary and available - if (self::ERROR === $this->formatLevelMap[$level]) { - if ($this->output instanceof ConsoleOutputInterface) { - $output = $output->getErrorOutput(); - } - $this->errored = true; - } - - // the if condition check isn't necessary -- it's the same one that $output will do internally anyway. - // We only do it for efficiency here as the message formatting is relatively expensive. - if ($output->getVerbosity() >= $this->verbosityLevelMap[$level]) { - $output->writeln(sprintf('<%1$s>[%2$s] %3$s', $this->formatLevelMap[$level], $level, $this->interpolate($message, $context)), $this->verbosityLevelMap[$level]); - } - } - - /** - * Returns true when any messages have been logged at error levels. - * - * @return bool - */ - public function hasErrored() - { - return $this->errored; - } - - /** - * Interpolates context values into the message placeholders. - * - * @author PHP Framework Interoperability Group - */ - private function interpolate(string $message, array $context): string - { - if (!str_contains($message, '{')) { - return $message; - } - - $replacements = []; - foreach ($context as $key => $val) { - if (null === $val || is_scalar($val) || (\is_object($val) && method_exists($val, '__toString'))) { - $replacements["{{$key}}"] = $val; - } elseif ($val instanceof \DateTimeInterface) { - $replacements["{{$key}}"] = $val->format(\DateTime::RFC3339); - } elseif (\is_object($val)) { - $replacements["{{$key}}"] = '[object '.\get_class($val).']'; - } else { - $replacements["{{$key}}"] = '['.\gettype($val).']'; - } - } - - return strtr($message, $replacements); - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Output/BufferedOutput.php b/tools/php-cs-fixer/vendor/symfony/console/Output/BufferedOutput.php deleted file mode 100644 index d37c6e3..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Output/BufferedOutput.php +++ /dev/null @@ -1,45 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Output; - -/** - * @author Jean-François Simon - */ -class BufferedOutput extends Output -{ - private $buffer = ''; - - /** - * Empties buffer and returns its content. - * - * @return string - */ - public function fetch() - { - $content = $this->buffer; - $this->buffer = ''; - - return $content; - } - - /** - * {@inheritdoc} - */ - protected function doWrite(string $message, bool $newline) - { - $this->buffer .= $message; - - if ($newline) { - $this->buffer .= \PHP_EOL; - } - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Output/ConsoleOutput.php b/tools/php-cs-fixer/vendor/symfony/console/Output/ConsoleOutput.php deleted file mode 100644 index 2cda213..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Output/ConsoleOutput.php +++ /dev/null @@ -1,166 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Output; - -use Symfony\Component\Console\Formatter\OutputFormatterInterface; - -/** - * ConsoleOutput is the default class for all CLI output. It uses STDOUT and STDERR. - * - * This class is a convenient wrapper around `StreamOutput` for both STDOUT and STDERR. - * - * $output = new ConsoleOutput(); - * - * This is equivalent to: - * - * $output = new StreamOutput(fopen('php://stdout', 'w')); - * $stdErr = new StreamOutput(fopen('php://stderr', 'w')); - * - * @author Fabien Potencier - */ -class ConsoleOutput extends StreamOutput implements ConsoleOutputInterface -{ - private $stderr; - private $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) - * @param OutputFormatterInterface|null $formatter Output formatter instance (null to use default OutputFormatter) - */ - public function __construct(int $verbosity = self::VERBOSITY_NORMAL, bool $decorated = null, OutputFormatterInterface $formatter = null) - { - parent::__construct($this->openOutputStream(), $verbosity, $decorated, $formatter); - - if (null === $formatter) { - // for BC reasons, stdErr has it own Formatter only when user don't inject a specific formatter. - $this->stderr = new StreamOutput($this->openErrorStream(), $verbosity, $decorated); - - return; - } - - $actualDecorated = $this->isDecorated(); - $this->stderr = new StreamOutput($this->openErrorStream(), $verbosity, $decorated, $this->getFormatter()); - - if (null === $decorated) { - $this->setDecorated($actualDecorated && $this->stderr->isDecorated()); - } - } - - /** - * Creates a new output section. - */ - public function section(): ConsoleSectionOutput - { - return new ConsoleSectionOutput($this->getStream(), $this->consoleSectionOutputs, $this->getVerbosity(), $this->isDecorated(), $this->getFormatter()); - } - - /** - * {@inheritdoc} - */ - public function setDecorated(bool $decorated) - { - parent::setDecorated($decorated); - $this->stderr->setDecorated($decorated); - } - - /** - * {@inheritdoc} - */ - public function setFormatter(OutputFormatterInterface $formatter) - { - parent::setFormatter($formatter); - $this->stderr->setFormatter($formatter); - } - - /** - * {@inheritdoc} - */ - public function setVerbosity(int $level) - { - parent::setVerbosity($level); - $this->stderr->setVerbosity($level); - } - - /** - * {@inheritdoc} - */ - public function getErrorOutput() - { - return $this->stderr; - } - - /** - * {@inheritdoc} - */ - public function setErrorOutput(OutputInterface $error) - { - $this->stderr = $error; - } - - /** - * Returns true if current environment supports writing console output to - * STDOUT. - * - * @return bool - */ - protected function hasStdoutSupport() - { - return false === $this->isRunningOS400(); - } - - /** - * Returns true if current environment supports writing console output to - * STDERR. - * - * @return bool - */ - protected function hasStderrSupport() - { - return false === $this->isRunningOS400(); - } - - /** - * Checks if current executing environment is IBM iSeries (OS400), which - * doesn't properly convert character-encodings between ASCII to EBCDIC. - */ - private function isRunningOS400(): bool - { - $checks = [ - \function_exists('php_uname') ? php_uname('s') : '', - getenv('OSTYPE'), - \PHP_OS, - ]; - - return false !== stripos(implode(';', $checks), 'OS400'); - } - - /** - * @return resource - */ - private function openOutputStream() - { - if (!$this->hasStdoutSupport()) { - return fopen('php://output', 'w'); - } - - return @fopen('php://stdout', 'w') ?: fopen('php://output', 'w'); - } - - /** - * @return resource - */ - private function openErrorStream() - { - return fopen($this->hasStderrSupport() ? 'php://stderr' : 'php://output', 'w'); - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Output/ConsoleOutputInterface.php b/tools/php-cs-fixer/vendor/symfony/console/Output/ConsoleOutputInterface.php deleted file mode 100644 index 6b6635f..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Output/ConsoleOutputInterface.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Output; - -/** - * ConsoleOutputInterface is the interface implemented by ConsoleOutput class. - * This adds information about stderr and section output stream. - * - * @author Dariusz Górecki - */ -interface ConsoleOutputInterface extends OutputInterface -{ - /** - * Gets the OutputInterface for errors. - * - * @return OutputInterface - */ - public function getErrorOutput(); - - public function setErrorOutput(OutputInterface $error); - - public function section(): ConsoleSectionOutput; -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Output/ConsoleSectionOutput.php b/tools/php-cs-fixer/vendor/symfony/console/Output/ConsoleSectionOutput.php deleted file mode 100644 index 8f16497..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Output/ConsoleSectionOutput.php +++ /dev/null @@ -1,143 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Output; - -use Symfony\Component\Console\Formatter\OutputFormatterInterface; -use Symfony\Component\Console\Helper\Helper; -use Symfony\Component\Console\Terminal; - -/** - * @author Pierre du Plessis - * @author Gabriel Ostrolucký - */ -class ConsoleSectionOutput extends StreamOutput -{ - private $content = []; - private $lines = 0; - private $sections; - private $terminal; - - /** - * @param resource $stream - * @param ConsoleSectionOutput[] $sections - */ - public function __construct($stream, array &$sections, int $verbosity, bool $decorated, OutputFormatterInterface $formatter) - { - parent::__construct($stream, $verbosity, $decorated, $formatter); - array_unshift($sections, $this); - $this->sections = &$sections; - $this->terminal = new Terminal(); - } - - /** - * Clears previous output for this section. - * - * @param int $lines Number of lines to clear. If null, then the entire output of this section is cleared - */ - public function clear(int $lines = null) - { - if (empty($this->content) || !$this->isDecorated()) { - return; - } - - if ($lines) { - array_splice($this->content, -($lines * 2)); // Multiply lines by 2 to cater for each new line added between content - } else { - $lines = $this->lines; - $this->content = []; - } - - $this->lines -= $lines; - - parent::doWrite($this->popStreamContentUntilCurrentSection($lines), false); - } - - /** - * Overwrites the previous output with a new message. - * - * @param array|string $message - */ - public function overwrite($message) - { - $this->clear(); - $this->writeln($message); - } - - public function getContent(): string - { - return implode('', $this->content); - } - - /** - * @internal - */ - public function addContent(string $input) - { - foreach (explode(\PHP_EOL, $input) as $lineContent) { - $this->lines += ceil($this->getDisplayLength($lineContent) / $this->terminal->getWidth()) ?: 1; - $this->content[] = $lineContent; - $this->content[] = \PHP_EOL; - } - } - - /** - * {@inheritdoc} - */ - protected function doWrite(string $message, bool $newline) - { - if (!$this->isDecorated()) { - parent::doWrite($message, $newline); - - return; - } - - $erasedContent = $this->popStreamContentUntilCurrentSection(); - - $this->addContent($message); - - parent::doWrite($message, true); - parent::doWrite($erasedContent, false); - } - - /** - * At initial stage, cursor is at the end of stream output. This method makes cursor crawl upwards until it hits - * current section. Then it erases content it crawled through. Optionally, it erases part of current section too. - */ - private function popStreamContentUntilCurrentSection(int $numberOfLinesToClearFromCurrentSection = 0): string - { - $numberOfLinesToClear = $numberOfLinesToClearFromCurrentSection; - $erasedContent = []; - - foreach ($this->sections as $section) { - if ($section === $this) { - break; - } - - $numberOfLinesToClear += $section->lines; - $erasedContent[] = $section->getContent(); - } - - if ($numberOfLinesToClear > 0) { - // move cursor up n lines - parent::doWrite(sprintf("\x1b[%dA", $numberOfLinesToClear), false); - // erase to end of screen - parent::doWrite("\x1b[0J", false); - } - - return implode('', array_reverse($erasedContent)); - } - - private function getDisplayLength(string $text): int - { - return Helper::width(Helper::removeDecoration($this->getFormatter(), str_replace("\t", ' ', $text))); - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Output/NullOutput.php b/tools/php-cs-fixer/vendor/symfony/console/Output/NullOutput.php deleted file mode 100644 index 3bbe63e..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Output/NullOutput.php +++ /dev/null @@ -1,128 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Output; - -use Symfony\Component\Console\Formatter\NullOutputFormatter; -use Symfony\Component\Console\Formatter\OutputFormatterInterface; - -/** - * NullOutput suppresses all output. - * - * $output = new NullOutput(); - * - * @author Fabien Potencier - * @author Tobias Schultze - */ -class NullOutput implements OutputInterface -{ - private $formatter; - - /** - * {@inheritdoc} - */ - public function setFormatter(OutputFormatterInterface $formatter) - { - // do nothing - } - - /** - * {@inheritdoc} - */ - public function getFormatter() - { - if ($this->formatter) { - return $this->formatter; - } - // to comply with the interface we must return a OutputFormatterInterface - return $this->formatter = new NullOutputFormatter(); - } - - /** - * {@inheritdoc} - */ - public function setDecorated(bool $decorated) - { - // do nothing - } - - /** - * {@inheritdoc} - */ - public function isDecorated() - { - return false; - } - - /** - * {@inheritdoc} - */ - public function setVerbosity(int $level) - { - // do nothing - } - - /** - * {@inheritdoc} - */ - public function getVerbosity() - { - return self::VERBOSITY_QUIET; - } - - /** - * {@inheritdoc} - */ - public function isQuiet() - { - return true; - } - - /** - * {@inheritdoc} - */ - public function isVerbose() - { - return false; - } - - /** - * {@inheritdoc} - */ - public function isVeryVerbose() - { - return false; - } - - /** - * {@inheritdoc} - */ - public function isDebug() - { - return false; - } - - /** - * {@inheritdoc} - */ - public function writeln($messages, int $options = self::OUTPUT_NORMAL) - { - // do nothing - } - - /** - * {@inheritdoc} - */ - public function write($messages, bool $newline = false, int $options = self::OUTPUT_NORMAL) - { - // do nothing - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Output/Output.php b/tools/php-cs-fixer/vendor/symfony/console/Output/Output.php deleted file mode 100644 index f939f06..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Output/Output.php +++ /dev/null @@ -1,174 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Output; - -use Symfony\Component\Console\Formatter\OutputFormatter; -use Symfony\Component\Console\Formatter\OutputFormatterInterface; - -/** - * Base class for output classes. - * - * There are five levels of verbosity: - * - * * normal: no option passed (normal output) - * * verbose: -v (more output) - * * very verbose: -vv (highly extended output) - * * debug: -vvv (all debug output) - * * quiet: -q (no output) - * - * @author Fabien Potencier - */ -abstract class Output implements OutputInterface -{ - private $verbosity; - private $formatter; - - /** - * @param int $verbosity The verbosity level (one of the VERBOSITY constants in OutputInterface) - * @param bool $decorated Whether to decorate messages - * @param OutputFormatterInterface|null $formatter Output formatter instance (null to use default OutputFormatter) - */ - public function __construct(?int $verbosity = self::VERBOSITY_NORMAL, bool $decorated = false, OutputFormatterInterface $formatter = null) - { - $this->verbosity = null === $verbosity ? self::VERBOSITY_NORMAL : $verbosity; - $this->formatter = $formatter ?? new OutputFormatter(); - $this->formatter->setDecorated($decorated); - } - - /** - * {@inheritdoc} - */ - public function setFormatter(OutputFormatterInterface $formatter) - { - $this->formatter = $formatter; - } - - /** - * {@inheritdoc} - */ - public function getFormatter() - { - return $this->formatter; - } - - /** - * {@inheritdoc} - */ - public function setDecorated(bool $decorated) - { - $this->formatter->setDecorated($decorated); - } - - /** - * {@inheritdoc} - */ - public function isDecorated() - { - return $this->formatter->isDecorated(); - } - - /** - * {@inheritdoc} - */ - public function setVerbosity(int $level) - { - $this->verbosity = $level; - } - - /** - * {@inheritdoc} - */ - public function getVerbosity() - { - return $this->verbosity; - } - - /** - * {@inheritdoc} - */ - public function isQuiet() - { - return self::VERBOSITY_QUIET === $this->verbosity; - } - - /** - * {@inheritdoc} - */ - public function isVerbose() - { - return self::VERBOSITY_VERBOSE <= $this->verbosity; - } - - /** - * {@inheritdoc} - */ - public function isVeryVerbose() - { - return self::VERBOSITY_VERY_VERBOSE <= $this->verbosity; - } - - /** - * {@inheritdoc} - */ - public function isDebug() - { - return self::VERBOSITY_DEBUG <= $this->verbosity; - } - - /** - * {@inheritdoc} - */ - public function writeln($messages, int $options = self::OUTPUT_NORMAL) - { - $this->write($messages, true, $options); - } - - /** - * {@inheritdoc} - */ - public function write($messages, bool $newline = false, int $options = self::OUTPUT_NORMAL) - { - if (!is_iterable($messages)) { - $messages = [$messages]; - } - - $types = self::OUTPUT_NORMAL | self::OUTPUT_RAW | self::OUTPUT_PLAIN; - $type = $types & $options ?: self::OUTPUT_NORMAL; - - $verbosities = self::VERBOSITY_QUIET | self::VERBOSITY_NORMAL | self::VERBOSITY_VERBOSE | self::VERBOSITY_VERY_VERBOSE | self::VERBOSITY_DEBUG; - $verbosity = $verbosities & $options ?: self::VERBOSITY_NORMAL; - - if ($verbosity > $this->getVerbosity()) { - return; - } - - foreach ($messages as $message) { - switch ($type) { - case OutputInterface::OUTPUT_NORMAL: - $message = $this->formatter->format($message); - break; - case OutputInterface::OUTPUT_RAW: - break; - case OutputInterface::OUTPUT_PLAIN: - $message = strip_tags($this->formatter->format($message)); - break; - } - - $this->doWrite($message ?? '', $newline); - } - } - - /** - * Writes a message to the output. - */ - abstract protected function doWrite(string $message, bool $newline); -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Output/OutputInterface.php b/tools/php-cs-fixer/vendor/symfony/console/Output/OutputInterface.php deleted file mode 100644 index 99ba755..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Output/OutputInterface.php +++ /dev/null @@ -1,110 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Output; - -use Symfony\Component\Console\Formatter\OutputFormatterInterface; - -/** - * OutputInterface is the interface implemented by all Output classes. - * - * @author Fabien Potencier - */ -interface OutputInterface -{ - public const VERBOSITY_QUIET = 16; - public const VERBOSITY_NORMAL = 32; - public const VERBOSITY_VERBOSE = 64; - public const VERBOSITY_VERY_VERBOSE = 128; - public const VERBOSITY_DEBUG = 256; - - public const OUTPUT_NORMAL = 1; - public const OUTPUT_RAW = 2; - public const OUTPUT_PLAIN = 4; - - /** - * Writes a message to the output. - * - * @param string|iterable $messages The message as an iterable of strings or a single string - * @param bool $newline Whether to add a newline - * @param int $options A bitmask of options (one of the OUTPUT or VERBOSITY constants), 0 is considered the same as self::OUTPUT_NORMAL | self::VERBOSITY_NORMAL - */ - public function write($messages, bool $newline = false, int $options = 0); - - /** - * Writes a message to the output and adds a newline at the end. - * - * @param string|iterable $messages The message as an iterable of strings or a single string - * @param int $options A bitmask of options (one of the OUTPUT or VERBOSITY constants), 0 is considered the same as self::OUTPUT_NORMAL | self::VERBOSITY_NORMAL - */ - public function writeln($messages, int $options = 0); - - /** - * Sets the verbosity of the output. - */ - public function setVerbosity(int $level); - - /** - * Gets the current verbosity of the output. - * - * @return int The current level of verbosity (one of the VERBOSITY constants) - */ - public function getVerbosity(); - - /** - * Returns whether verbosity is quiet (-q). - * - * @return bool true if verbosity is set to VERBOSITY_QUIET, false otherwise - */ - public function isQuiet(); - - /** - * Returns whether verbosity is verbose (-v). - * - * @return bool true if verbosity is set to VERBOSITY_VERBOSE, false otherwise - */ - public function isVerbose(); - - /** - * Returns whether verbosity is very verbose (-vv). - * - * @return bool true if verbosity is set to VERBOSITY_VERY_VERBOSE, false otherwise - */ - public function isVeryVerbose(); - - /** - * Returns whether verbosity is debug (-vvv). - * - * @return bool true if verbosity is set to VERBOSITY_DEBUG, false otherwise - */ - public function isDebug(); - - /** - * Sets the decorated flag. - */ - public function setDecorated(bool $decorated); - - /** - * Gets the decorated flag. - * - * @return bool true if the output will decorate messages, false otherwise - */ - public function isDecorated(); - - public function setFormatter(OutputFormatterInterface $formatter); - - /** - * Returns current output formatter instance. - * - * @return OutputFormatterInterface - */ - public function getFormatter(); -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Output/StreamOutput.php b/tools/php-cs-fixer/vendor/symfony/console/Output/StreamOutput.php deleted file mode 100644 index ea43452..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Output/StreamOutput.php +++ /dev/null @@ -1,115 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Output; - -use Symfony\Component\Console\Exception\InvalidArgumentException; -use Symfony\Component\Console\Formatter\OutputFormatterInterface; - -/** - * StreamOutput writes the output to a given stream. - * - * Usage: - * - * $output = new StreamOutput(fopen('php://stdout', 'w')); - * - * As `StreamOutput` can use any stream, you can also use a file: - * - * $output = new StreamOutput(fopen('/path/to/output.log', 'a', false)); - * - * @author Fabien Potencier - */ -class StreamOutput extends Output -{ - private $stream; - - /** - * @param resource $stream A stream resource - * @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) - * @param OutputFormatterInterface|null $formatter Output formatter instance (null to use default OutputFormatter) - * - * @throws InvalidArgumentException When first argument is not a real stream - */ - public function __construct($stream, int $verbosity = self::VERBOSITY_NORMAL, bool $decorated = null, OutputFormatterInterface $formatter = null) - { - if (!\is_resource($stream) || 'stream' !== get_resource_type($stream)) { - throw new InvalidArgumentException('The StreamOutput class needs a stream as its first argument.'); - } - - $this->stream = $stream; - - if (null === $decorated) { - $decorated = $this->hasColorSupport(); - } - - parent::__construct($verbosity, $decorated, $formatter); - } - - /** - * Gets the stream attached to this StreamOutput instance. - * - * @return resource A stream resource - */ - public function getStream() - { - return $this->stream; - } - - /** - * {@inheritdoc} - */ - protected function doWrite(string $message, bool $newline) - { - if ($newline) { - $message .= \PHP_EOL; - } - - @fwrite($this->stream, $message); - - fflush($this->stream); - } - - /** - * Returns true if the stream supports colorization. - * - * Colorization is disabled if not supported by the stream: - * - * This is tricky on Windows, because Cygwin, Msys2 etc emulate pseudo - * terminals via named pipes, so we can only check the environment. - * - * Reference: Composer\XdebugHandler\Process::supportsColor - * https://github.com/composer/xdebug-handler - * - * @return bool true if the stream supports colorization, false otherwise - */ - protected function hasColorSupport() - { - // Follow https://no-color.org/ - if (isset($_SERVER['NO_COLOR']) || false !== getenv('NO_COLOR')) { - return false; - } - - if ('Hyper' === getenv('TERM_PROGRAM')) { - return true; - } - - if (\DIRECTORY_SEPARATOR === '\\') { - return (\function_exists('sapi_windows_vt100_support') - && @sapi_windows_vt100_support($this->stream)) - || false !== getenv('ANSICON') - || 'ON' === getenv('ConEmuANSI') - || 'xterm' === getenv('TERM'); - } - - return stream_isatty($this->stream); - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Output/TrimmedBufferOutput.php b/tools/php-cs-fixer/vendor/symfony/console/Output/TrimmedBufferOutput.php deleted file mode 100644 index 5455c5b..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Output/TrimmedBufferOutput.php +++ /dev/null @@ -1,62 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Output; - -use Symfony\Component\Console\Exception\InvalidArgumentException; -use Symfony\Component\Console\Formatter\OutputFormatterInterface; - -/** - * A BufferedOutput that keeps only the last N chars. - * - * @author Jérémy Derussé - */ -class TrimmedBufferOutput extends Output -{ - private $maxLength; - private $buffer = ''; - - public function __construct(int $maxLength, ?int $verbosity = self::VERBOSITY_NORMAL, bool $decorated = false, OutputFormatterInterface $formatter = null) { - if ($maxLength <= 0) { - throw new InvalidArgumentException(sprintf('"%s()" expects a strictly positive maxLength. Got %d.', __METHOD__, $maxLength)); - } - - parent::__construct($verbosity, $decorated, $formatter); - $this->maxLength = $maxLength; - } - - /** - * Empties buffer and returns its content. - * - * @return string - */ - public function fetch() - { - $content = $this->buffer; - $this->buffer = ''; - - return $content; - } - - /** - * {@inheritdoc} - */ - protected function doWrite(string $message, bool $newline) - { - $this->buffer .= $message; - - if ($newline) { - $this->buffer .= \PHP_EOL; - } - - $this->buffer = substr($this->buffer, 0 - $this->maxLength); - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Question/ChoiceQuestion.php b/tools/php-cs-fixer/vendor/symfony/console/Question/ChoiceQuestion.php deleted file mode 100644 index 92b6e86..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Question/ChoiceQuestion.php +++ /dev/null @@ -1,183 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Question; - -use Symfony\Component\Console\Exception\InvalidArgumentException; - -/** - * Represents a choice question. - * - * @author Fabien Potencier - */ -class ChoiceQuestion extends Question -{ - private $choices; - private $multiselect = false; - private $prompt = ' > '; - private $errorMessage = 'Value "%s" is invalid'; - - /** - * @param string $question The question to ask to the user - * @param array $choices The list of available choices - * @param mixed $default The default answer to return - */ - public function __construct(string $question, array $choices, $default = null) - { - if (!$choices) { - throw new \LogicException('Choice question must have at least 1 choice available.'); - } - - parent::__construct($question, $default); - - $this->choices = $choices; - $this->setValidator($this->getDefaultValidator()); - $this->setAutocompleterValues($choices); - } - - /** - * Returns available choices. - * - * @return array - */ - public function getChoices() - { - return $this->choices; - } - - /** - * Sets multiselect option. - * - * When multiselect is set to true, multiple choices can be answered. - * - * @return $this - */ - public function setMultiselect(bool $multiselect) - { - $this->multiselect = $multiselect; - $this->setValidator($this->getDefaultValidator()); - - return $this; - } - - /** - * Returns whether the choices are multiselect. - * - * @return bool - */ - public function isMultiselect() - { - return $this->multiselect; - } - - /** - * Gets the prompt for choices. - * - * @return string - */ - public function getPrompt() - { - return $this->prompt; - } - - /** - * Sets the prompt for choices. - * - * @return $this - */ - public function setPrompt(string $prompt) - { - $this->prompt = $prompt; - - return $this; - } - - /** - * Sets the error message for invalid values. - * - * The error message has a string placeholder (%s) for the invalid value. - * - * @return $this - */ - public function setErrorMessage(string $errorMessage) - { - $this->errorMessage = $errorMessage; - $this->setValidator($this->getDefaultValidator()); - - return $this; - } - - private function getDefaultValidator(): callable - { - $choices = $this->choices; - $errorMessage = $this->errorMessage; - $multiselect = $this->multiselect; - $isAssoc = $this->isAssoc($choices); - - return function ($selected) use ($choices, $errorMessage, $multiselect, $isAssoc) { - if ($multiselect) { - // Check for a separated comma values - if (!preg_match('/^[^,]+(?:,[^,]+)*$/', $selected, $matches)) { - throw new InvalidArgumentException(sprintf($errorMessage, $selected)); - } - - $selectedChoices = explode(',', $selected); - } else { - $selectedChoices = [$selected]; - } - - if ($this->isTrimmable()) { - foreach ($selectedChoices as $k => $v) { - $selectedChoices[$k] = trim($v); - } - } - - $multiselectChoices = []; - foreach ($selectedChoices as $value) { - $results = []; - foreach ($choices as $key => $choice) { - if ($choice === $value) { - $results[] = $key; - } - } - - if (\count($results) > 1) { - throw new InvalidArgumentException(sprintf('The provided answer is ambiguous. Value should be one of "%s".', implode('" or "', $results))); - } - - $result = array_search($value, $choices); - - if (!$isAssoc) { - if (false !== $result) { - $result = $choices[$result]; - } elseif (isset($choices[$value])) { - $result = $choices[$value]; - } - } elseif (false === $result && isset($choices[$value])) { - $result = $value; - } - - if (false === $result) { - throw new InvalidArgumentException(sprintf($errorMessage, $value)); - } - - // For associative choices, consistently return the key as string: - $multiselectChoices[] = $isAssoc ? (string) $result : $result; - } - - if ($multiselect) { - return $multiselectChoices; - } - - return current($multiselectChoices); - }; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Question/ConfirmationQuestion.php b/tools/php-cs-fixer/vendor/symfony/console/Question/ConfirmationQuestion.php deleted file mode 100644 index 4228521..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Question/ConfirmationQuestion.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Question; - -/** - * Represents a yes/no question. - * - * @author Fabien Potencier - */ -class ConfirmationQuestion extends Question -{ - private $trueAnswerRegex; - - /** - * @param string $question The question to ask to the user - * @param bool $default The default answer to return, true or false - * @param string $trueAnswerRegex A regex to match the "yes" answer - */ - public function __construct(string $question, bool $default = true, string $trueAnswerRegex = '/^y/i') - { - parent::__construct($question, $default); - - $this->trueAnswerRegex = $trueAnswerRegex; - $this->setNormalizer($this->getDefaultNormalizer()); - } - - /** - * Returns the default answer normalizer. - */ - private function getDefaultNormalizer(): callable - { - $default = $this->getDefault(); - $regex = $this->trueAnswerRegex; - - return function ($answer) use ($default, $regex) { - if (\is_bool($answer)) { - return $answer; - } - - $answerIsTrue = (bool) preg_match($regex, $answer); - if (false === $default) { - return $answer && $answerIsTrue; - } - - return '' === $answer || $answerIsTrue; - }; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Question/Question.php b/tools/php-cs-fixer/vendor/symfony/console/Question/Question.php deleted file mode 100644 index 04d2d41..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Question/Question.php +++ /dev/null @@ -1,302 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Question; - -use Symfony\Component\Console\Exception\InvalidArgumentException; -use Symfony\Component\Console\Exception\LogicException; - -/** - * Represents a Question. - * - * @author Fabien Potencier - */ -class Question -{ - private $question; - private $attempts; - private $hidden = false; - private $hiddenFallback = true; - private $autocompleterCallback; - private $validator; - private $default; - private $normalizer; - private $trimmable = true; - private $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 - */ - public function __construct(string $question, $default = null) - { - $this->question = $question; - $this->default = $default; - } - - /** - * Returns the question. - * - * @return string - */ - public function getQuestion() - { - return $this->question; - } - - /** - * Returns the default answer. - * - * @return string|bool|int|float|null - */ - public function getDefault() - { - return $this->default; - } - - /** - * Returns whether the user response accepts newline characters. - */ - public function isMultiline(): bool - { - return $this->multiline; - } - - /** - * Sets whether the user response should accept newline characters. - * - * @return $this - */ - public function setMultiline(bool $multiline): self - { - $this->multiline = $multiline; - - return $this; - } - - /** - * Returns whether the user response must be hidden. - * - * @return bool - */ - public function isHidden() - { - return $this->hidden; - } - - /** - * Sets whether the user response must be hidden or not. - * - * @return $this - * - * @throws LogicException In case the autocompleter is also used - */ - public function setHidden(bool $hidden) - { - if ($this->autocompleterCallback) { - throw new LogicException('A hidden question cannot use the autocompleter.'); - } - - $this->hidden = (bool) $hidden; - - return $this; - } - - /** - * In case the response can not be hidden, whether to fallback on non-hidden question or not. - * - * @return bool - */ - public function isHiddenFallback() - { - return $this->hiddenFallback; - } - - /** - * Sets whether to fallback on non-hidden question if the response can not be hidden. - * - * @return $this - */ - public function setHiddenFallback(bool $fallback) - { - $this->hiddenFallback = (bool) $fallback; - - return $this; - } - - /** - * Gets values for the autocompleter. - * - * @return iterable|null - */ - public function getAutocompleterValues() - { - $callback = $this->getAutocompleterCallback(); - - return $callback ? $callback('') : null; - } - - /** - * Sets values for the autocompleter. - * - * @return $this - * - * @throws LogicException - */ - 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; - }; - } elseif ($values instanceof \Traversable) { - $valueCache = null; - $callback = static function () use ($values, &$valueCache) { - return $valueCache ?? $valueCache = iterator_to_array($values, false); - }; - } else { - $callback = null; - } - - return $this->setAutocompleterCallback($callback); - } - - /** - * Gets the callback function used for the autocompleter. - */ - public function getAutocompleterCallback(): ?callable - { - return $this->autocompleterCallback; - } - - /** - * Sets the callback function used for the autocompleter. - * - * The callback is passed the user input as argument and should return an iterable of corresponding suggestions. - * - * @return $this - */ - public function setAutocompleterCallback(callable $callback = null): self - { - if ($this->hidden && null !== $callback) { - throw new LogicException('A hidden question cannot use the autocompleter.'); - } - - $this->autocompleterCallback = $callback; - - return $this; - } - - /** - * Sets a validator for the question. - * - * @return $this - */ - public function setValidator(callable $validator = null) - { - $this->validator = $validator; - - return $this; - } - - /** - * Gets the validator for the question. - * - * @return callable|null - */ - public function getValidator() - { - return $this->validator; - } - - /** - * Sets the maximum number of attempts. - * - * Null means an unlimited number of attempts. - * - * @return $this - * - * @throws InvalidArgumentException in case the number of attempts is invalid - */ - public function setMaxAttempts(?int $attempts) - { - if (null !== $attempts) { - $attempts = (int) $attempts; - if ($attempts < 1) { - throw new InvalidArgumentException('Maximum number of attempts must be a positive value.'); - } - } - - $this->attempts = $attempts; - - return $this; - } - - /** - * Gets the maximum number of attempts. - * - * Null means an unlimited number of attempts. - * - * @return int|null - */ - public function getMaxAttempts() - { - return $this->attempts; - } - - /** - * Sets a normalizer for the response. - * - * The normalizer can be a callable (a string), a closure or a class implementing __invoke. - * - * @return $this - */ - public function setNormalizer(callable $normalizer) - { - $this->normalizer = $normalizer; - - return $this; - } - - /** - * Gets the normalizer for the response. - * - * The normalizer can ba a callable (a string), a closure or a class implementing __invoke. - * - * @return callable|null - */ - public function getNormalizer() - { - return $this->normalizer; - } - - protected function isAssoc(array $array) - { - return (bool) \count(array_filter(array_keys($array), 'is_string')); - } - - public function isTrimmable(): bool - { - return $this->trimmable; - } - - /** - * @return $this - */ - public function setTrimmable(bool $trimmable): self - { - $this->trimmable = $trimmable; - - return $this; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/README.md b/tools/php-cs-fixer/vendor/symfony/console/README.md deleted file mode 100644 index c89b4a1..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/README.md +++ /dev/null @@ -1,20 +0,0 @@ -Console Component -================= - -The Console component eases the creation of beautiful and testable command line -interfaces. - -Resources ---------- - - * [Documentation](https://symfony.com/doc/current/components/console.html) - * [Contributing](https://symfony.com/doc/current/contributing/index.html) - * [Report issues](https://github.com/symfony/symfony/issues) and - [send Pull Requests](https://github.com/symfony/symfony/pulls) - in the [main Symfony repository](https://github.com/symfony/symfony) - -Credits -------- - -`Resources/bin/hiddeninput.exe` is a third party binary provided within this -component. Find sources and license at https://github.com/Seldaek/hidden-input. diff --git a/tools/php-cs-fixer/vendor/symfony/console/Resources/bin/hiddeninput.exe b/tools/php-cs-fixer/vendor/symfony/console/Resources/bin/hiddeninput.exe deleted file mode 100644 index c8cf65e8d819e6e525121cf6b21f1c2429746038..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9216 zcmeHNe{@sVeZR8hV88~S)=Hp|Mpn({rC^@)BwNOI{ERJXCYlx+k1K6PLHo z_e!z_fhOzeA3JTX&-Z@s{rFOgjEwBlqjr!)9f zjyHz`A+ni`!0Taby{Uj5Y>jQq(k5A+X})PLWAi|{IZbtc8n^^trM{GI=P_15U6d?l zJJ3PW8XjfHpR}6`k{&5@JcEeH_SqQoQbU62o2YS30W)p_t&Fjy*RXQCZt$gCf|ao| zx&3R}m6|-Lfi@pua=$26n(UlnWo$>K67*|+#(qL_An=?l0M02AhOSJDv3;~?1ORfw z76EdK#MpSHqACHLcnJLIYlCSiX4eS@Pr8rN)Xwz0dk7O*y^0_C(Yks2Kvg! z-d-fJ)F9@k?>)m(XqDKIe2OKfhCQde9fpO0ko24yn*4xzX7q+ze`Z*=aJgwV?D?73 zaJ8UkSk|NN>@-|mB*f`EIK7$ElgAB<7p&p`^Vuq$58#;?B^*Bz7&d$B#+AYUC z(^m|`7{lqx&b^5$;i`j|S!+u|lcaQplp_&Nb)!>r>vGh3wb!tW zLq6%bkSt8jO|(vWH>LiPV(Xkp%BiGhl1q!PXXNKVKE!>Y5cHc2%cJOJA{-&ZsSn`T z#8~TA#(HWH4m>uCd+kCMTFgMI*s*n3!iCOwEI`{vGcVhzDu!Lw%-Ea^JATtrF`q3`+#KvvYJ0vM~A}D#LOD zlw`4ncB0U*Jji=--Wz#>I&5?hy;MgYW2u91d8ob=7MWfY`u;7Xe-J{Qsb0=0p|SM2 zG|=~mERIj4?gi)Ew|{LIN#oAsh20k_khIYjJBBN6rrIJ=eQO=nE;rTnPSiaQS$1$# z+|JRh0!IbQIa*f1(TZ}QM;|WO0+jTy(e)ggN4>zqp2E>C>hGPLHjHBh--2%@{EZNE zbUk{<3MABX&20QwK{MxK8`1Vk>^%dO5i@VTfu>NG3$K4NC=hSPsj9UYy`rNO}sBnB9QdKdIk7G+2_amnWstdTYVg z7HgLJGC~XLZG`63GwH8PdO_+G(k6~?J8Wj5mQos#21kC4W#2)guQXI)!z^{@F)U)5 z*re+r(2dib3D4P~%Z6TL=$PIkpmm<_#isu%t=%DcIwNkJhMeJ|bpahHO%8h|y~Ccf zUg#xVk+dyu>Q1O7JZ~8KS>tqi0qK**X*y6yHM71`bT=kFZ=@E%oe2!Km1^2sa>v+onZ%x_>aOJF+N0{i~z|<(IzgT*{0PpQq}E zQpU35@bm;qI?t_znGI&5&4sZV>+%m}w$(4hSDvLk)l<{5XyMlnCl7C%AjM3XnWvVz z{NoFsX)JB)SoqABZxUa*Yq+^^(cbq4mL%^lO12c${z{pf+)|kTTI~nQywyYF6}6|8 zlsN9&{-vwTrTyu<5^90_AsIU-ID#ZG@6d%poU44<**%xVe?`uxf}_Mr$SLHLS|K_N zQnw>(Lr2U=%$-<2D~RSzbG)2W2u^KMDnFFE?GmmbQ)V)fty957F`4OvQ_25E68ITr z5?`suu`|v?r!y=gFOGj$%9IJ zuTP=&2GcnoZZ0qSe6YL-*-lg>Q#>?Ew`a=GDc4vI#<1sNdKn?n7iSj0Orl$-#FMFi zykr>X-Xvi>sVr;92+8*H!r|3L$#o~hXa0z>AmF=z z?|@FF;*S|S0yqsw0j>Z(3mX-HD!|{N-vYc9paC8Ld=|6?00!6(_%lERupO`&um*4k z0b~W>e*uhTe4;V;mq>(ox$9FB`wLt!*DKj~!aOh|fL&#Pg*b??tm%5~_6M#02wqeC zS~wO>TWGnSp^r<0&8f2V6W->w=C+p~daC5e5wNQM*(* z66^}b0(!q3)zq$mu&VnbR#nr3;h5DS*o7{y66=!#;Dy4$pd1ZH<6WEOi0oJ8SxRL* z*v-9@Z^2w%^S(w5dO{_9Duby%2RT~;ppxaE$l()x6&}>7Wcg=u_&>f`Vs8OJGTy{X z2HpG=ThJz<{%|4Qq-~ad0qcrc87n88DHpM(nypwXIkZn<{zIT$ul&BQ?{ApCAZtyr zs2YpNt@x(G*faTU*HCKnAk(G=Tl~>r1QK8LY~J8mFFGoN5iIkYSwlm4Lsj#g4dsE5 zU-4;*Kdh-zv!rT4N$O}Q&n)?v0-9Y)lRFz58^P-KtKonzrfQ1p@0V_10^0||cGRn9 zRG<-#_TEV2nn4{BOh{YVBR4e!V!D?0K%BAlQN!D%M#k1bHypiIHT)5tlj>p0Pp_;+ z!cqC-JIs@JRhB+#teGs$Cib_=(yjRo4OJg^YPg%58aJVsC(LQ?W6%pn!-#aMZwoPcopo^Rn6BE z3=c5&W5~pP(C(-2r;PnH-S0{F`runM0ERCf3rESX$+S(MKOXmKJL9zXF}9-lf^xUs z+bb)+P%L&gV@<4q{6w^xEJ>Y>TQFUeoz0o-yq)jUqww=?wjUO8Y{a5G;DJ0Jr!LL+ zWhgsLuzi&eDrGDn$2DJwpFfH-?SGWbr>qRb?v{P`_%)So)CQgzO^HQ%;y#tJ=knH4 z95jX;^bF#BiuTH^%-j}{9VrZD=R%Q%wselH^p>5 z7d>gWB-st&3Fj%Mt*|tR5iK3J=`xhs&G)I7E>`FO@o7L z@S$B!pYMuzz5DN@X!O4DPm5n@raPJn-Q#o*m*e^5lk$g?0esg%$;>g5QW-|;c=H2GM}bo2tW^D924wmOkrUbWxcQ# z#v6bP%Tdfe~jtCRzAL;-OahZ=#yvUixu2-9fD2j$*|YY`F?0wF-{a# ztr<&kZjZ+81}6ZESqtgW)8kP#s@VLTSUR{}6?U^R*x7RE3Rl&n=VnFFqg9Uqz1n@N9N|=9<4} zuJfy^+}|D9X&vm3MAdqmu0&UMd^=K>b1hLAm_E!$rZC2b;;T~Dl zI`Eo_yRY76uM})|6wk9->of(=9&4jLv5#p@OzS~Yl>@pG)^>6`R+KtL{<4ly4o9WiM!%p_pfROU354)e8PIeE z1_s?#;OX6waNvvb&UQRN(WLbR+}&b#jo&WY-LlwCX}Q*$jGuKYuOGoIoyR(>e}}ix z+t}Q^cEcC8Y{@h}>HmJ^gD!l@gzwHmiBKl26x_lZVZG2UY!`w;RJd122;US&geQdW z3Qq}R!gIo5;ka;0I4c-Jq5X6A6?VzK&c4y!ZXdAUYu{r}*!SBXw?Aor+J4-A(*COb zb^CwV-?3k`zi-cX*c`VzL`RLI(b4MgIrGN z%ojf`E*6)Gg1A9!7q^N##2zsss^V9~-Qt7d!{UDNZ^XY9pA^3@9ui*?e=7c5d`nD; z?}~R(p>y1Kw!>|X4ycYEAkcZa*n-R%y! zqi)Up756UpqwfE7=hfigw$k~G@25gaxF9UGTkV>C(7x1Rbx4jb#|}rxq0vQ!n-c#f J0sQ~1{4brj`U(I5 diff --git a/tools/php-cs-fixer/vendor/symfony/console/SignalRegistry/SignalRegistry.php b/tools/php-cs-fixer/vendor/symfony/console/SignalRegistry/SignalRegistry.php deleted file mode 100644 index ed93dd0..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/SignalRegistry/SignalRegistry.php +++ /dev/null @@ -1,65 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\SignalRegistry; - -final class SignalRegistry -{ - private $signalHandlers = []; - - public function __construct() - { - if (\function_exists('pcntl_async_signals')) { - pcntl_async_signals(true); - } - } - - public function register(int $signal, callable $signalHandler): void - { - if (!isset($this->signalHandlers[$signal])) { - $previousCallback = pcntl_signal_get_handler($signal); - - if (\is_callable($previousCallback)) { - $this->signalHandlers[$signal][] = $previousCallback; - } - } - - $this->signalHandlers[$signal][] = $signalHandler; - - pcntl_signal($signal, [$this, 'handle']); - } - - public static function isSupported(): bool - { - if (!\function_exists('pcntl_signal')) { - return false; - } - - if (\in_array('pcntl_signal', explode(',', ini_get('disable_functions')))) { - return false; - } - - return true; - } - - /** - * @internal - */ - public function handle(int $signal): void - { - $count = \count($this->signalHandlers[$signal]); - - foreach ($this->signalHandlers[$signal] as $i => $signalHandler) { - $hasNext = $i !== $count - 1; - $signalHandler($signal, $hasNext); - } - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/SingleCommandApplication.php b/tools/php-cs-fixer/vendor/symfony/console/SingleCommandApplication.php deleted file mode 100644 index c1831d1..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/SingleCommandApplication.php +++ /dev/null @@ -1,67 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console; - -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * @author Grégoire Pineau - */ -class SingleCommandApplication extends Command -{ - private $version = 'UNKNOWN'; - private $autoExit = true; - private $running = false; - - public function setVersion(string $version): self - { - $this->version = $version; - - return $this; - } - - /** - * @final - */ - public function setAutoExit(bool $autoExit): self - { - $this->autoExit = $autoExit; - - return $this; - } - - public function run(InputInterface $input = null, OutputInterface $output = null): int - { - if ($this->running) { - return parent::run($input, $output); - } - - // We use the command name as the application name - $application = new Application($this->getName() ?: 'UNKNOWN', $this->version); - $application->setAutoExit($this->autoExit); - // Fix the usage of the command displayed with "--help" - $this->setName($_SERVER['argv'][0]); - $application->add($this); - $application->setDefaultCommand($this->getName(), true); - - $this->running = true; - try { - $ret = $application->run($input, $output); - } finally { - $this->running = false; - } - - return $ret ?? 1; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Style/OutputStyle.php b/tools/php-cs-fixer/vendor/symfony/console/Style/OutputStyle.php deleted file mode 100644 index 67a98ff..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Style/OutputStyle.php +++ /dev/null @@ -1,153 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Style; - -use Symfony\Component\Console\Formatter\OutputFormatterInterface; -use Symfony\Component\Console\Helper\ProgressBar; -use Symfony\Component\Console\Output\ConsoleOutputInterface; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * Decorates output to add console style guide helpers. - * - * @author Kevin Bond - */ -abstract class OutputStyle implements OutputInterface, StyleInterface -{ - private $output; - - public function __construct(OutputInterface $output) - { - $this->output = $output; - } - - /** - * {@inheritdoc} - */ - public function newLine(int $count = 1) - { - $this->output->write(str_repeat(\PHP_EOL, $count)); - } - - /** - * @return ProgressBar - */ - public function createProgressBar(int $max = 0) - { - return new ProgressBar($this->output, $max); - } - - /** - * {@inheritdoc} - */ - public function write($messages, bool $newline = false, int $type = self::OUTPUT_NORMAL) - { - $this->output->write($messages, $newline, $type); - } - - /** - * {@inheritdoc} - */ - public function writeln($messages, int $type = self::OUTPUT_NORMAL) - { - $this->output->writeln($messages, $type); - } - - /** - * {@inheritdoc} - */ - public function setVerbosity(int $level) - { - $this->output->setVerbosity($level); - } - - /** - * {@inheritdoc} - */ - public function getVerbosity() - { - return $this->output->getVerbosity(); - } - - /** - * {@inheritdoc} - */ - public function setDecorated(bool $decorated) - { - $this->output->setDecorated($decorated); - } - - /** - * {@inheritdoc} - */ - public function isDecorated() - { - return $this->output->isDecorated(); - } - - /** - * {@inheritdoc} - */ - public function setFormatter(OutputFormatterInterface $formatter) - { - $this->output->setFormatter($formatter); - } - - /** - * {@inheritdoc} - */ - public function getFormatter() - { - return $this->output->getFormatter(); - } - - /** - * {@inheritdoc} - */ - public function isQuiet() - { - return $this->output->isQuiet(); - } - - /** - * {@inheritdoc} - */ - public function isVerbose() - { - return $this->output->isVerbose(); - } - - /** - * {@inheritdoc} - */ - public function isVeryVerbose() - { - return $this->output->isVeryVerbose(); - } - - /** - * {@inheritdoc} - */ - public function isDebug() - { - return $this->output->isDebug(); - } - - protected function getErrorOutput() - { - if (!$this->output instanceof ConsoleOutputInterface) { - return $this->output; - } - - return $this->output->getErrorOutput(); - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Style/StyleInterface.php b/tools/php-cs-fixer/vendor/symfony/console/Style/StyleInterface.php deleted file mode 100644 index 38d23b7..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Style/StyleInterface.php +++ /dev/null @@ -1,132 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Style; - -/** - * Output style helpers. - * - * @author Kevin Bond - */ -interface StyleInterface -{ - /** - * Formats a command title. - */ - public function title(string $message); - - /** - * Formats a section title. - */ - public function section(string $message); - - /** - * Formats a list. - */ - public function listing(array $elements); - - /** - * Formats informational text. - * - * @param string|array $message - */ - public function text($message); - - /** - * Formats a success result bar. - * - * @param string|array $message - */ - public function success($message); - - /** - * Formats an error result bar. - * - * @param string|array $message - */ - public function error($message); - - /** - * Formats an warning result bar. - * - * @param string|array $message - */ - public function warning($message); - - /** - * Formats a note admonition. - * - * @param string|array $message - */ - public function note($message); - - /** - * Formats a caution admonition. - * - * @param string|array $message - */ - public function caution($message); - - /** - * Formats a table. - */ - public function table(array $headers, array $rows); - - /** - * Asks a question. - * - * @return mixed - */ - public function ask(string $question, string $default = null, callable $validator = null); - - /** - * Asks a question with the user input hidden. - * - * @return mixed - */ - public function askHidden(string $question, callable $validator = null); - - /** - * Asks for confirmation. - * - * @return bool - */ - public function confirm(string $question, bool $default = true); - - /** - * Asks a choice question. - * - * @param string|int|null $default - * - * @return mixed - */ - public function choice(string $question, array $choices, $default = null); - - /** - * Add newline(s). - */ - public function newLine(int $count = 1); - - /** - * Starts the progress output. - */ - public function progressStart(int $max = 0); - - /** - * Advances the progress output X steps. - */ - public function progressAdvance(int $step = 1); - - /** - * Finishes the progress output. - */ - public function progressFinish(); -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Style/SymfonyStyle.php b/tools/php-cs-fixer/vendor/symfony/console/Style/SymfonyStyle.php deleted file mode 100644 index 3e67213..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Style/SymfonyStyle.php +++ /dev/null @@ -1,513 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Style; - -use Symfony\Component\Console\Exception\InvalidArgumentException; -use Symfony\Component\Console\Exception\RuntimeException; -use Symfony\Component\Console\Formatter\OutputFormatter; -use Symfony\Component\Console\Helper\Helper; -use Symfony\Component\Console\Helper\ProgressBar; -use Symfony\Component\Console\Helper\SymfonyQuestionHelper; -use Symfony\Component\Console\Helper\Table; -use Symfony\Component\Console\Helper\TableCell; -use Symfony\Component\Console\Helper\TableSeparator; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\Output\TrimmedBufferOutput; -use Symfony\Component\Console\Question\ChoiceQuestion; -use Symfony\Component\Console\Question\ConfirmationQuestion; -use Symfony\Component\Console\Question\Question; -use Symfony\Component\Console\Terminal; - -/** - * Output decorator helpers for the Symfony Style Guide. - * - * @author Kevin Bond - */ -class SymfonyStyle extends OutputStyle -{ - public const MAX_LINE_LENGTH = 120; - - private $input; - private $questionHelper; - private $progressBar; - private $lineLength; - private $bufferedOutput; - - public function __construct(InputInterface $input, OutputInterface $output) - { - $this->input = $input; - $this->bufferedOutput = new TrimmedBufferOutput(\DIRECTORY_SEPARATOR === '\\' ? 4 : 2, $output->getVerbosity(), false, clone $output->getFormatter()); - // Windows cmd wraps lines as soon as the terminal width is reached, whether there are following chars or not. - $width = (new Terminal())->getWidth() ?: self::MAX_LINE_LENGTH; - $this->lineLength = min($width - (int) (\DIRECTORY_SEPARATOR === '\\'), self::MAX_LINE_LENGTH); - - parent::__construct($output); - } - - /** - * Formats a message as a block of text. - * - * @param string|array $messages The message to write in the block - */ - public function block($messages, string $type = null, string $style = null, string $prefix = ' ', bool $padding = false, bool $escape = true) - { - $messages = \is_array($messages) ? array_values($messages) : [$messages]; - - $this->autoPrependBlock(); - $this->writeln($this->createBlock($messages, $type, $style, $prefix, $padding, $escape)); - $this->newLine(); - } - - /** - * {@inheritdoc} - */ - public function title(string $message) - { - $this->autoPrependBlock(); - $this->writeln([ - sprintf('%s', OutputFormatter::escapeTrailingBackslash($message)), - sprintf('%s', str_repeat('=', Helper::width(Helper::removeDecoration($this->getFormatter(), $message)))), - ]); - $this->newLine(); - } - - /** - * {@inheritdoc} - */ - public function section(string $message) - { - $this->autoPrependBlock(); - $this->writeln([ - sprintf('%s', OutputFormatter::escapeTrailingBackslash($message)), - sprintf('%s', str_repeat('-', Helper::width(Helper::removeDecoration($this->getFormatter(), $message)))), - ]); - $this->newLine(); - } - - /** - * {@inheritdoc} - */ - public function listing(array $elements) - { - $this->autoPrependText(); - $elements = array_map(function ($element) { - return sprintf(' * %s', $element); - }, $elements); - - $this->writeln($elements); - $this->newLine(); - } - - /** - * {@inheritdoc} - */ - public function text($message) - { - $this->autoPrependText(); - - $messages = \is_array($message) ? array_values($message) : [$message]; - foreach ($messages as $message) { - $this->writeln(sprintf(' %s', $message)); - } - } - - /** - * Formats a command comment. - * - * @param string|array $message - */ - public function comment($message) - { - $this->block($message, null, null, ' // ', false, false); - } - - /** - * {@inheritdoc} - */ - public function success($message) - { - $this->block($message, 'OK', 'fg=black;bg=green', ' ', true); - } - - /** - * {@inheritdoc} - */ - public function error($message) - { - $this->block($message, 'ERROR', 'fg=white;bg=red', ' ', true); - } - - /** - * {@inheritdoc} - */ - public function warning($message) - { - $this->block($message, 'WARNING', 'fg=black;bg=yellow', ' ', true); - } - - /** - * {@inheritdoc} - */ - public function note($message) - { - $this->block($message, 'NOTE', 'fg=yellow', ' ! '); - } - - /** - * Formats an info message. - * - * @param string|array $message - */ - public function info($message) - { - $this->block($message, 'INFO', 'fg=green', ' ', true); - } - - /** - * {@inheritdoc} - */ - public function caution($message) - { - $this->block($message, 'CAUTION', 'fg=white;bg=red', ' ! ', true); - } - - /** - * {@inheritdoc} - */ - public function table(array $headers, array $rows) - { - $style = clone Table::getStyleDefinition('symfony-style-guide'); - $style->setCellHeaderFormat('%s'); - - $table = new Table($this); - $table->setHeaders($headers); - $table->setRows($rows); - $table->setStyle($style); - - $table->render(); - $this->newLine(); - } - - /** - * Formats a horizontal table. - */ - public function horizontalTable(array $headers, array $rows) - { - $style = clone Table::getStyleDefinition('symfony-style-guide'); - $style->setCellHeaderFormat('%s'); - - $table = new Table($this); - $table->setHeaders($headers); - $table->setRows($rows); - $table->setStyle($style); - $table->setHorizontal(true); - - $table->render(); - $this->newLine(); - } - - /** - * Formats a list of key/value horizontally. - * - * Each row can be one of: - * * 'A title' - * * ['key' => 'value'] - * * new TableSeparator() - * - * @param string|array|TableSeparator ...$list - */ - public function definitionList(...$list) - { - $style = clone Table::getStyleDefinition('symfony-style-guide'); - $style->setCellHeaderFormat('%s'); - - $table = new Table($this); - $headers = []; - $row = []; - foreach ($list as $value) { - if ($value instanceof TableSeparator) { - $headers[] = $value; - $row[] = $value; - continue; - } - if (\is_string($value)) { - $headers[] = new TableCell($value, ['colspan' => 2]); - $row[] = null; - continue; - } - if (!\is_array($value)) { - throw new InvalidArgumentException('Value should be an array, string, or an instance of TableSeparator.'); - } - $headers[] = key($value); - $row[] = current($value); - } - - $table->setHeaders($headers); - $table->setRows([$row]); - $table->setHorizontal(); - $table->setStyle($style); - - $table->render(); - $this->newLine(); - } - - /** - * {@inheritdoc} - */ - public function ask(string $question, string $default = null, callable $validator = null) - { - $question = new Question($question, $default); - $question->setValidator($validator); - - return $this->askQuestion($question); - } - - /** - * {@inheritdoc} - */ - public function askHidden(string $question, callable $validator = null) - { - $question = new Question($question); - - $question->setHidden(true); - $question->setValidator($validator); - - return $this->askQuestion($question); - } - - /** - * {@inheritdoc} - */ - public function confirm(string $question, bool $default = true) - { - return $this->askQuestion(new ConfirmationQuestion($question, $default)); - } - - /** - * {@inheritdoc} - */ - public function choice(string $question, array $choices, $default = null) - { - if (null !== $default) { - $values = array_flip($choices); - $default = $values[$default] ?? $default; - } - - return $this->askQuestion(new ChoiceQuestion($question, $choices, $default)); - } - - /** - * {@inheritdoc} - */ - public function progressStart(int $max = 0) - { - $this->progressBar = $this->createProgressBar($max); - $this->progressBar->start(); - } - - /** - * {@inheritdoc} - */ - public function progressAdvance(int $step = 1) - { - $this->getProgressBar()->advance($step); - } - - /** - * {@inheritdoc} - */ - public function progressFinish() - { - $this->getProgressBar()->finish(); - $this->newLine(2); - $this->progressBar = null; - } - - /** - * {@inheritdoc} - */ - public function createProgressBar(int $max = 0) - { - $progressBar = parent::createProgressBar($max); - - if ('\\' !== \DIRECTORY_SEPARATOR || 'Hyper' === getenv('TERM_PROGRAM')) { - $progressBar->setEmptyBarCharacter('░'); // light shade character \u2591 - $progressBar->setProgressCharacter(''); - $progressBar->setBarCharacter('▓'); // dark shade character \u2593 - } - - return $progressBar; - } - - /** - * @return mixed - */ - public function askQuestion(Question $question) - { - if ($this->input->isInteractive()) { - $this->autoPrependBlock(); - } - - if (!$this->questionHelper) { - $this->questionHelper = new SymfonyQuestionHelper(); - } - - $answer = $this->questionHelper->ask($this->input, $this, $question); - - if ($this->input->isInteractive()) { - $this->newLine(); - $this->bufferedOutput->write("\n"); - } - - return $answer; - } - - /** - * {@inheritdoc} - */ - public function writeln($messages, int $type = self::OUTPUT_NORMAL) - { - if (!is_iterable($messages)) { - $messages = [$messages]; - } - - foreach ($messages as $message) { - parent::writeln($message, $type); - $this->writeBuffer($message, true, $type); - } - } - - /** - * {@inheritdoc} - */ - public function write($messages, bool $newline = false, int $type = self::OUTPUT_NORMAL) - { - if (!is_iterable($messages)) { - $messages = [$messages]; - } - - foreach ($messages as $message) { - parent::write($message, $newline, $type); - $this->writeBuffer($message, $newline, $type); - } - } - - /** - * {@inheritdoc} - */ - public function newLine(int $count = 1) - { - parent::newLine($count); - $this->bufferedOutput->write(str_repeat("\n", $count)); - } - - /** - * Returns a new instance which makes use of stderr if available. - * - * @return self - */ - public function getErrorStyle() - { - return new self($this->input, $this->getErrorOutput()); - } - - private function getProgressBar(): ProgressBar - { - if (!$this->progressBar) { - throw new RuntimeException('The ProgressBar is not started.'); - } - - return $this->progressBar; - } - - private function autoPrependBlock(): void - { - $chars = substr(str_replace(\PHP_EOL, "\n", $this->bufferedOutput->fetch()), -2); - - if (!isset($chars[0])) { - $this->newLine(); //empty history, so we should start with a new line. - - return; - } - //Prepend new line for each non LF chars (This means no blank line was output before) - $this->newLine(2 - substr_count($chars, "\n")); - } - - private function autoPrependText(): void - { - $fetched = $this->bufferedOutput->fetch(); - //Prepend new line if last char isn't EOL: - if (!str_ends_with($fetched, "\n")) { - $this->newLine(); - } - } - - private function writeBuffer(string $message, bool $newLine, int $type): void - { - // We need to know if the last chars are PHP_EOL - $this->bufferedOutput->write($message, $newLine, $type); - } - - private function createBlock(iterable $messages, string $type = null, string $style = null, string $prefix = ' ', bool $padding = false, bool $escape = false): array - { - $indentLength = 0; - $prefixLength = Helper::width(Helper::removeDecoration($this->getFormatter(), $prefix)); - $lines = []; - - if (null !== $type) { - $type = sprintf('[%s] ', $type); - $indentLength = \strlen($type); - $lineIndentation = str_repeat(' ', $indentLength); - } - - // wrap and add newlines for each element - foreach ($messages as $key => $message) { - if ($escape) { - $message = OutputFormatter::escape($message); - } - - $decorationLength = Helper::width($message) - Helper::width(Helper::removeDecoration($this->getFormatter(), $message)); - $messageLineLength = min($this->lineLength - $prefixLength - $indentLength + $decorationLength, $this->lineLength); - $messageLines = explode(\PHP_EOL, wordwrap($message, $messageLineLength, \PHP_EOL, true)); - foreach ($messageLines as $messageLine) { - $lines[] = $messageLine; - } - - if (\count($messages) > 1 && $key < \count($messages) - 1) { - $lines[] = ''; - } - } - - $firstLineIndex = 0; - if ($padding && $this->isDecorated()) { - $firstLineIndex = 1; - array_unshift($lines, ''); - $lines[] = ''; - } - - foreach ($lines as $i => &$line) { - if (null !== $type) { - $line = $firstLineIndex === $i ? $type.$line : $lineIndentation.$line; - } - - $line = $prefix.$line; - $line .= str_repeat(' ', max($this->lineLength - Helper::width(Helper::removeDecoration($this->getFormatter(), $line)), 0)); - - if ($style) { - $line = sprintf('<%s>%s', $style, $line); - } - } - - return $lines; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Terminal.php b/tools/php-cs-fixer/vendor/symfony/console/Terminal.php deleted file mode 100644 index 5e5a3c2..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Terminal.php +++ /dev/null @@ -1,174 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console; - -class Terminal -{ - private static $width; - private static $height; - private static $stty; - - /** - * Gets the terminal width. - * - * @return int - */ - public function getWidth() - { - $width = getenv('COLUMNS'); - if (false !== $width) { - return (int) trim($width); - } - - if (null === self::$width) { - self::initDimensions(); - } - - return self::$width ?: 80; - } - - /** - * Gets the terminal height. - * - * @return int - */ - public function getHeight() - { - $height = getenv('LINES'); - if (false !== $height) { - return (int) trim($height); - } - - if (null === self::$height) { - self::initDimensions(); - } - - return self::$height ?: 50; - } - - /** - * @internal - * - * @return bool - */ - public static function hasSttyAvailable() - { - if (null !== self::$stty) { - return self::$stty; - } - - // skip check if exec function is disabled - if (!\function_exists('exec')) { - return false; - } - - exec('stty 2>&1', $output, $exitcode); - - return self::$stty = 0 === $exitcode; - } - - private static function initDimensions() - { - if ('\\' === \DIRECTORY_SEPARATOR) { - if (preg_match('/^(\d+)x(\d+)(?: \((\d+)x(\d+)\))?$/', trim(getenv('ANSICON')), $matches)) { - // extract [w, H] from "wxh (WxH)" - // or [w, h] from "wxh" - self::$width = (int) $matches[1]; - self::$height = isset($matches[4]) ? (int) $matches[4] : (int) $matches[2]; - } elseif (!self::hasVt100Support() && self::hasSttyAvailable()) { - // only use stty on Windows if the terminal does not support vt100 (e.g. Windows 7 + git-bash) - // testing for stty in a Windows 10 vt100-enabled console will implicitly disable vt100 support on STDOUT - self::initDimensionsUsingStty(); - } elseif (null !== $dimensions = self::getConsoleMode()) { - // extract [w, h] from "wxh" - self::$width = (int) $dimensions[0]; - self::$height = (int) $dimensions[1]; - } - } else { - self::initDimensionsUsingStty(); - } - } - - /** - * Returns whether STDOUT has vt100 support (some Windows 10+ configurations). - */ - private static function hasVt100Support(): bool - { - return \function_exists('sapi_windows_vt100_support') && sapi_windows_vt100_support(fopen('php://stdout', 'w')); - } - - /** - * Initializes dimensions using the output of an stty columns line. - */ - private static function initDimensionsUsingStty() - { - if ($sttyString = self::getSttyColumns()) { - if (preg_match('/rows.(\d+);.columns.(\d+);/i', $sttyString, $matches)) { - // extract [w, h] from "rows h; columns w;" - self::$width = (int) $matches[2]; - self::$height = (int) $matches[1]; - } elseif (preg_match('/;.(\d+).rows;.(\d+).columns/i', $sttyString, $matches)) { - // extract [w, h] from "; h rows; w columns" - self::$width = (int) $matches[2]; - self::$height = (int) $matches[1]; - } - } - } - - /** - * Runs and parses mode CON if it's available, suppressing any error output. - * - * @return int[]|null An array composed of the width and the height or null if it could not be parsed - */ - private static function getConsoleMode(): ?array - { - $info = self::readFromProcess('mode CON'); - - if (null === $info || !preg_match('/--------+\r?\n.+?(\d+)\r?\n.+?(\d+)\r?\n/', $info, $matches)) { - return null; - } - - return [(int) $matches[2], (int) $matches[1]]; - } - - /** - * Runs and parses stty -a if it's available, suppressing any error output. - */ - private static function getSttyColumns(): ?string - { - return self::readFromProcess('stty -a | grep columns'); - } - - private static function readFromProcess(string $command): ?string - { - if (!\function_exists('proc_open')) { - return null; - } - - $descriptorspec = [ - 1 => ['pipe', 'w'], - 2 => ['pipe', 'w'], - ]; - - $process = proc_open($command, $descriptorspec, $pipes, null, null, ['suppress_errors' => true]); - if (!\is_resource($process)) { - return null; - } - - $info = stream_get_contents($pipes[1]); - fclose($pipes[1]); - fclose($pipes[2]); - proc_close($process); - - return $info; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Tester/ApplicationTester.php b/tools/php-cs-fixer/vendor/symfony/console/Tester/ApplicationTester.php deleted file mode 100644 index d021c14..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Tester/ApplicationTester.php +++ /dev/null @@ -1,67 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Tester; - -use Symfony\Component\Console\Application; -use Symfony\Component\Console\Input\ArrayInput; - -/** - * Eases the testing of console applications. - * - * When testing an application, don't forget to disable the auto exit flag: - * - * $application = new Application(); - * $application->setAutoExit(false); - * - * @author Fabien Potencier - */ -class ApplicationTester -{ - use TesterTrait; - - private $application; - private $input; - private $statusCode; - - public function __construct(Application $application) - { - $this->application = $application; - } - - /** - * Executes the application. - * - * Available options: - * - * * interactive: Sets the input interactive flag - * * decorated: Sets the output decorated flag - * * verbosity: Sets the output verbosity flag - * * capture_stderr_separately: Make output of stdOut and stdErr separately available - * - * @return int The command exit code - */ - public function run(array $input, array $options = []) - { - $this->input = new ArrayInput($input); - if (isset($options['interactive'])) { - $this->input->setInteractive($options['interactive']); - } - - if ($this->inputs) { - $this->input->setStream(self::createStream($this->inputs)); - } - - $this->initOutput($options); - - return $this->statusCode = $this->application->run($this->input, $this->output); - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Tester/CommandTester.php b/tools/php-cs-fixer/vendor/symfony/console/Tester/CommandTester.php deleted file mode 100644 index 57efc9a..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Tester/CommandTester.php +++ /dev/null @@ -1,78 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Tester; - -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Input\ArrayInput; - -/** - * Eases the testing of console commands. - * - * @author Fabien Potencier - * @author Robin Chalas - */ -class CommandTester -{ - use TesterTrait; - - private $command; - private $input; - private $statusCode; - - public function __construct(Command $command) - { - $this->command = $command; - } - - /** - * Executes the command. - * - * Available execution options: - * - * * interactive: Sets the input interactive flag - * * decorated: Sets the output decorated flag - * * verbosity: Sets the output verbosity flag - * * capture_stderr_separately: Make output of stdOut and stdErr separately available - * - * @param array $input An array of command arguments and options - * @param array $options An array of execution options - * - * @return int The command exit code - */ - public function execute(array $input, array $options = []) - { - // set the command name automatically if the application requires - // this argument and no command name was passed - if (!isset($input['command']) - && (null !== $application = $this->command->getApplication()) - && $application->getDefinition()->hasArgument('command') - ) { - $input = array_merge(['command' => $this->command->getName()], $input); - } - - $this->input = new ArrayInput($input); - // Use an in-memory input stream even if no inputs are set so that QuestionHelper::ask() does not rely on the blocking STDIN. - $this->input->setStream(self::createStream($this->inputs)); - - if (isset($options['interactive'])) { - $this->input->setInteractive($options['interactive']); - } - - if (!isset($options['decorated'])) { - $options['decorated'] = false; - } - - $this->initOutput($options); - - return $this->statusCode = $this->command->run($this->input, $this->output); - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/Tester/TesterTrait.php b/tools/php-cs-fixer/vendor/symfony/console/Tester/TesterTrait.php deleted file mode 100644 index 358341b..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/Tester/TesterTrait.php +++ /dev/null @@ -1,186 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Tester; - -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\ConsoleOutput; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\Output\StreamOutput; - -/** - * @author Amrouche Hamza - */ -trait TesterTrait -{ - /** @var StreamOutput */ - private $output; - private $inputs = []; - private $captureStreamsIndependently = false; - - /** - * Gets the display returned by the last execution of the command or application. - * - * @throws \RuntimeException If it's called before the execute method - * - * @return string The display - */ - public function getDisplay(bool $normalize = false) - { - if (null === $this->output) { - throw new \RuntimeException('Output not initialized, did you execute the command before requesting the display?'); - } - - rewind($this->output->getStream()); - - $display = stream_get_contents($this->output->getStream()); - - if ($normalize) { - $display = str_replace(\PHP_EOL, "\n", $display); - } - - return $display; - } - - /** - * Gets the output written to STDERR by the application. - * - * @param bool $normalize Whether to normalize end of lines to \n or not - * - * @return string - */ - public function getErrorOutput(bool $normalize = false) - { - if (!$this->captureStreamsIndependently) { - throw new \LogicException('The error output is not available when the tester is run without "capture_stderr_separately" option set.'); - } - - rewind($this->output->getErrorOutput()->getStream()); - - $display = stream_get_contents($this->output->getErrorOutput()->getStream()); - - if ($normalize) { - $display = str_replace(\PHP_EOL, "\n", $display); - } - - return $display; - } - - /** - * Gets the input instance used by the last execution of the command or application. - * - * @return InputInterface The current input instance - */ - public function getInput() - { - return $this->input; - } - - /** - * Gets the output instance used by the last execution of the command or application. - * - * @return OutputInterface The current output instance - */ - public function getOutput() - { - return $this->output; - } - - /** - * Gets the status code returned by the last execution of the command or application. - * - * @throws \RuntimeException If it's called before the execute method - * - * @return int The status code - */ - public function getStatusCode() - { - if (null === $this->statusCode) { - throw new \RuntimeException('Status code not initialized, did you execute the command before requesting the status code?'); - } - - return $this->statusCode; - } - - /** - * Sets the user inputs. - * - * @param array $inputs An array of strings representing each input - * passed to the command input stream - * - * @return $this - */ - public function setInputs(array $inputs) - { - $this->inputs = $inputs; - - return $this; - } - - /** - * Initializes the output property. - * - * Available options: - * - * * decorated: Sets the output decorated flag - * * verbosity: Sets the output verbosity flag - * * capture_stderr_separately: Make output of stdOut and stdErr separately available - */ - private function initOutput(array $options) - { - $this->captureStreamsIndependently = \array_key_exists('capture_stderr_separately', $options) && $options['capture_stderr_separately']; - if (!$this->captureStreamsIndependently) { - $this->output = new StreamOutput(fopen('php://memory', 'w', false)); - if (isset($options['decorated'])) { - $this->output->setDecorated($options['decorated']); - } - if (isset($options['verbosity'])) { - $this->output->setVerbosity($options['verbosity']); - } - } else { - $this->output = new ConsoleOutput( - $options['verbosity'] ?? ConsoleOutput::VERBOSITY_NORMAL, - $options['decorated'] ?? null - ); - - $errorOutput = new StreamOutput(fopen('php://memory', 'w', false)); - $errorOutput->setFormatter($this->output->getFormatter()); - $errorOutput->setVerbosity($this->output->getVerbosity()); - $errorOutput->setDecorated($this->output->isDecorated()); - - $reflectedOutput = new \ReflectionObject($this->output); - $strErrProperty = $reflectedOutput->getProperty('stderr'); - $strErrProperty->setAccessible(true); - $strErrProperty->setValue($this->output, $errorOutput); - - $reflectedParent = $reflectedOutput->getParentClass(); - $streamProperty = $reflectedParent->getProperty('stream'); - $streamProperty->setAccessible(true); - $streamProperty->setValue($this->output, fopen('php://memory', 'w', false)); - } - } - - /** - * @return resource - */ - private static function createStream(array $inputs) - { - $stream = fopen('php://memory', 'r+', false); - - foreach ($inputs as $input) { - fwrite($stream, $input.\PHP_EOL); - } - - rewind($stream); - - return $stream; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/console/composer.json b/tools/php-cs-fixer/vendor/symfony/console/composer.json deleted file mode 100644 index 7598179..0000000 --- a/tools/php-cs-fixer/vendor/symfony/console/composer.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "name": "symfony/console", - "type": "library", - "description": "Eases the creation of beautiful and testable command line interfaces", - "keywords": ["console", "cli", "command line", "terminal"], - "homepage": "https://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.8", - "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2", - "symfony/string": "^5.1" - }, - "require-dev": { - "symfony/config": "^4.4|^5.0", - "symfony/event-dispatcher": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/lock": "^4.4|^5.0", - "symfony/process": "^4.4|^5.0", - "symfony/var-dumper": "^4.4|^5.0", - "psr/log": "^1|^2" - }, - "provide": { - "psr/log-implementation": "1.0|2.0" - }, - "suggest": { - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "", - "psr/log": "For using the console logger" - }, - "conflict": { - "psr/log": ">=3", - "symfony/dependency-injection": "<4.4", - "symfony/dotenv": "<5.1", - "symfony/event-dispatcher": "<4.4", - "symfony/lock": "<4.4", - "symfony/process": "<4.4" - }, - "autoload": { - "psr-4": { "Symfony\\Component\\Console\\": "" }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "minimum-stability": "dev" -} diff --git a/tools/php-cs-fixer/vendor/symfony/deprecation-contracts/.gitignore b/tools/php-cs-fixer/vendor/symfony/deprecation-contracts/.gitignore deleted file mode 100644 index c49a5d8..0000000 --- a/tools/php-cs-fixer/vendor/symfony/deprecation-contracts/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -vendor/ -composer.lock -phpunit.xml diff --git a/tools/php-cs-fixer/vendor/symfony/deprecation-contracts/CHANGELOG.md b/tools/php-cs-fixer/vendor/symfony/deprecation-contracts/CHANGELOG.md deleted file mode 100644 index 7932e26..0000000 --- a/tools/php-cs-fixer/vendor/symfony/deprecation-contracts/CHANGELOG.md +++ /dev/null @@ -1,5 +0,0 @@ -CHANGELOG -========= - -The changelog is maintained for all Symfony contracts at the following URL: -https://github.com/symfony/contracts/blob/main/CHANGELOG.md diff --git a/tools/php-cs-fixer/vendor/symfony/deprecation-contracts/LICENSE b/tools/php-cs-fixer/vendor/symfony/deprecation-contracts/LICENSE deleted file mode 100644 index ad85e17..0000000 --- a/tools/php-cs-fixer/vendor/symfony/deprecation-contracts/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2020-2021 Fabien Potencier - -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/tools/php-cs-fixer/vendor/symfony/deprecation-contracts/README.md b/tools/php-cs-fixer/vendor/symfony/deprecation-contracts/README.md deleted file mode 100644 index 4957933..0000000 --- a/tools/php-cs-fixer/vendor/symfony/deprecation-contracts/README.md +++ /dev/null @@ -1,26 +0,0 @@ -Symfony Deprecation Contracts -============================= - -A generic function and convention to trigger deprecation notices. - -This package provides a single global function named `trigger_deprecation()` that triggers silenced deprecation notices. - -By using a custom PHP error handler such as the one provided by the Symfony ErrorHandler component, -the triggered deprecations can be caught and logged for later discovery, both on dev and prod environments. - -The function requires at least 3 arguments: - - the name of the Composer package that is triggering the deprecation - - the version of the package that introduced the deprecation - - the message of the deprecation - - more arguments can be provided: they will be inserted in the message using `printf()` formatting - -Example: -```php -trigger_deprecation('symfony/blockchain', '8.9', 'Using "%s" is deprecated, use "%s" instead.', 'bitcoin', 'fabcoin'); -``` - -This will generate the following message: -`Since symfony/blockchain 8.9: Using "bitcoin" is deprecated, use "fabcoin" instead.` - -While not necessarily recommended, the deprecation notices can be completely ignored by declaring an empty -`function trigger_deprecation() {}` in your application. diff --git a/tools/php-cs-fixer/vendor/symfony/deprecation-contracts/composer.json b/tools/php-cs-fixer/vendor/symfony/deprecation-contracts/composer.json deleted file mode 100644 index 3884889..0000000 --- a/tools/php-cs-fixer/vendor/symfony/deprecation-contracts/composer.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "symfony/deprecation-contracts", - "type": "library", - "description": "A generic function and convention to trigger deprecation notices", - "homepage": "https://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "require": { - "php": ">=7.1" - }, - "autoload": { - "files": [ - "function.php" - ] - }, - "minimum-stability": "dev", - "extra": { - "branch-alias": { - "dev-main": "2.4-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/deprecation-contracts/function.php b/tools/php-cs-fixer/vendor/symfony/deprecation-contracts/function.php deleted file mode 100644 index d437150..0000000 --- a/tools/php-cs-fixer/vendor/symfony/deprecation-contracts/function.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -if (!function_exists('trigger_deprecation')) { - /** - * Triggers a silenced deprecation notice. - * - * @param string $package The name of the Composer package that is triggering the deprecation - * @param string $version The version of the package that introduced the deprecation - * @param string $message The message of the deprecation - * @param mixed ...$args Values to insert in the message using printf() formatting - * - * @author Nicolas Grekas - */ - function trigger_deprecation(string $package, string $version, string $message, ...$args): void - { - @trigger_error(($package || $version ? "Since $package $version: " : '').($args ? vsprintf($message, $args) : $message), \E_USER_DEPRECATED); - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/event-dispatcher-contracts/.gitignore b/tools/php-cs-fixer/vendor/symfony/event-dispatcher-contracts/.gitignore deleted file mode 100644 index c49a5d8..0000000 --- a/tools/php-cs-fixer/vendor/symfony/event-dispatcher-contracts/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -vendor/ -composer.lock -phpunit.xml diff --git a/tools/php-cs-fixer/vendor/symfony/event-dispatcher-contracts/CHANGELOG.md b/tools/php-cs-fixer/vendor/symfony/event-dispatcher-contracts/CHANGELOG.md deleted file mode 100644 index 7932e26..0000000 --- a/tools/php-cs-fixer/vendor/symfony/event-dispatcher-contracts/CHANGELOG.md +++ /dev/null @@ -1,5 +0,0 @@ -CHANGELOG -========= - -The changelog is maintained for all Symfony contracts at the following URL: -https://github.com/symfony/contracts/blob/main/CHANGELOG.md diff --git a/tools/php-cs-fixer/vendor/symfony/event-dispatcher-contracts/Event.php b/tools/php-cs-fixer/vendor/symfony/event-dispatcher-contracts/Event.php deleted file mode 100644 index 46dcb2b..0000000 --- a/tools/php-cs-fixer/vendor/symfony/event-dispatcher-contracts/Event.php +++ /dev/null @@ -1,54 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Contracts\EventDispatcher; - -use Psr\EventDispatcher\StoppableEventInterface; - -/** - * Event is the base class for classes containing event data. - * - * This class contains no event data. It is used by events that do not pass - * state information to an event handler when an event is raised. - * - * You can call the method stopPropagation() to abort the execution of - * further listeners in your event listener. - * - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author Bernhard Schussek - * @author Nicolas Grekas - */ -class Event implements StoppableEventInterface -{ - private $propagationStopped = false; - - /** - * {@inheritdoc} - */ - public function isPropagationStopped(): bool - { - return $this->propagationStopped; - } - - /** - * Stops the propagation of the event to further event listeners. - * - * If multiple event listeners are connected to the same event, no - * further event listener will be triggered once any trigger calls - * stopPropagation(). - */ - public function stopPropagation(): void - { - $this->propagationStopped = true; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/event-dispatcher-contracts/EventDispatcherInterface.php b/tools/php-cs-fixer/vendor/symfony/event-dispatcher-contracts/EventDispatcherInterface.php deleted file mode 100644 index 351dc51..0000000 --- a/tools/php-cs-fixer/vendor/symfony/event-dispatcher-contracts/EventDispatcherInterface.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Contracts\EventDispatcher; - -use Psr\EventDispatcher\EventDispatcherInterface as PsrEventDispatcherInterface; - -/** - * Allows providing hooks on domain-specific lifecycles by dispatching events. - */ -interface EventDispatcherInterface extends PsrEventDispatcherInterface -{ - /** - * Dispatches an event to all registered listeners. - * - * @param object $event The event to pass to the event handlers/listeners - * @param string|null $eventName The name of the event to dispatch. If not supplied, - * the class of $event should be used instead. - * - * @return object The passed $event MUST be returned - */ - public function dispatch(object $event, string $eventName = null): object; -} diff --git a/tools/php-cs-fixer/vendor/symfony/event-dispatcher-contracts/LICENSE b/tools/php-cs-fixer/vendor/symfony/event-dispatcher-contracts/LICENSE deleted file mode 100644 index 2358414..0000000 --- a/tools/php-cs-fixer/vendor/symfony/event-dispatcher-contracts/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2018-2021 Fabien Potencier - -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/tools/php-cs-fixer/vendor/symfony/event-dispatcher-contracts/README.md b/tools/php-cs-fixer/vendor/symfony/event-dispatcher-contracts/README.md deleted file mode 100644 index b1ab4c0..0000000 --- a/tools/php-cs-fixer/vendor/symfony/event-dispatcher-contracts/README.md +++ /dev/null @@ -1,9 +0,0 @@ -Symfony EventDispatcher Contracts -================================= - -A set of abstractions extracted out of the Symfony components. - -Can be used to build on semantics that the Symfony components proved useful - and -that already have battle tested implementations. - -See https://github.com/symfony/contracts/blob/main/README.md for more information. diff --git a/tools/php-cs-fixer/vendor/symfony/event-dispatcher-contracts/composer.json b/tools/php-cs-fixer/vendor/symfony/event-dispatcher-contracts/composer.json deleted file mode 100644 index 9f6dc41..0000000 --- a/tools/php-cs-fixer/vendor/symfony/event-dispatcher-contracts/composer.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "symfony/event-dispatcher-contracts", - "type": "library", - "description": "Generic abstractions related to dispatching event", - "keywords": ["abstractions", "contracts", "decoupling", "interfaces", "interoperability", "standards"], - "homepage": "https://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "require": { - "php": ">=7.2.5", - "psr/event-dispatcher": "^1" - }, - "suggest": { - "symfony/event-dispatcher-implementation": "" - }, - "autoload": { - "psr-4": { "Symfony\\Contracts\\EventDispatcher\\": "" } - }, - "minimum-stability": "dev", - "extra": { - "branch-alias": { - "dev-main": "2.4-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/event-dispatcher/Attribute/AsEventListener.php b/tools/php-cs-fixer/vendor/symfony/event-dispatcher/Attribute/AsEventListener.php deleted file mode 100644 index f42d4bd..0000000 --- a/tools/php-cs-fixer/vendor/symfony/event-dispatcher/Attribute/AsEventListener.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\EventDispatcher\Attribute; - -/** - * Service tag to autoconfigure event listeners. - * - * @author Alexander M. Turek - */ -#[\Attribute(\Attribute::TARGET_CLASS | \Attribute::IS_REPEATABLE)] -class AsEventListener -{ - public function __construct( - public ?string $event = null, - public ?string $method = null, - public int $priority = 0, - public ?string $dispatcher = null, - ) { - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/event-dispatcher/CHANGELOG.md b/tools/php-cs-fixer/vendor/symfony/event-dispatcher/CHANGELOG.md deleted file mode 100644 index 4172876..0000000 --- a/tools/php-cs-fixer/vendor/symfony/event-dispatcher/CHANGELOG.md +++ /dev/null @@ -1,86 +0,0 @@ -CHANGELOG -========= - -5.3 ---- - - * Add `#[AsEventListener]` attribute for declaring listeners on PHP 8 - -5.1.0 ------ - - * The `LegacyEventDispatcherProxy` class has been deprecated. - * Added an optional `dispatcher` attribute to the listener and subscriber tags in `RegisterListenerPass`. - -5.0.0 ------ - - * The signature of the `EventDispatcherInterface::dispatch()` method has been changed to `dispatch($event, string $eventName = null): object`. - * The `Event` class has been removed in favor of `Symfony\Contracts\EventDispatcher\Event`. - * The `TraceableEventDispatcherInterface` has been removed. - * The `WrappedListener` class is now final. - -4.4.0 ------ - - * `AddEventAliasesPass` has been added, allowing applications and bundles to extend the event alias mapping used by `RegisterListenersPass`. - * Made the `event` attribute of the `kernel.event_listener` tag optional for FQCN events. - -4.3.0 ------ - - * The signature of the `EventDispatcherInterface::dispatch()` method should be updated to `dispatch($event, string $eventName = null)`, not doing so is deprecated - * deprecated the `Event` class, use `Symfony\Contracts\EventDispatcher\Event` instead - -4.1.0 ------ - - * added support for invokable event listeners tagged with `kernel.event_listener` by default - * The `TraceableEventDispatcher::getOrphanedEvents()` method has been added. - * The `TraceableEventDispatcherInterface` has been deprecated. - -4.0.0 ------ - - * removed the `ContainerAwareEventDispatcher` class - * added the `reset()` method to the `TraceableEventDispatcherInterface` - -3.4.0 ------ - - * Implementing `TraceableEventDispatcherInterface` without the `reset()` method has been deprecated. - -3.3.0 ------ - - * The ContainerAwareEventDispatcher class has been deprecated. Use EventDispatcher with closure factories instead. - -3.0.0 ------ - - * The method `getListenerPriority($eventName, $listener)` has been added to the - `EventDispatcherInterface`. - * The methods `Event::setDispatcher()`, `Event::getDispatcher()`, `Event::setName()` - and `Event::getName()` have been removed. - The event dispatcher and the event name are passed to the listener call. - -2.5.0 ------ - - * added Debug\TraceableEventDispatcher (originally in HttpKernel) - * changed Debug\TraceableEventDispatcherInterface to extend EventDispatcherInterface - * added RegisterListenersPass (originally in HttpKernel) - -2.1.0 ------ - - * added TraceableEventDispatcherInterface - * added ContainerAwareEventDispatcher - * added a reference to the EventDispatcher on the Event - * added a reference to the Event name on the event - * added fluid interface to the dispatch() method which now returns the Event - object - * added GenericEvent event class - * added the possibility for subscribers to subscribe several times for the - same event - * added ImmutableEventDispatcher diff --git a/tools/php-cs-fixer/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php b/tools/php-cs-fixer/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php deleted file mode 100644 index 87d538e..0000000 --- a/tools/php-cs-fixer/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php +++ /dev/null @@ -1,363 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\EventDispatcher\Debug; - -use Psr\EventDispatcher\StoppableEventInterface; -use Psr\Log\LoggerInterface; -use Symfony\Component\EventDispatcher\EventDispatcherInterface; -use Symfony\Component\EventDispatcher\EventSubscriberInterface; -use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\HttpFoundation\RequestStack; -use Symfony\Component\Stopwatch\Stopwatch; -use Symfony\Contracts\Service\ResetInterface; - -/** - * Collects some data about event listeners. - * - * This event dispatcher delegates the dispatching to another one. - * - * @author Fabien Potencier - */ -class TraceableEventDispatcher implements EventDispatcherInterface, ResetInterface -{ - protected $logger; - protected $stopwatch; - - private $callStack; - private $dispatcher; - private $wrappedListeners; - private $orphanedEvents; - private $requestStack; - private $currentRequestHash = ''; - - public function __construct(EventDispatcherInterface $dispatcher, Stopwatch $stopwatch, LoggerInterface $logger = null, RequestStack $requestStack = null) - { - $this->dispatcher = $dispatcher; - $this->stopwatch = $stopwatch; - $this->logger = $logger; - $this->wrappedListeners = []; - $this->orphanedEvents = []; - $this->requestStack = $requestStack; - } - - /** - * {@inheritdoc} - */ - public function addListener(string $eventName, $listener, int $priority = 0) - { - $this->dispatcher->addListener($eventName, $listener, $priority); - } - - /** - * {@inheritdoc} - */ - public function addSubscriber(EventSubscriberInterface $subscriber) - { - $this->dispatcher->addSubscriber($subscriber); - } - - /** - * {@inheritdoc} - */ - public function removeListener(string $eventName, $listener) - { - if (isset($this->wrappedListeners[$eventName])) { - foreach ($this->wrappedListeners[$eventName] as $index => $wrappedListener) { - if ($wrappedListener->getWrappedListener() === $listener) { - $listener = $wrappedListener; - unset($this->wrappedListeners[$eventName][$index]); - break; - } - } - } - - return $this->dispatcher->removeListener($eventName, $listener); - } - - /** - * {@inheritdoc} - */ - public function removeSubscriber(EventSubscriberInterface $subscriber) - { - return $this->dispatcher->removeSubscriber($subscriber); - } - - /** - * {@inheritdoc} - */ - public function getListeners(string $eventName = null) - { - return $this->dispatcher->getListeners($eventName); - } - - /** - * {@inheritdoc} - */ - public function getListenerPriority(string $eventName, $listener) - { - // we might have wrapped listeners for the event (if called while dispatching) - // in that case get the priority by wrapper - if (isset($this->wrappedListeners[$eventName])) { - foreach ($this->wrappedListeners[$eventName] as $index => $wrappedListener) { - if ($wrappedListener->getWrappedListener() === $listener) { - return $this->dispatcher->getListenerPriority($eventName, $wrappedListener); - } - } - } - - return $this->dispatcher->getListenerPriority($eventName, $listener); - } - - /** - * {@inheritdoc} - */ - public function hasListeners(string $eventName = null) - { - return $this->dispatcher->hasListeners($eventName); - } - - /** - * {@inheritdoc} - */ - public function dispatch(object $event, string $eventName = null): object - { - $eventName = $eventName ?? \get_class($event); - - if (null === $this->callStack) { - $this->callStack = new \SplObjectStorage(); - } - - $currentRequestHash = $this->currentRequestHash = $this->requestStack && ($request = $this->requestStack->getCurrentRequest()) ? spl_object_hash($request) : ''; - - if (null !== $this->logger && $event instanceof StoppableEventInterface && $event->isPropagationStopped()) { - $this->logger->debug(sprintf('The "%s" event is already stopped. No listeners have been called.', $eventName)); - } - - $this->preProcess($eventName); - try { - $this->beforeDispatch($eventName, $event); - try { - $e = $this->stopwatch->start($eventName, 'section'); - try { - $this->dispatcher->dispatch($event, $eventName); - } finally { - if ($e->isStarted()) { - $e->stop(); - } - } - } finally { - $this->afterDispatch($eventName, $event); - } - } finally { - $this->currentRequestHash = $currentRequestHash; - $this->postProcess($eventName); - } - - return $event; - } - - /** - * @return array - */ - public function getCalledListeners(Request $request = null) - { - if (null === $this->callStack) { - return []; - } - - $hash = $request ? spl_object_hash($request) : null; - $called = []; - foreach ($this->callStack as $listener) { - [$eventName, $requestHash] = $this->callStack->getInfo(); - if (null === $hash || $hash === $requestHash) { - $called[] = $listener->getInfo($eventName); - } - } - - return $called; - } - - /** - * @return array - */ - public function getNotCalledListeners(Request $request = null) - { - try { - $allListeners = $this->getListeners(); - } catch (\Exception $e) { - if (null !== $this->logger) { - $this->logger->info('An exception was thrown while getting the uncalled listeners.', ['exception' => $e]); - } - - // unable to retrieve the uncalled listeners - return []; - } - - $hash = $request ? spl_object_hash($request) : null; - $calledListeners = []; - - if (null !== $this->callStack) { - foreach ($this->callStack as $calledListener) { - [, $requestHash] = $this->callStack->getInfo(); - - if (null === $hash || $hash === $requestHash) { - $calledListeners[] = $calledListener->getWrappedListener(); - } - } - } - - $notCalled = []; - foreach ($allListeners as $eventName => $listeners) { - foreach ($listeners as $listener) { - if (!\in_array($listener, $calledListeners, true)) { - if (!$listener instanceof WrappedListener) { - $listener = new WrappedListener($listener, null, $this->stopwatch, $this); - } - $notCalled[] = $listener->getInfo($eventName); - } - } - } - - uasort($notCalled, [$this, 'sortNotCalledListeners']); - - return $notCalled; - } - - public function getOrphanedEvents(Request $request = null): array - { - if ($request) { - return $this->orphanedEvents[spl_object_hash($request)] ?? []; - } - - if (!$this->orphanedEvents) { - return []; - } - - return array_merge(...array_values($this->orphanedEvents)); - } - - public function reset() - { - $this->callStack = null; - $this->orphanedEvents = []; - $this->currentRequestHash = ''; - } - - /** - * Proxies all method calls to the original event dispatcher. - * - * @param string $method The method name - * @param array $arguments The method arguments - * - * @return mixed - */ - public function __call(string $method, array $arguments) - { - return $this->dispatcher->{$method}(...$arguments); - } - - /** - * Called before dispatching the event. - */ - protected function beforeDispatch(string $eventName, object $event) - { - } - - /** - * Called after dispatching the event. - */ - protected function afterDispatch(string $eventName, object $event) - { - } - - private function preProcess(string $eventName): void - { - if (!$this->dispatcher->hasListeners($eventName)) { - $this->orphanedEvents[$this->currentRequestHash][] = $eventName; - - return; - } - - foreach ($this->dispatcher->getListeners($eventName) as $listener) { - $priority = $this->getListenerPriority($eventName, $listener); - $wrappedListener = new WrappedListener($listener instanceof WrappedListener ? $listener->getWrappedListener() : $listener, null, $this->stopwatch, $this); - $this->wrappedListeners[$eventName][] = $wrappedListener; - $this->dispatcher->removeListener($eventName, $listener); - $this->dispatcher->addListener($eventName, $wrappedListener, $priority); - $this->callStack->attach($wrappedListener, [$eventName, $this->currentRequestHash]); - } - } - - private function postProcess(string $eventName): void - { - unset($this->wrappedListeners[$eventName]); - $skipped = false; - foreach ($this->dispatcher->getListeners($eventName) as $listener) { - if (!$listener instanceof WrappedListener) { // #12845: a new listener was added during dispatch. - continue; - } - // Unwrap listener - $priority = $this->getListenerPriority($eventName, $listener); - $this->dispatcher->removeListener($eventName, $listener); - $this->dispatcher->addListener($eventName, $listener->getWrappedListener(), $priority); - - if (null !== $this->logger) { - $context = ['event' => $eventName, 'listener' => $listener->getPretty()]; - } - - if ($listener->wasCalled()) { - if (null !== $this->logger) { - $this->logger->debug('Notified event "{event}" to listener "{listener}".', $context); - } - } else { - $this->callStack->detach($listener); - } - - if (null !== $this->logger && $skipped) { - $this->logger->debug('Listener "{listener}" was not called for event "{event}".', $context); - } - - if ($listener->stoppedPropagation()) { - if (null !== $this->logger) { - $this->logger->debug('Listener "{listener}" stopped propagation of the event "{event}".', $context); - } - - $skipped = true; - } - } - } - - private function sortNotCalledListeners(array $a, array $b) - { - if (0 !== $cmp = strcmp($a['event'], $b['event'])) { - return $cmp; - } - - if (\is_int($a['priority']) && !\is_int($b['priority'])) { - return 1; - } - - if (!\is_int($a['priority']) && \is_int($b['priority'])) { - return -1; - } - - if ($a['priority'] === $b['priority']) { - return 0; - } - - if ($a['priority'] > $b['priority']) { - return -1; - } - - return 1; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/event-dispatcher/Debug/WrappedListener.php b/tools/php-cs-fixer/vendor/symfony/event-dispatcher/Debug/WrappedListener.php deleted file mode 100644 index 3916716..0000000 --- a/tools/php-cs-fixer/vendor/symfony/event-dispatcher/Debug/WrappedListener.php +++ /dev/null @@ -1,127 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\EventDispatcher\Debug; - -use Psr\EventDispatcher\StoppableEventInterface; -use Symfony\Component\EventDispatcher\EventDispatcherInterface; -use Symfony\Component\Stopwatch\Stopwatch; -use Symfony\Component\VarDumper\Caster\ClassStub; - -/** - * @author Fabien Potencier - */ -final class WrappedListener -{ - private $listener; - private $optimizedListener; - private $name; - private $called; - private $stoppedPropagation; - private $stopwatch; - private $dispatcher; - private $pretty; - private $stub; - private $priority; - private static $hasClassStub; - - public function __construct($listener, ?string $name, Stopwatch $stopwatch, EventDispatcherInterface $dispatcher = null) - { - $this->listener = $listener; - $this->optimizedListener = $listener instanceof \Closure ? $listener : (\is_callable($listener) ? \Closure::fromCallable($listener) : null); - $this->stopwatch = $stopwatch; - $this->dispatcher = $dispatcher; - $this->called = false; - $this->stoppedPropagation = false; - - if (\is_array($listener)) { - $this->name = \is_object($listener[0]) ? get_debug_type($listener[0]) : $listener[0]; - $this->pretty = $this->name.'::'.$listener[1]; - } elseif ($listener instanceof \Closure) { - $r = new \ReflectionFunction($listener); - if (str_contains($r->name, '{closure}')) { - $this->pretty = $this->name = 'closure'; - } elseif ($class = $r->getClosureScopeClass()) { - $this->name = $class->name; - $this->pretty = $this->name.'::'.$r->name; - } else { - $this->pretty = $this->name = $r->name; - } - } elseif (\is_string($listener)) { - $this->pretty = $this->name = $listener; - } else { - $this->name = get_debug_type($listener); - $this->pretty = $this->name.'::__invoke'; - } - - if (null !== $name) { - $this->name = $name; - } - - if (null === self::$hasClassStub) { - self::$hasClassStub = class_exists(ClassStub::class); - } - } - - public function getWrappedListener() - { - return $this->listener; - } - - public function wasCalled(): bool - { - return $this->called; - } - - public function stoppedPropagation(): bool - { - return $this->stoppedPropagation; - } - - public function getPretty(): string - { - return $this->pretty; - } - - public function getInfo(string $eventName): array - { - if (null === $this->stub) { - $this->stub = self::$hasClassStub ? new ClassStub($this->pretty.'()', $this->listener) : $this->pretty.'()'; - } - - return [ - 'event' => $eventName, - 'priority' => null !== $this->priority ? $this->priority : (null !== $this->dispatcher ? $this->dispatcher->getListenerPriority($eventName, $this->listener) : null), - 'pretty' => $this->pretty, - 'stub' => $this->stub, - ]; - } - - public function __invoke(object $event, string $eventName, EventDispatcherInterface $dispatcher): void - { - $dispatcher = $this->dispatcher ?: $dispatcher; - - $this->called = true; - $this->priority = $dispatcher->getListenerPriority($eventName, $this->listener); - - $e = $this->stopwatch->start($this->name, 'event_listener'); - - ($this->optimizedListener ?? $this->listener)($event, $eventName, $dispatcher); - - if ($e->isStarted()) { - $e->stop(); - } - - if ($event instanceof StoppableEventInterface && $event->isPropagationStopped()) { - $this->stoppedPropagation = true; - } - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/event-dispatcher/DependencyInjection/AddEventAliasesPass.php b/tools/php-cs-fixer/vendor/symfony/event-dispatcher/DependencyInjection/AddEventAliasesPass.php deleted file mode 100644 index 6e7292b..0000000 --- a/tools/php-cs-fixer/vendor/symfony/event-dispatcher/DependencyInjection/AddEventAliasesPass.php +++ /dev/null @@ -1,46 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\EventDispatcher\DependencyInjection; - -use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; -use Symfony\Component\DependencyInjection\ContainerBuilder; - -/** - * This pass allows bundles to extend the list of event aliases. - * - * @author Alexander M. Turek - */ -class AddEventAliasesPass implements CompilerPassInterface -{ - private $eventAliases; - private $eventAliasesParameter; - - public function __construct(array $eventAliases, string $eventAliasesParameter = 'event_dispatcher.event_aliases') - { - if (1 < \func_num_args()) { - trigger_deprecation('symfony/event-dispatcher', '5.3', 'Configuring "%s" is deprecated.', __CLASS__); - } - - $this->eventAliases = $eventAliases; - $this->eventAliasesParameter = $eventAliasesParameter; - } - - public function process(ContainerBuilder $container): void - { - $eventAliases = $container->hasParameter($this->eventAliasesParameter) ? $container->getParameter($this->eventAliasesParameter) : []; - - $container->setParameter( - $this->eventAliasesParameter, - array_merge($eventAliases, $this->eventAliases) - ); - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php b/tools/php-cs-fixer/vendor/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php deleted file mode 100644 index e271509..0000000 --- a/tools/php-cs-fixer/vendor/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php +++ /dev/null @@ -1,230 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\EventDispatcher\DependencyInjection; - -use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument; -use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; -use Symfony\Component\DependencyInjection\Reference; -use Symfony\Component\EventDispatcher\EventDispatcher; -use Symfony\Component\EventDispatcher\EventSubscriberInterface; -use Symfony\Contracts\EventDispatcher\Event; - -/** - * Compiler pass to register tagged services for an event dispatcher. - */ -class RegisterListenersPass implements CompilerPassInterface -{ - protected $dispatcherService; - protected $listenerTag; - protected $subscriberTag; - protected $eventAliasesParameter; - - private $hotPathEvents = []; - private $hotPathTagName; - private $noPreloadEvents = []; - private $noPreloadTagName; - - public function __construct(string $dispatcherService = 'event_dispatcher', string $listenerTag = 'kernel.event_listener', string $subscriberTag = 'kernel.event_subscriber', string $eventAliasesParameter = 'event_dispatcher.event_aliases') - { - if (0 < \func_num_args()) { - trigger_deprecation('symfony/event-dispatcher', '5.3', 'Configuring "%s" is deprecated.', __CLASS__); - } - - $this->dispatcherService = $dispatcherService; - $this->listenerTag = $listenerTag; - $this->subscriberTag = $subscriberTag; - $this->eventAliasesParameter = $eventAliasesParameter; - } - - /** - * @return $this - */ - public function setHotPathEvents(array $hotPathEvents, string $tagName = 'container.hot_path') - { - $this->hotPathEvents = array_flip($hotPathEvents); - $this->hotPathTagName = $tagName; - - return $this; - } - - /** - * @return $this - */ - public function setNoPreloadEvents(array $noPreloadEvents, string $tagName = 'container.no_preload'): self - { - $this->noPreloadEvents = array_flip($noPreloadEvents); - $this->noPreloadTagName = $tagName; - - return $this; - } - - public function process(ContainerBuilder $container) - { - if (!$container->hasDefinition($this->dispatcherService) && !$container->hasAlias($this->dispatcherService)) { - return; - } - - $aliases = []; - - if ($container->hasParameter($this->eventAliasesParameter)) { - $aliases = $container->getParameter($this->eventAliasesParameter); - } - - $globalDispatcherDefinition = $container->findDefinition($this->dispatcherService); - - foreach ($container->findTaggedServiceIds($this->listenerTag, true) as $id => $events) { - $noPreload = 0; - - foreach ($events as $event) { - $priority = $event['priority'] ?? 0; - - if (!isset($event['event'])) { - if ($container->getDefinition($id)->hasTag($this->subscriberTag)) { - continue; - } - - $event['method'] = $event['method'] ?? '__invoke'; - $event['event'] = $this->getEventFromTypeDeclaration($container, $id, $event['method']); - } - - $event['event'] = $aliases[$event['event']] ?? $event['event']; - - if (!isset($event['method'])) { - $event['method'] = 'on'.preg_replace_callback([ - '/(?<=\b|_)[a-z]/i', - '/[^a-z0-9]/i', - ], function ($matches) { return strtoupper($matches[0]); }, $event['event']); - $event['method'] = preg_replace('/[^a-z0-9]/i', '', $event['method']); - - if (null !== ($class = $container->getDefinition($id)->getClass()) && ($r = $container->getReflectionClass($class, false)) && !$r->hasMethod($event['method']) && $r->hasMethod('__invoke')) { - $event['method'] = '__invoke'; - } - } - - $dispatcherDefinition = $globalDispatcherDefinition; - if (isset($event['dispatcher'])) { - $dispatcherDefinition = $container->getDefinition($event['dispatcher']); - } - - $dispatcherDefinition->addMethodCall('addListener', [$event['event'], [new ServiceClosureArgument(new Reference($id)), $event['method']], $priority]); - - if (isset($this->hotPathEvents[$event['event']])) { - $container->getDefinition($id)->addTag($this->hotPathTagName); - } elseif (isset($this->noPreloadEvents[$event['event']])) { - ++$noPreload; - } - } - - if ($noPreload && \count($events) === $noPreload) { - $container->getDefinition($id)->addTag($this->noPreloadTagName); - } - } - - $extractingDispatcher = new ExtractingEventDispatcher(); - - foreach ($container->findTaggedServiceIds($this->subscriberTag, true) as $id => $tags) { - $def = $container->getDefinition($id); - - // We must assume that the class value has been correctly filled, even if the service is created by a factory - $class = $def->getClass(); - - if (!$r = $container->getReflectionClass($class)) { - throw new InvalidArgumentException(sprintf('Class "%s" used for service "%s" cannot be found.', $class, $id)); - } - if (!$r->isSubclassOf(EventSubscriberInterface::class)) { - throw new InvalidArgumentException(sprintf('Service "%s" must implement interface "%s".', $id, EventSubscriberInterface::class)); - } - $class = $r->name; - - $dispatcherDefinitions = []; - foreach ($tags as $attributes) { - if (!isset($attributes['dispatcher']) || isset($dispatcherDefinitions[$attributes['dispatcher']])) { - continue; - } - - $dispatcherDefinitions[$attributes['dispatcher']] = $container->getDefinition($attributes['dispatcher']); - } - - if (!$dispatcherDefinitions) { - $dispatcherDefinitions = [$globalDispatcherDefinition]; - } - - $noPreload = 0; - ExtractingEventDispatcher::$aliases = $aliases; - ExtractingEventDispatcher::$subscriber = $class; - $extractingDispatcher->addSubscriber($extractingDispatcher); - foreach ($extractingDispatcher->listeners as $args) { - $args[1] = [new ServiceClosureArgument(new Reference($id)), $args[1]]; - foreach ($dispatcherDefinitions as $dispatcherDefinition) { - $dispatcherDefinition->addMethodCall('addListener', $args); - } - - if (isset($this->hotPathEvents[$args[0]])) { - $container->getDefinition($id)->addTag($this->hotPathTagName); - } elseif (isset($this->noPreloadEvents[$args[0]])) { - ++$noPreload; - } - } - if ($noPreload && \count($extractingDispatcher->listeners) === $noPreload) { - $container->getDefinition($id)->addTag($this->noPreloadTagName); - } - $extractingDispatcher->listeners = []; - ExtractingEventDispatcher::$aliases = []; - } - } - - private function getEventFromTypeDeclaration(ContainerBuilder $container, string $id, string $method): string - { - if ( - null === ($class = $container->getDefinition($id)->getClass()) - || !($r = $container->getReflectionClass($class, false)) - || !$r->hasMethod($method) - || 1 > ($m = $r->getMethod($method))->getNumberOfParameters() - || !($type = $m->getParameters()[0]->getType()) instanceof \ReflectionNamedType - || $type->isBuiltin() - || Event::class === ($name = $type->getName()) - ) { - throw new InvalidArgumentException(sprintf('Service "%s" must define the "event" attribute on "%s" tags.', $id, $this->listenerTag)); - } - - return $name; - } -} - -/** - * @internal - */ -class ExtractingEventDispatcher extends EventDispatcher implements EventSubscriberInterface -{ - public $listeners = []; - - public static $aliases = []; - public static $subscriber; - - public function addListener(string $eventName, $listener, int $priority = 0) - { - $this->listeners[] = [$eventName, $listener[1], $priority]; - } - - public static function getSubscribedEvents(): array - { - $events = []; - - foreach ([self::$subscriber, 'getSubscribedEvents']() as $eventName => $params) { - $events[self::$aliases[$eventName] ?? $eventName] = $params; - } - - return $events; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/event-dispatcher/EventDispatcher.php b/tools/php-cs-fixer/vendor/symfony/event-dispatcher/EventDispatcher.php deleted file mode 100644 index c479a75..0000000 --- a/tools/php-cs-fixer/vendor/symfony/event-dispatcher/EventDispatcher.php +++ /dev/null @@ -1,280 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\EventDispatcher; - -use Psr\EventDispatcher\StoppableEventInterface; -use Symfony\Component\EventDispatcher\Debug\WrappedListener; - -/** - * The EventDispatcherInterface is the central point of Symfony's event listener system. - * - * Listeners are registered on the manager and events are dispatched through the - * manager. - * - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author Bernhard Schussek - * @author Fabien Potencier - * @author Jordi Boggiano - * @author Jordan Alliot - * @author Nicolas Grekas - */ -class EventDispatcher implements EventDispatcherInterface -{ - private $listeners = []; - private $sorted = []; - private $optimized; - - public function __construct() - { - if (__CLASS__ === static::class) { - $this->optimized = []; - } - } - - /** - * {@inheritdoc} - */ - public function dispatch(object $event, string $eventName = null): object - { - $eventName = $eventName ?? \get_class($event); - - if (null !== $this->optimized) { - $listeners = $this->optimized[$eventName] ?? (empty($this->listeners[$eventName]) ? [] : $this->optimizeListeners($eventName)); - } else { - $listeners = $this->getListeners($eventName); - } - - if ($listeners) { - $this->callListeners($listeners, $eventName, $event); - } - - return $event; - } - - /** - * {@inheritdoc} - */ - public function getListeners(string $eventName = null) - { - if (null !== $eventName) { - if (empty($this->listeners[$eventName])) { - return []; - } - - if (!isset($this->sorted[$eventName])) { - $this->sortListeners($eventName); - } - - return $this->sorted[$eventName]; - } - - foreach ($this->listeners as $eventName => $eventListeners) { - if (!isset($this->sorted[$eventName])) { - $this->sortListeners($eventName); - } - } - - return array_filter($this->sorted); - } - - /** - * {@inheritdoc} - */ - public function getListenerPriority(string $eventName, $listener) - { - if (empty($this->listeners[$eventName])) { - return null; - } - - if (\is_array($listener) && isset($listener[0]) && $listener[0] instanceof \Closure && 2 >= \count($listener)) { - $listener[0] = $listener[0](); - $listener[1] = $listener[1] ?? '__invoke'; - } - - foreach ($this->listeners[$eventName] as $priority => &$listeners) { - foreach ($listeners as &$v) { - if ($v !== $listener && \is_array($v) && isset($v[0]) && $v[0] instanceof \Closure && 2 >= \count($v)) { - $v[0] = $v[0](); - $v[1] = $v[1] ?? '__invoke'; - } - if ($v === $listener) { - return $priority; - } - } - } - - return null; - } - - /** - * {@inheritdoc} - */ - public function hasListeners(string $eventName = null) - { - if (null !== $eventName) { - return !empty($this->listeners[$eventName]); - } - - foreach ($this->listeners as $eventListeners) { - if ($eventListeners) { - return true; - } - } - - return false; - } - - /** - * {@inheritdoc} - */ - public function addListener(string $eventName, $listener, int $priority = 0) - { - $this->listeners[$eventName][$priority][] = $listener; - unset($this->sorted[$eventName], $this->optimized[$eventName]); - } - - /** - * {@inheritdoc} - */ - public function removeListener(string $eventName, $listener) - { - if (empty($this->listeners[$eventName])) { - return; - } - - if (\is_array($listener) && isset($listener[0]) && $listener[0] instanceof \Closure && 2 >= \count($listener)) { - $listener[0] = $listener[0](); - $listener[1] = $listener[1] ?? '__invoke'; - } - - foreach ($this->listeners[$eventName] as $priority => &$listeners) { - foreach ($listeners as $k => &$v) { - if ($v !== $listener && \is_array($v) && isset($v[0]) && $v[0] instanceof \Closure && 2 >= \count($v)) { - $v[0] = $v[0](); - $v[1] = $v[1] ?? '__invoke'; - } - if ($v === $listener) { - unset($listeners[$k], $this->sorted[$eventName], $this->optimized[$eventName]); - } - } - - if (!$listeners) { - unset($this->listeners[$eventName][$priority]); - } - } - } - - /** - * {@inheritdoc} - */ - public function addSubscriber(EventSubscriberInterface $subscriber) - { - foreach ($subscriber->getSubscribedEvents() as $eventName => $params) { - if (\is_string($params)) { - $this->addListener($eventName, [$subscriber, $params]); - } elseif (\is_string($params[0])) { - $this->addListener($eventName, [$subscriber, $params[0]], $params[1] ?? 0); - } else { - foreach ($params as $listener) { - $this->addListener($eventName, [$subscriber, $listener[0]], $listener[1] ?? 0); - } - } - } - } - - /** - * {@inheritdoc} - */ - public function removeSubscriber(EventSubscriberInterface $subscriber) - { - foreach ($subscriber->getSubscribedEvents() as $eventName => $params) { - if (\is_array($params) && \is_array($params[0])) { - foreach ($params as $listener) { - $this->removeListener($eventName, [$subscriber, $listener[0]]); - } - } else { - $this->removeListener($eventName, [$subscriber, \is_string($params) ? $params : $params[0]]); - } - } - } - - /** - * Triggers the listeners of an event. - * - * This method can be overridden to add functionality that is executed - * for each listener. - * - * @param callable[] $listeners The event listeners - * @param string $eventName The name of the event to dispatch - * @param object $event The event object to pass to the event handlers/listeners - */ - protected function callListeners(iterable $listeners, string $eventName, object $event) - { - $stoppable = $event instanceof StoppableEventInterface; - - foreach ($listeners as $listener) { - if ($stoppable && $event->isPropagationStopped()) { - break; - } - $listener($event, $eventName, $this); - } - } - - /** - * Sorts the internal list of listeners for the given event by priority. - */ - private function sortListeners(string $eventName) - { - krsort($this->listeners[$eventName]); - $this->sorted[$eventName] = []; - - foreach ($this->listeners[$eventName] as &$listeners) { - foreach ($listeners as $k => &$listener) { - if (\is_array($listener) && isset($listener[0]) && $listener[0] instanceof \Closure && 2 >= \count($listener)) { - $listener[0] = $listener[0](); - $listener[1] = $listener[1] ?? '__invoke'; - } - $this->sorted[$eventName][] = $listener; - } - } - } - - /** - * Optimizes the internal list of listeners for the given event by priority. - */ - private function optimizeListeners(string $eventName): array - { - krsort($this->listeners[$eventName]); - $this->optimized[$eventName] = []; - - foreach ($this->listeners[$eventName] as &$listeners) { - foreach ($listeners as &$listener) { - $closure = &$this->optimized[$eventName][]; - if (\is_array($listener) && isset($listener[0]) && $listener[0] instanceof \Closure && 2 >= \count($listener)) { - $closure = static function (...$args) use (&$listener, &$closure) { - if ($listener[0] instanceof \Closure) { - $listener[0] = $listener[0](); - $listener[1] = $listener[1] ?? '__invoke'; - } - ($closure = \Closure::fromCallable($listener))(...$args); - }; - } else { - $closure = $listener instanceof \Closure || $listener instanceof WrappedListener ? $listener : \Closure::fromCallable($listener); - } - } - } - - return $this->optimized[$eventName]; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/event-dispatcher/EventDispatcherInterface.php b/tools/php-cs-fixer/vendor/symfony/event-dispatcher/EventDispatcherInterface.php deleted file mode 100644 index 9251e02..0000000 --- a/tools/php-cs-fixer/vendor/symfony/event-dispatcher/EventDispatcherInterface.php +++ /dev/null @@ -1,70 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\EventDispatcher; - -use Symfony\Contracts\EventDispatcher\EventDispatcherInterface as ContractsEventDispatcherInterface; - -/** - * The EventDispatcherInterface is the central point of Symfony's event listener system. - * Listeners are registered on the manager and events are dispatched through the - * manager. - * - * @author Bernhard Schussek - */ -interface EventDispatcherInterface extends ContractsEventDispatcherInterface -{ - /** - * Adds an event listener that listens on the specified events. - * - * @param int $priority The higher this value, the earlier an event - * listener will be triggered in the chain (defaults to 0) - */ - public function addListener(string $eventName, callable $listener, int $priority = 0); - - /** - * Adds an event subscriber. - * - * The subscriber is asked for all the events it is - * interested in and added as a listener for these events. - */ - public function addSubscriber(EventSubscriberInterface $subscriber); - - /** - * Removes an event listener from the specified events. - */ - public function removeListener(string $eventName, callable $listener); - - public function removeSubscriber(EventSubscriberInterface $subscriber); - - /** - * Gets the listeners of a specific event or all listeners sorted by descending priority. - * - * @return array The event listeners for the specified event, or all event listeners by event name - */ - public function getListeners(string $eventName = null); - - /** - * Gets the listener priority for a specific event. - * - * Returns null if the event or the listener does not exist. - * - * @return int|null The event listener priority - */ - public function getListenerPriority(string $eventName, callable $listener); - - /** - * Checks whether an event has any registered listeners. - * - * @return bool true if the specified event has any listeners, false otherwise - */ - public function hasListeners(string $eventName = null); -} diff --git a/tools/php-cs-fixer/vendor/symfony/event-dispatcher/EventSubscriberInterface.php b/tools/php-cs-fixer/vendor/symfony/event-dispatcher/EventSubscriberInterface.php deleted file mode 100644 index a0fc96d..0000000 --- a/tools/php-cs-fixer/vendor/symfony/event-dispatcher/EventSubscriberInterface.php +++ /dev/null @@ -1,49 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\EventDispatcher; - -/** - * An EventSubscriber knows itself what events it is interested in. - * If an EventSubscriber is added to an EventDispatcherInterface, the manager invokes - * {@link getSubscribedEvents} and registers the subscriber as a listener for all - * returned events. - * - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author Bernhard Schussek - */ -interface EventSubscriberInterface -{ - /** - * Returns an array of event names this subscriber wants to listen to. - * - * The array keys are event names and the value can be: - * - * * The method name to call (priority defaults to 0) - * * An array composed of the method name to call and the priority - * * An array of arrays composed of the method names to call and respective - * priorities, or 0 if unset - * - * For instance: - * - * * ['eventName' => 'methodName'] - * * ['eventName' => ['methodName', $priority]] - * * ['eventName' => [['methodName1', $priority], ['methodName2']]] - * - * The code must not depend on runtime state as it will only be called at compile time. - * All logic depending on runtime state must be put into the individual methods handling the events. - * - * @return array The event names to listen to - */ - public static function getSubscribedEvents(); -} diff --git a/tools/php-cs-fixer/vendor/symfony/event-dispatcher/GenericEvent.php b/tools/php-cs-fixer/vendor/symfony/event-dispatcher/GenericEvent.php deleted file mode 100644 index 691ab36..0000000 --- a/tools/php-cs-fixer/vendor/symfony/event-dispatcher/GenericEvent.php +++ /dev/null @@ -1,179 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\EventDispatcher; - -use Symfony\Contracts\EventDispatcher\Event; - -/** - * Event encapsulation class. - * - * Encapsulates events thus decoupling the observer from the subject they encapsulate. - * - * @author Drak - */ -class GenericEvent extends Event implements \ArrayAccess, \IteratorAggregate -{ - protected $subject; - protected $arguments; - - /** - * Encapsulate an event with $subject and $args. - * - * @param mixed $subject The subject of the event, usually an object or a callable - * @param array $arguments Arguments to store in the event - */ - public function __construct($subject = null, array $arguments = []) - { - $this->subject = $subject; - $this->arguments = $arguments; - } - - /** - * Getter for subject property. - * - * @return mixed The observer subject - */ - public function getSubject() - { - return $this->subject; - } - - /** - * Get argument by key. - * - * @return mixed Contents of array key - * - * @throws \InvalidArgumentException if key is not found - */ - public function getArgument(string $key) - { - if ($this->hasArgument($key)) { - return $this->arguments[$key]; - } - - throw new \InvalidArgumentException(sprintf('Argument "%s" not found.', $key)); - } - - /** - * Add argument to event. - * - * @param mixed $value Value - * - * @return $this - */ - public function setArgument(string $key, $value) - { - $this->arguments[$key] = $value; - - return $this; - } - - /** - * Getter for all arguments. - * - * @return array - */ - public function getArguments() - { - return $this->arguments; - } - - /** - * Set args property. - * - * @return $this - */ - public function setArguments(array $args = []) - { - $this->arguments = $args; - - return $this; - } - - /** - * Has argument. - * - * @return bool - */ - public function hasArgument(string $key) - { - return \array_key_exists($key, $this->arguments); - } - - /** - * ArrayAccess for argument getter. - * - * @param string $key Array key - * - * @return mixed - * - * @throws \InvalidArgumentException if key does not exist in $this->args - */ - #[\ReturnTypeWillChange] - public function offsetGet($key) - { - return $this->getArgument($key); - } - - /** - * ArrayAccess for argument setter. - * - * @param string $key Array key to set - * @param mixed $value Value - * - * @return void - */ - #[\ReturnTypeWillChange] - public function offsetSet($key, $value) - { - $this->setArgument($key, $value); - } - - /** - * ArrayAccess for unset argument. - * - * @param string $key Array key - * - * @return void - */ - #[\ReturnTypeWillChange] - public function offsetUnset($key) - { - if ($this->hasArgument($key)) { - unset($this->arguments[$key]); - } - } - - /** - * ArrayAccess has argument. - * - * @param string $key Array key - * - * @return bool - */ - #[\ReturnTypeWillChange] - public function offsetExists($key) - { - return $this->hasArgument($key); - } - - /** - * IteratorAggregate for iterating over the object like an array. - * - * @return \ArrayIterator - */ - #[\ReturnTypeWillChange] - public function getIterator() - { - return new \ArrayIterator($this->arguments); - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/event-dispatcher/ImmutableEventDispatcher.php b/tools/php-cs-fixer/vendor/symfony/event-dispatcher/ImmutableEventDispatcher.php deleted file mode 100644 index 568d79c..0000000 --- a/tools/php-cs-fixer/vendor/symfony/event-dispatcher/ImmutableEventDispatcher.php +++ /dev/null @@ -1,91 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\EventDispatcher; - -/** - * A read-only proxy for an event dispatcher. - * - * @author Bernhard Schussek - */ -class ImmutableEventDispatcher implements EventDispatcherInterface -{ - private $dispatcher; - - public function __construct(EventDispatcherInterface $dispatcher) - { - $this->dispatcher = $dispatcher; - } - - /** - * {@inheritdoc} - */ - public function dispatch(object $event, string $eventName = null): object - { - return $this->dispatcher->dispatch($event, $eventName); - } - - /** - * {@inheritdoc} - */ - public function addListener(string $eventName, $listener, int $priority = 0) - { - throw new \BadMethodCallException('Unmodifiable event dispatchers must not be modified.'); - } - - /** - * {@inheritdoc} - */ - public function addSubscriber(EventSubscriberInterface $subscriber) - { - throw new \BadMethodCallException('Unmodifiable event dispatchers must not be modified.'); - } - - /** - * {@inheritdoc} - */ - public function removeListener(string $eventName, $listener) - { - throw new \BadMethodCallException('Unmodifiable event dispatchers must not be modified.'); - } - - /** - * {@inheritdoc} - */ - public function removeSubscriber(EventSubscriberInterface $subscriber) - { - throw new \BadMethodCallException('Unmodifiable event dispatchers must not be modified.'); - } - - /** - * {@inheritdoc} - */ - public function getListeners(string $eventName = null) - { - return $this->dispatcher->getListeners($eventName); - } - - /** - * {@inheritdoc} - */ - public function getListenerPriority(string $eventName, $listener) - { - return $this->dispatcher->getListenerPriority($eventName, $listener); - } - - /** - * {@inheritdoc} - */ - public function hasListeners(string $eventName = null) - { - return $this->dispatcher->hasListeners($eventName); - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/event-dispatcher/LICENSE b/tools/php-cs-fixer/vendor/symfony/event-dispatcher/LICENSE deleted file mode 100644 index 9ff2d0d..0000000 --- a/tools/php-cs-fixer/vendor/symfony/event-dispatcher/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2004-2021 Fabien Potencier - -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/tools/php-cs-fixer/vendor/symfony/event-dispatcher/LegacyEventDispatcherProxy.php b/tools/php-cs-fixer/vendor/symfony/event-dispatcher/LegacyEventDispatcherProxy.php deleted file mode 100644 index 6e17c8f..0000000 --- a/tools/php-cs-fixer/vendor/symfony/event-dispatcher/LegacyEventDispatcherProxy.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\EventDispatcher; - -use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; - -trigger_deprecation('symfony/event-dispatcher', '5.1', '%s is deprecated, use the event dispatcher without the proxy.', LegacyEventDispatcherProxy::class); - -/** - * A helper class to provide BC/FC with the legacy signature of EventDispatcherInterface::dispatch(). - * - * @author Nicolas Grekas - * - * @deprecated since Symfony 5.1 - */ -final class LegacyEventDispatcherProxy -{ - public static function decorate(?EventDispatcherInterface $dispatcher): ?EventDispatcherInterface - { - return $dispatcher; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/event-dispatcher/README.md b/tools/php-cs-fixer/vendor/symfony/event-dispatcher/README.md deleted file mode 100644 index dcdb68d..0000000 --- a/tools/php-cs-fixer/vendor/symfony/event-dispatcher/README.md +++ /dev/null @@ -1,15 +0,0 @@ -EventDispatcher Component -========================= - -The EventDispatcher component provides tools that allow your application -components to communicate with each other by dispatching events and listening to -them. - -Resources ---------- - - * [Documentation](https://symfony.com/doc/current/components/event_dispatcher.html) - * [Contributing](https://symfony.com/doc/current/contributing/index.html) - * [Report issues](https://github.com/symfony/symfony/issues) and - [send Pull Requests](https://github.com/symfony/symfony/pulls) - in the [main Symfony repository](https://github.com/symfony/symfony) diff --git a/tools/php-cs-fixer/vendor/symfony/event-dispatcher/composer.json b/tools/php-cs-fixer/vendor/symfony/event-dispatcher/composer.json deleted file mode 100644 index 72a712a..0000000 --- a/tools/php-cs-fixer/vendor/symfony/event-dispatcher/composer.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "name": "symfony/event-dispatcher", - "type": "library", - "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", - "keywords": [], - "homepage": "https://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/event-dispatcher-contracts": "^2", - "symfony/polyfill-php80": "^1.16" - }, - "require-dev": { - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/expression-language": "^4.4|^5.0", - "symfony/config": "^4.4|^5.0", - "symfony/error-handler": "^4.4|^5.0", - "symfony/http-foundation": "^4.4|^5.0", - "symfony/service-contracts": "^1.1|^2", - "symfony/stopwatch": "^4.4|^5.0", - "psr/log": "^1|^2|^3" - }, - "conflict": { - "symfony/dependency-injection": "<4.4" - }, - "provide": { - "psr/event-dispatcher-implementation": "1.0", - "symfony/event-dispatcher-implementation": "2.0" - }, - "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" - }, - "autoload": { - "psr-4": { "Symfony\\Component\\EventDispatcher\\": "" }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "minimum-stability": "dev" -} diff --git a/tools/php-cs-fixer/vendor/symfony/filesystem/CHANGELOG.md b/tools/php-cs-fixer/vendor/symfony/filesystem/CHANGELOG.md deleted file mode 100644 index 4a0755b..0000000 --- a/tools/php-cs-fixer/vendor/symfony/filesystem/CHANGELOG.md +++ /dev/null @@ -1,76 +0,0 @@ -CHANGELOG -========= - -5.0.0 ------ - - * `Filesystem::dumpFile()` and `appendToFile()` don't accept arrays anymore - -4.4.0 ------ - - * support for passing a `null` value to `Filesystem::isAbsolutePath()` is deprecated and will be removed in 5.0 - * `tempnam()` now accepts a third argument `$suffix`. - -4.3.0 ------ - - * support for passing arrays to `Filesystem::dumpFile()` is deprecated and will be removed in 5.0 - * support for passing arrays to `Filesystem::appendToFile()` is deprecated and will be removed in 5.0 - -4.0.0 ------ - - * removed `LockHandler` - * Support for passing relative paths to `Filesystem::makePathRelative()` has been removed. - -3.4.0 ------ - - * support for passing relative paths to `Filesystem::makePathRelative()` is deprecated and will be removed in 4.0 - -3.3.0 ------ - - * added `appendToFile()` to append contents to existing files - -3.2.0 ------ - - * added `readlink()` as a platform independent method to read links - -3.0.0 ------ - - * removed `$mode` argument from `Filesystem::dumpFile()` - -2.8.0 ------ - - * added tempnam() a stream aware version of PHP's native tempnam() - -2.6.0 ------ - - * added LockHandler - -2.3.12 ------- - - * deprecated dumpFile() file mode argument. - -2.3.0 ------ - - * added the dumpFile() method to atomically write files - -2.2.0 ------ - - * added a delete option for the mirror() method - -2.1.0 ------ - - * 24eb396 : BC Break : mkdir() function now throws exception in case of failure instead of returning Boolean value - * created the component diff --git a/tools/php-cs-fixer/vendor/symfony/filesystem/Exception/ExceptionInterface.php b/tools/php-cs-fixer/vendor/symfony/filesystem/Exception/ExceptionInterface.php deleted file mode 100644 index fc438d9..0000000 --- a/tools/php-cs-fixer/vendor/symfony/filesystem/Exception/ExceptionInterface.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Filesystem\Exception; - -/** - * Exception interface for all exceptions thrown by the component. - * - * @author Romain Neutron - */ -interface ExceptionInterface extends \Throwable -{ -} diff --git a/tools/php-cs-fixer/vendor/symfony/filesystem/Exception/FileNotFoundException.php b/tools/php-cs-fixer/vendor/symfony/filesystem/Exception/FileNotFoundException.php deleted file mode 100644 index 48b6408..0000000 --- a/tools/php-cs-fixer/vendor/symfony/filesystem/Exception/FileNotFoundException.php +++ /dev/null @@ -1,34 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Filesystem\Exception; - -/** - * Exception class thrown when a file couldn't be found. - * - * @author Fabien Potencier - * @author Christian Gärtner - */ -class FileNotFoundException extends IOException -{ - public function __construct(string $message = null, int $code = 0, \Throwable $previous = null, string $path = null) - { - if (null === $message) { - if (null === $path) { - $message = 'File could not be found.'; - } else { - $message = sprintf('File "%s" could not be found.', $path); - } - } - - parent::__construct($message, $code, $previous, $path); - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/filesystem/Exception/IOException.php b/tools/php-cs-fixer/vendor/symfony/filesystem/Exception/IOException.php deleted file mode 100644 index fea26e4..0000000 --- a/tools/php-cs-fixer/vendor/symfony/filesystem/Exception/IOException.php +++ /dev/null @@ -1,39 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Filesystem\Exception; - -/** - * Exception class thrown when a filesystem operation failure happens. - * - * @author Romain Neutron - * @author Christian Gärtner - * @author Fabien Potencier - */ -class IOException extends \RuntimeException implements IOExceptionInterface -{ - private $path; - - public function __construct(string $message, int $code = 0, \Throwable $previous = null, string $path = null) - { - $this->path = $path; - - parent::__construct($message, $code, $previous); - } - - /** - * {@inheritdoc} - */ - public function getPath() - { - return $this->path; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/filesystem/Exception/IOExceptionInterface.php b/tools/php-cs-fixer/vendor/symfony/filesystem/Exception/IOExceptionInterface.php deleted file mode 100644 index f9d4644..0000000 --- a/tools/php-cs-fixer/vendor/symfony/filesystem/Exception/IOExceptionInterface.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Filesystem\Exception; - -/** - * IOException interface for file and input/output stream related exceptions thrown by the component. - * - * @author Christian Gärtner - */ -interface IOExceptionInterface extends ExceptionInterface -{ - /** - * Returns the associated path for the exception. - * - * @return string|null The path - */ - public function getPath(); -} diff --git a/tools/php-cs-fixer/vendor/symfony/filesystem/Exception/InvalidArgumentException.php b/tools/php-cs-fixer/vendor/symfony/filesystem/Exception/InvalidArgumentException.php deleted file mode 100644 index abadc20..0000000 --- a/tools/php-cs-fixer/vendor/symfony/filesystem/Exception/InvalidArgumentException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Filesystem\Exception; - -/** - * @author Christian Flothmann - */ -class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface -{ -} diff --git a/tools/php-cs-fixer/vendor/symfony/filesystem/Filesystem.php b/tools/php-cs-fixer/vendor/symfony/filesystem/Filesystem.php deleted file mode 100644 index 4e70c32..0000000 --- a/tools/php-cs-fixer/vendor/symfony/filesystem/Filesystem.php +++ /dev/null @@ -1,758 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Filesystem; - -use Symfony\Component\Filesystem\Exception\FileNotFoundException; -use Symfony\Component\Filesystem\Exception\InvalidArgumentException; -use Symfony\Component\Filesystem\Exception\IOException; - -/** - * Provides basic utility to manipulate the file system. - * - * @author Fabien Potencier - */ -class Filesystem -{ - private static $lastError; - - /** - * Copies a file. - * - * If the target file is older than the origin file, it's always overwritten. - * If the target file is newer, it is overwritten only when the - * $overwriteNewerFiles option is set to true. - * - * @throws FileNotFoundException When originFile doesn't exist - * @throws IOException When copy fails - */ - public function copy(string $originFile, string $targetFile, bool $overwriteNewerFiles = false) - { - $originIsLocal = stream_is_local($originFile) || 0 === stripos($originFile, 'file://'); - if ($originIsLocal && !is_file($originFile)) { - throw new FileNotFoundException(sprintf('Failed to copy "%s" because file does not exist.', $originFile), 0, null, $originFile); - } - - $this->mkdir(\dirname($targetFile)); - - $doCopy = true; - if (!$overwriteNewerFiles && null === parse_url($originFile, \PHP_URL_HOST) && is_file($targetFile)) { - $doCopy = filemtime($originFile) > filemtime($targetFile); - } - - if ($doCopy) { - // https://bugs.php.net/64634 - if (!$source = self::box('fopen', $originFile, 'r')) { - throw new IOException(sprintf('Failed to copy "%s" to "%s" because source file could not be opened for reading: ', $originFile, $targetFile).self::$lastError, 0, null, $originFile); - } - - // Stream context created to allow files overwrite when using FTP stream wrapper - disabled by default - if (!$target = self::box('fopen', $targetFile, 'w', false, stream_context_create(['ftp' => ['overwrite' => true]]))) { - throw new IOException(sprintf('Failed to copy "%s" to "%s" because target file could not be opened for writing: ', $originFile, $targetFile).self::$lastError, 0, null, $originFile); - } - - $bytesCopied = stream_copy_to_stream($source, $target); - fclose($source); - fclose($target); - unset($source, $target); - - if (!is_file($targetFile)) { - throw new IOException(sprintf('Failed to copy "%s" to "%s".', $originFile, $targetFile), 0, null, $originFile); - } - - if ($originIsLocal) { - // Like `cp`, preserve executable permission bits - self::box('chmod', $targetFile, fileperms($targetFile) | (fileperms($originFile) & 0111)); - - if ($bytesCopied !== $bytesOrigin = filesize($originFile)) { - throw new IOException(sprintf('Failed to copy the whole content of "%s" to "%s" (%g of %g bytes copied).', $originFile, $targetFile, $bytesCopied, $bytesOrigin), 0, null, $originFile); - } - } - } - } - - /** - * Creates a directory recursively. - * - * @param string|iterable $dirs The directory path - * - * @throws IOException On any directory creation failure - */ - public function mkdir($dirs, int $mode = 0777) - { - foreach ($this->toIterable($dirs) as $dir) { - if (is_dir($dir)) { - continue; - } - - if (!self::box('mkdir', $dir, $mode, true) && !is_dir($dir)) { - throw new IOException(sprintf('Failed to create "%s": ', $dir).self::$lastError, 0, null, $dir); - } - } - } - - /** - * Checks the existence of files or directories. - * - * @param string|iterable $files A filename, an array of files, or a \Traversable instance to check - * - * @return bool true if the file exists, false otherwise - */ - public function exists($files) - { - $maxPathLength = \PHP_MAXPATHLEN - 2; - - foreach ($this->toIterable($files) as $file) { - if (\strlen($file) > $maxPathLength) { - throw new IOException(sprintf('Could not check if file exist because path length exceeds %d characters.', $maxPathLength), 0, null, $file); - } - - if (!file_exists($file)) { - return false; - } - } - - return true; - } - - /** - * Sets access and modification time of file. - * - * @param string|iterable $files A filename, an array of files, or a \Traversable instance to create - * @param int|null $time The touch time as a Unix timestamp, if not supplied the current system time is used - * @param int|null $atime The access time as a Unix timestamp, if not supplied the current system time is used - * - * @throws IOException When touch fails - */ - public function touch($files, int $time = null, int $atime = null) - { - foreach ($this->toIterable($files) as $file) { - if (!($time ? self::box('touch', $file, $time, $atime) : self::box('touch', $file))) { - throw new IOException(sprintf('Failed to touch "%s": ', $file).self::$lastError, 0, null, $file); - } - } - } - - /** - * Removes files or directories. - * - * @param string|iterable $files A filename, an array of files, or a \Traversable instance to remove - * - * @throws IOException When removal fails - */ - public function remove($files) - { - if ($files instanceof \Traversable) { - $files = iterator_to_array($files, false); - } elseif (!\is_array($files)) { - $files = [$files]; - } - - self::doRemove($files, false); - } - - private static function doRemove(array $files, bool $isRecursive): void - { - $files = array_reverse($files); - foreach ($files as $file) { - if (is_link($file)) { - // See https://bugs.php.net/52176 - if (!(self::box('unlink', $file) || '\\' !== \DIRECTORY_SEPARATOR || self::box('rmdir', $file)) && file_exists($file)) { - throw new IOException(sprintf('Failed to remove symlink "%s": ', $file).self::$lastError); - } - } elseif (is_dir($file)) { - if (!$isRecursive) { - $tmpName = \dirname(realpath($file)).'/.'.strrev(strtr(base64_encode(random_bytes(2)), '/=', '-.')); - - if (file_exists($tmpName)) { - try { - self::doRemove([$tmpName], true); - } catch (IOException $e) { - } - } - - if (!file_exists($tmpName) && self::box('rename', $file, $tmpName)) { - $origFile = $file; - $file = $tmpName; - } else { - $origFile = null; - } - } - - $files = new \FilesystemIterator($file, \FilesystemIterator::CURRENT_AS_PATHNAME | \FilesystemIterator::SKIP_DOTS); - self::doRemove(iterator_to_array($files, true), true); - - if (!self::box('rmdir', $file) && file_exists($file) && !$isRecursive) { - $lastError = self::$lastError; - - if (null !== $origFile && self::box('rename', $file, $origFile)) { - $file = $origFile; - } - - throw new IOException(sprintf('Failed to remove directory "%s": ', $file).$lastError); - } - } elseif (!self::box('unlink', $file) && (str_contains(self::$lastError, 'Permission denied') || file_exists($file))) { - throw new IOException(sprintf('Failed to remove file "%s": ', $file).self::$lastError); - } - } - } - - /** - * Change mode for an array of files or directories. - * - * @param string|iterable $files A filename, an array of files, or a \Traversable instance to change mode - * @param int $mode The new mode (octal) - * @param int $umask The mode mask (octal) - * @param bool $recursive Whether change the mod recursively or not - * - * @throws IOException When the change fails - */ - public function chmod($files, int $mode, int $umask = 0000, bool $recursive = false) - { - foreach ($this->toIterable($files) as $file) { - if ((\PHP_VERSION_ID < 80000 || \is_int($mode)) && !self::box('chmod', $file, $mode & ~$umask)) { - throw new IOException(sprintf('Failed to chmod file "%s": ', $file).self::$lastError, 0, null, $file); - } - if ($recursive && is_dir($file) && !is_link($file)) { - $this->chmod(new \FilesystemIterator($file), $mode, $umask, true); - } - } - } - - /** - * Change the owner of an array of files or directories. - * - * @param string|iterable $files A filename, an array of files, or a \Traversable instance to change owner - * @param string|int $user A user name or number - * @param bool $recursive Whether change the owner recursively or not - * - * @throws IOException When the change fails - */ - public function chown($files, $user, bool $recursive = false) - { - foreach ($this->toIterable($files) as $file) { - if ($recursive && is_dir($file) && !is_link($file)) { - $this->chown(new \FilesystemIterator($file), $user, true); - } - if (is_link($file) && \function_exists('lchown')) { - if (!self::box('lchown', $file, $user)) { - throw new IOException(sprintf('Failed to chown file "%s": ', $file).self::$lastError, 0, null, $file); - } - } else { - if (!self::box('chown', $file, $user)) { - throw new IOException(sprintf('Failed to chown file "%s": ', $file).self::$lastError, 0, null, $file); - } - } - } - } - - /** - * Change the group of an array of files or directories. - * - * @param string|iterable $files A filename, an array of files, or a \Traversable instance to change group - * @param string|int $group A group name or number - * @param bool $recursive Whether change the group recursively or not - * - * @throws IOException When the change fails - */ - public function chgrp($files, $group, bool $recursive = false) - { - foreach ($this->toIterable($files) as $file) { - if ($recursive && is_dir($file) && !is_link($file)) { - $this->chgrp(new \FilesystemIterator($file), $group, true); - } - if (is_link($file) && \function_exists('lchgrp')) { - if (!self::box('lchgrp', $file, $group)) { - throw new IOException(sprintf('Failed to chgrp file "%s": ', $file).self::$lastError, 0, null, $file); - } - } else { - if (!self::box('chgrp', $file, $group)) { - throw new IOException(sprintf('Failed to chgrp file "%s": ', $file).self::$lastError, 0, null, $file); - } - } - } - } - - /** - * Renames a file or a directory. - * - * @throws IOException When target file or directory already exists - * @throws IOException When origin cannot be renamed - */ - public function rename(string $origin, string $target, bool $overwrite = false) - { - // we check that target does not exist - if (!$overwrite && $this->isReadable($target)) { - throw new IOException(sprintf('Cannot rename because the target "%s" already exists.', $target), 0, null, $target); - } - - if (!self::box('rename', $origin, $target)) { - if (is_dir($origin)) { - // See https://bugs.php.net/54097 & https://php.net/rename#113943 - $this->mirror($origin, $target, null, ['override' => $overwrite, 'delete' => $overwrite]); - $this->remove($origin); - - return; - } - throw new IOException(sprintf('Cannot rename "%s" to "%s": ', $origin, $target).self::$lastError, 0, null, $target); - } - } - - /** - * Tells whether a file exists and is readable. - * - * @throws IOException When windows path is longer than 258 characters - */ - private function isReadable(string $filename): bool - { - $maxPathLength = \PHP_MAXPATHLEN - 2; - - if (\strlen($filename) > $maxPathLength) { - throw new IOException(sprintf('Could not check if file is readable because path length exceeds %d characters.', $maxPathLength), 0, null, $filename); - } - - return is_readable($filename); - } - - /** - * Creates a symbolic link or copy a directory. - * - * @throws IOException When symlink fails - */ - public function symlink(string $originDir, string $targetDir, bool $copyOnWindows = false) - { - if ('\\' === \DIRECTORY_SEPARATOR) { - $originDir = strtr($originDir, '/', '\\'); - $targetDir = strtr($targetDir, '/', '\\'); - - if ($copyOnWindows) { - $this->mirror($originDir, $targetDir); - - return; - } - } - - $this->mkdir(\dirname($targetDir)); - - if (is_link($targetDir)) { - if (readlink($targetDir) === $originDir) { - return; - } - $this->remove($targetDir); - } - - if (!self::box('symlink', $originDir, $targetDir)) { - $this->linkException($originDir, $targetDir, 'symbolic'); - } - } - - /** - * Creates a hard link, or several hard links to a file. - * - * @param string|string[] $targetFiles The target file(s) - * - * @throws FileNotFoundException When original file is missing or not a file - * @throws IOException When link fails, including if link already exists - */ - public function hardlink(string $originFile, $targetFiles) - { - if (!$this->exists($originFile)) { - throw new FileNotFoundException(null, 0, null, $originFile); - } - - if (!is_file($originFile)) { - throw new FileNotFoundException(sprintf('Origin file "%s" is not a file.', $originFile)); - } - - foreach ($this->toIterable($targetFiles) as $targetFile) { - if (is_file($targetFile)) { - if (fileinode($originFile) === fileinode($targetFile)) { - continue; - } - $this->remove($targetFile); - } - - if (!self::box('link', $originFile, $targetFile)) { - $this->linkException($originFile, $targetFile, 'hard'); - } - } - } - - /** - * @param string $linkType Name of the link type, typically 'symbolic' or 'hard' - */ - private function linkException(string $origin, string $target, string $linkType) - { - if (self::$lastError) { - if ('\\' === \DIRECTORY_SEPARATOR && str_contains(self::$lastError, 'error code(1314)')) { - throw new IOException(sprintf('Unable to create "%s" link due to error code 1314: \'A required privilege is not held by the client\'. Do you have the required Administrator-rights?', $linkType), 0, null, $target); - } - } - throw new IOException(sprintf('Failed to create "%s" link from "%s" to "%s": ', $linkType, $origin, $target).self::$lastError, 0, null, $target); - } - - /** - * Resolves links in paths. - * - * With $canonicalize = false (default) - * - if $path does not exist or is not a link, returns null - * - if $path is a link, returns the next direct target of the link without considering the existence of the target - * - * With $canonicalize = true - * - if $path does not exist, returns null - * - if $path exists, returns its absolute fully resolved final version - * - * @return string|null - */ - public function readlink(string $path, bool $canonicalize = false) - { - if (!$canonicalize && !is_link($path)) { - return null; - } - - if ($canonicalize) { - if (!$this->exists($path)) { - return null; - } - - if ('\\' === \DIRECTORY_SEPARATOR && \PHP_VERSION_ID < 70410) { - $path = readlink($path); - } - - return realpath($path); - } - - if ('\\' === \DIRECTORY_SEPARATOR && \PHP_VERSION_ID < 70400) { - return realpath($path); - } - - return readlink($path); - } - - /** - * Given an existing path, convert it to a path relative to a given starting path. - * - * @return string Path of target relative to starting path - */ - public function makePathRelative(string $endPath, string $startPath) - { - if (!$this->isAbsolutePath($startPath)) { - throw new InvalidArgumentException(sprintf('The start path "%s" is not absolute.', $startPath)); - } - - if (!$this->isAbsolutePath($endPath)) { - throw new InvalidArgumentException(sprintf('The end path "%s" is not absolute.', $endPath)); - } - - // Normalize separators on Windows - if ('\\' === \DIRECTORY_SEPARATOR) { - $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]; - }; - - $splitPath = function ($path) { - $result = []; - - foreach (explode('/', trim($path, '/')) as $segment) { - if ('..' === $segment) { - array_pop($result); - } elseif ('.' !== $segment && '' !== $segment) { - $result[] = $segment; - } - } - - return $result; - }; - - [$endPath, $endDriveLetter] = $splitDriveLetter($endPath); - [$startPath, $startDriveLetter] = $splitDriveLetter($startPath); - - $startPathArr = $splitPath($startPath); - $endPathArr = $splitPath($endPath); - - if ($endDriveLetter && $startDriveLetter && $endDriveLetter != $startDriveLetter) { - // End path is on another drive, so no relative path exists - return $endDriveLetter.':/'.($endPathArr ? implode('/', $endPathArr).'/' : ''); - } - - // Find for which directory the common path stops - $index = 0; - while (isset($startPathArr[$index]) && isset($endPathArr[$index]) && $startPathArr[$index] === $endPathArr[$index]) { - ++$index; - } - - // Determine how deep the start path is relative to the common path (ie, "web/bundles" = 2 levels) - if (1 === \count($startPathArr) && '' === $startPathArr[0]) { - $depth = 0; - } else { - $depth = \count($startPathArr) - $index; - } - - // Repeated "../" for each level need to reach the common path - $traverser = str_repeat('../', $depth); - - $endPathRemainder = implode('/', \array_slice($endPathArr, $index)); - - // Construct $endPath from traversing to the common path, then to the remaining $endPath - $relativePath = $traverser.('' !== $endPathRemainder ? $endPathRemainder.'/' : ''); - - return '' === $relativePath ? './' : $relativePath; - } - - /** - * Mirrors a directory to another. - * - * Copies files and directories from the origin directory into the target directory. By default: - * - * - existing files in the target directory will be overwritten, except if they are newer (see the `override` option) - * - files in the target directory that do not exist in the source directory will not be deleted (see the `delete` option) - * - * @param \Traversable|null $iterator Iterator that filters which files and directories to copy, if null a recursive iterator is created - * @param array $options An array of boolean options - * Valid options are: - * - $options['override'] If true, target files newer than origin files are overwritten (see copy(), defaults to false) - * - $options['copy_on_windows'] Whether to copy files instead of links on Windows (see symlink(), defaults to false) - * - $options['delete'] Whether to delete files that are not in the source directory (defaults to false) - * - * @throws IOException When file type is unknown - */ - public function mirror(string $originDir, string $targetDir, \Traversable $iterator = null, array $options = []) - { - $targetDir = rtrim($targetDir, '/\\'); - $originDir = rtrim($originDir, '/\\'); - $originDirLen = \strlen($originDir); - - if (!$this->exists($originDir)) { - throw new IOException(sprintf('The origin directory specified "%s" was not found.', $originDir), 0, null, $originDir); - } - - // Iterate in destination folder to remove obsolete entries - if ($this->exists($targetDir) && isset($options['delete']) && $options['delete']) { - $deleteIterator = $iterator; - if (null === $deleteIterator) { - $flags = \FilesystemIterator::SKIP_DOTS; - $deleteIterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($targetDir, $flags), \RecursiveIteratorIterator::CHILD_FIRST); - } - $targetDirLen = \strlen($targetDir); - foreach ($deleteIterator as $file) { - $origin = $originDir.substr($file->getPathname(), $targetDirLen); - if (!$this->exists($origin)) { - $this->remove($file); - } - } - } - - $copyOnWindows = $options['copy_on_windows'] ?? false; - - if (null === $iterator) { - $flags = $copyOnWindows ? \FilesystemIterator::SKIP_DOTS | \FilesystemIterator::FOLLOW_SYMLINKS : \FilesystemIterator::SKIP_DOTS; - $iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($originDir, $flags), \RecursiveIteratorIterator::SELF_FIRST); - } - - $this->mkdir($targetDir); - $filesCreatedWhileMirroring = []; - - foreach ($iterator as $file) { - if ($file->getPathname() === $targetDir || $file->getRealPath() === $targetDir || isset($filesCreatedWhileMirroring[$file->getRealPath()])) { - continue; - } - - $target = $targetDir.substr($file->getPathname(), $originDirLen); - $filesCreatedWhileMirroring[$target] = true; - - if (!$copyOnWindows && is_link($file)) { - $this->symlink($file->getLinkTarget(), $target); - } elseif (is_dir($file)) { - $this->mkdir($target); - } elseif (is_file($file)) { - $this->copy($file, $target, $options['override'] ?? false); - } else { - throw new IOException(sprintf('Unable to guess "%s" file type.', $file), 0, null, $file); - } - } - } - - /** - * Returns whether the file path is an absolute path. - * - * @return bool - */ - public function isAbsolutePath(string $file) - { - return '' !== $file && (strspn($file, '/\\', 0, 1) - || (\strlen($file) > 3 && ctype_alpha($file[0]) - && ':' === $file[1] - && strspn($file, '/\\', 2, 1) - ) - || null !== parse_url($file, \PHP_URL_SCHEME) - ); - } - - /** - * Creates a temporary file with support for custom stream wrappers. - * - * @param string $prefix The prefix of the generated temporary filename - * Note: Windows uses only the first three characters of prefix - * @param string $suffix The suffix of the generated temporary filename - * - * @return string The new temporary filename (with path), or throw an exception on failure - */ - public function tempnam(string $dir, string $prefix/*, string $suffix = ''*/) - { - $suffix = \func_num_args() > 2 ? func_get_arg(2) : ''; - [$scheme, $hierarchy] = $this->getSchemeAndHierarchy($dir); - - // If no scheme or scheme is "file" or "gs" (Google Cloud) create temp file in local filesystem - if ((null === $scheme || 'file' === $scheme || 'gs' === $scheme) && '' === $suffix) { - // If tempnam failed or no scheme return the filename otherwise prepend the scheme - if ($tmpFile = self::box('tempnam', $hierarchy, $prefix)) { - if (null !== $scheme && 'gs' !== $scheme) { - return $scheme.'://'.$tmpFile; - } - - return $tmpFile; - } - - throw new IOException('A temporary file could not be created: '.self::$lastError); - } - - // Loop until we create a valid temp file or have reached 10 attempts - for ($i = 0; $i < 10; ++$i) { - // Create a unique filename - $tmpFile = $dir.'/'.$prefix.uniqid(mt_rand(), true).$suffix; - - // Use fopen instead of file_exists as some streams do not support stat - // Use mode 'x+' to atomically check existence and create to avoid a TOCTOU vulnerability - if (!$handle = self::box('fopen', $tmpFile, 'x+')) { - continue; - } - - // Close the file if it was successfully opened - self::box('fclose', $handle); - - return $tmpFile; - } - - throw new IOException('A temporary file could not be created: '.self::$lastError); - } - - /** - * Atomically dumps content into a file. - * - * @param string|resource $content The data to write into the file - * - * @throws IOException if the file cannot be written to - */ - public function dumpFile(string $filename, $content) - { - if (\is_array($content)) { - throw new \TypeError(sprintf('Argument 2 passed to "%s()" must be string or resource, array given.', __METHOD__)); - } - - $dir = \dirname($filename); - - if (!is_dir($dir)) { - $this->mkdir($dir); - } - - // Will create a temp file with 0600 access rights - // when the filesystem supports chmod. - $tmpFile = $this->tempnam($dir, basename($filename)); - - try { - if (false === self::box('file_put_contents', $tmpFile, $content)) { - throw new IOException(sprintf('Failed to write file "%s": ', $filename).self::$lastError, 0, null, $filename); - } - - self::box('chmod', $tmpFile, file_exists($filename) ? fileperms($filename) : 0666 & ~umask()); - - $this->rename($tmpFile, $filename, true); - } finally { - if (file_exists($tmpFile)) { - self::box('unlink', $tmpFile); - } - } - } - - /** - * Appends content to an existing file. - * - * @param string|resource $content The content to append - * - * @throws IOException If the file is not writable - */ - public function appendToFile(string $filename, $content) - { - if (\is_array($content)) { - throw new \TypeError(sprintf('Argument 2 passed to "%s()" must be string or resource, array given.', __METHOD__)); - } - - $dir = \dirname($filename); - - if (!is_dir($dir)) { - $this->mkdir($dir); - } - - if (false === self::box('file_put_contents', $filename, $content, \FILE_APPEND)) { - throw new IOException(sprintf('Failed to write file "%s": ', $filename).self::$lastError, 0, null, $filename); - } - } - - private function toIterable($files): iterable - { - return is_iterable($files) ? $files : [$files]; - } - - /** - * Gets a 2-tuple of scheme (may be null) and hierarchical part of a filename (e.g. file:///tmp -> [file, tmp]). - */ - private function getSchemeAndHierarchy(string $filename): array - { - $components = explode('://', $filename, 2); - - return 2 === \count($components) ? [$components[0], $components[1]] : [null, $components[0]]; - } - - /** - * @param mixed ...$args - * - * @return mixed - */ - private static function box(callable $func, ...$args) - { - self::$lastError = null; - set_error_handler(__CLASS__.'::handleError'); - try { - $result = $func(...$args); - restore_error_handler(); - - return $result; - } catch (\Throwable $e) { - } - restore_error_handler(); - - throw $e; - } - - /** - * @internal - */ - public static function handleError(int $type, string $msg) - { - self::$lastError = $msg; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/filesystem/LICENSE b/tools/php-cs-fixer/vendor/symfony/filesystem/LICENSE deleted file mode 100644 index 9ff2d0d..0000000 --- a/tools/php-cs-fixer/vendor/symfony/filesystem/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2004-2021 Fabien Potencier - -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/tools/php-cs-fixer/vendor/symfony/filesystem/README.md b/tools/php-cs-fixer/vendor/symfony/filesystem/README.md deleted file mode 100644 index f2f6d45..0000000 --- a/tools/php-cs-fixer/vendor/symfony/filesystem/README.md +++ /dev/null @@ -1,13 +0,0 @@ -Filesystem Component -==================== - -The Filesystem component provides basic utilities for the filesystem. - -Resources ---------- - - * [Documentation](https://symfony.com/doc/current/components/filesystem.html) - * [Contributing](https://symfony.com/doc/current/contributing/index.html) - * [Report issues](https://github.com/symfony/symfony/issues) and - [send Pull Requests](https://github.com/symfony/symfony/pulls) - in the [main Symfony repository](https://github.com/symfony/symfony) diff --git a/tools/php-cs-fixer/vendor/symfony/filesystem/composer.json b/tools/php-cs-fixer/vendor/symfony/filesystem/composer.json deleted file mode 100644 index a6c17a1..0000000 --- a/tools/php-cs-fixer/vendor/symfony/filesystem/composer.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "name": "symfony/filesystem", - "type": "library", - "description": "Provides basic utilities for the filesystem", - "keywords": [], - "homepage": "https://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-php80": "^1.16" - }, - "autoload": { - "psr-4": { "Symfony\\Component\\Filesystem\\": "" }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "minimum-stability": "dev" -} diff --git a/tools/php-cs-fixer/vendor/symfony/finder/CHANGELOG.md b/tools/php-cs-fixer/vendor/symfony/finder/CHANGELOG.md deleted file mode 100644 index 33f5bd5..0000000 --- a/tools/php-cs-fixer/vendor/symfony/finder/CHANGELOG.md +++ /dev/null @@ -1,79 +0,0 @@ -CHANGELOG -========= - -5.0.0 ------ - - * added `$useNaturalSort` argument to `Finder::sortByName()` - -4.3.0 ------ - - * added Finder::ignoreVCSIgnored() to ignore files based on rules listed in .gitignore - -4.2.0 ------ - - * added $useNaturalSort option to Finder::sortByName() method - * the `Finder::sortByName()` method will have a new `$useNaturalSort` - argument in version 5.0, not defining it is deprecated - * added `Finder::reverseSorting()` to reverse the sorting - -4.0.0 ------ - - * removed `ExceptionInterface` - * removed `Symfony\Component\Finder\Iterator\FilterIterator` - -3.4.0 ------ - - * deprecated `Symfony\Component\Finder\Iterator\FilterIterator` - * added Finder::hasResults() method to check if any results were found - -3.3.0 ------ - - * added double-star matching to Glob::toRegex() - -3.0.0 ------ - - * removed deprecated classes - -2.8.0 ------ - - * deprecated adapters and related classes - -2.5.0 ------ - * added support for GLOB_BRACE in the paths passed to Finder::in() - -2.3.0 ------ - - * added a way to ignore unreadable directories (via Finder::ignoreUnreadableDirs()) - * unified the way subfolders that are not executable are handled by always throwing an AccessDeniedException exception - -2.2.0 ------ - - * added Finder::path() and Finder::notPath() methods - * added finder adapters to improve performance on specific platforms - * added support for wildcard characters (glob patterns) in the paths passed - to Finder::in() - -2.1.0 ------ - - * added Finder::sortByAccessedTime(), Finder::sortByChangedTime(), and - Finder::sortByModifiedTime() - * added Countable to Finder - * added support for an array of directories as an argument to - Finder::exclude() - * added searching based on the file content via Finder::contains() and - Finder::notContains() - * added support for the != operator in the Comparator - * [BC BREAK] filter expressions (used for file name and content) are no more - considered as regexps but glob patterns when they are enclosed in '*' or '?' diff --git a/tools/php-cs-fixer/vendor/symfony/finder/Comparator/Comparator.php b/tools/php-cs-fixer/vendor/symfony/finder/Comparator/Comparator.php deleted file mode 100644 index cfe3965..0000000 --- a/tools/php-cs-fixer/vendor/symfony/finder/Comparator/Comparator.php +++ /dev/null @@ -1,91 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder\Comparator; - -/** - * Comparator. - * - * @author Fabien Potencier - */ -class Comparator -{ - private $target; - private $operator = '=='; - - /** - * Gets the target value. - * - * @return string The target value - */ - public function getTarget() - { - return $this->target; - } - - public function setTarget(string $target) - { - $this->target = $target; - } - - /** - * Gets the comparison operator. - * - * @return string The operator - */ - public function getOperator() - { - return $this->operator; - } - - /** - * Sets the comparison operator. - * - * @throws \InvalidArgumentException - */ - public function setOperator(string $operator) - { - if ('' === $operator) { - $operator = '=='; - } - - if (!\in_array($operator, ['>', '<', '>=', '<=', '==', '!='])) { - throw new \InvalidArgumentException(sprintf('Invalid operator "%s".', $operator)); - } - - $this->operator = $operator; - } - - /** - * Tests against the target. - * - * @param mixed $test A test value - * - * @return bool - */ - public function test($test) - { - switch ($this->operator) { - case '>': - return $test > $this->target; - case '>=': - return $test >= $this->target; - case '<': - return $test < $this->target; - case '<=': - return $test <= $this->target; - case '!=': - return $test != $this->target; - } - - return $test == $this->target; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/finder/Comparator/DateComparator.php b/tools/php-cs-fixer/vendor/symfony/finder/Comparator/DateComparator.php deleted file mode 100644 index ae22c6c..0000000 --- a/tools/php-cs-fixer/vendor/symfony/finder/Comparator/DateComparator.php +++ /dev/null @@ -1,51 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder\Comparator; - -/** - * DateCompare compiles date comparisons. - * - * @author Fabien Potencier - */ -class DateComparator extends Comparator -{ - /** - * @param string $test A comparison string - * - * @throws \InvalidArgumentException If the test is not understood - */ - public function __construct(string $test) - { - if (!preg_match('#^\s*(==|!=|[<>]=?|after|since|before|until)?\s*(.+?)\s*$#i', $test, $matches)) { - throw new \InvalidArgumentException(sprintf('Don\'t understand "%s" as a date test.', $test)); - } - - try { - $date = new \DateTime($matches[2]); - $target = $date->format('U'); - } catch (\Exception $e) { - throw new \InvalidArgumentException(sprintf('"%s" is not a valid date.', $matches[2])); - } - - $operator = $matches[1] ?? '=='; - if ('since' === $operator || 'after' === $operator) { - $operator = '>'; - } - - if ('until' === $operator || 'before' === $operator) { - $operator = '<'; - } - - $this->setOperator($operator); - $this->setTarget($target); - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/finder/Comparator/NumberComparator.php b/tools/php-cs-fixer/vendor/symfony/finder/Comparator/NumberComparator.php deleted file mode 100644 index 657118f..0000000 --- a/tools/php-cs-fixer/vendor/symfony/finder/Comparator/NumberComparator.php +++ /dev/null @@ -1,79 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder\Comparator; - -/** - * NumberComparator compiles a simple comparison to an anonymous - * subroutine, which you can call with a value to be tested again. - * - * Now this would be very pointless, if NumberCompare didn't understand - * magnitudes. - * - * The target value may use magnitudes of kilobytes (k, ki), - * megabytes (m, mi), or gigabytes (g, gi). Those suffixed - * with an i use the appropriate 2**n version in accordance with the - * IEC standard: http://physics.nist.gov/cuu/Units/binary.html - * - * Based on the Perl Number::Compare module. - * - * @author Fabien Potencier PHP port - * @author Richard Clamp Perl version - * @copyright 2004-2005 Fabien Potencier - * @copyright 2002 Richard Clamp - * - * @see http://physics.nist.gov/cuu/Units/binary.html - */ -class NumberComparator extends Comparator -{ - /** - * @param string|int $test A comparison string or an integer - * - * @throws \InvalidArgumentException If the test is not understood - */ - public function __construct(?string $test) - { - if (null === $test || !preg_match('#^\s*(==|!=|[<>]=?)?\s*([0-9\.]+)\s*([kmg]i?)?\s*$#i', $test, $matches)) { - throw new \InvalidArgumentException(sprintf('Don\'t understand "%s" as a number test.', $test ?? 'null')); - } - - $target = $matches[2]; - if (!is_numeric($target)) { - throw new \InvalidArgumentException(sprintf('Invalid number "%s".', $target)); - } - if (isset($matches[3])) { - // magnitude - switch (strtolower($matches[3])) { - case 'k': - $target *= 1000; - break; - case 'ki': - $target *= 1024; - break; - case 'm': - $target *= 1000000; - break; - case 'mi': - $target *= 1024 * 1024; - break; - case 'g': - $target *= 1000000000; - break; - case 'gi': - $target *= 1024 * 1024 * 1024; - break; - } - } - - $this->setTarget($target); - $this->setOperator($matches[1] ?? '=='); - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/finder/Exception/AccessDeniedException.php b/tools/php-cs-fixer/vendor/symfony/finder/Exception/AccessDeniedException.php deleted file mode 100644 index ee195ea..0000000 --- a/tools/php-cs-fixer/vendor/symfony/finder/Exception/AccessDeniedException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder\Exception; - -/** - * @author Jean-François Simon - */ -class AccessDeniedException extends \UnexpectedValueException -{ -} diff --git a/tools/php-cs-fixer/vendor/symfony/finder/Exception/DirectoryNotFoundException.php b/tools/php-cs-fixer/vendor/symfony/finder/Exception/DirectoryNotFoundException.php deleted file mode 100644 index c6cc0f2..0000000 --- a/tools/php-cs-fixer/vendor/symfony/finder/Exception/DirectoryNotFoundException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder\Exception; - -/** - * @author Andreas Erhard - */ -class DirectoryNotFoundException extends \InvalidArgumentException -{ -} diff --git a/tools/php-cs-fixer/vendor/symfony/finder/Finder.php b/tools/php-cs-fixer/vendor/symfony/finder/Finder.php deleted file mode 100644 index c9bd21f..0000000 --- a/tools/php-cs-fixer/vendor/symfony/finder/Finder.php +++ /dev/null @@ -1,808 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder; - -use Symfony\Component\Finder\Comparator\DateComparator; -use Symfony\Component\Finder\Comparator\NumberComparator; -use Symfony\Component\Finder\Exception\DirectoryNotFoundException; -use Symfony\Component\Finder\Iterator\CustomFilterIterator; -use Symfony\Component\Finder\Iterator\DateRangeFilterIterator; -use Symfony\Component\Finder\Iterator\DepthRangeFilterIterator; -use Symfony\Component\Finder\Iterator\ExcludeDirectoryFilterIterator; -use Symfony\Component\Finder\Iterator\FilecontentFilterIterator; -use Symfony\Component\Finder\Iterator\FilenameFilterIterator; -use Symfony\Component\Finder\Iterator\LazyIterator; -use Symfony\Component\Finder\Iterator\SizeRangeFilterIterator; -use Symfony\Component\Finder\Iterator\SortableIterator; - -/** - * Finder allows to build rules to find files and directories. - * - * It is a thin wrapper around several specialized iterator classes. - * - * All rules may be invoked several times. - * - * All methods return the current Finder object to allow chaining: - * - * $finder = Finder::create()->files()->name('*.php')->in(__DIR__); - * - * @author Fabien Potencier - */ -class Finder implements \IteratorAggregate, \Countable -{ - public const IGNORE_VCS_FILES = 1; - public const IGNORE_DOT_FILES = 2; - public const IGNORE_VCS_IGNORED_FILES = 4; - - private $mode = 0; - private $names = []; - private $notNames = []; - private $exclude = []; - private $filters = []; - private $depths = []; - private $sizes = []; - private $followLinks = false; - private $reverseSorting = false; - private $sort = false; - private $ignore = 0; - private $dirs = []; - private $dates = []; - private $iterators = []; - private $contains = []; - private $notContains = []; - private $paths = []; - private $notPaths = []; - private $ignoreUnreadableDirs = false; - - private static $vcsPatterns = ['.svn', '_svn', 'CVS', '_darcs', '.arch-params', '.monotone', '.bzr', '.git', '.hg']; - - public function __construct() - { - $this->ignore = static::IGNORE_VCS_FILES | static::IGNORE_DOT_FILES; - } - - /** - * Creates a new Finder. - * - * @return static - */ - public static function create() - { - return new static(); - } - - /** - * Restricts the matching to directories only. - * - * @return $this - */ - public function directories() - { - $this->mode = Iterator\FileTypeFilterIterator::ONLY_DIRECTORIES; - - return $this; - } - - /** - * Restricts the matching to files only. - * - * @return $this - */ - public function files() - { - $this->mode = Iterator\FileTypeFilterIterator::ONLY_FILES; - - return $this; - } - - /** - * Adds tests for the directory depth. - * - * Usage: - * - * $finder->depth('> 1') // the Finder will start matching at level 1. - * $finder->depth('< 3') // the Finder will descend at most 3 levels of directories below the starting point. - * $finder->depth(['>= 1', '< 3']) - * - * @param string|int|string[]|int[] $levels The depth level expression or an array of depth levels - * - * @return $this - * - * @see DepthRangeFilterIterator - * @see NumberComparator - */ - public function depth($levels) - { - foreach ((array) $levels as $level) { - $this->depths[] = new Comparator\NumberComparator($level); - } - - return $this; - } - - /** - * Adds tests for file dates (last modified). - * - * The date must be something that strtotime() is able to parse: - * - * $finder->date('since yesterday'); - * $finder->date('until 2 days ago'); - * $finder->date('> now - 2 hours'); - * $finder->date('>= 2005-10-15'); - * $finder->date(['>= 2005-10-15', '<= 2006-05-27']); - * - * @param string|string[] $dates A date range string or an array of date ranges - * - * @return $this - * - * @see strtotime - * @see DateRangeFilterIterator - * @see DateComparator - */ - public function date($dates) - { - foreach ((array) $dates as $date) { - $this->dates[] = new Comparator\DateComparator($date); - } - - return $this; - } - - /** - * Adds rules that files must match. - * - * You can use patterns (delimited with / sign), globs or simple strings. - * - * $finder->name('*.php') - * $finder->name('/\.php$/') // same as above - * $finder->name('test.php') - * $finder->name(['test.py', 'test.php']) - * - * @param string|string[] $patterns A pattern (a regexp, a glob, or a string) or an array of patterns - * - * @return $this - * - * @see FilenameFilterIterator - */ - public function name($patterns) - { - $this->names = array_merge($this->names, (array) $patterns); - - return $this; - } - - /** - * Adds rules that files must not match. - * - * @param string|string[] $patterns A pattern (a regexp, a glob, or a string) or an array of patterns - * - * @return $this - * - * @see FilenameFilterIterator - */ - public function notName($patterns) - { - $this->notNames = array_merge($this->notNames, (array) $patterns); - - return $this; - } - - /** - * Adds tests that file contents must match. - * - * Strings or PCRE patterns can be used: - * - * $finder->contains('Lorem ipsum') - * $finder->contains('/Lorem ipsum/i') - * $finder->contains(['dolor', '/ipsum/i']) - * - * @param string|string[] $patterns A pattern (string or regexp) or an array of patterns - * - * @return $this - * - * @see FilecontentFilterIterator - */ - public function contains($patterns) - { - $this->contains = array_merge($this->contains, (array) $patterns); - - return $this; - } - - /** - * Adds tests that file contents must not match. - * - * Strings or PCRE patterns can be used: - * - * $finder->notContains('Lorem ipsum') - * $finder->notContains('/Lorem ipsum/i') - * $finder->notContains(['lorem', '/dolor/i']) - * - * @param string|string[] $patterns A pattern (string or regexp) or an array of patterns - * - * @return $this - * - * @see FilecontentFilterIterator - */ - public function notContains($patterns) - { - $this->notContains = array_merge($this->notContains, (array) $patterns); - - return $this; - } - - /** - * Adds rules that filenames must match. - * - * You can use patterns (delimited with / sign) or simple strings. - * - * $finder->path('some/special/dir') - * $finder->path('/some\/special\/dir/') // same as above - * $finder->path(['some dir', 'another/dir']) - * - * Use only / as dirname separator. - * - * @param string|string[] $patterns A pattern (a regexp or a string) or an array of patterns - * - * @return $this - * - * @see FilenameFilterIterator - */ - public function path($patterns) - { - $this->paths = array_merge($this->paths, (array) $patterns); - - return $this; - } - - /** - * Adds rules that filenames must not match. - * - * You can use patterns (delimited with / sign) or simple strings. - * - * $finder->notPath('some/special/dir') - * $finder->notPath('/some\/special\/dir/') // same as above - * $finder->notPath(['some/file.txt', 'another/file.log']) - * - * Use only / as dirname separator. - * - * @param string|string[] $patterns A pattern (a regexp or a string) or an array of patterns - * - * @return $this - * - * @see FilenameFilterIterator - */ - public function notPath($patterns) - { - $this->notPaths = array_merge($this->notPaths, (array) $patterns); - - return $this; - } - - /** - * Adds tests for file sizes. - * - * $finder->size('> 10K'); - * $finder->size('<= 1Ki'); - * $finder->size(4); - * $finder->size(['> 10K', '< 20K']) - * - * @param string|int|string[]|int[] $sizes A size range string or an integer or an array of size ranges - * - * @return $this - * - * @see SizeRangeFilterIterator - * @see NumberComparator - */ - public function size($sizes) - { - foreach ((array) $sizes as $size) { - $this->sizes[] = new Comparator\NumberComparator($size); - } - - return $this; - } - - /** - * Excludes directories. - * - * Directories passed as argument must be relative to the ones defined with the `in()` method. For example: - * - * $finder->in(__DIR__)->exclude('ruby'); - * - * @param string|array $dirs A directory path or an array of directories - * - * @return $this - * - * @see ExcludeDirectoryFilterIterator - */ - public function exclude($dirs) - { - $this->exclude = array_merge($this->exclude, (array) $dirs); - - return $this; - } - - /** - * Excludes "hidden" directories and files (starting with a dot). - * - * This option is enabled by default. - * - * @return $this - * - * @see ExcludeDirectoryFilterIterator - */ - public function ignoreDotFiles(bool $ignoreDotFiles) - { - if ($ignoreDotFiles) { - $this->ignore |= static::IGNORE_DOT_FILES; - } else { - $this->ignore &= ~static::IGNORE_DOT_FILES; - } - - return $this; - } - - /** - * Forces the finder to ignore version control directories. - * - * This option is enabled by default. - * - * @return $this - * - * @see ExcludeDirectoryFilterIterator - */ - public function ignoreVCS(bool $ignoreVCS) - { - if ($ignoreVCS) { - $this->ignore |= static::IGNORE_VCS_FILES; - } else { - $this->ignore &= ~static::IGNORE_VCS_FILES; - } - - return $this; - } - - /** - * Forces Finder to obey .gitignore and ignore files based on rules listed there. - * - * This option is disabled by default. - * - * @return $this - */ - public function ignoreVCSIgnored(bool $ignoreVCSIgnored) - { - if ($ignoreVCSIgnored) { - $this->ignore |= static::IGNORE_VCS_IGNORED_FILES; - } else { - $this->ignore &= ~static::IGNORE_VCS_IGNORED_FILES; - } - - return $this; - } - - /** - * Adds VCS patterns. - * - * @see ignoreVCS() - * - * @param string|string[] $pattern VCS patterns to ignore - */ - public static function addVCSPattern($pattern) - { - foreach ((array) $pattern as $p) { - self::$vcsPatterns[] = $p; - } - - self::$vcsPatterns = array_unique(self::$vcsPatterns); - } - - /** - * Sorts files and directories by an anonymous function. - * - * The anonymous function receives two \SplFileInfo instances to compare. - * - * This can be slow as all the matching files and directories must be retrieved for comparison. - * - * @return $this - * - * @see SortableIterator - */ - public function sort(\Closure $closure) - { - $this->sort = $closure; - - return $this; - } - - /** - * Sorts files and directories by name. - * - * This can be slow as all the matching files and directories must be retrieved for comparison. - * - * @return $this - * - * @see SortableIterator - */ - public function sortByName(bool $useNaturalSort = false) - { - $this->sort = $useNaturalSort ? Iterator\SortableIterator::SORT_BY_NAME_NATURAL : Iterator\SortableIterator::SORT_BY_NAME; - - return $this; - } - - /** - * Sorts files and directories by type (directories before files), then by name. - * - * This can be slow as all the matching files and directories must be retrieved for comparison. - * - * @return $this - * - * @see SortableIterator - */ - public function sortByType() - { - $this->sort = Iterator\SortableIterator::SORT_BY_TYPE; - - return $this; - } - - /** - * Sorts files and directories by the last accessed time. - * - * This is the time that the file was last accessed, read or written to. - * - * This can be slow as all the matching files and directories must be retrieved for comparison. - * - * @return $this - * - * @see SortableIterator - */ - public function sortByAccessedTime() - { - $this->sort = Iterator\SortableIterator::SORT_BY_ACCESSED_TIME; - - return $this; - } - - /** - * Reverses the sorting. - * - * @return $this - */ - public function reverseSorting() - { - $this->reverseSorting = true; - - return $this; - } - - /** - * Sorts files and directories by the last inode changed time. - * - * This is the time that the inode information was last modified (permissions, owner, group or other metadata). - * - * On Windows, since inode is not available, changed time is actually the file creation time. - * - * This can be slow as all the matching files and directories must be retrieved for comparison. - * - * @return $this - * - * @see SortableIterator - */ - public function sortByChangedTime() - { - $this->sort = Iterator\SortableIterator::SORT_BY_CHANGED_TIME; - - return $this; - } - - /** - * Sorts files and directories by the last modified time. - * - * This is the last time the actual contents of the file were last modified. - * - * This can be slow as all the matching files and directories must be retrieved for comparison. - * - * @return $this - * - * @see SortableIterator - */ - public function sortByModifiedTime() - { - $this->sort = Iterator\SortableIterator::SORT_BY_MODIFIED_TIME; - - return $this; - } - - /** - * Filters the iterator with an anonymous function. - * - * The anonymous function receives a \SplFileInfo and must return false - * to remove files. - * - * @return $this - * - * @see CustomFilterIterator - */ - public function filter(\Closure $closure) - { - $this->filters[] = $closure; - - return $this; - } - - /** - * Forces the following of symlinks. - * - * @return $this - */ - public function followLinks() - { - $this->followLinks = true; - - return $this; - } - - /** - * Tells finder to ignore unreadable directories. - * - * By default, scanning unreadable directories content throws an AccessDeniedException. - * - * @return $this - */ - public function ignoreUnreadableDirs(bool $ignore = true) - { - $this->ignoreUnreadableDirs = $ignore; - - return $this; - } - - /** - * Searches files and directories which match defined rules. - * - * @param string|string[] $dirs A directory path or an array of directories - * - * @return $this - * - * @throws DirectoryNotFoundException if one of the directories does not exist - */ - public function in($dirs) - { - $resolvedDirs = []; - - foreach ((array) $dirs as $dir) { - if (is_dir($dir)) { - $resolvedDirs[] = $this->normalizeDir($dir); - } elseif ($glob = glob($dir, (\defined('GLOB_BRACE') ? \GLOB_BRACE : 0) | \GLOB_ONLYDIR | \GLOB_NOSORT)) { - sort($glob); - $resolvedDirs = array_merge($resolvedDirs, array_map([$this, 'normalizeDir'], $glob)); - } else { - throw new DirectoryNotFoundException(sprintf('The "%s" directory does not exist.', $dir)); - } - } - - $this->dirs = array_merge($this->dirs, $resolvedDirs); - - return $this; - } - - /** - * Returns an Iterator for the current Finder configuration. - * - * This method implements the IteratorAggregate interface. - * - * @return \Iterator|SplFileInfo[] An iterator - * - * @throws \LogicException if the in() method has not been called - */ - #[\ReturnTypeWillChange] - public function getIterator() - { - if (0 === \count($this->dirs) && 0 === \count($this->iterators)) { - throw new \LogicException('You must call one of in() or append() methods before iterating over a Finder.'); - } - - if (1 === \count($this->dirs) && 0 === \count($this->iterators)) { - $iterator = $this->searchInDirectory($this->dirs[0]); - - if ($this->sort || $this->reverseSorting) { - $iterator = (new Iterator\SortableIterator($iterator, $this->sort, $this->reverseSorting))->getIterator(); - } - - return $iterator; - } - - $iterator = new \AppendIterator(); - foreach ($this->dirs as $dir) { - $iterator->append(new \IteratorIterator(new LazyIterator(function () use ($dir) { - return $this->searchInDirectory($dir); - }))); - } - - foreach ($this->iterators as $it) { - $iterator->append($it); - } - - if ($this->sort || $this->reverseSorting) { - $iterator = (new Iterator\SortableIterator($iterator, $this->sort, $this->reverseSorting))->getIterator(); - } - - return $iterator; - } - - /** - * Appends an existing set of files/directories to the finder. - * - * The set can be another Finder, an Iterator, an IteratorAggregate, or even a plain array. - * - * @return $this - * - * @throws \InvalidArgumentException when the given argument is not iterable - */ - public function append(iterable $iterator) - { - if ($iterator instanceof \IteratorAggregate) { - $this->iterators[] = $iterator->getIterator(); - } elseif ($iterator instanceof \Iterator) { - $this->iterators[] = $iterator; - } elseif (is_iterable($iterator)) { - $it = new \ArrayIterator(); - foreach ($iterator as $file) { - $file = $file instanceof \SplFileInfo ? $file : new \SplFileInfo($file); - $it[$file->getPathname()] = $file; - } - $this->iterators[] = $it; - } else { - throw new \InvalidArgumentException('Finder::append() method wrong argument type.'); - } - - return $this; - } - - /** - * Check if any results were found. - * - * @return bool - */ - public function hasResults() - { - foreach ($this->getIterator() as $_) { - return true; - } - - return false; - } - - /** - * Counts all the results collected by the iterators. - * - * @return int - */ - #[\ReturnTypeWillChange] - public function count() - { - return iterator_count($this->getIterator()); - } - - private function searchInDirectory(string $dir): \Iterator - { - $exclude = $this->exclude; - $notPaths = $this->notPaths; - - if (static::IGNORE_VCS_FILES === (static::IGNORE_VCS_FILES & $this->ignore)) { - $exclude = array_merge($exclude, self::$vcsPatterns); - } - - if (static::IGNORE_DOT_FILES === (static::IGNORE_DOT_FILES & $this->ignore)) { - $notPaths[] = '#(^|/)\..+(/|$)#'; - } - - if (static::IGNORE_VCS_IGNORED_FILES === (static::IGNORE_VCS_IGNORED_FILES & $this->ignore)) { - $gitignoreFilePath = sprintf('%s/.gitignore', $dir); - if (!is_readable($gitignoreFilePath)) { - throw new \RuntimeException(sprintf('The "ignoreVCSIgnored" option cannot be used by the Finder as the "%s" file is not readable.', $gitignoreFilePath)); - } - $notPaths = array_merge($notPaths, [Gitignore::toRegex(file_get_contents($gitignoreFilePath))]); - } - - $minDepth = 0; - $maxDepth = \PHP_INT_MAX; - - foreach ($this->depths as $comparator) { - switch ($comparator->getOperator()) { - case '>': - $minDepth = $comparator->getTarget() + 1; - break; - case '>=': - $minDepth = $comparator->getTarget(); - break; - case '<': - $maxDepth = $comparator->getTarget() - 1; - break; - case '<=': - $maxDepth = $comparator->getTarget(); - break; - default: - $minDepth = $maxDepth = $comparator->getTarget(); - } - } - - $flags = \RecursiveDirectoryIterator::SKIP_DOTS; - - if ($this->followLinks) { - $flags |= \RecursiveDirectoryIterator::FOLLOW_SYMLINKS; - } - - $iterator = new Iterator\RecursiveDirectoryIterator($dir, $flags, $this->ignoreUnreadableDirs); - - if ($exclude) { - $iterator = new Iterator\ExcludeDirectoryFilterIterator($iterator, $exclude); - } - - $iterator = new \RecursiveIteratorIterator($iterator, \RecursiveIteratorIterator::SELF_FIRST); - - if ($minDepth > 0 || $maxDepth < \PHP_INT_MAX) { - $iterator = new Iterator\DepthRangeFilterIterator($iterator, $minDepth, $maxDepth); - } - - if ($this->mode) { - $iterator = new Iterator\FileTypeFilterIterator($iterator, $this->mode); - } - - if ($this->names || $this->notNames) { - $iterator = new Iterator\FilenameFilterIterator($iterator, $this->names, $this->notNames); - } - - if ($this->contains || $this->notContains) { - $iterator = new Iterator\FilecontentFilterIterator($iterator, $this->contains, $this->notContains); - } - - if ($this->sizes) { - $iterator = new Iterator\SizeRangeFilterIterator($iterator, $this->sizes); - } - - if ($this->dates) { - $iterator = new Iterator\DateRangeFilterIterator($iterator, $this->dates); - } - - if ($this->filters) { - $iterator = new Iterator\CustomFilterIterator($iterator, $this->filters); - } - - if ($this->paths || $notPaths) { - $iterator = new Iterator\PathFilterIterator($iterator, $this->paths, $notPaths); - } - - return $iterator; - } - - /** - * Normalizes given directory names by removing trailing slashes. - * - * Excluding: (s)ftp:// or ssh2.(s)ftp:// wrapper - */ - private function normalizeDir(string $dir): string - { - if ('/' === $dir) { - return $dir; - } - - $dir = rtrim($dir, '/'.\DIRECTORY_SEPARATOR); - - if (preg_match('#^(ssh2\.)?s?ftp://#', $dir)) { - $dir .= '/'; - } - - return $dir; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/finder/Gitignore.php b/tools/php-cs-fixer/vendor/symfony/finder/Gitignore.php deleted file mode 100644 index 491f588..0000000 --- a/tools/php-cs-fixer/vendor/symfony/finder/Gitignore.php +++ /dev/null @@ -1,83 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder; - -/** - * Gitignore matches against text. - * - * @author Michael Voříšek - * @author Ahmed Abdou - */ -class Gitignore -{ - /** - * Returns a regexp which is the equivalent of the gitignore pattern. - * - * Format specification: https://git-scm.com/docs/gitignore#_pattern_format - */ - public static function toRegex(string $gitignoreFileContent): string - { - $gitignoreFileContent = preg_replace('~(? $line) { - $line = preg_replace('~(? - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder; - -/** - * Glob matches globbing patterns against text. - * - * if match_glob("foo.*", "foo.bar") echo "matched\n"; - * - * // prints foo.bar and foo.baz - * $regex = glob_to_regex("foo.*"); - * for (['foo.bar', 'foo.baz', 'foo', 'bar'] as $t) - * { - * if (/$regex/) echo "matched: $car\n"; - * } - * - * Glob implements glob(3) style matching that can be used to match - * against text, rather than fetching names from a filesystem. - * - * Based on the Perl Text::Glob module. - * - * @author Fabien Potencier PHP port - * @author Richard Clamp Perl version - * @copyright 2004-2005 Fabien Potencier - * @copyright 2002 Richard Clamp - */ -class Glob -{ - /** - * Returns a regexp which is the equivalent of the glob pattern. - * - * @return string - */ - public static function toRegex(string $glob, bool $strictLeadingDot = true, bool $strictWildcardSlash = true, string $delimiter = '#') - { - $firstByte = true; - $escaping = false; - $inCurlies = 0; - $regex = ''; - $sizeGlob = \strlen($glob); - for ($i = 0; $i < $sizeGlob; ++$i) { - $car = $glob[$i]; - if ($firstByte && $strictLeadingDot && '.' !== $car) { - $regex .= '(?=[^\.])'; - } - - $firstByte = '/' === $car; - - if ($firstByte && $strictWildcardSlash && isset($glob[$i + 2]) && '**' === $glob[$i + 1].$glob[$i + 2] && (!isset($glob[$i + 3]) || '/' === $glob[$i + 3])) { - $car = '[^/]++/'; - if (!isset($glob[$i + 3])) { - $car .= '?'; - } - - if ($strictLeadingDot) { - $car = '(?=[^\.])'.$car; - } - - $car = '/(?:'.$car.')*'; - $i += 2 + isset($glob[$i + 3]); - - if ('/' === $delimiter) { - $car = str_replace('/', '\\/', $car); - } - } - - if ($delimiter === $car || '.' === $car || '(' === $car || ')' === $car || '|' === $car || '+' === $car || '^' === $car || '$' === $car) { - $regex .= "\\$car"; - } elseif ('*' === $car) { - $regex .= $escaping ? '\\*' : ($strictWildcardSlash ? '[^/]*' : '.*'); - } elseif ('?' === $car) { - $regex .= $escaping ? '\\?' : ($strictWildcardSlash ? '[^/]' : '.'); - } elseif ('{' === $car) { - $regex .= $escaping ? '\\{' : '('; - if (!$escaping) { - ++$inCurlies; - } - } elseif ('}' === $car && $inCurlies) { - $regex .= $escaping ? '}' : ')'; - if (!$escaping) { - --$inCurlies; - } - } elseif (',' === $car && $inCurlies) { - $regex .= $escaping ? ',' : '|'; - } elseif ('\\' === $car) { - if ($escaping) { - $regex .= '\\\\'; - $escaping = false; - } else { - $escaping = true; - } - - continue; - } else { - $regex .= $car; - } - $escaping = false; - } - - return $delimiter.'^'.$regex.'$'.$delimiter; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/finder/Iterator/CustomFilterIterator.php b/tools/php-cs-fixer/vendor/symfony/finder/Iterator/CustomFilterIterator.php deleted file mode 100644 index f85cb7b..0000000 --- a/tools/php-cs-fixer/vendor/symfony/finder/Iterator/CustomFilterIterator.php +++ /dev/null @@ -1,62 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder\Iterator; - -/** - * CustomFilterIterator filters files by applying anonymous functions. - * - * The anonymous function receives a \SplFileInfo and must return false - * to remove files. - * - * @author Fabien Potencier - */ -class CustomFilterIterator extends \FilterIterator -{ - private $filters = []; - - /** - * @param \Iterator $iterator The Iterator to filter - * @param callable[] $filters An array of PHP callbacks - * - * @throws \InvalidArgumentException - */ - public function __construct(\Iterator $iterator, array $filters) - { - foreach ($filters as $filter) { - if (!\is_callable($filter)) { - throw new \InvalidArgumentException('Invalid PHP callback.'); - } - } - $this->filters = $filters; - - parent::__construct($iterator); - } - - /** - * Filters the iterator values. - * - * @return bool true if the value should be kept, false otherwise - */ - #[\ReturnTypeWillChange] - public function accept() - { - $fileinfo = $this->current(); - - foreach ($this->filters as $filter) { - if (false === $filter($fileinfo)) { - return false; - } - } - - return true; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/finder/Iterator/DateRangeFilterIterator.php b/tools/php-cs-fixer/vendor/symfony/finder/Iterator/DateRangeFilterIterator.php deleted file mode 100644 index 90616f4..0000000 --- a/tools/php-cs-fixer/vendor/symfony/finder/Iterator/DateRangeFilterIterator.php +++ /dev/null @@ -1,59 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder\Iterator; - -use Symfony\Component\Finder\Comparator\DateComparator; - -/** - * DateRangeFilterIterator filters out files that are not in the given date range (last modified dates). - * - * @author Fabien Potencier - */ -class DateRangeFilterIterator extends \FilterIterator -{ - private $comparators = []; - - /** - * @param \Iterator $iterator The Iterator to filter - * @param DateComparator[] $comparators An array of DateComparator instances - */ - public function __construct(\Iterator $iterator, array $comparators) - { - $this->comparators = $comparators; - - parent::__construct($iterator); - } - - /** - * Filters the iterator values. - * - * @return bool true if the value should be kept, false otherwise - */ - #[\ReturnTypeWillChange] - public function accept() - { - $fileinfo = $this->current(); - - if (!file_exists($fileinfo->getPathname())) { - return false; - } - - $filedate = $fileinfo->getMTime(); - foreach ($this->comparators as $compare) { - if (!$compare->test($filedate)) { - return false; - } - } - - return true; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/finder/Iterator/DepthRangeFilterIterator.php b/tools/php-cs-fixer/vendor/symfony/finder/Iterator/DepthRangeFilterIterator.php deleted file mode 100644 index e96fefd..0000000 --- a/tools/php-cs-fixer/vendor/symfony/finder/Iterator/DepthRangeFilterIterator.php +++ /dev/null @@ -1,46 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder\Iterator; - -/** - * DepthRangeFilterIterator limits the directory depth. - * - * @author Fabien Potencier - */ -class DepthRangeFilterIterator extends \FilterIterator -{ - private $minDepth = 0; - - /** - * @param \RecursiveIteratorIterator $iterator The Iterator to filter - * @param int $minDepth The min depth - * @param int $maxDepth The max depth - */ - public function __construct(\RecursiveIteratorIterator $iterator, int $minDepth = 0, int $maxDepth = \PHP_INT_MAX) - { - $this->minDepth = $minDepth; - $iterator->setMaxDepth(\PHP_INT_MAX === $maxDepth ? -1 : $maxDepth); - - parent::__construct($iterator); - } - - /** - * Filters the iterator values. - * - * @return bool true if the value should be kept, false otherwise - */ - #[\ReturnTypeWillChange] - public function accept() - { - return $this->getInnerIterator()->getDepth() >= $this->minDepth; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php b/tools/php-cs-fixer/vendor/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php deleted file mode 100644 index cf9e678..0000000 --- a/tools/php-cs-fixer/vendor/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php +++ /dev/null @@ -1,93 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder\Iterator; - -/** - * ExcludeDirectoryFilterIterator filters out directories. - * - * @author Fabien Potencier - */ -class ExcludeDirectoryFilterIterator extends \FilterIterator implements \RecursiveIterator -{ - private $iterator; - private $isRecursive; - private $excludedDirs = []; - private $excludedPattern; - - /** - * @param \Iterator $iterator The Iterator to filter - * @param string[] $directories An array of directories to exclude - */ - public function __construct(\Iterator $iterator, array $directories) - { - $this->iterator = $iterator; - $this->isRecursive = $iterator instanceof \RecursiveIterator; - $patterns = []; - foreach ($directories as $directory) { - $directory = rtrim($directory, '/'); - if (!$this->isRecursive || str_contains($directory, '/')) { - $patterns[] = preg_quote($directory, '#'); - } else { - $this->excludedDirs[$directory] = true; - } - } - if ($patterns) { - $this->excludedPattern = '#(?:^|/)(?:'.implode('|', $patterns).')(?:/|$)#'; - } - - parent::__construct($iterator); - } - - /** - * Filters the iterator values. - * - * @return bool True if the value should be kept, false otherwise - */ - #[\ReturnTypeWillChange] - public function accept() - { - if ($this->isRecursive && isset($this->excludedDirs[$this->getFilename()]) && $this->isDir()) { - return false; - } - - if ($this->excludedPattern) { - $path = $this->isDir() ? $this->current()->getRelativePathname() : $this->current()->getRelativePath(); - $path = str_replace('\\', '/', $path); - - return !preg_match($this->excludedPattern, $path); - } - - return true; - } - - /** - * @return bool - */ - #[\ReturnTypeWillChange] - public function hasChildren() - { - return $this->isRecursive && $this->iterator->hasChildren(); - } - - /** - * @return self - */ - #[\ReturnTypeWillChange] - public function getChildren() - { - $children = new self($this->iterator->getChildren(), []); - $children->excludedDirs = $this->excludedDirs; - $children->excludedPattern = $this->excludedPattern; - - return $children; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/finder/Iterator/FileTypeFilterIterator.php b/tools/php-cs-fixer/vendor/symfony/finder/Iterator/FileTypeFilterIterator.php deleted file mode 100644 index d054cef..0000000 --- a/tools/php-cs-fixer/vendor/symfony/finder/Iterator/FileTypeFilterIterator.php +++ /dev/null @@ -1,54 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder\Iterator; - -/** - * FileTypeFilterIterator only keeps files, directories, or both. - * - * @author Fabien Potencier - */ -class FileTypeFilterIterator extends \FilterIterator -{ - public const ONLY_FILES = 1; - public const ONLY_DIRECTORIES = 2; - - private $mode; - - /** - * @param \Iterator $iterator The Iterator to filter - * @param int $mode The mode (self::ONLY_FILES or self::ONLY_DIRECTORIES) - */ - public function __construct(\Iterator $iterator, int $mode) - { - $this->mode = $mode; - - parent::__construct($iterator); - } - - /** - * Filters the iterator values. - * - * @return bool true if the value should be kept, false otherwise - */ - #[\ReturnTypeWillChange] - public function accept() - { - $fileinfo = $this->current(); - if (self::ONLY_DIRECTORIES === (self::ONLY_DIRECTORIES & $this->mode) && $fileinfo->isFile()) { - return false; - } elseif (self::ONLY_FILES === (self::ONLY_FILES & $this->mode) && $fileinfo->isDir()) { - return false; - } - - return true; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/finder/Iterator/FilecontentFilterIterator.php b/tools/php-cs-fixer/vendor/symfony/finder/Iterator/FilecontentFilterIterator.php deleted file mode 100644 index 9493b5e..0000000 --- a/tools/php-cs-fixer/vendor/symfony/finder/Iterator/FilecontentFilterIterator.php +++ /dev/null @@ -1,59 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder\Iterator; - -/** - * FilecontentFilterIterator filters files by their contents using patterns (regexps or strings). - * - * @author Fabien Potencier - * @author Włodzimierz Gajda - */ -class FilecontentFilterIterator extends MultiplePcreFilterIterator -{ - /** - * Filters the iterator values. - * - * @return bool true if the value should be kept, false otherwise - */ - #[\ReturnTypeWillChange] - public function accept() - { - if (!$this->matchRegexps && !$this->noMatchRegexps) { - return true; - } - - $fileinfo = $this->current(); - - if ($fileinfo->isDir() || !$fileinfo->isReadable()) { - return false; - } - - $content = $fileinfo->getContents(); - if (!$content) { - return false; - } - - return $this->isAccepted($content); - } - - /** - * Converts string to regexp if necessary. - * - * @param string $str Pattern: string or regexp - * - * @return string regexp corresponding to a given string or regexp - */ - protected function toRegex(string $str) - { - return $this->isRegex($str) ? $str : '/'.preg_quote($str, '/').'/'; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/finder/Iterator/FilenameFilterIterator.php b/tools/php-cs-fixer/vendor/symfony/finder/Iterator/FilenameFilterIterator.php deleted file mode 100644 index 137c2c4..0000000 --- a/tools/php-cs-fixer/vendor/symfony/finder/Iterator/FilenameFilterIterator.php +++ /dev/null @@ -1,48 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder\Iterator; - -use Symfony\Component\Finder\Glob; - -/** - * FilenameFilterIterator filters files by patterns (a regexp, a glob, or a string). - * - * @author Fabien Potencier - */ -class FilenameFilterIterator extends MultiplePcreFilterIterator -{ - /** - * Filters the iterator values. - * - * @return bool true if the value should be kept, false otherwise - */ - #[\ReturnTypeWillChange] - public function accept() - { - return $this->isAccepted($this->current()->getFilename()); - } - - /** - * Converts glob to regexp. - * - * PCRE patterns are left unchanged. - * Glob strings are transformed with Glob::toRegex(). - * - * @param string $str Pattern: glob or regexp - * - * @return string regexp corresponding to a given glob or regexp - */ - protected function toRegex(string $str) - { - return $this->isRegex($str) ? $str : Glob::toRegex($str); - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/finder/Iterator/LazyIterator.php b/tools/php-cs-fixer/vendor/symfony/finder/Iterator/LazyIterator.php deleted file mode 100644 index 32cc37f..0000000 --- a/tools/php-cs-fixer/vendor/symfony/finder/Iterator/LazyIterator.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder\Iterator; - -/** - * @author Jérémy Derussé - * - * @internal - */ -class LazyIterator implements \IteratorAggregate -{ - private $iteratorFactory; - - public function __construct(callable $iteratorFactory) - { - $this->iteratorFactory = $iteratorFactory; - } - - public function getIterator(): \Traversable - { - yield from ($this->iteratorFactory)(); - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/finder/Iterator/MultiplePcreFilterIterator.php b/tools/php-cs-fixer/vendor/symfony/finder/Iterator/MultiplePcreFilterIterator.php deleted file mode 100644 index 78a34ab..0000000 --- a/tools/php-cs-fixer/vendor/symfony/finder/Iterator/MultiplePcreFilterIterator.php +++ /dev/null @@ -1,106 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder\Iterator; - -/** - * MultiplePcreFilterIterator filters files using patterns (regexps, globs or strings). - * - * @author Fabien Potencier - */ -abstract class MultiplePcreFilterIterator extends \FilterIterator -{ - protected $matchRegexps = []; - protected $noMatchRegexps = []; - - /** - * @param \Iterator $iterator The Iterator to filter - * @param string[] $matchPatterns An array of patterns that need to match - * @param string[] $noMatchPatterns An array of patterns that need to not match - */ - public function __construct(\Iterator $iterator, array $matchPatterns, array $noMatchPatterns) - { - foreach ($matchPatterns as $pattern) { - $this->matchRegexps[] = $this->toRegex($pattern); - } - - foreach ($noMatchPatterns as $pattern) { - $this->noMatchRegexps[] = $this->toRegex($pattern); - } - - parent::__construct($iterator); - } - - /** - * Checks whether the string is accepted by the regex filters. - * - * If there is no regexps defined in the class, this method will accept the string. - * Such case can be handled by child classes before calling the method if they want to - * apply a different behavior. - * - * @return bool - */ - protected function isAccepted(string $string) - { - // should at least not match one rule to exclude - foreach ($this->noMatchRegexps as $regex) { - if (preg_match($regex, $string)) { - return false; - } - } - - // should at least match one rule - if ($this->matchRegexps) { - foreach ($this->matchRegexps as $regex) { - if (preg_match($regex, $string)) { - return true; - } - } - - return false; - } - - // If there is no match rules, the file is accepted - return true; - } - - /** - * Checks whether the string is a regex. - * - * @return bool - */ - protected function isRegex(string $str) - { - if (preg_match('/^(.{3,}?)[imsxuADU]*$/', $str, $m)) { - $start = substr($m[1], 0, 1); - $end = substr($m[1], -1); - - if ($start === $end) { - return !preg_match('/[*?[:alnum:] \\\\]/', $start); - } - - foreach ([['{', '}'], ['(', ')'], ['[', ']'], ['<', '>']] as $delimiters) { - if ($start === $delimiters[0] && $end === $delimiters[1]) { - return true; - } - } - } - - return false; - } - - /** - * Converts string into regexp. - * - * @return string - */ - abstract protected function toRegex(string $str); -} diff --git a/tools/php-cs-fixer/vendor/symfony/finder/Iterator/PathFilterIterator.php b/tools/php-cs-fixer/vendor/symfony/finder/Iterator/PathFilterIterator.php deleted file mode 100644 index 1d09c26..0000000 --- a/tools/php-cs-fixer/vendor/symfony/finder/Iterator/PathFilterIterator.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder\Iterator; - -/** - * PathFilterIterator filters files by path patterns (e.g. some/special/dir). - * - * @author Fabien Potencier - * @author Włodzimierz Gajda - */ -class PathFilterIterator extends MultiplePcreFilterIterator -{ - /** - * Filters the iterator values. - * - * @return bool true if the value should be kept, false otherwise - */ - #[\ReturnTypeWillChange] - public function accept() - { - $filename = $this->current()->getRelativePathname(); - - if ('\\' === \DIRECTORY_SEPARATOR) { - $filename = str_replace('\\', '/', $filename); - } - - return $this->isAccepted($filename); - } - - /** - * Converts strings to regexp. - * - * PCRE patterns are left unchanged. - * - * Default conversion: - * 'lorem/ipsum/dolor' ==> 'lorem\/ipsum\/dolor/' - * - * Use only / as directory separator (on Windows also). - * - * @param string $str Pattern: regexp or dirname - * - * @return string regexp corresponding to a given string or regexp - */ - protected function toRegex(string $str) - { - return $this->isRegex($str) ? $str : '/'.preg_quote($str, '/').'/'; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/finder/Iterator/RecursiveDirectoryIterator.php b/tools/php-cs-fixer/vendor/symfony/finder/Iterator/RecursiveDirectoryIterator.php deleted file mode 100644 index a18e618..0000000 --- a/tools/php-cs-fixer/vendor/symfony/finder/Iterator/RecursiveDirectoryIterator.php +++ /dev/null @@ -1,149 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder\Iterator; - -use Symfony\Component\Finder\Exception\AccessDeniedException; -use Symfony\Component\Finder\SplFileInfo; - -/** - * Extends the \RecursiveDirectoryIterator to support relative paths. - * - * @author Victor Berchet - */ -class RecursiveDirectoryIterator extends \RecursiveDirectoryIterator -{ - /** - * @var bool - */ - private $ignoreUnreadableDirs; - - /** - * @var bool - */ - private $rewindable; - - // these 3 properties take part of the performance optimization to avoid redoing the same work in all iterations - private $rootPath; - private $subPath; - private $directorySeparator = '/'; - - /** - * @throws \RuntimeException - */ - public function __construct(string $path, int $flags, bool $ignoreUnreadableDirs = false) - { - if ($flags & (self::CURRENT_AS_PATHNAME | self::CURRENT_AS_SELF)) { - throw new \RuntimeException('This iterator only support returning current as fileinfo.'); - } - - parent::__construct($path, $flags); - $this->ignoreUnreadableDirs = $ignoreUnreadableDirs; - $this->rootPath = $path; - if ('/' !== \DIRECTORY_SEPARATOR && !($flags & self::UNIX_PATHS)) { - $this->directorySeparator = \DIRECTORY_SEPARATOR; - } - } - - /** - * Return an instance of SplFileInfo with support for relative paths. - * - * @return SplFileInfo File information - */ - #[\ReturnTypeWillChange] - public function current() - { - // the logic here avoids redoing the same work in all iterations - - if (null === $subPathname = $this->subPath) { - $subPathname = $this->subPath = (string) $this->getSubPath(); - } - if ('' !== $subPathname) { - $subPathname .= $this->directorySeparator; - } - $subPathname .= $this->getFilename(); - - if ('/' !== $basePath = $this->rootPath) { - $basePath .= $this->directorySeparator; - } - - return new SplFileInfo($basePath.$subPathname, $this->subPath, $subPathname); - } - - /** - * @return \RecursiveIterator - * - * @throws AccessDeniedException - */ - #[\ReturnTypeWillChange] - public function getChildren() - { - try { - $children = parent::getChildren(); - - if ($children instanceof self) { - // parent method will call the constructor with default arguments, so unreadable dirs won't be ignored anymore - $children->ignoreUnreadableDirs = $this->ignoreUnreadableDirs; - - // performance optimization to avoid redoing the same work in all children - $children->rewindable = &$this->rewindable; - $children->rootPath = $this->rootPath; - } - - return $children; - } catch (\UnexpectedValueException $e) { - if ($this->ignoreUnreadableDirs) { - // If directory is unreadable and finder is set to ignore it, a fake empty content is returned. - return new \RecursiveArrayIterator([]); - } else { - throw new AccessDeniedException($e->getMessage(), $e->getCode(), $e); - } - } - } - - /** - * Do nothing for non rewindable stream. - * - * @return void - */ - #[\ReturnTypeWillChange] - public function rewind() - { - if (false === $this->isRewindable()) { - return; - } - - parent::rewind(); - } - - /** - * Checks if the stream is rewindable. - * - * @return bool true when the stream is rewindable, false otherwise - */ - public function isRewindable() - { - if (null !== $this->rewindable) { - return $this->rewindable; - } - - if (false !== $stream = @opendir($this->getPath())) { - $infos = stream_get_meta_data($stream); - closedir($stream); - - if ($infos['seekable']) { - return $this->rewindable = true; - } - } - - return $this->rewindable = false; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/finder/Iterator/SizeRangeFilterIterator.php b/tools/php-cs-fixer/vendor/symfony/finder/Iterator/SizeRangeFilterIterator.php deleted file mode 100644 index 4078f36..0000000 --- a/tools/php-cs-fixer/vendor/symfony/finder/Iterator/SizeRangeFilterIterator.php +++ /dev/null @@ -1,58 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder\Iterator; - -use Symfony\Component\Finder\Comparator\NumberComparator; - -/** - * SizeRangeFilterIterator filters out files that are not in the given size range. - * - * @author Fabien Potencier - */ -class SizeRangeFilterIterator extends \FilterIterator -{ - private $comparators = []; - - /** - * @param \Iterator $iterator The Iterator to filter - * @param NumberComparator[] $comparators An array of NumberComparator instances - */ - public function __construct(\Iterator $iterator, array $comparators) - { - $this->comparators = $comparators; - - parent::__construct($iterator); - } - - /** - * Filters the iterator values. - * - * @return bool true if the value should be kept, false otherwise - */ - #[\ReturnTypeWillChange] - public function accept() - { - $fileinfo = $this->current(); - if (!$fileinfo->isFile()) { - return true; - } - - $filesize = $fileinfo->getSize(); - foreach ($this->comparators as $compare) { - if (!$compare->test($filesize)) { - return false; - } - } - - return true; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/finder/Iterator/SortableIterator.php b/tools/php-cs-fixer/vendor/symfony/finder/Iterator/SortableIterator.php deleted file mode 100644 index 04ca8eb..0000000 --- a/tools/php-cs-fixer/vendor/symfony/finder/Iterator/SortableIterator.php +++ /dev/null @@ -1,101 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder\Iterator; - -/** - * SortableIterator applies a sort on a given Iterator. - * - * @author Fabien Potencier - */ -class SortableIterator implements \IteratorAggregate -{ - public const SORT_BY_NONE = 0; - public const SORT_BY_NAME = 1; - public const SORT_BY_TYPE = 2; - public const SORT_BY_ACCESSED_TIME = 3; - public const SORT_BY_CHANGED_TIME = 4; - public const SORT_BY_MODIFIED_TIME = 5; - public const SORT_BY_NAME_NATURAL = 6; - - private $iterator; - private $sort; - - /** - * @param int|callable $sort The sort type (SORT_BY_NAME, SORT_BY_TYPE, or a PHP callback) - * - * @throws \InvalidArgumentException - */ - public function __construct(\Traversable $iterator, $sort, bool $reverseOrder = false) - { - $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()); - }; - } 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()); - }; - } elseif (self::SORT_BY_TYPE === $sort) { - $this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use ($order) { - if ($a->isDir() && $b->isFile()) { - return -$order; - } elseif ($a->isFile() && $b->isDir()) { - return $order; - } - - 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()); - }; - } elseif (self::SORT_BY_CHANGED_TIME === $sort) { - $this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use ($order) { - return $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()); - }; - } 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); } : $sort; - } else { - throw new \InvalidArgumentException('The SortableIterator takes a PHP callable or a valid built-in sort algorithm as an argument.'); - } - } - - /** - * @return \Traversable - */ - #[\ReturnTypeWillChange] - public function getIterator() - { - if (1 === $this->sort) { - return $this->iterator; - } - - $array = iterator_to_array($this->iterator, true); - - if (-1 === $this->sort) { - $array = array_reverse($array); - } else { - uasort($array, $this->sort); - } - - return new \ArrayIterator($array); - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/finder/LICENSE b/tools/php-cs-fixer/vendor/symfony/finder/LICENSE deleted file mode 100644 index 9ff2d0d..0000000 --- a/tools/php-cs-fixer/vendor/symfony/finder/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2004-2021 Fabien Potencier - -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/tools/php-cs-fixer/vendor/symfony/finder/README.md b/tools/php-cs-fixer/vendor/symfony/finder/README.md deleted file mode 100644 index 22bdeb9..0000000 --- a/tools/php-cs-fixer/vendor/symfony/finder/README.md +++ /dev/null @@ -1,14 +0,0 @@ -Finder Component -================ - -The Finder component finds files and directories via an intuitive fluent -interface. - -Resources ---------- - - * [Documentation](https://symfony.com/doc/current/components/finder.html) - * [Contributing](https://symfony.com/doc/current/contributing/index.html) - * [Report issues](https://github.com/symfony/symfony/issues) and - [send Pull Requests](https://github.com/symfony/symfony/pulls) - in the [main Symfony repository](https://github.com/symfony/symfony) diff --git a/tools/php-cs-fixer/vendor/symfony/finder/SplFileInfo.php b/tools/php-cs-fixer/vendor/symfony/finder/SplFileInfo.php deleted file mode 100644 index 62c9faa..0000000 --- a/tools/php-cs-fixer/vendor/symfony/finder/SplFileInfo.php +++ /dev/null @@ -1,85 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder; - -/** - * Extends \SplFileInfo to support relative paths. - * - * @author Fabien Potencier - */ -class SplFileInfo extends \SplFileInfo -{ - private $relativePath; - private $relativePathname; - - /** - * @param string $file The file name - * @param string $relativePath The relative path - * @param string $relativePathname The relative path name - */ - public function __construct(string $file, string $relativePath, string $relativePathname) - { - parent::__construct($file); - $this->relativePath = $relativePath; - $this->relativePathname = $relativePathname; - } - - /** - * Returns the relative path. - * - * This path does not contain the file name. - * - * @return string the relative path - */ - public function getRelativePath() - { - return $this->relativePath; - } - - /** - * Returns the relative path name. - * - * This path contains the file name. - * - * @return string the relative path name - */ - public function getRelativePathname() - { - return $this->relativePathname; - } - - public function getFilenameWithoutExtension(): string - { - $filename = $this->getFilename(); - - return pathinfo($filename, \PATHINFO_FILENAME); - } - - /** - * Returns the contents of the file. - * - * @return string the contents of the file - * - * @throws \RuntimeException - */ - public function getContents() - { - set_error_handler(function ($type, $msg) use (&$error) { $error = $msg; }); - $content = file_get_contents($this->getPathname()); - restore_error_handler(); - if (false === $content) { - throw new \RuntimeException($error); - } - - return $content; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/finder/composer.json b/tools/php-cs-fixer/vendor/symfony/finder/composer.json deleted file mode 100644 index deccde8..0000000 --- a/tools/php-cs-fixer/vendor/symfony/finder/composer.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "symfony/finder", - "type": "library", - "description": "Finds files and directories via an intuitive fluent interface", - "keywords": [], - "homepage": "https://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.16" - }, - "autoload": { - "psr-4": { "Symfony\\Component\\Finder\\": "" }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "minimum-stability": "dev" -} diff --git a/tools/php-cs-fixer/vendor/symfony/options-resolver/CHANGELOG.md b/tools/php-cs-fixer/vendor/symfony/options-resolver/CHANGELOG.md deleted file mode 100644 index 84c4594..0000000 --- a/tools/php-cs-fixer/vendor/symfony/options-resolver/CHANGELOG.md +++ /dev/null @@ -1,81 +0,0 @@ -CHANGELOG -========= - -5.3 ---- - - * Add prototype definition for nested options - -5.1.0 ------ - - * added fluent configuration of options using `OptionResolver::define()` - * added `setInfo()` and `getInfo()` methods - * updated the signature of method `OptionsResolver::setDeprecated()` to `OptionsResolver::setDeprecation(string $option, string $package, string $version, $message)` - * deprecated `OptionsResolverIntrospector::getDeprecationMessage()`, use `OptionsResolverIntrospector::getDeprecation()` instead - -5.0.0 ------ - - * added argument `$triggerDeprecation` to `OptionsResolver::offsetGet()` - -4.3.0 ------ - - * added `OptionsResolver::addNormalizer` method - -4.2.0 ------ - - * added support for nested options definition - * added `setDeprecated` and `isDeprecated` methods - -3.4.0 ------ - - * added `OptionsResolverIntrospector` to inspect options definitions inside an `OptionsResolver` instance - * added array of types support in allowed types (e.g int[]) - -2.6.0 ------ - - * deprecated OptionsResolverInterface - * [BC BREAK] removed "array" type hint from OptionsResolverInterface methods - setRequired(), setAllowedValues(), addAllowedValues(), setAllowedTypes() and - addAllowedTypes() - * added OptionsResolver::setDefault() - * added OptionsResolver::hasDefault() - * added OptionsResolver::setNormalizer() - * added OptionsResolver::isRequired() - * added OptionsResolver::getRequiredOptions() - * added OptionsResolver::isMissing() - * added OptionsResolver::getMissingOptions() - * added OptionsResolver::setDefined() - * added OptionsResolver::isDefined() - * added OptionsResolver::getDefinedOptions() - * added OptionsResolver::remove() - * added OptionsResolver::clear() - * deprecated OptionsResolver::replaceDefaults() - * deprecated OptionsResolver::setOptional() in favor of setDefined() - * deprecated OptionsResolver::isKnown() in favor of isDefined() - * [BC BREAK] OptionsResolver::isRequired() returns true now if a required - option has a default value set - * [BC BREAK] merged Options into OptionsResolver and turned Options into an - interface - * deprecated Options::overload() (now in OptionsResolver) - * deprecated Options::set() (now in OptionsResolver) - * deprecated Options::get() (now in OptionsResolver) - * deprecated Options::has() (now in OptionsResolver) - * deprecated Options::replace() (now in OptionsResolver) - * [BC BREAK] Options::get() (now in OptionsResolver) can only be used within - lazy option/normalizer closures now - * [BC BREAK] removed Traversable interface from Options since using within - lazy option/normalizer closures resulted in exceptions - * [BC BREAK] removed Options::all() since using within lazy option/normalizer - closures resulted in exceptions - * [BC BREAK] OptionDefinitionException now extends LogicException instead of - RuntimeException - * [BC BREAK] normalizers are not executed anymore for unset options - * normalizers are executed after validating the options now - * [BC BREAK] an UndefinedOptionsException is now thrown instead of an - InvalidOptionsException when non-existing options are passed diff --git a/tools/php-cs-fixer/vendor/symfony/options-resolver/Debug/OptionsResolverIntrospector.php b/tools/php-cs-fixer/vendor/symfony/options-resolver/Debug/OptionsResolverIntrospector.php deleted file mode 100644 index 95909f3..0000000 --- a/tools/php-cs-fixer/vendor/symfony/options-resolver/Debug/OptionsResolverIntrospector.php +++ /dev/null @@ -1,120 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\OptionsResolver\Debug; - -use Symfony\Component\OptionsResolver\Exception\NoConfigurationException; -use Symfony\Component\OptionsResolver\Exception\UndefinedOptionsException; -use Symfony\Component\OptionsResolver\OptionsResolver; - -/** - * @author Maxime Steinhausser - * - * @final - */ -class OptionsResolverIntrospector -{ - private $get; - - public function __construct(OptionsResolver $optionsResolver) - { - $this->get = \Closure::bind(function ($property, $option, $message) { - /** @var OptionsResolver $this */ - if (!$this->isDefined($option)) { - throw new UndefinedOptionsException(sprintf('The option "%s" does not exist.', $option)); - } - - if (!\array_key_exists($option, $this->{$property})) { - throw new NoConfigurationException($message); - } - - return $this->{$property}[$option]; - }, $optionsResolver, $optionsResolver); - } - - /** - * @return mixed - * - * @throws NoConfigurationException on no configured value - */ - public function getDefault(string $option) - { - return ($this->get)('defaults', $option, sprintf('No default value was set for the "%s" option.', $option)); - } - - /** - * @return \Closure[] - * - * @throws NoConfigurationException on no configured closures - */ - public function getLazyClosures(string $option): array - { - return ($this->get)('lazy', $option, sprintf('No lazy closures were set for the "%s" option.', $option)); - } - - /** - * @return string[] - * - * @throws NoConfigurationException on no configured types - */ - public function getAllowedTypes(string $option): array - { - return ($this->get)('allowedTypes', $option, sprintf('No allowed types were set for the "%s" option.', $option)); - } - - /** - * @return mixed[] - * - * @throws NoConfigurationException on no configured values - */ - public function getAllowedValues(string $option): array - { - return ($this->get)('allowedValues', $option, sprintf('No allowed values were set for the "%s" option.', $option)); - } - - /** - * @throws NoConfigurationException on no configured normalizer - */ - public function getNormalizer(string $option): \Closure - { - return current($this->getNormalizers($option)); - } - - /** - * @throws NoConfigurationException when no normalizer is configured - */ - public function getNormalizers(string $option): array - { - return ($this->get)('normalizers', $option, sprintf('No normalizer was set for the "%s" option.', $option)); - } - - /** - * @return string|\Closure - * - * @throws NoConfigurationException on no configured deprecation - * - * @deprecated since Symfony 5.1, use "getDeprecation()" instead. - */ - public function getDeprecationMessage(string $option) - { - trigger_deprecation('symfony/options-resolver', '5.1', 'The "%s()" method is deprecated, use "getDeprecation()" instead.', __METHOD__); - - return $this->getDeprecation($option)['message']; - } - - /** - * @throws NoConfigurationException on no configured deprecation - */ - public function getDeprecation(string $option): array - { - return ($this->get)('deprecated', $option, sprintf('No deprecation was set for the "%s" option.', $option)); - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/options-resolver/Exception/AccessException.php b/tools/php-cs-fixer/vendor/symfony/options-resolver/Exception/AccessException.php deleted file mode 100644 index c12b680..0000000 --- a/tools/php-cs-fixer/vendor/symfony/options-resolver/Exception/AccessException.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\OptionsResolver\Exception; - -/** - * Thrown when trying to read an option outside of or write it inside of - * {@link \Symfony\Component\OptionsResolver\Options::resolve()}. - * - * @author Bernhard Schussek - */ -class AccessException extends \LogicException implements ExceptionInterface -{ -} diff --git a/tools/php-cs-fixer/vendor/symfony/options-resolver/Exception/ExceptionInterface.php b/tools/php-cs-fixer/vendor/symfony/options-resolver/Exception/ExceptionInterface.php deleted file mode 100644 index ea99d05..0000000 --- a/tools/php-cs-fixer/vendor/symfony/options-resolver/Exception/ExceptionInterface.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\OptionsResolver\Exception; - -/** - * Marker interface for all exceptions thrown by the OptionsResolver component. - * - * @author Bernhard Schussek - */ -interface ExceptionInterface extends \Throwable -{ -} diff --git a/tools/php-cs-fixer/vendor/symfony/options-resolver/Exception/InvalidArgumentException.php b/tools/php-cs-fixer/vendor/symfony/options-resolver/Exception/InvalidArgumentException.php deleted file mode 100644 index 6d421d6..0000000 --- a/tools/php-cs-fixer/vendor/symfony/options-resolver/Exception/InvalidArgumentException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\OptionsResolver\Exception; - -/** - * Thrown when an argument is invalid. - * - * @author Bernhard Schussek - */ -class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface -{ -} diff --git a/tools/php-cs-fixer/vendor/symfony/options-resolver/Exception/InvalidOptionsException.php b/tools/php-cs-fixer/vendor/symfony/options-resolver/Exception/InvalidOptionsException.php deleted file mode 100644 index 6fd4f12..0000000 --- a/tools/php-cs-fixer/vendor/symfony/options-resolver/Exception/InvalidOptionsException.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\OptionsResolver\Exception; - -/** - * Thrown when the value of an option does not match its validation rules. - * - * You should make sure a valid value is passed to the option. - * - * @author Bernhard Schussek - */ -class InvalidOptionsException extends InvalidArgumentException -{ -} diff --git a/tools/php-cs-fixer/vendor/symfony/options-resolver/Exception/MissingOptionsException.php b/tools/php-cs-fixer/vendor/symfony/options-resolver/Exception/MissingOptionsException.php deleted file mode 100644 index faa487f..0000000 --- a/tools/php-cs-fixer/vendor/symfony/options-resolver/Exception/MissingOptionsException.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\OptionsResolver\Exception; - -/** - * Exception thrown when a required option is missing. - * - * Add the option to the passed options array. - * - * @author Bernhard Schussek - */ -class MissingOptionsException extends InvalidArgumentException -{ -} diff --git a/tools/php-cs-fixer/vendor/symfony/options-resolver/Exception/NoConfigurationException.php b/tools/php-cs-fixer/vendor/symfony/options-resolver/Exception/NoConfigurationException.php deleted file mode 100644 index 6693ec1..0000000 --- a/tools/php-cs-fixer/vendor/symfony/options-resolver/Exception/NoConfigurationException.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\OptionsResolver\Exception; - -use Symfony\Component\OptionsResolver\Debug\OptionsResolverIntrospector; - -/** - * Thrown when trying to introspect an option definition property - * for which no value was configured inside the OptionsResolver instance. - * - * @see OptionsResolverIntrospector - * - * @author Maxime Steinhausser - */ -class NoConfigurationException extends \RuntimeException implements ExceptionInterface -{ -} diff --git a/tools/php-cs-fixer/vendor/symfony/options-resolver/Exception/NoSuchOptionException.php b/tools/php-cs-fixer/vendor/symfony/options-resolver/Exception/NoSuchOptionException.php deleted file mode 100644 index 4c3280f..0000000 --- a/tools/php-cs-fixer/vendor/symfony/options-resolver/Exception/NoSuchOptionException.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\OptionsResolver\Exception; - -/** - * Thrown when trying to read an option that has no value set. - * - * When accessing optional options from within a lazy option or normalizer you should first - * check whether the optional option is set. You can do this with `isset($options['optional'])`. - * In contrast to the {@link UndefinedOptionsException}, this is a runtime exception that can - * occur when evaluating lazy options. - * - * @author Tobias Schultze - */ -class NoSuchOptionException extends \OutOfBoundsException implements ExceptionInterface -{ -} diff --git a/tools/php-cs-fixer/vendor/symfony/options-resolver/Exception/OptionDefinitionException.php b/tools/php-cs-fixer/vendor/symfony/options-resolver/Exception/OptionDefinitionException.php deleted file mode 100644 index e8e339d..0000000 --- a/tools/php-cs-fixer/vendor/symfony/options-resolver/Exception/OptionDefinitionException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\OptionsResolver\Exception; - -/** - * Thrown when two lazy options have a cyclic dependency. - * - * @author Bernhard Schussek - */ -class OptionDefinitionException extends \LogicException implements ExceptionInterface -{ -} diff --git a/tools/php-cs-fixer/vendor/symfony/options-resolver/Exception/UndefinedOptionsException.php b/tools/php-cs-fixer/vendor/symfony/options-resolver/Exception/UndefinedOptionsException.php deleted file mode 100644 index 6ca3fce..0000000 --- a/tools/php-cs-fixer/vendor/symfony/options-resolver/Exception/UndefinedOptionsException.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\OptionsResolver\Exception; - -/** - * Exception thrown when an undefined option is passed. - * - * You should remove the options in question from your code or define them - * beforehand. - * - * @author Bernhard Schussek - */ -class UndefinedOptionsException extends InvalidArgumentException -{ -} diff --git a/tools/php-cs-fixer/vendor/symfony/options-resolver/LICENSE b/tools/php-cs-fixer/vendor/symfony/options-resolver/LICENSE deleted file mode 100644 index 9ff2d0d..0000000 --- a/tools/php-cs-fixer/vendor/symfony/options-resolver/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2004-2021 Fabien Potencier - -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/tools/php-cs-fixer/vendor/symfony/options-resolver/OptionConfigurator.php b/tools/php-cs-fixer/vendor/symfony/options-resolver/OptionConfigurator.php deleted file mode 100644 index 62f03d0..0000000 --- a/tools/php-cs-fixer/vendor/symfony/options-resolver/OptionConfigurator.php +++ /dev/null @@ -1,139 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\OptionsResolver; - -use Symfony\Component\OptionsResolver\Exception\AccessException; - -final class OptionConfigurator -{ - private $name; - private $resolver; - - public function __construct(string $name, OptionsResolver $resolver) - { - $this->name = $name; - $this->resolver = $resolver; - $this->resolver->setDefined($name); - } - - /** - * Adds allowed types for this option. - * - * @return $this - * - * @throws AccessException If called from a lazy option or normalizer - */ - public function allowedTypes(string ...$types): self - { - $this->resolver->setAllowedTypes($this->name, $types); - - return $this; - } - - /** - * Sets allowed values for this option. - * - * @param mixed ...$values One or more acceptable values/closures - * - * @return $this - * - * @throws AccessException If called from a lazy option or normalizer - */ - public function allowedValues(...$values): self - { - $this->resolver->setAllowedValues($this->name, $values); - - return $this; - } - - /** - * Sets the default value for this option. - * - * @param mixed $value The default value of the option - * - * @return $this - * - * @throws AccessException If called from a lazy option or normalizer - */ - public function default($value): self - { - $this->resolver->setDefault($this->name, $value); - - return $this; - } - - /** - * Defines an option configurator with the given name. - */ - public function define(string $option): self - { - return $this->resolver->define($option); - } - - /** - * Marks this option as deprecated. - * - * @param string $package The name of the composer package that is triggering the deprecation - * @param string $version The version of the package that introduced the deprecation - * @param string|\Closure $message The deprecation message to use - * - * @return $this - */ - public function deprecated(string $package, string $version, $message = 'The option "%name%" is deprecated.'): self - { - $this->resolver->setDeprecated($this->name, $package, $version, $message); - - return $this; - } - - /** - * Sets the normalizer for this option. - * - * @return $this - * - * @throws AccessException If called from a lazy option or normalizer - */ - public function normalize(\Closure $normalizer): self - { - $this->resolver->setNormalizer($this->name, $normalizer); - - return $this; - } - - /** - * Marks this option as required. - * - * @return $this - * - * @throws AccessException If called from a lazy option or normalizer - */ - public function required(): self - { - $this->resolver->setRequired($this->name); - - return $this; - } - - /** - * Sets an info message for an option. - * - * @return $this - * - * @throws AccessException If called from a lazy option or normalizer - */ - public function info(string $info): self - { - $this->resolver->setInfo($this->name, $info); - - return $this; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/options-resolver/Options.php b/tools/php-cs-fixer/vendor/symfony/options-resolver/Options.php deleted file mode 100644 index d444ec4..0000000 --- a/tools/php-cs-fixer/vendor/symfony/options-resolver/Options.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\OptionsResolver; - -/** - * Contains resolved option values. - * - * @author Bernhard Schussek - * @author Tobias Schultze - */ -interface Options extends \ArrayAccess, \Countable -{ -} diff --git a/tools/php-cs-fixer/vendor/symfony/options-resolver/OptionsResolver.php b/tools/php-cs-fixer/vendor/symfony/options-resolver/OptionsResolver.php deleted file mode 100644 index bb95548..0000000 --- a/tools/php-cs-fixer/vendor/symfony/options-resolver/OptionsResolver.php +++ /dev/null @@ -1,1347 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\OptionsResolver; - -use Symfony\Component\OptionsResolver\Exception\AccessException; -use Symfony\Component\OptionsResolver\Exception\InvalidArgumentException; -use Symfony\Component\OptionsResolver\Exception\InvalidOptionsException; -use Symfony\Component\OptionsResolver\Exception\MissingOptionsException; -use Symfony\Component\OptionsResolver\Exception\NoSuchOptionException; -use Symfony\Component\OptionsResolver\Exception\OptionDefinitionException; -use Symfony\Component\OptionsResolver\Exception\UndefinedOptionsException; - -/** - * Validates options and merges them with default values. - * - * @author Bernhard Schussek - * @author Tobias Schultze - */ -class OptionsResolver implements Options -{ - private const VALIDATION_FUNCTIONS = [ - 'bool' => 'is_bool', - 'boolean' => 'is_bool', - 'int' => 'is_int', - 'integer' => 'is_int', - 'long' => 'is_int', - 'float' => 'is_float', - 'double' => 'is_float', - 'real' => 'is_float', - 'numeric' => 'is_numeric', - 'string' => 'is_string', - 'scalar' => 'is_scalar', - 'array' => 'is_array', - 'iterable' => 'is_iterable', - 'countable' => 'is_countable', - 'callable' => 'is_callable', - 'object' => 'is_object', - 'resource' => 'is_resource', - ]; - - /** - * The names of all defined options. - */ - private $defined = []; - - /** - * The default option values. - */ - private $defaults = []; - - /** - * A list of closure for nested options. - * - * @var \Closure[][] - */ - private $nested = []; - - /** - * The names of required options. - */ - private $required = []; - - /** - * The resolved option values. - */ - private $resolved = []; - - /** - * A list of normalizer closures. - * - * @var \Closure[][] - */ - private $normalizers = []; - - /** - * A list of accepted values for each option. - */ - private $allowedValues = []; - - /** - * A list of accepted types for each option. - */ - private $allowedTypes = []; - - /** - * A list of info messages for each option. - */ - private $info = []; - - /** - * A list of closures for evaluating lazy options. - */ - private $lazy = []; - - /** - * A list of lazy options whose closure is currently being called. - * - * This list helps detecting circular dependencies between lazy options. - */ - private $calling = []; - - /** - * A list of deprecated options. - */ - private $deprecated = []; - - /** - * The list of options provided by the user. - */ - private $given = []; - - /** - * Whether the instance is locked for reading. - * - * Once locked, the options cannot be changed anymore. This is - * necessary in order to avoid inconsistencies during the resolving - * process. If any option is changed after being read, all evaluated - * lazy options that depend on this option would become invalid. - */ - private $locked = false; - - private $parentsOptions = []; - - /** - * Whether the whole options definition is marked as array prototype. - */ - private $prototype; - - /** - * The prototype array's index that is being read. - */ - private $prototypeIndex; - - /** - * Sets the default value of a given option. - * - * If the default value should be set based on other options, you can pass - * a closure with the following signature: - * - * function (Options $options) { - * // ... - * } - * - * The closure will be evaluated when {@link resolve()} is called. The - * closure has access to the resolved values of other options through the - * passed {@link Options} instance: - * - * function (Options $options) { - * if (isset($options['port'])) { - * // ... - * } - * } - * - * If you want to access the previously set default value, add a second - * argument to the closure's signature: - * - * $options->setDefault('name', 'Default Name'); - * - * $options->setDefault('name', function (Options $options, $previousValue) { - * // 'Default Name' === $previousValue - * }); - * - * This is mostly useful if the configuration of the {@link Options} object - * is spread across different locations of your code, such as base and - * sub-classes. - * - * If you want to define nested options, you can pass a closure with the - * following signature: - * - * $options->setDefault('database', function (OptionsResolver $resolver) { - * $resolver->setDefined(['dbname', 'host', 'port', 'user', 'pass']); - * } - * - * To get access to the parent options, add a second argument to the closure's - * signature: - * - * function (OptionsResolver $resolver, Options $parent) { - * // 'default' === $parent['connection'] - * } - * - * @param string $option The name of the option - * @param mixed $value The default value of the option - * - * @return $this - * - * @throws AccessException If called from a lazy option or normalizer - */ - public function setDefault(string $option, $value) - { - // Setting is not possible once resolving starts, because then lazy - // options could manipulate the state of the object, leading to - // inconsistent results. - if ($this->locked) { - throw new AccessException('Default values cannot be set from a lazy option or normalizer.'); - } - - // If an option is a closure that should be evaluated lazily, store it - // in the "lazy" property. - if ($value instanceof \Closure) { - $reflClosure = new \ReflectionFunction($value); - $params = $reflClosure->getParameters(); - - if (isset($params[0]) && Options::class === $this->getParameterClassName($params[0])) { - // Initialize the option if no previous value exists - if (!isset($this->defaults[$option])) { - $this->defaults[$option] = null; - } - - // Ignore previous lazy options if the closure has no second parameter - if (!isset($this->lazy[$option]) || !isset($params[1])) { - $this->lazy[$option] = []; - } - - // Store closure for later evaluation - $this->lazy[$option][] = $value; - $this->defined[$option] = true; - - // Make sure the option is processed and is not nested anymore - unset($this->resolved[$option], $this->nested[$option]); - - return $this; - } - - if (isset($params[0]) && null !== ($type = $params[0]->getType()) && self::class === $type->getName() && (!isset($params[1]) || (($type = $params[1]->getType()) instanceof \ReflectionNamedType && Options::class === $type->getName()))) { - // Store closure for later evaluation - $this->nested[$option][] = $value; - $this->defaults[$option] = []; - $this->defined[$option] = true; - - // Make sure the option is processed and is not lazy anymore - unset($this->resolved[$option], $this->lazy[$option]); - - return $this; - } - } - - // This option is not lazy nor nested anymore - unset($this->lazy[$option], $this->nested[$option]); - - // Yet undefined options can be marked as resolved, because we only need - // to resolve options with lazy closures, normalizers or validation - // rules, none of which can exist for undefined options - // If the option was resolved before, update the resolved value - if (!isset($this->defined[$option]) || \array_key_exists($option, $this->resolved)) { - $this->resolved[$option] = $value; - } - - $this->defaults[$option] = $value; - $this->defined[$option] = true; - - return $this; - } - - /** - * @return $this - * - * @throws AccessException If called from a lazy option or normalizer - */ - public function setDefaults(array $defaults) - { - foreach ($defaults as $option => $value) { - $this->setDefault($option, $value); - } - - return $this; - } - - /** - * Returns whether a default value is set for an option. - * - * Returns true if {@link setDefault()} was called for this option. - * An option is also considered set if it was set to null. - * - * @return bool Whether a default value is set - */ - public function hasDefault(string $option) - { - return \array_key_exists($option, $this->defaults); - } - - /** - * Marks one or more options as required. - * - * @param string|string[] $optionNames One or more option names - * - * @return $this - * - * @throws AccessException If called from a lazy option or normalizer - */ - public function setRequired($optionNames) - { - if ($this->locked) { - throw new AccessException('Options cannot be made required from a lazy option or normalizer.'); - } - - foreach ((array) $optionNames as $option) { - $this->defined[$option] = true; - $this->required[$option] = true; - } - - return $this; - } - - /** - * Returns whether an option is required. - * - * An option is required if it was passed to {@link setRequired()}. - * - * @return bool Whether the option is required - */ - public function isRequired(string $option) - { - return isset($this->required[$option]); - } - - /** - * Returns the names of all required options. - * - * @return string[] The names of the required options - * - * @see isRequired() - */ - public function getRequiredOptions() - { - return array_keys($this->required); - } - - /** - * Returns whether an option is missing a default value. - * - * An option is missing if it was passed to {@link setRequired()}, but not - * to {@link setDefault()}. This option must be passed explicitly to - * {@link resolve()}, otherwise an exception will be thrown. - * - * @return bool Whether the option is missing - */ - public function isMissing(string $option) - { - return isset($this->required[$option]) && !\array_key_exists($option, $this->defaults); - } - - /** - * Returns the names of all options missing a default value. - * - * @return string[] The names of the missing options - * - * @see isMissing() - */ - public function getMissingOptions() - { - return array_keys(array_diff_key($this->required, $this->defaults)); - } - - /** - * Defines a valid option name. - * - * Defines an option name without setting a default value. The option will - * be accepted when passed to {@link resolve()}. When not passed, the - * option will not be included in the resolved options. - * - * @param string|string[] $optionNames One or more option names - * - * @return $this - * - * @throws AccessException If called from a lazy option or normalizer - */ - public function setDefined($optionNames) - { - if ($this->locked) { - throw new AccessException('Options cannot be defined from a lazy option or normalizer.'); - } - - foreach ((array) $optionNames as $option) { - $this->defined[$option] = true; - } - - return $this; - } - - /** - * Returns whether an option is defined. - * - * Returns true for any option passed to {@link setDefault()}, - * {@link setRequired()} or {@link setDefined()}. - * - * @return bool Whether the option is defined - */ - public function isDefined(string $option) - { - return isset($this->defined[$option]); - } - - /** - * Returns the names of all defined options. - * - * @return string[] The names of the defined options - * - * @see isDefined() - */ - public function getDefinedOptions() - { - return array_keys($this->defined); - } - - public function isNested(string $option): bool - { - return isset($this->nested[$option]); - } - - /** - * Deprecates an option, allowed types or values. - * - * Instead of passing the message, you may also pass a closure with the - * following signature: - * - * function (Options $options, $value): string { - * // ... - * } - * - * The closure receives the value as argument and should return a string. - * Return an empty string to ignore the option deprecation. - * - * The closure is invoked when {@link resolve()} is called. The parameter - * passed to the closure is the value of the option after validating it - * and before normalizing it. - * - * @param string $package The name of the composer package that is triggering the deprecation - * @param string $version The version of the package that introduced the deprecation - * @param string|\Closure $message The deprecation message to use - */ - public function setDeprecated(string $option/*, string $package, string $version, $message = 'The option "%name%" is deprecated.' */): self - { - if ($this->locked) { - throw new AccessException('Options cannot be deprecated from a lazy option or normalizer.'); - } - - if (!isset($this->defined[$option])) { - throw new UndefinedOptionsException(sprintf('The option "%s" does not exist, defined options are: "%s".', $this->formatOptions([$option]), implode('", "', array_keys($this->defined)))); - } - - $args = \func_get_args(); - - if (\func_num_args() < 3) { - trigger_deprecation('symfony/options-resolver', '5.1', 'The signature of method "%s()" requires 2 new arguments: "string $package, string $version", not defining them is deprecated.', __METHOD__); - - $message = $args[1] ?? 'The option "%name%" is deprecated.'; - $package = $version = ''; - } else { - $package = $args[1]; - $version = $args[2]; - $message = $args[3] ?? 'The option "%name%" is deprecated.'; - } - - if (!\is_string($message) && !$message instanceof \Closure) { - throw new InvalidArgumentException(sprintf('Invalid type for deprecation message argument, expected string or \Closure, but got "%s".', get_debug_type($message))); - } - - // ignore if empty string - if ('' === $message) { - return $this; - } - - $this->deprecated[$option] = [ - 'package' => $package, - 'version' => $version, - 'message' => $message, - ]; - - // Make sure the option is processed - unset($this->resolved[$option]); - - return $this; - } - - public function isDeprecated(string $option): bool - { - return isset($this->deprecated[$option]); - } - - /** - * Sets the normalizer for an option. - * - * The normalizer should be a closure with the following signature: - * - * function (Options $options, $value) { - * // ... - * } - * - * The closure is invoked when {@link resolve()} is called. The closure - * has access to the resolved values of other options through the passed - * {@link Options} instance. - * - * The second parameter passed to the closure is the value of - * the option. - * - * The resolved option value is set to the return value of the closure. - * - * @return $this - * - * @throws UndefinedOptionsException If the option is undefined - * @throws AccessException If called from a lazy option or normalizer - */ - public function setNormalizer(string $option, \Closure $normalizer) - { - if ($this->locked) { - throw new AccessException('Normalizers cannot be set from a lazy option or normalizer.'); - } - - if (!isset($this->defined[$option])) { - throw new UndefinedOptionsException(sprintf('The option "%s" does not exist. Defined options are: "%s".', $this->formatOptions([$option]), implode('", "', array_keys($this->defined)))); - } - - $this->normalizers[$option] = [$normalizer]; - - // Make sure the option is processed - unset($this->resolved[$option]); - - return $this; - } - - /** - * Adds a normalizer for an option. - * - * The normalizer should be a closure with the following signature: - * - * function (Options $options, $value): mixed { - * // ... - * } - * - * The closure is invoked when {@link resolve()} is called. The closure - * has access to the resolved values of other options through the passed - * {@link Options} instance. - * - * The second parameter passed to the closure is the value of - * the option. - * - * The resolved option value is set to the return value of the closure. - * - * @return $this - * - * @throws UndefinedOptionsException If the option is undefined - * @throws AccessException If called from a lazy option or normalizer - */ - public function addNormalizer(string $option, \Closure $normalizer, bool $forcePrepend = false): self - { - if ($this->locked) { - throw new AccessException('Normalizers cannot be set from a lazy option or normalizer.'); - } - - if (!isset($this->defined[$option])) { - throw new UndefinedOptionsException(sprintf('The option "%s" does not exist. Defined options are: "%s".', $this->formatOptions([$option]), implode('", "', array_keys($this->defined)))); - } - - if ($forcePrepend) { - $this->normalizers[$option] = $this->normalizers[$option] ?? []; - array_unshift($this->normalizers[$option], $normalizer); - } else { - $this->normalizers[$option][] = $normalizer; - } - - // Make sure the option is processed - unset($this->resolved[$option]); - - return $this; - } - - /** - * Sets allowed values for an option. - * - * Instead of passing values, you may also pass a closures with the - * following signature: - * - * function ($value) { - * // return true or false - * } - * - * The closure receives the value as argument and should return true to - * accept the value and false to reject the value. - * - * @param string $option The option name - * @param mixed $allowedValues One or more acceptable values/closures - * - * @return $this - * - * @throws UndefinedOptionsException If the option is undefined - * @throws AccessException If called from a lazy option or normalizer - */ - public function setAllowedValues(string $option, $allowedValues) - { - if ($this->locked) { - throw new AccessException('Allowed values cannot be set from a lazy option or normalizer.'); - } - - if (!isset($this->defined[$option])) { - throw new UndefinedOptionsException(sprintf('The option "%s" does not exist. Defined options are: "%s".', $this->formatOptions([$option]), implode('", "', array_keys($this->defined)))); - } - - $this->allowedValues[$option] = \is_array($allowedValues) ? $allowedValues : [$allowedValues]; - - // Make sure the option is processed - unset($this->resolved[$option]); - - return $this; - } - - /** - * Adds allowed values for an option. - * - * The values are merged with the allowed values defined previously. - * - * Instead of passing values, you may also pass a closures with the - * following signature: - * - * function ($value) { - * // return true or false - * } - * - * The closure receives the value as argument and should return true to - * accept the value and false to reject the value. - * - * @param string $option The option name - * @param mixed $allowedValues One or more acceptable values/closures - * - * @return $this - * - * @throws UndefinedOptionsException If the option is undefined - * @throws AccessException If called from a lazy option or normalizer - */ - public function addAllowedValues(string $option, $allowedValues) - { - if ($this->locked) { - throw new AccessException('Allowed values cannot be added from a lazy option or normalizer.'); - } - - if (!isset($this->defined[$option])) { - throw new UndefinedOptionsException(sprintf('The option "%s" does not exist. Defined options are: "%s".', $this->formatOptions([$option]), implode('", "', array_keys($this->defined)))); - } - - if (!\is_array($allowedValues)) { - $allowedValues = [$allowedValues]; - } - - if (!isset($this->allowedValues[$option])) { - $this->allowedValues[$option] = $allowedValues; - } else { - $this->allowedValues[$option] = array_merge($this->allowedValues[$option], $allowedValues); - } - - // Make sure the option is processed - unset($this->resolved[$option]); - - return $this; - } - - /** - * Sets allowed types for an option. - * - * Any type for which a corresponding is_() function exists is - * acceptable. Additionally, fully-qualified class or interface names may - * be passed. - * - * @param string|string[] $allowedTypes One or more accepted types - * - * @return $this - * - * @throws UndefinedOptionsException If the option is undefined - * @throws AccessException If called from a lazy option or normalizer - */ - public function setAllowedTypes(string $option, $allowedTypes) - { - if ($this->locked) { - throw new AccessException('Allowed types cannot be set from a lazy option or normalizer.'); - } - - if (!isset($this->defined[$option])) { - throw new UndefinedOptionsException(sprintf('The option "%s" does not exist. Defined options are: "%s".', $this->formatOptions([$option]), implode('", "', array_keys($this->defined)))); - } - - $this->allowedTypes[$option] = (array) $allowedTypes; - - // Make sure the option is processed - unset($this->resolved[$option]); - - return $this; - } - - /** - * Adds allowed types for an option. - * - * The types are merged with the allowed types defined previously. - * - * Any type for which a corresponding is_() function exists is - * acceptable. Additionally, fully-qualified class or interface names may - * be passed. - * - * @param string|string[] $allowedTypes One or more accepted types - * - * @return $this - * - * @throws UndefinedOptionsException If the option is undefined - * @throws AccessException If called from a lazy option or normalizer - */ - public function addAllowedTypes(string $option, $allowedTypes) - { - if ($this->locked) { - throw new AccessException('Allowed types cannot be added from a lazy option or normalizer.'); - } - - if (!isset($this->defined[$option])) { - throw new UndefinedOptionsException(sprintf('The option "%s" does not exist. Defined options are: "%s".', $this->formatOptions([$option]), implode('", "', array_keys($this->defined)))); - } - - if (!isset($this->allowedTypes[$option])) { - $this->allowedTypes[$option] = (array) $allowedTypes; - } else { - $this->allowedTypes[$option] = array_merge($this->allowedTypes[$option], (array) $allowedTypes); - } - - // Make sure the option is processed - unset($this->resolved[$option]); - - return $this; - } - - /** - * Defines an option configurator with the given name. - */ - public function define(string $option): OptionConfigurator - { - if (isset($this->defined[$option])) { - throw new OptionDefinitionException(sprintf('The option "%s" is already defined.', $option)); - } - - return new OptionConfigurator($option, $this); - } - - /** - * Sets an info message for an option. - * - * @return $this - * - * @throws UndefinedOptionsException If the option is undefined - * @throws AccessException If called from a lazy option or normalizer - */ - public function setInfo(string $option, string $info): self - { - if ($this->locked) { - throw new AccessException('The Info message cannot be set from a lazy option or normalizer.'); - } - - if (!isset($this->defined[$option])) { - throw new UndefinedOptionsException(sprintf('The option "%s" does not exist. Defined options are: "%s".', $this->formatOptions([$option]), implode('", "', array_keys($this->defined)))); - } - - $this->info[$option] = $info; - - return $this; - } - - /** - * Gets the info message for an option. - */ - public function getInfo(string $option): ?string - { - if (!isset($this->defined[$option])) { - throw new UndefinedOptionsException(sprintf('The option "%s" does not exist. Defined options are: "%s".', $this->formatOptions([$option]), implode('", "', array_keys($this->defined)))); - } - - return $this->info[$option] ?? null; - } - - /** - * Marks the whole options definition as array prototype. - * - * @return $this - * - * @throws AccessException If called from a lazy option, a normalizer or a root definition - */ - public function setPrototype(bool $prototype): self - { - if ($this->locked) { - throw new AccessException('The prototype property cannot be set from a lazy option or normalizer.'); - } - - if (null === $this->prototype && $prototype) { - throw new AccessException('The prototype property cannot be set from a root definition.'); - } - - $this->prototype = $prototype; - - return $this; - } - - public function isPrototype(): bool - { - return $this->prototype ?? false; - } - - /** - * Removes the option with the given name. - * - * Undefined options are ignored. - * - * @param string|string[] $optionNames One or more option names - * - * @return $this - * - * @throws AccessException If called from a lazy option or normalizer - */ - public function remove($optionNames) - { - if ($this->locked) { - throw new AccessException('Options cannot be removed from a lazy option or normalizer.'); - } - - foreach ((array) $optionNames as $option) { - unset($this->defined[$option], $this->defaults[$option], $this->required[$option], $this->resolved[$option]); - unset($this->lazy[$option], $this->normalizers[$option], $this->allowedTypes[$option], $this->allowedValues[$option], $this->info[$option]); - } - - return $this; - } - - /** - * Removes all options. - * - * @return $this - * - * @throws AccessException If called from a lazy option or normalizer - */ - public function clear() - { - if ($this->locked) { - throw new AccessException('Options cannot be cleared from a lazy option or normalizer.'); - } - - $this->defined = []; - $this->defaults = []; - $this->nested = []; - $this->required = []; - $this->resolved = []; - $this->lazy = []; - $this->normalizers = []; - $this->allowedTypes = []; - $this->allowedValues = []; - $this->deprecated = []; - $this->info = []; - - return $this; - } - - /** - * Merges options with the default values stored in the container and - * validates them. - * - * Exceptions are thrown if: - * - * - Undefined options are passed; - * - Required options are missing; - * - Options have invalid types; - * - Options have invalid values. - * - * @return array The merged and validated options - * - * @throws UndefinedOptionsException If an option name is undefined - * @throws InvalidOptionsException If an option doesn't fulfill the - * specified validation rules - * @throws MissingOptionsException If a required option is missing - * @throws OptionDefinitionException If there is a cyclic dependency between - * lazy options and/or normalizers - * @throws NoSuchOptionException If a lazy option reads an unavailable option - * @throws AccessException If called from a lazy option or normalizer - */ - public function resolve(array $options = []) - { - if ($this->locked) { - throw new AccessException('Options cannot be resolved from a lazy option or normalizer.'); - } - - // Allow this method to be called multiple times - $clone = clone $this; - - // Make sure that no unknown options are passed - $diff = array_diff_key($options, $clone->defined); - - if (\count($diff) > 0) { - ksort($clone->defined); - ksort($diff); - - throw new UndefinedOptionsException(sprintf((\count($diff) > 1 ? 'The options "%s" do not exist.' : 'The option "%s" does not exist.').' Defined options are: "%s".', $this->formatOptions(array_keys($diff)), implode('", "', array_keys($clone->defined)))); - } - - // Override options set by the user - foreach ($options as $option => $value) { - $clone->given[$option] = true; - $clone->defaults[$option] = $value; - unset($clone->resolved[$option], $clone->lazy[$option]); - } - - // Check whether any required option is missing - $diff = array_diff_key($clone->required, $clone->defaults); - - if (\count($diff) > 0) { - ksort($diff); - - throw new MissingOptionsException(sprintf(\count($diff) > 1 ? 'The required options "%s" are missing.' : 'The required option "%s" is missing.', $this->formatOptions(array_keys($diff)))); - } - - // Lock the container - $clone->locked = true; - - // Now process the individual options. Use offsetGet(), which resolves - // the option itself and any options that the option depends on - foreach ($clone->defaults as $option => $_) { - $clone->offsetGet($option); - } - - return $clone->resolved; - } - - /** - * Returns the resolved value of an option. - * - * @param bool $triggerDeprecation Whether to trigger the deprecation or not (true by default) - * - * @return mixed The option value - * - * @throws AccessException If accessing this method outside of - * {@link resolve()} - * @throws NoSuchOptionException If the option is not set - * @throws InvalidOptionsException If the option doesn't fulfill the - * specified validation rules - * @throws OptionDefinitionException If there is a cyclic dependency between - * lazy options and/or normalizers - */ - #[\ReturnTypeWillChange] - public function offsetGet($option, bool $triggerDeprecation = true) - { - if (!$this->locked) { - throw new AccessException('Array access is only supported within closures of lazy options and normalizers.'); - } - - // Shortcut for resolved options - if (isset($this->resolved[$option]) || \array_key_exists($option, $this->resolved)) { - if ($triggerDeprecation && isset($this->deprecated[$option]) && (isset($this->given[$option]) || $this->calling) && \is_string($this->deprecated[$option]['message'])) { - trigger_deprecation($this->deprecated[$option]['package'], $this->deprecated[$option]['version'], strtr($this->deprecated[$option]['message'], ['%name%' => $option])); - } - - return $this->resolved[$option]; - } - - // Check whether the option is set at all - if (!isset($this->defaults[$option]) && !\array_key_exists($option, $this->defaults)) { - if (!isset($this->defined[$option])) { - throw new NoSuchOptionException(sprintf('The option "%s" does not exist. Defined options are: "%s".', $this->formatOptions([$option]), implode('", "', array_keys($this->defined)))); - } - - throw new NoSuchOptionException(sprintf('The optional option "%s" has no value set. You should make sure it is set with "isset" before reading it.', $this->formatOptions([$option]))); - } - - $value = $this->defaults[$option]; - - // Resolve the option if it is a nested definition - if (isset($this->nested[$option])) { - // If the closure is already being called, we have a cyclic dependency - if (isset($this->calling[$option])) { - throw new OptionDefinitionException(sprintf('The options "%s" have a cyclic dependency.', $this->formatOptions(array_keys($this->calling)))); - } - - if (!\is_array($value)) { - throw new InvalidOptionsException(sprintf('The nested option "%s" with value %s is expected to be of type array, but is of type "%s".', $this->formatOptions([$option]), $this->formatValue($value), get_debug_type($value))); - } - - // The following section must be protected from cyclic calls. - $this->calling[$option] = true; - try { - $resolver = new self(); - $resolver->prototype = false; - $resolver->parentsOptions = $this->parentsOptions; - $resolver->parentsOptions[] = $option; - foreach ($this->nested[$option] as $closure) { - $closure($resolver, $this); - } - - if ($resolver->prototype) { - $values = []; - foreach ($value as $index => $prototypeValue) { - if (!\is_array($prototypeValue)) { - throw new InvalidOptionsException(sprintf('The value of the option "%s" is expected to be of type array of array, but is of type array of "%s".', $this->formatOptions([$option]), get_debug_type($prototypeValue))); - } - - $resolver->prototypeIndex = $index; - $values[$index] = $resolver->resolve($prototypeValue); - } - $value = $values; - } else { - $value = $resolver->resolve($value); - } - } finally { - $resolver->prototypeIndex = null; - unset($this->calling[$option]); - } - } - - // Resolve the option if the default value is lazily evaluated - if (isset($this->lazy[$option])) { - // If the closure is already being called, we have a cyclic - // dependency - if (isset($this->calling[$option])) { - throw new OptionDefinitionException(sprintf('The options "%s" have a cyclic dependency.', $this->formatOptions(array_keys($this->calling)))); - } - - // The following section must be protected from cyclic - // calls. Set $calling for the current $option to detect a cyclic - // dependency - // BEGIN - $this->calling[$option] = true; - try { - foreach ($this->lazy[$option] as $closure) { - $value = $closure($this, $value); - } - } finally { - unset($this->calling[$option]); - } - // END - } - - // Validate the type of the resolved option - if (isset($this->allowedTypes[$option])) { - $valid = true; - $invalidTypes = []; - - foreach ($this->allowedTypes[$option] as $type) { - if ($valid = $this->verifyTypes($type, $value, $invalidTypes)) { - break; - } - } - - if (!$valid) { - $fmtActualValue = $this->formatValue($value); - $fmtAllowedTypes = implode('" or "', $this->allowedTypes[$option]); - $fmtProvidedTypes = implode('|', array_keys($invalidTypes)); - $allowedContainsArrayType = \count(array_filter($this->allowedTypes[$option], static function ($item) { - return str_ends_with($item, '[]'); - })) > 0; - - if (\is_array($value) && $allowedContainsArrayType) { - throw new InvalidOptionsException(sprintf('The option "%s" with value %s is expected to be of type "%s", but one of the elements is of type "%s".', $this->formatOptions([$option]), $fmtActualValue, $fmtAllowedTypes, $fmtProvidedTypes)); - } - - throw new InvalidOptionsException(sprintf('The option "%s" with value %s is expected to be of type "%s", but is of type "%s".', $this->formatOptions([$option]), $fmtActualValue, $fmtAllowedTypes, $fmtProvidedTypes)); - } - } - - // Validate the value of the resolved option - if (isset($this->allowedValues[$option])) { - $success = false; - $printableAllowedValues = []; - - foreach ($this->allowedValues[$option] as $allowedValue) { - if ($allowedValue instanceof \Closure) { - if ($allowedValue($value)) { - $success = true; - break; - } - - // Don't include closures in the exception message - continue; - } - - if ($value === $allowedValue) { - $success = true; - break; - } - - $printableAllowedValues[] = $allowedValue; - } - - if (!$success) { - $message = sprintf( - 'The option "%s" with value %s is invalid.', - $option, - $this->formatValue($value) - ); - - if (\count($printableAllowedValues) > 0) { - $message .= sprintf( - ' Accepted values are: %s.', - $this->formatValues($printableAllowedValues) - ); - } - - if (isset($this->info[$option])) { - $message .= sprintf(' Info: %s.', $this->info[$option]); - } - - throw new InvalidOptionsException($message); - } - } - - // Check whether the option is deprecated - // and it is provided by the user or is being called from a lazy evaluation - if ($triggerDeprecation && isset($this->deprecated[$option]) && (isset($this->given[$option]) || ($this->calling && \is_string($this->deprecated[$option]['message'])))) { - $deprecation = $this->deprecated[$option]; - $message = $this->deprecated[$option]['message']; - - if ($message instanceof \Closure) { - // If the closure is already being called, we have a cyclic dependency - if (isset($this->calling[$option])) { - throw new OptionDefinitionException(sprintf('The options "%s" have a cyclic dependency.', $this->formatOptions(array_keys($this->calling)))); - } - - $this->calling[$option] = true; - try { - if (!\is_string($message = $message($this, $value))) { - throw new InvalidOptionsException(sprintf('Invalid type for deprecation message, expected string but got "%s", return an empty string to ignore.', get_debug_type($message))); - } - } finally { - unset($this->calling[$option]); - } - } - - if ('' !== $message) { - trigger_deprecation($deprecation['package'], $deprecation['version'], strtr($message, ['%name%' => $option])); - } - } - - // Normalize the validated option - if (isset($this->normalizers[$option])) { - // If the closure is already being called, we have a cyclic - // dependency - if (isset($this->calling[$option])) { - throw new OptionDefinitionException(sprintf('The options "%s" have a cyclic dependency.', $this->formatOptions(array_keys($this->calling)))); - } - - // The following section must be protected from cyclic - // calls. Set $calling for the current $option to detect a cyclic - // dependency - // BEGIN - $this->calling[$option] = true; - try { - foreach ($this->normalizers[$option] as $normalizer) { - $value = $normalizer($this, $value); - } - } finally { - unset($this->calling[$option]); - } - // END - } - - // Mark as resolved - $this->resolved[$option] = $value; - - return $value; - } - - private function verifyTypes(string $type, $value, array &$invalidTypes, int $level = 0): bool - { - if (\is_array($value) && '[]' === substr($type, -2)) { - $type = substr($type, 0, -2); - $valid = true; - - foreach ($value as $val) { - if (!$this->verifyTypes($type, $val, $invalidTypes, $level + 1)) { - $valid = false; - } - } - - return $valid; - } - - if (('null' === $type && null === $value) || (isset(self::VALIDATION_FUNCTIONS[$type]) ? self::VALIDATION_FUNCTIONS[$type]($value) : $value instanceof $type)) { - return true; - } - - if (!$invalidTypes || $level > 0) { - $invalidTypes[get_debug_type($value)] = true; - } - - return false; - } - - /** - * Returns whether a resolved option with the given name exists. - * - * @param string $option The option name - * - * @return bool Whether the option is set - * - * @throws AccessException If accessing this method outside of {@link resolve()} - * - * @see \ArrayAccess::offsetExists() - */ - #[\ReturnTypeWillChange] - public function offsetExists($option) - { - if (!$this->locked) { - throw new AccessException('Array access is only supported within closures of lazy options and normalizers.'); - } - - return \array_key_exists($option, $this->defaults); - } - - /** - * Not supported. - * - * @return void - * - * @throws AccessException - */ - #[\ReturnTypeWillChange] - public function offsetSet($option, $value) - { - throw new AccessException('Setting options via array access is not supported. Use setDefault() instead.'); - } - - /** - * Not supported. - * - * @return void - * - * @throws AccessException - */ - #[\ReturnTypeWillChange] - public function offsetUnset($option) - { - throw new AccessException('Removing options via array access is not supported. Use remove() instead.'); - } - - /** - * Returns the number of set options. - * - * This may be only a subset of the defined options. - * - * @return int Number of options - * - * @throws AccessException If accessing this method outside of {@link resolve()} - * - * @see \Countable::count() - */ - #[\ReturnTypeWillChange] - public function count() - { - if (!$this->locked) { - throw new AccessException('Counting is only supported within closures of lazy options and normalizers.'); - } - - return \count($this->defaults); - } - - /** - * Returns a string representation of the value. - * - * This method returns the equivalent PHP tokens for most scalar types - * (i.e. "false" for false, "1" for 1 etc.). Strings are always wrapped - * in double quotes ("). - * - * @param mixed $value The value to format as string - */ - private function formatValue($value): string - { - if (\is_object($value)) { - return \get_class($value); - } - - if (\is_array($value)) { - return 'array'; - } - - if (\is_string($value)) { - return '"'.$value.'"'; - } - - if (\is_resource($value)) { - return 'resource'; - } - - if (null === $value) { - return 'null'; - } - - if (false === $value) { - return 'false'; - } - - if (true === $value) { - return 'true'; - } - - return (string) $value; - } - - /** - * Returns a string representation of a list of values. - * - * Each of the values is converted to a string using - * {@link formatValue()}. The values are then concatenated with commas. - * - * @see formatValue() - */ - private function formatValues(array $values): string - { - foreach ($values as $key => $value) { - $values[$key] = $this->formatValue($value); - } - - return implode(', ', $values); - } - - private function formatOptions(array $options): string - { - if ($this->parentsOptions) { - $prefix = array_shift($this->parentsOptions); - if ($this->parentsOptions) { - $prefix .= sprintf('[%s]', implode('][', $this->parentsOptions)); - } - - if ($this->prototype && null !== $this->prototypeIndex) { - $prefix .= sprintf('[%s]', $this->prototypeIndex); - } - - $options = array_map(static function (string $option) use ($prefix): string { - return sprintf('%s[%s]', $prefix, $option); - }, $options); - } - - return implode('", "', $options); - } - - private function getParameterClassName(\ReflectionParameter $parameter): ?string - { - if (!($type = $parameter->getType()) instanceof \ReflectionNamedType || $type->isBuiltin()) { - return null; - } - - return $type->getName(); - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/options-resolver/README.md b/tools/php-cs-fixer/vendor/symfony/options-resolver/README.md deleted file mode 100644 index c63b900..0000000 --- a/tools/php-cs-fixer/vendor/symfony/options-resolver/README.md +++ /dev/null @@ -1,15 +0,0 @@ -OptionsResolver Component -========================= - -The OptionsResolver component is `array_replace` on steroids. It allows you to -create an options system with required options, defaults, validation (type, -value), normalization and more. - -Resources ---------- - - * [Documentation](https://symfony.com/doc/current/components/options_resolver.html) - * [Contributing](https://symfony.com/doc/current/contributing/index.html) - * [Report issues](https://github.com/symfony/symfony/issues) and - [send Pull Requests](https://github.com/symfony/symfony/pulls) - in the [main Symfony repository](https://github.com/symfony/symfony) diff --git a/tools/php-cs-fixer/vendor/symfony/options-resolver/composer.json b/tools/php-cs-fixer/vendor/symfony/options-resolver/composer.json deleted file mode 100644 index 6e65a79..0000000 --- a/tools/php-cs-fixer/vendor/symfony/options-resolver/composer.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "symfony/options-resolver", - "type": "library", - "description": "Provides an improved replacement for the array_replace PHP function", - "keywords": ["options", "config", "configuration"], - "homepage": "https://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-php73": "~1.0", - "symfony/polyfill-php80": "^1.16" - }, - "autoload": { - "psr-4": { "Symfony\\Component\\OptionsResolver\\": "" }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "minimum-stability": "dev" -} diff --git a/tools/php-cs-fixer/vendor/symfony/polyfill-ctype/Ctype.php b/tools/php-cs-fixer/vendor/symfony/polyfill-ctype/Ctype.php deleted file mode 100644 index 58414dc..0000000 --- a/tools/php-cs-fixer/vendor/symfony/polyfill-ctype/Ctype.php +++ /dev/null @@ -1,227 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Polyfill\Ctype; - -/** - * Ctype implementation through regex. - * - * @internal - * - * @author Gert de Pagter - */ -final class Ctype -{ - /** - * Returns TRUE if every character in text is either a letter or a digit, FALSE otherwise. - * - * @see https://php.net/ctype-alnum - * - * @param string|int $text - * - * @return bool - */ - public static function ctype_alnum($text) - { - $text = self::convert_int_to_char_for_ctype($text); - - return \is_string($text) && '' !== $text && !preg_match('/[^A-Za-z0-9]/', $text); - } - - /** - * Returns TRUE if every character in text is a letter, FALSE otherwise. - * - * @see https://php.net/ctype-alpha - * - * @param string|int $text - * - * @return bool - */ - public static function ctype_alpha($text) - { - $text = self::convert_int_to_char_for_ctype($text); - - return \is_string($text) && '' !== $text && !preg_match('/[^A-Za-z]/', $text); - } - - /** - * Returns TRUE if every character in text is a control character from the current locale, FALSE otherwise. - * - * @see https://php.net/ctype-cntrl - * - * @param string|int $text - * - * @return bool - */ - public static function ctype_cntrl($text) - { - $text = self::convert_int_to_char_for_ctype($text); - - return \is_string($text) && '' !== $text && !preg_match('/[^\x00-\x1f\x7f]/', $text); - } - - /** - * Returns TRUE if every character in the string text is a decimal digit, FALSE otherwise. - * - * @see https://php.net/ctype-digit - * - * @param string|int $text - * - * @return bool - */ - public static function ctype_digit($text) - { - $text = self::convert_int_to_char_for_ctype($text); - - return \is_string($text) && '' !== $text && !preg_match('/[^0-9]/', $text); - } - - /** - * Returns TRUE if every character in text is printable and actually creates visible output (no white space), FALSE otherwise. - * - * @see https://php.net/ctype-graph - * - * @param string|int $text - * - * @return bool - */ - public static function ctype_graph($text) - { - $text = self::convert_int_to_char_for_ctype($text); - - return \is_string($text) && '' !== $text && !preg_match('/[^!-~]/', $text); - } - - /** - * Returns TRUE if every character in text is a lowercase letter. - * - * @see https://php.net/ctype-lower - * - * @param string|int $text - * - * @return bool - */ - public static function ctype_lower($text) - { - $text = self::convert_int_to_char_for_ctype($text); - - return \is_string($text) && '' !== $text && !preg_match('/[^a-z]/', $text); - } - - /** - * Returns TRUE if every character in text will actually create output (including blanks). Returns FALSE if text contains control characters or characters that do not have any output or control function at all. - * - * @see https://php.net/ctype-print - * - * @param string|int $text - * - * @return bool - */ - public static function ctype_print($text) - { - $text = self::convert_int_to_char_for_ctype($text); - - return \is_string($text) && '' !== $text && !preg_match('/[^ -~]/', $text); - } - - /** - * Returns TRUE if every character in text is printable, but neither letter, digit or blank, FALSE otherwise. - * - * @see https://php.net/ctype-punct - * - * @param string|int $text - * - * @return bool - */ - public static function ctype_punct($text) - { - $text = self::convert_int_to_char_for_ctype($text); - - return \is_string($text) && '' !== $text && !preg_match('/[^!-\/\:-@\[-`\{-~]/', $text); - } - - /** - * Returns TRUE if every character in text creates some sort of white space, FALSE otherwise. Besides the blank character this also includes tab, vertical tab, line feed, carriage return and form feed characters. - * - * @see https://php.net/ctype-space - * - * @param string|int $text - * - * @return bool - */ - public static function ctype_space($text) - { - $text = self::convert_int_to_char_for_ctype($text); - - return \is_string($text) && '' !== $text && !preg_match('/[^\s]/', $text); - } - - /** - * Returns TRUE if every character in text is an uppercase letter. - * - * @see https://php.net/ctype-upper - * - * @param string|int $text - * - * @return bool - */ - public static function ctype_upper($text) - { - $text = self::convert_int_to_char_for_ctype($text); - - return \is_string($text) && '' !== $text && !preg_match('/[^A-Z]/', $text); - } - - /** - * Returns TRUE if every character in text is a hexadecimal 'digit', that is a decimal digit or a character from [A-Fa-f] , FALSE otherwise. - * - * @see https://php.net/ctype-xdigit - * - * @param string|int $text - * - * @return bool - */ - public static function ctype_xdigit($text) - { - $text = self::convert_int_to_char_for_ctype($text); - - return \is_string($text) && '' !== $text && !preg_match('/[^A-Fa-f0-9]/', $text); - } - - /** - * Converts integers to their char versions according to normal ctype behaviour, if needed. - * - * If an integer between -128 and 255 inclusive is provided, - * it is interpreted as the ASCII value of a single character - * (negative values have 256 added in order to allow characters in the Extended ASCII range). - * Any other integer is interpreted as a string containing the decimal digits of the integer. - * - * @param string|int $int - * - * @return mixed - */ - private static function convert_int_to_char_for_ctype($int) - { - if (!\is_int($int)) { - return $int; - } - - if ($int < -128 || $int > 255) { - return (string) $int; - } - - if ($int < 0) { - $int += 256; - } - - return \chr($int); - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/polyfill-ctype/LICENSE b/tools/php-cs-fixer/vendor/symfony/polyfill-ctype/LICENSE deleted file mode 100644 index 3f853aa..0000000 --- a/tools/php-cs-fixer/vendor/symfony/polyfill-ctype/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2018-2019 Fabien Potencier - -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/tools/php-cs-fixer/vendor/symfony/polyfill-ctype/README.md b/tools/php-cs-fixer/vendor/symfony/polyfill-ctype/README.md deleted file mode 100644 index 8add1ab..0000000 --- a/tools/php-cs-fixer/vendor/symfony/polyfill-ctype/README.md +++ /dev/null @@ -1,12 +0,0 @@ -Symfony Polyfill / Ctype -======================== - -This component provides `ctype_*` functions to users who run php versions without the ctype extension. - -More information can be found in the -[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). - -License -======= - -This library is released under the [MIT license](LICENSE). diff --git a/tools/php-cs-fixer/vendor/symfony/polyfill-ctype/bootstrap.php b/tools/php-cs-fixer/vendor/symfony/polyfill-ctype/bootstrap.php deleted file mode 100644 index d54524b..0000000 --- a/tools/php-cs-fixer/vendor/symfony/polyfill-ctype/bootstrap.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use Symfony\Polyfill\Ctype as p; - -if (\PHP_VERSION_ID >= 80000) { - return require __DIR__.'/bootstrap80.php'; -} - -if (!function_exists('ctype_alnum')) { - function ctype_alnum($text) { return p\Ctype::ctype_alnum($text); } -} -if (!function_exists('ctype_alpha')) { - function ctype_alpha($text) { return p\Ctype::ctype_alpha($text); } -} -if (!function_exists('ctype_cntrl')) { - function ctype_cntrl($text) { return p\Ctype::ctype_cntrl($text); } -} -if (!function_exists('ctype_digit')) { - function ctype_digit($text) { return p\Ctype::ctype_digit($text); } -} -if (!function_exists('ctype_graph')) { - function ctype_graph($text) { return p\Ctype::ctype_graph($text); } -} -if (!function_exists('ctype_lower')) { - function ctype_lower($text) { return p\Ctype::ctype_lower($text); } -} -if (!function_exists('ctype_print')) { - function ctype_print($text) { return p\Ctype::ctype_print($text); } -} -if (!function_exists('ctype_punct')) { - function ctype_punct($text) { return p\Ctype::ctype_punct($text); } -} -if (!function_exists('ctype_space')) { - function ctype_space($text) { return p\Ctype::ctype_space($text); } -} -if (!function_exists('ctype_upper')) { - function ctype_upper($text) { return p\Ctype::ctype_upper($text); } -} -if (!function_exists('ctype_xdigit')) { - function ctype_xdigit($text) { return p\Ctype::ctype_xdigit($text); } -} diff --git a/tools/php-cs-fixer/vendor/symfony/polyfill-ctype/bootstrap80.php b/tools/php-cs-fixer/vendor/symfony/polyfill-ctype/bootstrap80.php deleted file mode 100644 index ab2f861..0000000 --- a/tools/php-cs-fixer/vendor/symfony/polyfill-ctype/bootstrap80.php +++ /dev/null @@ -1,46 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use Symfony\Polyfill\Ctype as p; - -if (!function_exists('ctype_alnum')) { - function ctype_alnum(mixed $text): bool { return p\Ctype::ctype_alnum($text); } -} -if (!function_exists('ctype_alpha')) { - function ctype_alpha(mixed $text): bool { return p\Ctype::ctype_alpha($text); } -} -if (!function_exists('ctype_cntrl')) { - function ctype_cntrl(mixed $text): bool { return p\Ctype::ctype_cntrl($text); } -} -if (!function_exists('ctype_digit')) { - function ctype_digit(mixed $text): bool { return p\Ctype::ctype_digit($text); } -} -if (!function_exists('ctype_graph')) { - function ctype_graph(mixed $text): bool { return p\Ctype::ctype_graph($text); } -} -if (!function_exists('ctype_lower')) { - function ctype_lower(mixed $text): bool { return p\Ctype::ctype_lower($text); } -} -if (!function_exists('ctype_print')) { - function ctype_print(mixed $text): bool { return p\Ctype::ctype_print($text); } -} -if (!function_exists('ctype_punct')) { - function ctype_punct(mixed $text): bool { return p\Ctype::ctype_punct($text); } -} -if (!function_exists('ctype_space')) { - function ctype_space(mixed $text): bool { return p\Ctype::ctype_space($text); } -} -if (!function_exists('ctype_upper')) { - function ctype_upper(mixed $text): bool { return p\Ctype::ctype_upper($text); } -} -if (!function_exists('ctype_xdigit')) { - function ctype_xdigit(mixed $text): bool { return p\Ctype::ctype_xdigit($text); } -} diff --git a/tools/php-cs-fixer/vendor/symfony/polyfill-ctype/composer.json b/tools/php-cs-fixer/vendor/symfony/polyfill-ctype/composer.json deleted file mode 100644 index f0621a3..0000000 --- a/tools/php-cs-fixer/vendor/symfony/polyfill-ctype/composer.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "symfony/polyfill-ctype", - "type": "library", - "description": "Symfony polyfill for ctype functions", - "keywords": ["polyfill", "compatibility", "portable", "ctype"], - "homepage": "https://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "require": { - "php": ">=7.1" - }, - "autoload": { - "psr-4": { "Symfony\\Polyfill\\Ctype\\": "" }, - "files": [ "bootstrap.php" ] - }, - "suggest": { - "ext-ctype": "For best performance" - }, - "minimum-stability": "dev", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/polyfill-intl-grapheme/Grapheme.php b/tools/php-cs-fixer/vendor/symfony/polyfill-intl-grapheme/Grapheme.php deleted file mode 100644 index 572da5d..0000000 --- a/tools/php-cs-fixer/vendor/symfony/polyfill-intl-grapheme/Grapheme.php +++ /dev/null @@ -1,247 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Polyfill\Intl\Grapheme; - -\define('SYMFONY_GRAPHEME_CLUSTER_RX', \PCRE_VERSION >= '8.32' ? '\X' : Grapheme::GRAPHEME_CLUSTER_RX); - -/** - * Partial intl implementation in pure PHP. - * - * Implemented: - * - grapheme_extract - Extract a sequence of grapheme clusters from a text buffer, which must be encoded in UTF-8 - * - grapheme_stripos - Find position (in grapheme units) of first occurrence of a case-insensitive string - * - grapheme_stristr - Returns part of haystack string from the first occurrence of case-insensitive needle to the end of haystack - * - grapheme_strlen - Get string length in grapheme units - * - grapheme_strpos - Find position (in grapheme units) of first occurrence of a string - * - grapheme_strripos - Find position (in grapheme units) of last occurrence of a case-insensitive string - * - grapheme_strrpos - Find position (in grapheme units) of last occurrence of a string - * - grapheme_strstr - Returns part of haystack string from the first occurrence of needle to the end of haystack - * - grapheme_substr - Return part of a string - * - * @author Nicolas Grekas - * - * @internal - */ -final class Grapheme -{ - // (CRLF|([ZWNJ-ZWJ]|T+|L*(LV?V+|LV|LVT)T*|L+|[^Control])[Extend]*|[Control]) - // This regular expression is a work around for http://bugs.exim.org/1279 - public const GRAPHEME_CLUSTER_RX = '(?:\r\n|(?:[ -~\x{200C}\x{200D}]|[ᆨ-ᇹ]+|[ᄀ-ᅟ]*(?:[가개갸걔거게겨계고과괘괴교구궈궤귀규그긔기까깨꺄꺠꺼께껴꼐꼬꽈꽤꾀꾜꾸꿔꿰뀌뀨끄끠끼나내냐냬너네녀녜노놔놰뇌뇨누눠눼뉘뉴느늬니다대댜댸더데뎌뎨도돠돼되됴두둬뒈뒤듀드듸디따때땨떄떠떼뗘뗴또똬뙈뙤뚀뚜뚸뛔뛰뜌뜨띄띠라래랴럐러레려례로롸뢔뢰료루뤄뤠뤼류르릐리마매먀먜머메며몌모뫄뫠뫼묘무뭐뭬뮈뮤므믜미바배뱌뱨버베벼볘보봐봬뵈뵤부붜붸뷔뷰브븨비빠빼뺘뺴뻐뻬뼈뼤뽀뽜뽸뾔뾰뿌뿨쀄쀠쀼쁘쁴삐사새샤섀서세셔셰소솨쇄쇠쇼수숴쉐쉬슈스싀시싸쌔쌰썌써쎄쎠쎼쏘쏴쐐쐬쑈쑤쒀쒜쒸쓔쓰씌씨아애야얘어에여예오와왜외요우워웨위유으의이자재쟈쟤저제져졔조좌좨죄죠주줘줴쥐쥬즈즤지짜째쨔쨰쩌쩨쪄쪠쪼쫘쫴쬐쬬쭈쭤쮀쮜쮸쯔쯰찌차채챠챼처체쳐쳬초촤쵀최쵸추춰췌취츄츠츼치카캐캬컈커케켜켸코콰쾌쾨쿄쿠쿼퀘퀴큐크킈키타태탸턔터테텨톄토톼퇘퇴툐투퉈퉤튀튜트틔티파패퍄퍠퍼페펴폐포퐈퐤푀표푸풔풰퓌퓨프픠피하해햐햬허헤혀혜호화홰회효후훠훼휘휴흐희히]?[ᅠ-ᆢ]+|[가-힣])[ᆨ-ᇹ]*|[ᄀ-ᅟ]+|[^\p{Cc}\p{Cf}\p{Zl}\p{Zp}])[\p{Mn}\p{Me}\x{09BE}\x{09D7}\x{0B3E}\x{0B57}\x{0BBE}\x{0BD7}\x{0CC2}\x{0CD5}\x{0CD6}\x{0D3E}\x{0D57}\x{0DCF}\x{0DDF}\x{200C}\x{200D}\x{1D165}\x{1D16E}-\x{1D172}]*|[\p{Cc}\p{Cf}\p{Zl}\p{Zp}])'; - - private const CASE_FOLD = [ - ['µ', 'ſ', "\xCD\x85", 'ς', "\xCF\x90", "\xCF\x91", "\xCF\x95", "\xCF\x96", "\xCF\xB0", "\xCF\xB1", "\xCF\xB5", "\xE1\xBA\x9B", "\xE1\xBE\xBE"], - ['μ', 's', 'ι', 'σ', 'β', 'θ', 'φ', 'π', 'κ', 'ρ', 'ε', "\xE1\xB9\xA1", 'ι'], - ]; - - public static function grapheme_extract($s, $size, $type = \GRAPHEME_EXTR_COUNT, $start = 0, &$next = 0) - { - if (0 > $start) { - $start = \strlen($s) + $start; - } - - if (!is_scalar($s)) { - $hasError = false; - set_error_handler(function () use (&$hasError) { $hasError = true; }); - $next = substr($s, $start); - restore_error_handler(); - if ($hasError) { - substr($s, $start); - $s = ''; - } else { - $s = $next; - } - } else { - $s = substr($s, $start); - } - $size = (int) $size; - $type = (int) $type; - $start = (int) $start; - - if (\GRAPHEME_EXTR_COUNT !== $type && \GRAPHEME_EXTR_MAXBYTES !== $type && \GRAPHEME_EXTR_MAXCHARS !== $type) { - if (80000 > \PHP_VERSION_ID) { - return false; - } - - throw new \ValueError('grapheme_extract(): Argument #3 ($type) must be one of GRAPHEME_EXTR_COUNT, GRAPHEME_EXTR_MAXBYTES, or GRAPHEME_EXTR_MAXCHARS'); - } - - if (!isset($s[0]) || 0 > $size || 0 > $start) { - return false; - } - if (0 === $size) { - return ''; - } - - $next = $start; - - $s = preg_split('/('.SYMFONY_GRAPHEME_CLUSTER_RX.')/u', "\r\n".$s, $size + 1, \PREG_SPLIT_NO_EMPTY | \PREG_SPLIT_DELIM_CAPTURE); - - if (!isset($s[1])) { - return false; - } - - $i = 1; - $ret = ''; - - do { - if (\GRAPHEME_EXTR_COUNT === $type) { - --$size; - } elseif (\GRAPHEME_EXTR_MAXBYTES === $type) { - $size -= \strlen($s[$i]); - } else { - $size -= iconv_strlen($s[$i], 'UTF-8//IGNORE'); - } - - if ($size >= 0) { - $ret .= $s[$i]; - } - } while (isset($s[++$i]) && $size > 0); - - $next += \strlen($ret); - - return $ret; - } - - public static function grapheme_strlen($s) - { - preg_replace('/'.SYMFONY_GRAPHEME_CLUSTER_RX.'/u', '', $s, -1, $len); - - return 0 === $len && '' !== $s ? null : $len; - } - - public static function grapheme_substr($s, $start, $len = null) - { - if (null === $len) { - $len = 2147483647; - } - - preg_match_all('/'.SYMFONY_GRAPHEME_CLUSTER_RX.'/u', $s, $s); - - $slen = \count($s[0]); - $start = (int) $start; - - if (0 > $start) { - $start += $slen; - } - if (0 > $start) { - if (\PHP_VERSION_ID < 80000) { - return false; - } - - $start = 0; - } - if ($start >= $slen) { - return \PHP_VERSION_ID >= 80000 ? '' : false; - } - - $rem = $slen - $start; - - if (0 > $len) { - $len += $rem; - } - if (0 === $len) { - return ''; - } - if (0 > $len) { - return \PHP_VERSION_ID >= 80000 ? '' : false; - } - if ($len > $rem) { - $len = $rem; - } - - return implode('', \array_slice($s[0], $start, $len)); - } - - public static function grapheme_strpos($s, $needle, $offset = 0) - { - return self::grapheme_position($s, $needle, $offset, 0); - } - - public static function grapheme_stripos($s, $needle, $offset = 0) - { - return self::grapheme_position($s, $needle, $offset, 1); - } - - public static function grapheme_strrpos($s, $needle, $offset = 0) - { - return self::grapheme_position($s, $needle, $offset, 2); - } - - public static function grapheme_strripos($s, $needle, $offset = 0) - { - return self::grapheme_position($s, $needle, $offset, 3); - } - - public static function grapheme_stristr($s, $needle, $beforeNeedle = false) - { - return mb_stristr($s, $needle, $beforeNeedle, 'UTF-8'); - } - - public static function grapheme_strstr($s, $needle, $beforeNeedle = false) - { - return mb_strstr($s, $needle, $beforeNeedle, 'UTF-8'); - } - - private static function grapheme_position($s, $needle, $offset, $mode) - { - $needle = (string) $needle; - if (80000 > \PHP_VERSION_ID && !preg_match('/./us', $needle)) { - return false; - } - $s = (string) $s; - if (!preg_match('/./us', $s)) { - return false; - } - if ($offset > 0) { - $s = self::grapheme_substr($s, $offset); - } elseif ($offset < 0) { - if (2 > $mode) { - $offset += self::grapheme_strlen($s); - $s = self::grapheme_substr($s, $offset); - if (0 > $offset) { - $offset = 0; - } - } elseif (0 > $offset += self::grapheme_strlen($needle)) { - $s = self::grapheme_substr($s, 0, $offset); - $offset = 0; - } else { - $offset = 0; - } - } - - // As UTF-8 is self-synchronizing, and we have ensured the strings are valid UTF-8, - // we can use normal binary string functions here. For case-insensitive searches, - // case fold the strings first. - $caseInsensitive = $mode & 1; - $reverse = $mode & 2; - if ($caseInsensitive) { - // Use the same case folding mode as mbstring does for mb_stripos(). - // Stick to SIMPLE case folding to avoid changing the length of the string, which - // might result in offsets being shifted. - $mode = \defined('MB_CASE_FOLD_SIMPLE') ? \MB_CASE_FOLD_SIMPLE : \MB_CASE_LOWER; - $s = mb_convert_case($s, $mode, 'UTF-8'); - $needle = mb_convert_case($needle, $mode, 'UTF-8'); - - if (!\defined('MB_CASE_FOLD_SIMPLE')) { - $s = str_replace(self::CASE_FOLD[0], self::CASE_FOLD[1], $s); - $needle = str_replace(self::CASE_FOLD[0], self::CASE_FOLD[1], $needle); - } - } - if ($reverse) { - $needlePos = strrpos($s, $needle); - } else { - $needlePos = strpos($s, $needle); - } - - return false !== $needlePos ? self::grapheme_strlen(substr($s, 0, $needlePos)) + $offset : false; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/polyfill-intl-grapheme/LICENSE b/tools/php-cs-fixer/vendor/symfony/polyfill-intl-grapheme/LICENSE deleted file mode 100644 index 4cd8bdd..0000000 --- a/tools/php-cs-fixer/vendor/symfony/polyfill-intl-grapheme/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2015-2019 Fabien Potencier - -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/tools/php-cs-fixer/vendor/symfony/polyfill-intl-grapheme/README.md b/tools/php-cs-fixer/vendor/symfony/polyfill-intl-grapheme/README.md deleted file mode 100644 index 77523ea..0000000 --- a/tools/php-cs-fixer/vendor/symfony/polyfill-intl-grapheme/README.md +++ /dev/null @@ -1,31 +0,0 @@ -Symfony Polyfill / Intl: Grapheme -================================= - -This component provides a partial, native PHP implementation of the -[Grapheme functions](https://php.net/intl.grapheme) from the -[Intl](https://php.net/intl) extension. - -- [`grapheme_extract`](https://php.net/grapheme_extract): Extract a sequence of grapheme - clusters from a text buffer, which must be encoded in UTF-8 -- [`grapheme_stripos`](https://php.net/grapheme_stripos): Find position (in grapheme units) - of first occurrence of a case-insensitive string -- [`grapheme_stristr`](https://php.net/grapheme_stristr): Returns part of haystack string - from the first occurrence of case-insensitive needle to the end of haystack -- [`grapheme_strlen`](https://php.net/grapheme_strlen): Get string length in grapheme units -- [`grapheme_strpos`](https://php.net/grapheme_strpos): Find position (in grapheme units) - of first occurrence of a string -- [`grapheme_strripos`](https://php.net/grapheme_strripos): Find position (in grapheme units) - of last occurrence of a case-insensitive string -- [`grapheme_strrpos`](https://php.net/grapheme_strrpos): Find position (in grapheme units) - of last occurrence of a string -- [`grapheme_strstr`](https://php.net/grapheme_strstr): Returns part of haystack string from - the first occurrence of needle to the end of haystack -- [`grapheme_substr`](https://php.net/grapheme_substr): Return part of a string - -More information can be found in the -[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). - -License -======= - -This library is released under the [MIT license](LICENSE). diff --git a/tools/php-cs-fixer/vendor/symfony/polyfill-intl-grapheme/bootstrap.php b/tools/php-cs-fixer/vendor/symfony/polyfill-intl-grapheme/bootstrap.php deleted file mode 100644 index a9ea03c..0000000 --- a/tools/php-cs-fixer/vendor/symfony/polyfill-intl-grapheme/bootstrap.php +++ /dev/null @@ -1,58 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use Symfony\Polyfill\Intl\Grapheme as p; - -if (extension_loaded('intl')) { - return; -} - -if (\PHP_VERSION_ID >= 80000) { - return require __DIR__.'/bootstrap80.php'; -} - -if (!defined('GRAPHEME_EXTR_COUNT')) { - define('GRAPHEME_EXTR_COUNT', 0); -} -if (!defined('GRAPHEME_EXTR_MAXBYTES')) { - define('GRAPHEME_EXTR_MAXBYTES', 1); -} -if (!defined('GRAPHEME_EXTR_MAXCHARS')) { - define('GRAPHEME_EXTR_MAXCHARS', 2); -} - -if (!function_exists('grapheme_extract')) { - function grapheme_extract($haystack, $size, $type = 0, $start = 0, &$next = 0) { return p\Grapheme::grapheme_extract($haystack, $size, $type, $start, $next); } -} -if (!function_exists('grapheme_stripos')) { - function grapheme_stripos($haystack, $needle, $offset = 0) { return p\Grapheme::grapheme_stripos($haystack, $needle, $offset); } -} -if (!function_exists('grapheme_stristr')) { - function grapheme_stristr($haystack, $needle, $beforeNeedle = false) { return p\Grapheme::grapheme_stristr($haystack, $needle, $beforeNeedle); } -} -if (!function_exists('grapheme_strlen')) { - function grapheme_strlen($input) { return p\Grapheme::grapheme_strlen($input); } -} -if (!function_exists('grapheme_strpos')) { - function grapheme_strpos($haystack, $needle, $offset = 0) { return p\Grapheme::grapheme_strpos($haystack, $needle, $offset); } -} -if (!function_exists('grapheme_strripos')) { - function grapheme_strripos($haystack, $needle, $offset = 0) { return p\Grapheme::grapheme_strripos($haystack, $needle, $offset); } -} -if (!function_exists('grapheme_strrpos')) { - function grapheme_strrpos($haystack, $needle, $offset = 0) { return p\Grapheme::grapheme_strrpos($haystack, $needle, $offset); } -} -if (!function_exists('grapheme_strstr')) { - function grapheme_strstr($haystack, $needle, $beforeNeedle = false) { return p\Grapheme::grapheme_strstr($haystack, $needle, $beforeNeedle); } -} -if (!function_exists('grapheme_substr')) { - function grapheme_substr($string, $offset, $length = null) { return p\Grapheme::grapheme_substr($string, $offset, $length); } -} diff --git a/tools/php-cs-fixer/vendor/symfony/polyfill-intl-grapheme/bootstrap80.php b/tools/php-cs-fixer/vendor/symfony/polyfill-intl-grapheme/bootstrap80.php deleted file mode 100644 index b8c0786..0000000 --- a/tools/php-cs-fixer/vendor/symfony/polyfill-intl-grapheme/bootstrap80.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use Symfony\Polyfill\Intl\Grapheme as p; - -if (!defined('GRAPHEME_EXTR_COUNT')) { - define('GRAPHEME_EXTR_COUNT', 0); -} -if (!defined('GRAPHEME_EXTR_MAXBYTES')) { - define('GRAPHEME_EXTR_MAXBYTES', 1); -} -if (!defined('GRAPHEME_EXTR_MAXCHARS')) { - define('GRAPHEME_EXTR_MAXCHARS', 2); -} - -if (!function_exists('grapheme_extract')) { - function grapheme_extract(?string $haystack, ?int $size, ?int $type = GRAPHEME_EXTR_COUNT, ?int $offset = 0, &$next = null): string|false { return p\Grapheme::grapheme_extract((string) $haystack, (int) $size, (int) $type, (int) $offset, $next); } -} -if (!function_exists('grapheme_stripos')) { - function grapheme_stripos(?string $haystack, ?string $needle, ?int $offset = 0): int|false { return p\Grapheme::grapheme_stripos((string) $haystack, (string) $needle, (int) $offset); } -} -if (!function_exists('grapheme_stristr')) { - function grapheme_stristr(?string $haystack, ?string $needle, ?bool $beforeNeedle = false): string|false { return p\Grapheme::grapheme_stristr((string) $haystack, (string) $needle, (bool) $beforeNeedle); } -} -if (!function_exists('grapheme_strlen')) { - function grapheme_strlen(?string $string): int|false|null { return p\Grapheme::grapheme_strlen((string) $string); } -} -if (!function_exists('grapheme_strpos')) { - function grapheme_strpos(?string $haystack, ?string $needle, ?int $offset = 0): int|false { return p\Grapheme::grapheme_strpos((string) $haystack, (string) $needle, (int) $offset); } -} -if (!function_exists('grapheme_strripos')) { - function grapheme_strripos(?string $haystack, ?string $needle, ?int $offset = 0): int|false { return p\Grapheme::grapheme_strripos((string) $haystack, (string) $needle, (int) $offset); } -} -if (!function_exists('grapheme_strrpos')) { - function grapheme_strrpos(?string $haystack, ?string $needle, ?int $offset = 0): int|false { return p\Grapheme::grapheme_strrpos((string) $haystack, (string) $needle, (int) $offset); } -} -if (!function_exists('grapheme_strstr')) { - function grapheme_strstr(?string $haystack, ?string $needle, ?bool $beforeNeedle = false): string|false { return p\Grapheme::grapheme_strstr((string) $haystack, (string) $needle, (bool) $beforeNeedle); } -} -if (!function_exists('grapheme_substr')) { - function grapheme_substr(?string $string, ?int $offset, ?int $length = null): string|false { return p\Grapheme::grapheme_substr((string) $string, (int) $offset, $length); } -} diff --git a/tools/php-cs-fixer/vendor/symfony/polyfill-intl-grapheme/composer.json b/tools/php-cs-fixer/vendor/symfony/polyfill-intl-grapheme/composer.json deleted file mode 100644 index 02c98ee..0000000 --- a/tools/php-cs-fixer/vendor/symfony/polyfill-intl-grapheme/composer.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "symfony/polyfill-intl-grapheme", - "type": "library", - "description": "Symfony polyfill for intl's grapheme_* functions", - "keywords": ["polyfill", "shim", "compatibility", "portable", "intl", "grapheme"], - "homepage": "https://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "require": { - "php": ">=7.1" - }, - "autoload": { - "psr-4": { "Symfony\\Polyfill\\Intl\\Grapheme\\": "" }, - "files": [ "bootstrap.php" ] - }, - "suggest": { - "ext-intl": "For best performance" - }, - "minimum-stability": "dev", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/polyfill-intl-normalizer/LICENSE b/tools/php-cs-fixer/vendor/symfony/polyfill-intl-normalizer/LICENSE deleted file mode 100644 index 4cd8bdd..0000000 --- a/tools/php-cs-fixer/vendor/symfony/polyfill-intl-normalizer/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2015-2019 Fabien Potencier - -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/tools/php-cs-fixer/vendor/symfony/polyfill-intl-normalizer/Normalizer.php b/tools/php-cs-fixer/vendor/symfony/polyfill-intl-normalizer/Normalizer.php deleted file mode 100644 index 4443c23..0000000 --- a/tools/php-cs-fixer/vendor/symfony/polyfill-intl-normalizer/Normalizer.php +++ /dev/null @@ -1,310 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Polyfill\Intl\Normalizer; - -/** - * Normalizer is a PHP fallback implementation of the Normalizer class provided by the intl extension. - * - * It has been validated with Unicode 6.3 Normalization Conformance Test. - * See http://www.unicode.org/reports/tr15/ for detailed info about Unicode normalizations. - * - * @author Nicolas Grekas - * - * @internal - */ -class Normalizer -{ - public const FORM_D = \Normalizer::FORM_D; - public const FORM_KD = \Normalizer::FORM_KD; - public const FORM_C = \Normalizer::FORM_C; - public const FORM_KC = \Normalizer::FORM_KC; - public const NFD = \Normalizer::NFD; - public const NFKD = \Normalizer::NFKD; - public const NFC = \Normalizer::NFC; - public const NFKC = \Normalizer::NFKC; - - private static $C; - private static $D; - private static $KD; - private static $cC; - private static $ulenMask = ["\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4]; - private static $ASCII = "\x20\x65\x69\x61\x73\x6E\x74\x72\x6F\x6C\x75\x64\x5D\x5B\x63\x6D\x70\x27\x0A\x67\x7C\x68\x76\x2E\x66\x62\x2C\x3A\x3D\x2D\x71\x31\x30\x43\x32\x2A\x79\x78\x29\x28\x4C\x39\x41\x53\x2F\x50\x22\x45\x6A\x4D\x49\x6B\x33\x3E\x35\x54\x3C\x44\x34\x7D\x42\x7B\x38\x46\x77\x52\x36\x37\x55\x47\x4E\x3B\x4A\x7A\x56\x23\x48\x4F\x57\x5F\x26\x21\x4B\x3F\x58\x51\x25\x59\x5C\x09\x5A\x2B\x7E\x5E\x24\x40\x60\x7F\x00\x01\x02\x03\x04\x05\x06\x07\x08\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F"; - - public static function isNormalized(string $s, int $form = self::FORM_C) - { - if (!\in_array($form, [self::NFD, self::NFKD, self::NFC, self::NFKC])) { - return false; - } - if (!isset($s[strspn($s, self::$ASCII)])) { - return true; - } - if (self::NFC == $form && preg_match('//u', $s) && !preg_match('/[^\x00-\x{2FF}]/u', $s)) { - return true; - } - - return self::normalize($s, $form) === $s; - } - - public static function normalize(string $s, int $form = self::FORM_C) - { - if (!preg_match('//u', $s)) { - return false; - } - - switch ($form) { - case self::NFC: $C = true; $K = false; break; - case self::NFD: $C = false; $K = false; break; - case self::NFKC: $C = true; $K = true; break; - case self::NFKD: $C = false; $K = true; break; - default: - if (\defined('Normalizer::NONE') && \Normalizer::NONE == $form) { - return $s; - } - - if (80000 > \PHP_VERSION_ID) { - return false; - } - - throw new \ValueError('normalizer_normalize(): Argument #2 ($form) must be a a valid normalization form'); - } - - if ('' === $s) { - return ''; - } - - if ($K && null === self::$KD) { - self::$KD = self::getData('compatibilityDecomposition'); - } - - if (null === self::$D) { - self::$D = self::getData('canonicalDecomposition'); - self::$cC = self::getData('combiningClass'); - } - - if (null !== $mbEncoding = (2 /* MB_OVERLOAD_STRING */ & (int) ini_get('mbstring.func_overload')) ? mb_internal_encoding() : null) { - mb_internal_encoding('8bit'); - } - - $r = self::decompose($s, $K); - - if ($C) { - if (null === self::$C) { - self::$C = self::getData('canonicalComposition'); - } - - $r = self::recompose($r); - } - if (null !== $mbEncoding) { - mb_internal_encoding($mbEncoding); - } - - return $r; - } - - private static function recompose($s) - { - $ASCII = self::$ASCII; - $compMap = self::$C; - $combClass = self::$cC; - $ulenMask = self::$ulenMask; - - $result = $tail = ''; - - $i = $s[0] < "\x80" ? 1 : $ulenMask[$s[0] & "\xF0"]; - $len = \strlen($s); - - $lastUchr = substr($s, 0, $i); - $lastUcls = isset($combClass[$lastUchr]) ? 256 : 0; - - while ($i < $len) { - if ($s[$i] < "\x80") { - // ASCII chars - - if ($tail) { - $lastUchr .= $tail; - $tail = ''; - } - - if ($j = strspn($s, $ASCII, $i + 1)) { - $lastUchr .= substr($s, $i, $j); - $i += $j; - } - - $result .= $lastUchr; - $lastUchr = $s[$i]; - $lastUcls = 0; - ++$i; - continue; - } - - $ulen = $ulenMask[$s[$i] & "\xF0"]; - $uchr = substr($s, $i, $ulen); - - if ($lastUchr < "\xE1\x84\x80" || "\xE1\x84\x92" < $lastUchr - || $uchr < "\xE1\x85\xA1" || "\xE1\x85\xB5" < $uchr - || $lastUcls) { - // Table lookup and combining chars composition - - $ucls = $combClass[$uchr] ?? 0; - - if (isset($compMap[$lastUchr.$uchr]) && (!$lastUcls || $lastUcls < $ucls)) { - $lastUchr = $compMap[$lastUchr.$uchr]; - } elseif ($lastUcls = $ucls) { - $tail .= $uchr; - } else { - if ($tail) { - $lastUchr .= $tail; - $tail = ''; - } - - $result .= $lastUchr; - $lastUchr = $uchr; - } - } else { - // Hangul chars - - $L = \ord($lastUchr[2]) - 0x80; - $V = \ord($uchr[2]) - 0xA1; - $T = 0; - - $uchr = substr($s, $i + $ulen, 3); - - if ("\xE1\x86\xA7" <= $uchr && $uchr <= "\xE1\x87\x82") { - $T = \ord($uchr[2]) - 0xA7; - 0 > $T && $T += 0x40; - $ulen += 3; - } - - $L = 0xAC00 + ($L * 21 + $V) * 28 + $T; - $lastUchr = \chr(0xE0 | $L >> 12).\chr(0x80 | $L >> 6 & 0x3F).\chr(0x80 | $L & 0x3F); - } - - $i += $ulen; - } - - return $result.$lastUchr.$tail; - } - - private static function decompose($s, $c) - { - $result = ''; - - $ASCII = self::$ASCII; - $decompMap = self::$D; - $combClass = self::$cC; - $ulenMask = self::$ulenMask; - if ($c) { - $compatMap = self::$KD; - } - - $c = []; - $i = 0; - $len = \strlen($s); - - while ($i < $len) { - if ($s[$i] < "\x80") { - // ASCII chars - - if ($c) { - ksort($c); - $result .= implode('', $c); - $c = []; - } - - $j = 1 + strspn($s, $ASCII, $i + 1); - $result .= substr($s, $i, $j); - $i += $j; - continue; - } - - $ulen = $ulenMask[$s[$i] & "\xF0"]; - $uchr = substr($s, $i, $ulen); - $i += $ulen; - - if ($uchr < "\xEA\xB0\x80" || "\xED\x9E\xA3" < $uchr) { - // Table lookup - - if ($uchr !== $j = $compatMap[$uchr] ?? ($decompMap[$uchr] ?? $uchr)) { - $uchr = $j; - - $j = \strlen($uchr); - $ulen = $uchr[0] < "\x80" ? 1 : $ulenMask[$uchr[0] & "\xF0"]; - - if ($ulen != $j) { - // Put trailing chars in $s - - $j -= $ulen; - $i -= $j; - - if (0 > $i) { - $s = str_repeat(' ', -$i).$s; - $len -= $i; - $i = 0; - } - - while ($j--) { - $s[$i + $j] = $uchr[$ulen + $j]; - } - - $uchr = substr($uchr, 0, $ulen); - } - } - if (isset($combClass[$uchr])) { - // Combining chars, for sorting - - if (!isset($c[$combClass[$uchr]])) { - $c[$combClass[$uchr]] = ''; - } - $c[$combClass[$uchr]] .= $uchr; - continue; - } - } else { - // Hangul chars - - $uchr = unpack('C*', $uchr); - $j = (($uchr[1] - 224) << 12) + (($uchr[2] - 128) << 6) + $uchr[3] - 0xAC80; - - $uchr = "\xE1\x84".\chr(0x80 + (int) ($j / 588)) - ."\xE1\x85".\chr(0xA1 + (int) (($j % 588) / 28)); - - if ($j %= 28) { - $uchr .= $j < 25 - ? ("\xE1\x86".\chr(0xA7 + $j)) - : ("\xE1\x87".\chr(0x67 + $j)); - } - } - if ($c) { - ksort($c); - $result .= implode('', $c); - $c = []; - } - - $result .= $uchr; - } - - if ($c) { - ksort($c); - $result .= implode('', $c); - } - - return $result; - } - - private static function getData($file) - { - if (file_exists($file = __DIR__.'/Resources/unidata/'.$file.'.php')) { - return require $file; - } - - return false; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/polyfill-intl-normalizer/README.md b/tools/php-cs-fixer/vendor/symfony/polyfill-intl-normalizer/README.md deleted file mode 100644 index 15060c5..0000000 --- a/tools/php-cs-fixer/vendor/symfony/polyfill-intl-normalizer/README.md +++ /dev/null @@ -1,14 +0,0 @@ -Symfony Polyfill / Intl: Normalizer -=================================== - -This component provides a fallback implementation for the -[`Normalizer`](https://php.net/Normalizer) class provided -by the [Intl](https://php.net/intl) extension. - -More information can be found in the -[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). - -License -======= - -This library is released under the [MIT license](LICENSE). diff --git a/tools/php-cs-fixer/vendor/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php b/tools/php-cs-fixer/vendor/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php deleted file mode 100644 index 0fdfc89..0000000 --- a/tools/php-cs-fixer/vendor/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php +++ /dev/null @@ -1,17 +0,0 @@ - 'À', - 'Á' => 'Á', - 'Â' => 'Â', - 'Ã' => 'Ã', - 'Ä' => 'Ä', - 'Å' => 'Å', - 'Ç' => 'Ç', - 'È' => 'È', - 'É' => 'É', - 'Ê' => 'Ê', - 'Ë' => 'Ë', - 'Ì' => 'Ì', - 'Í' => 'Í', - 'Î' => 'Î', - 'Ï' => 'Ï', - 'Ñ' => 'Ñ', - 'Ò' => 'Ò', - 'Ó' => 'Ó', - 'Ô' => 'Ô', - 'Õ' => 'Õ', - 'Ö' => 'Ö', - 'Ù' => 'Ù', - 'Ú' => 'Ú', - 'Û' => 'Û', - 'Ü' => 'Ü', - 'Ý' => 'Ý', - 'à' => 'à', - 'á' => 'á', - 'â' => 'â', - 'ã' => 'ã', - 'ä' => 'ä', - 'å' => 'å', - 'ç' => 'ç', - 'è' => 'è', - 'é' => 'é', - 'ê' => 'ê', - 'ë' => 'ë', - 'ì' => 'ì', - 'í' => 'í', - 'î' => 'î', - 'ï' => 'ï', - 'ñ' => 'ñ', - 'ò' => 'ò', - 'ó' => 'ó', - 'ô' => 'ô', - 'õ' => 'õ', - 'ö' => 'ö', - 'ù' => 'ù', - 'ú' => 'ú', - 'û' => 'û', - 'ü' => 'ü', - 'ý' => 'ý', - 'ÿ' => 'ÿ', - 'Ā' => 'Ā', - 'ā' => 'ā', - 'Ă' => 'Ă', - 'ă' => 'ă', - 'Ą' => 'Ą', - 'ą' => 'ą', - 'Ć' => 'Ć', - 'ć' => 'ć', - 'Ĉ' => 'Ĉ', - 'ĉ' => 'ĉ', - 'Ċ' => 'Ċ', - 'ċ' => 'ċ', - 'Č' => 'Č', - 'č' => 'č', - 'Ď' => 'Ď', - 'ď' => 'ď', - 'Ē' => 'Ē', - 'ē' => 'ē', - 'Ĕ' => 'Ĕ', - 'ĕ' => 'ĕ', - 'Ė' => 'Ė', - 'ė' => 'ė', - 'Ę' => 'Ę', - 'ę' => 'ę', - 'Ě' => 'Ě', - 'ě' => 'ě', - 'Ĝ' => 'Ĝ', - 'ĝ' => 'ĝ', - 'Ğ' => 'Ğ', - 'ğ' => 'ğ', - 'Ġ' => 'Ġ', - 'ġ' => 'ġ', - 'Ģ' => 'Ģ', - 'ģ' => 'ģ', - 'Ĥ' => 'Ĥ', - 'ĥ' => 'ĥ', - 'Ĩ' => 'Ĩ', - 'ĩ' => 'ĩ', - 'Ī' => 'Ī', - 'ī' => 'ī', - 'Ĭ' => 'Ĭ', - 'ĭ' => 'ĭ', - 'Į' => 'Į', - 'į' => 'į', - 'İ' => 'İ', - 'Ĵ' => 'Ĵ', - 'ĵ' => 'ĵ', - 'Ķ' => 'Ķ', - 'ķ' => 'ķ', - 'Ĺ' => 'Ĺ', - 'ĺ' => 'ĺ', - 'Ļ' => 'Ļ', - 'ļ' => 'ļ', - 'Ľ' => 'Ľ', - 'ľ' => 'ľ', - 'Ń' => 'Ń', - 'ń' => 'ń', - 'Ņ' => 'Ņ', - 'ņ' => 'ņ', - 'Ň' => 'Ň', - 'ň' => 'ň', - 'Ō' => 'Ō', - 'ō' => 'ō', - 'Ŏ' => 'Ŏ', - 'ŏ' => 'ŏ', - 'Ő' => 'Ő', - 'ő' => 'ő', - 'Ŕ' => 'Ŕ', - 'ŕ' => 'ŕ', - 'Ŗ' => 'Ŗ', - 'ŗ' => 'ŗ', - 'Ř' => 'Ř', - 'ř' => 'ř', - 'Ś' => 'Ś', - 'ś' => 'ś', - 'Ŝ' => 'Ŝ', - 'ŝ' => 'ŝ', - 'Ş' => 'Ş', - 'ş' => 'ş', - 'Š' => 'Š', - 'š' => 'š', - 'Ţ' => 'Ţ', - 'ţ' => 'ţ', - 'Ť' => 'Ť', - 'ť' => 'ť', - 'Ũ' => 'Ũ', - 'ũ' => 'ũ', - 'Ū' => 'Ū', - 'ū' => 'ū', - 'Ŭ' => 'Ŭ', - 'ŭ' => 'ŭ', - 'Ů' => 'Ů', - 'ů' => 'ů', - 'Ű' => 'Ű', - 'ű' => 'ű', - 'Ų' => 'Ų', - 'ų' => 'ų', - 'Ŵ' => 'Ŵ', - 'ŵ' => 'ŵ', - 'Ŷ' => 'Ŷ', - 'ŷ' => 'ŷ', - 'Ÿ' => 'Ÿ', - 'Ź' => 'Ź', - 'ź' => 'ź', - 'Ż' => 'Ż', - 'ż' => 'ż', - 'Ž' => 'Ž', - 'ž' => 'ž', - 'Ơ' => 'Ơ', - 'ơ' => 'ơ', - 'Ư' => 'Ư', - 'ư' => 'ư', - 'Ǎ' => 'Ǎ', - 'ǎ' => 'ǎ', - 'Ǐ' => 'Ǐ', - 'ǐ' => 'ǐ', - 'Ǒ' => 'Ǒ', - 'ǒ' => 'ǒ', - 'Ǔ' => 'Ǔ', - 'ǔ' => 'ǔ', - 'Ǖ' => 'Ǖ', - 'ǖ' => 'ǖ', - 'Ǘ' => 'Ǘ', - 'ǘ' => 'ǘ', - 'Ǚ' => 'Ǚ', - 'ǚ' => 'ǚ', - 'Ǜ' => 'Ǜ', - 'ǜ' => 'ǜ', - 'Ǟ' => 'Ǟ', - 'ǟ' => 'ǟ', - 'Ǡ' => 'Ǡ', - 'ǡ' => 'ǡ', - 'Ǣ' => 'Ǣ', - 'ǣ' => 'ǣ', - 'Ǧ' => 'Ǧ', - 'ǧ' => 'ǧ', - 'Ǩ' => 'Ǩ', - 'ǩ' => 'ǩ', - 'Ǫ' => 'Ǫ', - 'ǫ' => 'ǫ', - 'Ǭ' => 'Ǭ', - 'ǭ' => 'ǭ', - 'Ǯ' => 'Ǯ', - 'ǯ' => 'ǯ', - 'ǰ' => 'ǰ', - 'Ǵ' => 'Ǵ', - 'ǵ' => 'ǵ', - 'Ǹ' => 'Ǹ', - 'ǹ' => 'ǹ', - 'Ǻ' => 'Ǻ', - 'ǻ' => 'ǻ', - 'Ǽ' => 'Ǽ', - 'ǽ' => 'ǽ', - 'Ǿ' => 'Ǿ', - 'ǿ' => 'ǿ', - 'Ȁ' => 'Ȁ', - 'ȁ' => 'ȁ', - 'Ȃ' => 'Ȃ', - 'ȃ' => 'ȃ', - 'Ȅ' => 'Ȅ', - 'ȅ' => 'ȅ', - 'Ȇ' => 'Ȇ', - 'ȇ' => 'ȇ', - 'Ȉ' => 'Ȉ', - 'ȉ' => 'ȉ', - 'Ȋ' => 'Ȋ', - 'ȋ' => 'ȋ', - 'Ȍ' => 'Ȍ', - 'ȍ' => 'ȍ', - 'Ȏ' => 'Ȏ', - 'ȏ' => 'ȏ', - 'Ȑ' => 'Ȑ', - 'ȑ' => 'ȑ', - 'Ȓ' => 'Ȓ', - 'ȓ' => 'ȓ', - 'Ȕ' => 'Ȕ', - 'ȕ' => 'ȕ', - 'Ȗ' => 'Ȗ', - 'ȗ' => 'ȗ', - 'Ș' => 'Ș', - 'ș' => 'ș', - 'Ț' => 'Ț', - 'ț' => 'ț', - 'Ȟ' => 'Ȟ', - 'ȟ' => 'ȟ', - 'Ȧ' => 'Ȧ', - 'ȧ' => 'ȧ', - 'Ȩ' => 'Ȩ', - 'ȩ' => 'ȩ', - 'Ȫ' => 'Ȫ', - 'ȫ' => 'ȫ', - 'Ȭ' => 'Ȭ', - 'ȭ' => 'ȭ', - 'Ȯ' => 'Ȯ', - 'ȯ' => 'ȯ', - 'Ȱ' => 'Ȱ', - 'ȱ' => 'ȱ', - 'Ȳ' => 'Ȳ', - 'ȳ' => 'ȳ', - '΅' => '΅', - 'Ά' => 'Ά', - 'Έ' => 'Έ', - 'Ή' => 'Ή', - 'Ί' => 'Ί', - 'Ό' => 'Ό', - 'Ύ' => 'Ύ', - 'Ώ' => 'Ώ', - 'ΐ' => 'ΐ', - 'Ϊ' => 'Ϊ', - 'Ϋ' => 'Ϋ', - 'ά' => 'ά', - 'έ' => 'έ', - 'ή' => 'ή', - 'ί' => 'ί', - 'ΰ' => 'ΰ', - 'ϊ' => 'ϊ', - 'ϋ' => 'ϋ', - 'ό' => 'ό', - 'ύ' => 'ύ', - 'ώ' => 'ώ', - 'ϓ' => 'ϓ', - 'ϔ' => 'ϔ', - 'Ѐ' => 'Ѐ', - 'Ё' => 'Ё', - 'Ѓ' => 'Ѓ', - 'Ї' => 'Ї', - 'Ќ' => 'Ќ', - 'Ѝ' => 'Ѝ', - 'Ў' => 'Ў', - 'Й' => 'Й', - 'й' => 'й', - 'ѐ' => 'ѐ', - 'ё' => 'ё', - 'ѓ' => 'ѓ', - 'ї' => 'ї', - 'ќ' => 'ќ', - 'ѝ' => 'ѝ', - 'ў' => 'ў', - 'Ѷ' => 'Ѷ', - 'ѷ' => 'ѷ', - 'Ӂ' => 'Ӂ', - 'ӂ' => 'ӂ', - 'Ӑ' => 'Ӑ', - 'ӑ' => 'ӑ', - 'Ӓ' => 'Ӓ', - 'ӓ' => 'ӓ', - 'Ӗ' => 'Ӗ', - 'ӗ' => 'ӗ', - 'Ӛ' => 'Ӛ', - 'ӛ' => 'ӛ', - 'Ӝ' => 'Ӝ', - 'ӝ' => 'ӝ', - 'Ӟ' => 'Ӟ', - 'ӟ' => 'ӟ', - 'Ӣ' => 'Ӣ', - 'ӣ' => 'ӣ', - 'Ӥ' => 'Ӥ', - 'ӥ' => 'ӥ', - 'Ӧ' => 'Ӧ', - 'ӧ' => 'ӧ', - 'Ӫ' => 'Ӫ', - 'ӫ' => 'ӫ', - 'Ӭ' => 'Ӭ', - 'ӭ' => 'ӭ', - 'Ӯ' => 'Ӯ', - 'ӯ' => 'ӯ', - 'Ӱ' => 'Ӱ', - 'ӱ' => 'ӱ', - 'Ӳ' => 'Ӳ', - 'ӳ' => 'ӳ', - 'Ӵ' => 'Ӵ', - 'ӵ' => 'ӵ', - 'Ӹ' => 'Ӹ', - 'ӹ' => 'ӹ', - 'آ' => 'آ', - 'أ' => 'أ', - 'ؤ' => 'ؤ', - 'إ' => 'إ', - 'ئ' => 'ئ', - 'ۀ' => 'ۀ', - 'ۂ' => 'ۂ', - 'ۓ' => 'ۓ', - 'ऩ' => 'ऩ', - 'ऱ' => 'ऱ', - 'ऴ' => 'ऴ', - 'ো' => 'ো', - 'ৌ' => 'ৌ', - 'ୈ' => 'ୈ', - 'ୋ' => 'ୋ', - 'ୌ' => 'ୌ', - 'ஔ' => 'ஔ', - 'ொ' => 'ொ', - 'ோ' => 'ோ', - 'ௌ' => 'ௌ', - 'ై' => 'ై', - 'ೀ' => 'ೀ', - 'ೇ' => 'ೇ', - 'ೈ' => 'ೈ', - 'ೊ' => 'ೊ', - 'ೋ' => 'ೋ', - 'ൊ' => 'ൊ', - 'ോ' => 'ോ', - 'ൌ' => 'ൌ', - 'ේ' => 'ේ', - 'ො' => 'ො', - 'ෝ' => 'ෝ', - 'ෞ' => 'ෞ', - 'ဦ' => 'ဦ', - 'ᬆ' => 'ᬆ', - 'ᬈ' => 'ᬈ', - 'ᬊ' => 'ᬊ', - 'ᬌ' => 'ᬌ', - 'ᬎ' => 'ᬎ', - 'ᬒ' => 'ᬒ', - 'ᬻ' => 'ᬻ', - 'ᬽ' => 'ᬽ', - 'ᭀ' => 'ᭀ', - 'ᭁ' => 'ᭁ', - 'ᭃ' => 'ᭃ', - 'Ḁ' => 'Ḁ', - 'ḁ' => 'ḁ', - 'Ḃ' => 'Ḃ', - 'ḃ' => 'ḃ', - 'Ḅ' => 'Ḅ', - 'ḅ' => 'ḅ', - 'Ḇ' => 'Ḇ', - 'ḇ' => 'ḇ', - 'Ḉ' => 'Ḉ', - 'ḉ' => 'ḉ', - 'Ḋ' => 'Ḋ', - 'ḋ' => 'ḋ', - 'Ḍ' => 'Ḍ', - 'ḍ' => 'ḍ', - 'Ḏ' => 'Ḏ', - 'ḏ' => 'ḏ', - 'Ḑ' => 'Ḑ', - 'ḑ' => 'ḑ', - 'Ḓ' => 'Ḓ', - 'ḓ' => 'ḓ', - 'Ḕ' => 'Ḕ', - 'ḕ' => 'ḕ', - 'Ḗ' => 'Ḗ', - 'ḗ' => 'ḗ', - 'Ḙ' => 'Ḙ', - 'ḙ' => 'ḙ', - 'Ḛ' => 'Ḛ', - 'ḛ' => 'ḛ', - 'Ḝ' => 'Ḝ', - 'ḝ' => 'ḝ', - 'Ḟ' => 'Ḟ', - 'ḟ' => 'ḟ', - 'Ḡ' => 'Ḡ', - 'ḡ' => 'ḡ', - 'Ḣ' => 'Ḣ', - 'ḣ' => 'ḣ', - 'Ḥ' => 'Ḥ', - 'ḥ' => 'ḥ', - 'Ḧ' => 'Ḧ', - 'ḧ' => 'ḧ', - 'Ḩ' => 'Ḩ', - 'ḩ' => 'ḩ', - 'Ḫ' => 'Ḫ', - 'ḫ' => 'ḫ', - 'Ḭ' => 'Ḭ', - 'ḭ' => 'ḭ', - 'Ḯ' => 'Ḯ', - 'ḯ' => 'ḯ', - 'Ḱ' => 'Ḱ', - 'ḱ' => 'ḱ', - 'Ḳ' => 'Ḳ', - 'ḳ' => 'ḳ', - 'Ḵ' => 'Ḵ', - 'ḵ' => 'ḵ', - 'Ḷ' => 'Ḷ', - 'ḷ' => 'ḷ', - 'Ḹ' => 'Ḹ', - 'ḹ' => 'ḹ', - 'Ḻ' => 'Ḻ', - 'ḻ' => 'ḻ', - 'Ḽ' => 'Ḽ', - 'ḽ' => 'ḽ', - 'Ḿ' => 'Ḿ', - 'ḿ' => 'ḿ', - 'Ṁ' => 'Ṁ', - 'ṁ' => 'ṁ', - 'Ṃ' => 'Ṃ', - 'ṃ' => 'ṃ', - 'Ṅ' => 'Ṅ', - 'ṅ' => 'ṅ', - 'Ṇ' => 'Ṇ', - 'ṇ' => 'ṇ', - 'Ṉ' => 'Ṉ', - 'ṉ' => 'ṉ', - 'Ṋ' => 'Ṋ', - 'ṋ' => 'ṋ', - 'Ṍ' => 'Ṍ', - 'ṍ' => 'ṍ', - 'Ṏ' => 'Ṏ', - 'ṏ' => 'ṏ', - 'Ṑ' => 'Ṑ', - 'ṑ' => 'ṑ', - 'Ṓ' => 'Ṓ', - 'ṓ' => 'ṓ', - 'Ṕ' => 'Ṕ', - 'ṕ' => 'ṕ', - 'Ṗ' => 'Ṗ', - 'ṗ' => 'ṗ', - 'Ṙ' => 'Ṙ', - 'ṙ' => 'ṙ', - 'Ṛ' => 'Ṛ', - 'ṛ' => 'ṛ', - 'Ṝ' => 'Ṝ', - 'ṝ' => 'ṝ', - 'Ṟ' => 'Ṟ', - 'ṟ' => 'ṟ', - 'Ṡ' => 'Ṡ', - 'ṡ' => 'ṡ', - 'Ṣ' => 'Ṣ', - 'ṣ' => 'ṣ', - 'Ṥ' => 'Ṥ', - 'ṥ' => 'ṥ', - 'Ṧ' => 'Ṧ', - 'ṧ' => 'ṧ', - 'Ṩ' => 'Ṩ', - 'ṩ' => 'ṩ', - 'Ṫ' => 'Ṫ', - 'ṫ' => 'ṫ', - 'Ṭ' => 'Ṭ', - 'ṭ' => 'ṭ', - 'Ṯ' => 'Ṯ', - 'ṯ' => 'ṯ', - 'Ṱ' => 'Ṱ', - 'ṱ' => 'ṱ', - 'Ṳ' => 'Ṳ', - 'ṳ' => 'ṳ', - 'Ṵ' => 'Ṵ', - 'ṵ' => 'ṵ', - 'Ṷ' => 'Ṷ', - 'ṷ' => 'ṷ', - 'Ṹ' => 'Ṹ', - 'ṹ' => 'ṹ', - 'Ṻ' => 'Ṻ', - 'ṻ' => 'ṻ', - 'Ṽ' => 'Ṽ', - 'ṽ' => 'ṽ', - 'Ṿ' => 'Ṿ', - 'ṿ' => 'ṿ', - 'Ẁ' => 'Ẁ', - 'ẁ' => 'ẁ', - 'Ẃ' => 'Ẃ', - 'ẃ' => 'ẃ', - 'Ẅ' => 'Ẅ', - 'ẅ' => 'ẅ', - 'Ẇ' => 'Ẇ', - 'ẇ' => 'ẇ', - 'Ẉ' => 'Ẉ', - 'ẉ' => 'ẉ', - 'Ẋ' => 'Ẋ', - 'ẋ' => 'ẋ', - 'Ẍ' => 'Ẍ', - 'ẍ' => 'ẍ', - 'Ẏ' => 'Ẏ', - 'ẏ' => 'ẏ', - 'Ẑ' => 'Ẑ', - 'ẑ' => 'ẑ', - 'Ẓ' => 'Ẓ', - 'ẓ' => 'ẓ', - 'Ẕ' => 'Ẕ', - 'ẕ' => 'ẕ', - 'ẖ' => 'ẖ', - 'ẗ' => 'ẗ', - 'ẘ' => 'ẘ', - 'ẙ' => 'ẙ', - 'ẛ' => 'ẛ', - 'Ạ' => 'Ạ', - 'ạ' => 'ạ', - 'Ả' => 'Ả', - 'ả' => 'ả', - 'Ấ' => 'Ấ', - 'ấ' => 'ấ', - 'Ầ' => 'Ầ', - 'ầ' => 'ầ', - 'Ẩ' => 'Ẩ', - 'ẩ' => 'ẩ', - 'Ẫ' => 'Ẫ', - 'ẫ' => 'ẫ', - 'Ậ' => 'Ậ', - 'ậ' => 'ậ', - 'Ắ' => 'Ắ', - 'ắ' => 'ắ', - 'Ằ' => 'Ằ', - 'ằ' => 'ằ', - 'Ẳ' => 'Ẳ', - 'ẳ' => 'ẳ', - 'Ẵ' => 'Ẵ', - 'ẵ' => 'ẵ', - 'Ặ' => 'Ặ', - 'ặ' => 'ặ', - 'Ẹ' => 'Ẹ', - 'ẹ' => 'ẹ', - 'Ẻ' => 'Ẻ', - 'ẻ' => 'ẻ', - 'Ẽ' => 'Ẽ', - 'ẽ' => 'ẽ', - 'Ế' => 'Ế', - 'ế' => 'ế', - 'Ề' => 'Ề', - 'ề' => 'ề', - 'Ể' => 'Ể', - 'ể' => 'ể', - 'Ễ' => 'Ễ', - 'ễ' => 'ễ', - 'Ệ' => 'Ệ', - 'ệ' => 'ệ', - 'Ỉ' => 'Ỉ', - 'ỉ' => 'ỉ', - 'Ị' => 'Ị', - 'ị' => 'ị', - 'Ọ' => 'Ọ', - 'ọ' => 'ọ', - 'Ỏ' => 'Ỏ', - 'ỏ' => 'ỏ', - 'Ố' => 'Ố', - 'ố' => 'ố', - 'Ồ' => 'Ồ', - 'ồ' => 'ồ', - 'Ổ' => 'Ổ', - 'ổ' => 'ổ', - 'Ỗ' => 'Ỗ', - 'ỗ' => 'ỗ', - 'Ộ' => 'Ộ', - 'ộ' => 'ộ', - 'Ớ' => 'Ớ', - 'ớ' => 'ớ', - 'Ờ' => 'Ờ', - 'ờ' => 'ờ', - 'Ở' => 'Ở', - 'ở' => 'ở', - 'Ỡ' => 'Ỡ', - 'ỡ' => 'ỡ', - 'Ợ' => 'Ợ', - 'ợ' => 'ợ', - 'Ụ' => 'Ụ', - 'ụ' => 'ụ', - 'Ủ' => 'Ủ', - 'ủ' => 'ủ', - 'Ứ' => 'Ứ', - 'ứ' => 'ứ', - 'Ừ' => 'Ừ', - 'ừ' => 'ừ', - 'Ử' => 'Ử', - 'ử' => 'ử', - 'Ữ' => 'Ữ', - 'ữ' => 'ữ', - 'Ự' => 'Ự', - 'ự' => 'ự', - 'Ỳ' => 'Ỳ', - 'ỳ' => 'ỳ', - 'Ỵ' => 'Ỵ', - 'ỵ' => 'ỵ', - 'Ỷ' => 'Ỷ', - 'ỷ' => 'ỷ', - 'Ỹ' => 'Ỹ', - 'ỹ' => 'ỹ', - 'ἀ' => 'ἀ', - 'ἁ' => 'ἁ', - 'ἂ' => 'ἂ', - 'ἃ' => 'ἃ', - 'ἄ' => 'ἄ', - 'ἅ' => 'ἅ', - 'ἆ' => 'ἆ', - 'ἇ' => 'ἇ', - 'Ἀ' => 'Ἀ', - 'Ἁ' => 'Ἁ', - 'Ἂ' => 'Ἂ', - 'Ἃ' => 'Ἃ', - 'Ἄ' => 'Ἄ', - 'Ἅ' => 'Ἅ', - 'Ἆ' => 'Ἆ', - 'Ἇ' => 'Ἇ', - 'ἐ' => 'ἐ', - 'ἑ' => 'ἑ', - 'ἒ' => 'ἒ', - 'ἓ' => 'ἓ', - 'ἔ' => 'ἔ', - 'ἕ' => 'ἕ', - 'Ἐ' => 'Ἐ', - 'Ἑ' => 'Ἑ', - 'Ἒ' => 'Ἒ', - 'Ἓ' => 'Ἓ', - 'Ἔ' => 'Ἔ', - 'Ἕ' => 'Ἕ', - 'ἠ' => 'ἠ', - 'ἡ' => 'ἡ', - 'ἢ' => 'ἢ', - 'ἣ' => 'ἣ', - 'ἤ' => 'ἤ', - 'ἥ' => 'ἥ', - 'ἦ' => 'ἦ', - 'ἧ' => 'ἧ', - 'Ἠ' => 'Ἠ', - 'Ἡ' => 'Ἡ', - 'Ἢ' => 'Ἢ', - 'Ἣ' => 'Ἣ', - 'Ἤ' => 'Ἤ', - 'Ἥ' => 'Ἥ', - 'Ἦ' => 'Ἦ', - 'Ἧ' => 'Ἧ', - 'ἰ' => 'ἰ', - 'ἱ' => 'ἱ', - 'ἲ' => 'ἲ', - 'ἳ' => 'ἳ', - 'ἴ' => 'ἴ', - 'ἵ' => 'ἵ', - 'ἶ' => 'ἶ', - 'ἷ' => 'ἷ', - 'Ἰ' => 'Ἰ', - 'Ἱ' => 'Ἱ', - 'Ἲ' => 'Ἲ', - 'Ἳ' => 'Ἳ', - 'Ἴ' => 'Ἴ', - 'Ἵ' => 'Ἵ', - 'Ἶ' => 'Ἶ', - 'Ἷ' => 'Ἷ', - 'ὀ' => 'ὀ', - 'ὁ' => 'ὁ', - 'ὂ' => 'ὂ', - 'ὃ' => 'ὃ', - 'ὄ' => 'ὄ', - 'ὅ' => 'ὅ', - 'Ὀ' => 'Ὀ', - 'Ὁ' => 'Ὁ', - 'Ὂ' => 'Ὂ', - 'Ὃ' => 'Ὃ', - 'Ὄ' => 'Ὄ', - 'Ὅ' => 'Ὅ', - 'ὐ' => 'ὐ', - 'ὑ' => 'ὑ', - 'ὒ' => 'ὒ', - 'ὓ' => 'ὓ', - 'ὔ' => 'ὔ', - 'ὕ' => 'ὕ', - 'ὖ' => 'ὖ', - 'ὗ' => 'ὗ', - 'Ὑ' => 'Ὑ', - 'Ὓ' => 'Ὓ', - 'Ὕ' => 'Ὕ', - 'Ὗ' => 'Ὗ', - 'ὠ' => 'ὠ', - 'ὡ' => 'ὡ', - 'ὢ' => 'ὢ', - 'ὣ' => 'ὣ', - 'ὤ' => 'ὤ', - 'ὥ' => 'ὥ', - 'ὦ' => 'ὦ', - 'ὧ' => 'ὧ', - 'Ὠ' => 'Ὠ', - 'Ὡ' => 'Ὡ', - 'Ὢ' => 'Ὢ', - 'Ὣ' => 'Ὣ', - 'Ὤ' => 'Ὤ', - 'Ὥ' => 'Ὥ', - 'Ὦ' => 'Ὦ', - 'Ὧ' => 'Ὧ', - 'ὰ' => 'ὰ', - 'ὲ' => 'ὲ', - 'ὴ' => 'ὴ', - 'ὶ' => 'ὶ', - 'ὸ' => 'ὸ', - 'ὺ' => 'ὺ', - 'ὼ' => 'ὼ', - 'ᾀ' => 'ᾀ', - 'ᾁ' => 'ᾁ', - 'ᾂ' => 'ᾂ', - 'ᾃ' => 'ᾃ', - 'ᾄ' => 'ᾄ', - 'ᾅ' => 'ᾅ', - 'ᾆ' => 'ᾆ', - 'ᾇ' => 'ᾇ', - 'ᾈ' => 'ᾈ', - 'ᾉ' => 'ᾉ', - 'ᾊ' => 'ᾊ', - 'ᾋ' => 'ᾋ', - 'ᾌ' => 'ᾌ', - 'ᾍ' => 'ᾍ', - 'ᾎ' => 'ᾎ', - 'ᾏ' => 'ᾏ', - 'ᾐ' => 'ᾐ', - 'ᾑ' => 'ᾑ', - 'ᾒ' => 'ᾒ', - 'ᾓ' => 'ᾓ', - 'ᾔ' => 'ᾔ', - 'ᾕ' => 'ᾕ', - 'ᾖ' => 'ᾖ', - 'ᾗ' => 'ᾗ', - 'ᾘ' => 'ᾘ', - 'ᾙ' => 'ᾙ', - 'ᾚ' => 'ᾚ', - 'ᾛ' => 'ᾛ', - 'ᾜ' => 'ᾜ', - 'ᾝ' => 'ᾝ', - 'ᾞ' => 'ᾞ', - 'ᾟ' => 'ᾟ', - 'ᾠ' => 'ᾠ', - 'ᾡ' => 'ᾡ', - 'ᾢ' => 'ᾢ', - 'ᾣ' => 'ᾣ', - 'ᾤ' => 'ᾤ', - 'ᾥ' => 'ᾥ', - 'ᾦ' => 'ᾦ', - 'ᾧ' => 'ᾧ', - 'ᾨ' => 'ᾨ', - 'ᾩ' => 'ᾩ', - 'ᾪ' => 'ᾪ', - 'ᾫ' => 'ᾫ', - 'ᾬ' => 'ᾬ', - 'ᾭ' => 'ᾭ', - 'ᾮ' => 'ᾮ', - 'ᾯ' => 'ᾯ', - 'ᾰ' => 'ᾰ', - 'ᾱ' => 'ᾱ', - 'ᾲ' => 'ᾲ', - 'ᾳ' => 'ᾳ', - 'ᾴ' => 'ᾴ', - 'ᾶ' => 'ᾶ', - 'ᾷ' => 'ᾷ', - 'Ᾰ' => 'Ᾰ', - 'Ᾱ' => 'Ᾱ', - 'Ὰ' => 'Ὰ', - 'ᾼ' => 'ᾼ', - '῁' => '῁', - 'ῂ' => 'ῂ', - 'ῃ' => 'ῃ', - 'ῄ' => 'ῄ', - 'ῆ' => 'ῆ', - 'ῇ' => 'ῇ', - 'Ὲ' => 'Ὲ', - 'Ὴ' => 'Ὴ', - 'ῌ' => 'ῌ', - '῍' => '῍', - '῎' => '῎', - '῏' => '῏', - 'ῐ' => 'ῐ', - 'ῑ' => 'ῑ', - 'ῒ' => 'ῒ', - 'ῖ' => 'ῖ', - 'ῗ' => 'ῗ', - 'Ῐ' => 'Ῐ', - 'Ῑ' => 'Ῑ', - 'Ὶ' => 'Ὶ', - '῝' => '῝', - '῞' => '῞', - '῟' => '῟', - 'ῠ' => 'ῠ', - 'ῡ' => 'ῡ', - 'ῢ' => 'ῢ', - 'ῤ' => 'ῤ', - 'ῥ' => 'ῥ', - 'ῦ' => 'ῦ', - 'ῧ' => 'ῧ', - 'Ῠ' => 'Ῠ', - 'Ῡ' => 'Ῡ', - 'Ὺ' => 'Ὺ', - 'Ῥ' => 'Ῥ', - '῭' => '῭', - 'ῲ' => 'ῲ', - 'ῳ' => 'ῳ', - 'ῴ' => 'ῴ', - 'ῶ' => 'ῶ', - 'ῷ' => 'ῷ', - 'Ὸ' => 'Ὸ', - 'Ὼ' => 'Ὼ', - 'ῼ' => 'ῼ', - '↚' => '↚', - '↛' => '↛', - '↮' => '↮', - '⇍' => '⇍', - '⇎' => '⇎', - '⇏' => '⇏', - '∄' => '∄', - '∉' => '∉', - '∌' => '∌', - '∤' => '∤', - '∦' => '∦', - '≁' => '≁', - '≄' => '≄', - '≇' => '≇', - '≉' => '≉', - '≠' => '≠', - '≢' => '≢', - '≭' => '≭', - '≮' => '≮', - '≯' => '≯', - '≰' => '≰', - '≱' => '≱', - '≴' => '≴', - '≵' => '≵', - '≸' => '≸', - '≹' => '≹', - '⊀' => '⊀', - '⊁' => '⊁', - '⊄' => '⊄', - '⊅' => '⊅', - '⊈' => '⊈', - '⊉' => '⊉', - '⊬' => '⊬', - '⊭' => '⊭', - '⊮' => '⊮', - '⊯' => '⊯', - '⋠' => '⋠', - '⋡' => '⋡', - '⋢' => '⋢', - '⋣' => '⋣', - '⋪' => '⋪', - '⋫' => '⋫', - '⋬' => '⋬', - '⋭' => '⋭', - 'が' => 'が', - 'ぎ' => 'ぎ', - 'ぐ' => 'ぐ', - 'げ' => 'げ', - 'ご' => 'ご', - 'ざ' => 'ざ', - 'じ' => 'じ', - 'ず' => 'ず', - 'ぜ' => 'ぜ', - 'ぞ' => 'ぞ', - 'だ' => 'だ', - 'ぢ' => 'ぢ', - 'づ' => 'づ', - 'で' => 'で', - 'ど' => 'ど', - 'ば' => 'ば', - 'ぱ' => 'ぱ', - 'び' => 'び', - 'ぴ' => 'ぴ', - 'ぶ' => 'ぶ', - 'ぷ' => 'ぷ', - 'べ' => 'べ', - 'ぺ' => 'ぺ', - 'ぼ' => 'ぼ', - 'ぽ' => 'ぽ', - 'ゔ' => 'ゔ', - 'ゞ' => 'ゞ', - 'ガ' => 'ガ', - 'ギ' => 'ギ', - 'グ' => 'グ', - 'ゲ' => 'ゲ', - 'ゴ' => 'ゴ', - 'ザ' => 'ザ', - 'ジ' => 'ジ', - 'ズ' => 'ズ', - 'ゼ' => 'ゼ', - 'ゾ' => 'ゾ', - 'ダ' => 'ダ', - 'ヂ' => 'ヂ', - 'ヅ' => 'ヅ', - 'デ' => 'デ', - 'ド' => 'ド', - 'バ' => 'バ', - 'パ' => 'パ', - 'ビ' => 'ビ', - 'ピ' => 'ピ', - 'ブ' => 'ブ', - 'プ' => 'プ', - 'ベ' => 'ベ', - 'ペ' => 'ペ', - 'ボ' => 'ボ', - 'ポ' => 'ポ', - 'ヴ' => 'ヴ', - 'ヷ' => 'ヷ', - 'ヸ' => 'ヸ', - 'ヹ' => 'ヹ', - 'ヺ' => 'ヺ', - 'ヾ' => 'ヾ', - '𑂚' => '𑂚', - '𑂜' => '𑂜', - '𑂫' => '𑂫', - '𑄮' => '𑄮', - '𑄯' => '𑄯', - '𑍋' => '𑍋', - '𑍌' => '𑍌', - '𑒻' => '𑒻', - '𑒼' => '𑒼', - '𑒾' => '𑒾', - '𑖺' => '𑖺', - '𑖻' => '𑖻', - '𑤸' => '𑤸', -); diff --git a/tools/php-cs-fixer/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalDecomposition.php b/tools/php-cs-fixer/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalDecomposition.php deleted file mode 100644 index 5a3e8e0..0000000 --- a/tools/php-cs-fixer/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalDecomposition.php +++ /dev/null @@ -1,2065 +0,0 @@ - 'À', - 'Á' => 'Á', - 'Â' => 'Â', - 'Ã' => 'Ã', - 'Ä' => 'Ä', - 'Å' => 'Å', - 'Ç' => 'Ç', - 'È' => 'È', - 'É' => 'É', - 'Ê' => 'Ê', - 'Ë' => 'Ë', - 'Ì' => 'Ì', - 'Í' => 'Í', - 'Î' => 'Î', - 'Ï' => 'Ï', - 'Ñ' => 'Ñ', - 'Ò' => 'Ò', - 'Ó' => 'Ó', - 'Ô' => 'Ô', - 'Õ' => 'Õ', - 'Ö' => 'Ö', - 'Ù' => 'Ù', - 'Ú' => 'Ú', - 'Û' => 'Û', - 'Ü' => 'Ü', - 'Ý' => 'Ý', - 'à' => 'à', - 'á' => 'á', - 'â' => 'â', - 'ã' => 'ã', - 'ä' => 'ä', - 'å' => 'å', - 'ç' => 'ç', - 'è' => 'è', - 'é' => 'é', - 'ê' => 'ê', - 'ë' => 'ë', - 'ì' => 'ì', - 'í' => 'í', - 'î' => 'î', - 'ï' => 'ï', - 'ñ' => 'ñ', - 'ò' => 'ò', - 'ó' => 'ó', - 'ô' => 'ô', - 'õ' => 'õ', - 'ö' => 'ö', - 'ù' => 'ù', - 'ú' => 'ú', - 'û' => 'û', - 'ü' => 'ü', - 'ý' => 'ý', - 'ÿ' => 'ÿ', - 'Ā' => 'Ā', - 'ā' => 'ā', - 'Ă' => 'Ă', - 'ă' => 'ă', - 'Ą' => 'Ą', - 'ą' => 'ą', - 'Ć' => 'Ć', - 'ć' => 'ć', - 'Ĉ' => 'Ĉ', - 'ĉ' => 'ĉ', - 'Ċ' => 'Ċ', - 'ċ' => 'ċ', - 'Č' => 'Č', - 'č' => 'č', - 'Ď' => 'Ď', - 'ď' => 'ď', - 'Ē' => 'Ē', - 'ē' => 'ē', - 'Ĕ' => 'Ĕ', - 'ĕ' => 'ĕ', - 'Ė' => 'Ė', - 'ė' => 'ė', - 'Ę' => 'Ę', - 'ę' => 'ę', - 'Ě' => 'Ě', - 'ě' => 'ě', - 'Ĝ' => 'Ĝ', - 'ĝ' => 'ĝ', - 'Ğ' => 'Ğ', - 'ğ' => 'ğ', - 'Ġ' => 'Ġ', - 'ġ' => 'ġ', - 'Ģ' => 'Ģ', - 'ģ' => 'ģ', - 'Ĥ' => 'Ĥ', - 'ĥ' => 'ĥ', - 'Ĩ' => 'Ĩ', - 'ĩ' => 'ĩ', - 'Ī' => 'Ī', - 'ī' => 'ī', - 'Ĭ' => 'Ĭ', - 'ĭ' => 'ĭ', - 'Į' => 'Į', - 'į' => 'į', - 'İ' => 'İ', - 'Ĵ' => 'Ĵ', - 'ĵ' => 'ĵ', - 'Ķ' => 'Ķ', - 'ķ' => 'ķ', - 'Ĺ' => 'Ĺ', - 'ĺ' => 'ĺ', - 'Ļ' => 'Ļ', - 'ļ' => 'ļ', - 'Ľ' => 'Ľ', - 'ľ' => 'ľ', - 'Ń' => 'Ń', - 'ń' => 'ń', - 'Ņ' => 'Ņ', - 'ņ' => 'ņ', - 'Ň' => 'Ň', - 'ň' => 'ň', - 'Ō' => 'Ō', - 'ō' => 'ō', - 'Ŏ' => 'Ŏ', - 'ŏ' => 'ŏ', - 'Ő' => 'Ő', - 'ő' => 'ő', - 'Ŕ' => 'Ŕ', - 'ŕ' => 'ŕ', - 'Ŗ' => 'Ŗ', - 'ŗ' => 'ŗ', - 'Ř' => 'Ř', - 'ř' => 'ř', - 'Ś' => 'Ś', - 'ś' => 'ś', - 'Ŝ' => 'Ŝ', - 'ŝ' => 'ŝ', - 'Ş' => 'Ş', - 'ş' => 'ş', - 'Š' => 'Š', - 'š' => 'š', - 'Ţ' => 'Ţ', - 'ţ' => 'ţ', - 'Ť' => 'Ť', - 'ť' => 'ť', - 'Ũ' => 'Ũ', - 'ũ' => 'ũ', - 'Ū' => 'Ū', - 'ū' => 'ū', - 'Ŭ' => 'Ŭ', - 'ŭ' => 'ŭ', - 'Ů' => 'Ů', - 'ů' => 'ů', - 'Ű' => 'Ű', - 'ű' => 'ű', - 'Ų' => 'Ų', - 'ų' => 'ų', - 'Ŵ' => 'Ŵ', - 'ŵ' => 'ŵ', - 'Ŷ' => 'Ŷ', - 'ŷ' => 'ŷ', - 'Ÿ' => 'Ÿ', - 'Ź' => 'Ź', - 'ź' => 'ź', - 'Ż' => 'Ż', - 'ż' => 'ż', - 'Ž' => 'Ž', - 'ž' => 'ž', - 'Ơ' => 'Ơ', - 'ơ' => 'ơ', - 'Ư' => 'Ư', - 'ư' => 'ư', - 'Ǎ' => 'Ǎ', - 'ǎ' => 'ǎ', - 'Ǐ' => 'Ǐ', - 'ǐ' => 'ǐ', - 'Ǒ' => 'Ǒ', - 'ǒ' => 'ǒ', - 'Ǔ' => 'Ǔ', - 'ǔ' => 'ǔ', - 'Ǖ' => 'Ǖ', - 'ǖ' => 'ǖ', - 'Ǘ' => 'Ǘ', - 'ǘ' => 'ǘ', - 'Ǚ' => 'Ǚ', - 'ǚ' => 'ǚ', - 'Ǜ' => 'Ǜ', - 'ǜ' => 'ǜ', - 'Ǟ' => 'Ǟ', - 'ǟ' => 'ǟ', - 'Ǡ' => 'Ǡ', - 'ǡ' => 'ǡ', - 'Ǣ' => 'Ǣ', - 'ǣ' => 'ǣ', - 'Ǧ' => 'Ǧ', - 'ǧ' => 'ǧ', - 'Ǩ' => 'Ǩ', - 'ǩ' => 'ǩ', - 'Ǫ' => 'Ǫ', - 'ǫ' => 'ǫ', - 'Ǭ' => 'Ǭ', - 'ǭ' => 'ǭ', - 'Ǯ' => 'Ǯ', - 'ǯ' => 'ǯ', - 'ǰ' => 'ǰ', - 'Ǵ' => 'Ǵ', - 'ǵ' => 'ǵ', - 'Ǹ' => 'Ǹ', - 'ǹ' => 'ǹ', - 'Ǻ' => 'Ǻ', - 'ǻ' => 'ǻ', - 'Ǽ' => 'Ǽ', - 'ǽ' => 'ǽ', - 'Ǿ' => 'Ǿ', - 'ǿ' => 'ǿ', - 'Ȁ' => 'Ȁ', - 'ȁ' => 'ȁ', - 'Ȃ' => 'Ȃ', - 'ȃ' => 'ȃ', - 'Ȅ' => 'Ȅ', - 'ȅ' => 'ȅ', - 'Ȇ' => 'Ȇ', - 'ȇ' => 'ȇ', - 'Ȉ' => 'Ȉ', - 'ȉ' => 'ȉ', - 'Ȋ' => 'Ȋ', - 'ȋ' => 'ȋ', - 'Ȍ' => 'Ȍ', - 'ȍ' => 'ȍ', - 'Ȏ' => 'Ȏ', - 'ȏ' => 'ȏ', - 'Ȑ' => 'Ȑ', - 'ȑ' => 'ȑ', - 'Ȓ' => 'Ȓ', - 'ȓ' => 'ȓ', - 'Ȕ' => 'Ȕ', - 'ȕ' => 'ȕ', - 'Ȗ' => 'Ȗ', - 'ȗ' => 'ȗ', - 'Ș' => 'Ș', - 'ș' => 'ș', - 'Ț' => 'Ț', - 'ț' => 'ț', - 'Ȟ' => 'Ȟ', - 'ȟ' => 'ȟ', - 'Ȧ' => 'Ȧ', - 'ȧ' => 'ȧ', - 'Ȩ' => 'Ȩ', - 'ȩ' => 'ȩ', - 'Ȫ' => 'Ȫ', - 'ȫ' => 'ȫ', - 'Ȭ' => 'Ȭ', - 'ȭ' => 'ȭ', - 'Ȯ' => 'Ȯ', - 'ȯ' => 'ȯ', - 'Ȱ' => 'Ȱ', - 'ȱ' => 'ȱ', - 'Ȳ' => 'Ȳ', - 'ȳ' => 'ȳ', - '̀' => '̀', - '́' => '́', - '̓' => '̓', - '̈́' => '̈́', - 'ʹ' => 'ʹ', - ';' => ';', - '΅' => '΅', - 'Ά' => 'Ά', - '·' => '·', - 'Έ' => 'Έ', - 'Ή' => 'Ή', - 'Ί' => 'Ί', - 'Ό' => 'Ό', - 'Ύ' => 'Ύ', - 'Ώ' => 'Ώ', - 'ΐ' => 'ΐ', - 'Ϊ' => 'Ϊ', - 'Ϋ' => 'Ϋ', - 'ά' => 'ά', - 'έ' => 'έ', - 'ή' => 'ή', - 'ί' => 'ί', - 'ΰ' => 'ΰ', - 'ϊ' => 'ϊ', - 'ϋ' => 'ϋ', - 'ό' => 'ό', - 'ύ' => 'ύ', - 'ώ' => 'ώ', - 'ϓ' => 'ϓ', - 'ϔ' => 'ϔ', - 'Ѐ' => 'Ѐ', - 'Ё' => 'Ё', - 'Ѓ' => 'Ѓ', - 'Ї' => 'Ї', - 'Ќ' => 'Ќ', - 'Ѝ' => 'Ѝ', - 'Ў' => 'Ў', - 'Й' => 'Й', - 'й' => 'й', - 'ѐ' => 'ѐ', - 'ё' => 'ё', - 'ѓ' => 'ѓ', - 'ї' => 'ї', - 'ќ' => 'ќ', - 'ѝ' => 'ѝ', - 'ў' => 'ў', - 'Ѷ' => 'Ѷ', - 'ѷ' => 'ѷ', - 'Ӂ' => 'Ӂ', - 'ӂ' => 'ӂ', - 'Ӑ' => 'Ӑ', - 'ӑ' => 'ӑ', - 'Ӓ' => 'Ӓ', - 'ӓ' => 'ӓ', - 'Ӗ' => 'Ӗ', - 'ӗ' => 'ӗ', - 'Ӛ' => 'Ӛ', - 'ӛ' => 'ӛ', - 'Ӝ' => 'Ӝ', - 'ӝ' => 'ӝ', - 'Ӟ' => 'Ӟ', - 'ӟ' => 'ӟ', - 'Ӣ' => 'Ӣ', - 'ӣ' => 'ӣ', - 'Ӥ' => 'Ӥ', - 'ӥ' => 'ӥ', - 'Ӧ' => 'Ӧ', - 'ӧ' => 'ӧ', - 'Ӫ' => 'Ӫ', - 'ӫ' => 'ӫ', - 'Ӭ' => 'Ӭ', - 'ӭ' => 'ӭ', - 'Ӯ' => 'Ӯ', - 'ӯ' => 'ӯ', - 'Ӱ' => 'Ӱ', - 'ӱ' => 'ӱ', - 'Ӳ' => 'Ӳ', - 'ӳ' => 'ӳ', - 'Ӵ' => 'Ӵ', - 'ӵ' => 'ӵ', - 'Ӹ' => 'Ӹ', - 'ӹ' => 'ӹ', - 'آ' => 'آ', - 'أ' => 'أ', - 'ؤ' => 'ؤ', - 'إ' => 'إ', - 'ئ' => 'ئ', - 'ۀ' => 'ۀ', - 'ۂ' => 'ۂ', - 'ۓ' => 'ۓ', - 'ऩ' => 'ऩ', - 'ऱ' => 'ऱ', - 'ऴ' => 'ऴ', - 'क़' => 'क़', - 'ख़' => 'ख़', - 'ग़' => 'ग़', - 'ज़' => 'ज़', - 'ड़' => 'ड़', - 'ढ़' => 'ढ़', - 'फ़' => 'फ़', - 'य़' => 'य़', - 'ো' => 'ো', - 'ৌ' => 'ৌ', - 'ড়' => 'ড়', - 'ঢ়' => 'ঢ়', - 'য়' => 'য়', - 'ਲ਼' => 'ਲ਼', - 'ਸ਼' => 'ਸ਼', - 'ਖ਼' => 'ਖ਼', - 'ਗ਼' => 'ਗ਼', - 'ਜ਼' => 'ਜ਼', - 'ਫ਼' => 'ਫ਼', - 'ୈ' => 'ୈ', - 'ୋ' => 'ୋ', - 'ୌ' => 'ୌ', - 'ଡ଼' => 'ଡ଼', - 'ଢ଼' => 'ଢ଼', - 'ஔ' => 'ஔ', - 'ொ' => 'ொ', - 'ோ' => 'ோ', - 'ௌ' => 'ௌ', - 'ై' => 'ై', - 'ೀ' => 'ೀ', - 'ೇ' => 'ೇ', - 'ೈ' => 'ೈ', - 'ೊ' => 'ೊ', - 'ೋ' => 'ೋ', - 'ൊ' => 'ൊ', - 'ോ' => 'ോ', - 'ൌ' => 'ൌ', - 'ේ' => 'ේ', - 'ො' => 'ො', - 'ෝ' => 'ෝ', - 'ෞ' => 'ෞ', - 'གྷ' => 'གྷ', - 'ཌྷ' => 'ཌྷ', - 'དྷ' => 'དྷ', - 'བྷ' => 'བྷ', - 'ཛྷ' => 'ཛྷ', - 'ཀྵ' => 'ཀྵ', - 'ཱི' => 'ཱི', - 'ཱུ' => 'ཱུ', - 'ྲྀ' => 'ྲྀ', - 'ླྀ' => 'ླྀ', - 'ཱྀ' => 'ཱྀ', - 'ྒྷ' => 'ྒྷ', - 'ྜྷ' => 'ྜྷ', - 'ྡྷ' => 'ྡྷ', - 'ྦྷ' => 'ྦྷ', - 'ྫྷ' => 'ྫྷ', - 'ྐྵ' => 'ྐྵ', - 'ဦ' => 'ဦ', - 'ᬆ' => 'ᬆ', - 'ᬈ' => 'ᬈ', - 'ᬊ' => 'ᬊ', - 'ᬌ' => 'ᬌ', - 'ᬎ' => 'ᬎ', - 'ᬒ' => 'ᬒ', - 'ᬻ' => 'ᬻ', - 'ᬽ' => 'ᬽ', - 'ᭀ' => 'ᭀ', - 'ᭁ' => 'ᭁ', - 'ᭃ' => 'ᭃ', - 'Ḁ' => 'Ḁ', - 'ḁ' => 'ḁ', - 'Ḃ' => 'Ḃ', - 'ḃ' => 'ḃ', - 'Ḅ' => 'Ḅ', - 'ḅ' => 'ḅ', - 'Ḇ' => 'Ḇ', - 'ḇ' => 'ḇ', - 'Ḉ' => 'Ḉ', - 'ḉ' => 'ḉ', - 'Ḋ' => 'Ḋ', - 'ḋ' => 'ḋ', - 'Ḍ' => 'Ḍ', - 'ḍ' => 'ḍ', - 'Ḏ' => 'Ḏ', - 'ḏ' => 'ḏ', - 'Ḑ' => 'Ḑ', - 'ḑ' => 'ḑ', - 'Ḓ' => 'Ḓ', - 'ḓ' => 'ḓ', - 'Ḕ' => 'Ḕ', - 'ḕ' => 'ḕ', - 'Ḗ' => 'Ḗ', - 'ḗ' => 'ḗ', - 'Ḙ' => 'Ḙ', - 'ḙ' => 'ḙ', - 'Ḛ' => 'Ḛ', - 'ḛ' => 'ḛ', - 'Ḝ' => 'Ḝ', - 'ḝ' => 'ḝ', - 'Ḟ' => 'Ḟ', - 'ḟ' => 'ḟ', - 'Ḡ' => 'Ḡ', - 'ḡ' => 'ḡ', - 'Ḣ' => 'Ḣ', - 'ḣ' => 'ḣ', - 'Ḥ' => 'Ḥ', - 'ḥ' => 'ḥ', - 'Ḧ' => 'Ḧ', - 'ḧ' => 'ḧ', - 'Ḩ' => 'Ḩ', - 'ḩ' => 'ḩ', - 'Ḫ' => 'Ḫ', - 'ḫ' => 'ḫ', - 'Ḭ' => 'Ḭ', - 'ḭ' => 'ḭ', - 'Ḯ' => 'Ḯ', - 'ḯ' => 'ḯ', - 'Ḱ' => 'Ḱ', - 'ḱ' => 'ḱ', - 'Ḳ' => 'Ḳ', - 'ḳ' => 'ḳ', - 'Ḵ' => 'Ḵ', - 'ḵ' => 'ḵ', - 'Ḷ' => 'Ḷ', - 'ḷ' => 'ḷ', - 'Ḹ' => 'Ḹ', - 'ḹ' => 'ḹ', - 'Ḻ' => 'Ḻ', - 'ḻ' => 'ḻ', - 'Ḽ' => 'Ḽ', - 'ḽ' => 'ḽ', - 'Ḿ' => 'Ḿ', - 'ḿ' => 'ḿ', - 'Ṁ' => 'Ṁ', - 'ṁ' => 'ṁ', - 'Ṃ' => 'Ṃ', - 'ṃ' => 'ṃ', - 'Ṅ' => 'Ṅ', - 'ṅ' => 'ṅ', - 'Ṇ' => 'Ṇ', - 'ṇ' => 'ṇ', - 'Ṉ' => 'Ṉ', - 'ṉ' => 'ṉ', - 'Ṋ' => 'Ṋ', - 'ṋ' => 'ṋ', - 'Ṍ' => 'Ṍ', - 'ṍ' => 'ṍ', - 'Ṏ' => 'Ṏ', - 'ṏ' => 'ṏ', - 'Ṑ' => 'Ṑ', - 'ṑ' => 'ṑ', - 'Ṓ' => 'Ṓ', - 'ṓ' => 'ṓ', - 'Ṕ' => 'Ṕ', - 'ṕ' => 'ṕ', - 'Ṗ' => 'Ṗ', - 'ṗ' => 'ṗ', - 'Ṙ' => 'Ṙ', - 'ṙ' => 'ṙ', - 'Ṛ' => 'Ṛ', - 'ṛ' => 'ṛ', - 'Ṝ' => 'Ṝ', - 'ṝ' => 'ṝ', - 'Ṟ' => 'Ṟ', - 'ṟ' => 'ṟ', - 'Ṡ' => 'Ṡ', - 'ṡ' => 'ṡ', - 'Ṣ' => 'Ṣ', - 'ṣ' => 'ṣ', - 'Ṥ' => 'Ṥ', - 'ṥ' => 'ṥ', - 'Ṧ' => 'Ṧ', - 'ṧ' => 'ṧ', - 'Ṩ' => 'Ṩ', - 'ṩ' => 'ṩ', - 'Ṫ' => 'Ṫ', - 'ṫ' => 'ṫ', - 'Ṭ' => 'Ṭ', - 'ṭ' => 'ṭ', - 'Ṯ' => 'Ṯ', - 'ṯ' => 'ṯ', - 'Ṱ' => 'Ṱ', - 'ṱ' => 'ṱ', - 'Ṳ' => 'Ṳ', - 'ṳ' => 'ṳ', - 'Ṵ' => 'Ṵ', - 'ṵ' => 'ṵ', - 'Ṷ' => 'Ṷ', - 'ṷ' => 'ṷ', - 'Ṹ' => 'Ṹ', - 'ṹ' => 'ṹ', - 'Ṻ' => 'Ṻ', - 'ṻ' => 'ṻ', - 'Ṽ' => 'Ṽ', - 'ṽ' => 'ṽ', - 'Ṿ' => 'Ṿ', - 'ṿ' => 'ṿ', - 'Ẁ' => 'Ẁ', - 'ẁ' => 'ẁ', - 'Ẃ' => 'Ẃ', - 'ẃ' => 'ẃ', - 'Ẅ' => 'Ẅ', - 'ẅ' => 'ẅ', - 'Ẇ' => 'Ẇ', - 'ẇ' => 'ẇ', - 'Ẉ' => 'Ẉ', - 'ẉ' => 'ẉ', - 'Ẋ' => 'Ẋ', - 'ẋ' => 'ẋ', - 'Ẍ' => 'Ẍ', - 'ẍ' => 'ẍ', - 'Ẏ' => 'Ẏ', - 'ẏ' => 'ẏ', - 'Ẑ' => 'Ẑ', - 'ẑ' => 'ẑ', - 'Ẓ' => 'Ẓ', - 'ẓ' => 'ẓ', - 'Ẕ' => 'Ẕ', - 'ẕ' => 'ẕ', - 'ẖ' => 'ẖ', - 'ẗ' => 'ẗ', - 'ẘ' => 'ẘ', - 'ẙ' => 'ẙ', - 'ẛ' => 'ẛ', - 'Ạ' => 'Ạ', - 'ạ' => 'ạ', - 'Ả' => 'Ả', - 'ả' => 'ả', - 'Ấ' => 'Ấ', - 'ấ' => 'ấ', - 'Ầ' => 'Ầ', - 'ầ' => 'ầ', - 'Ẩ' => 'Ẩ', - 'ẩ' => 'ẩ', - 'Ẫ' => 'Ẫ', - 'ẫ' => 'ẫ', - 'Ậ' => 'Ậ', - 'ậ' => 'ậ', - 'Ắ' => 'Ắ', - 'ắ' => 'ắ', - 'Ằ' => 'Ằ', - 'ằ' => 'ằ', - 'Ẳ' => 'Ẳ', - 'ẳ' => 'ẳ', - 'Ẵ' => 'Ẵ', - 'ẵ' => 'ẵ', - 'Ặ' => 'Ặ', - 'ặ' => 'ặ', - 'Ẹ' => 'Ẹ', - 'ẹ' => 'ẹ', - 'Ẻ' => 'Ẻ', - 'ẻ' => 'ẻ', - 'Ẽ' => 'Ẽ', - 'ẽ' => 'ẽ', - 'Ế' => 'Ế', - 'ế' => 'ế', - 'Ề' => 'Ề', - 'ề' => 'ề', - 'Ể' => 'Ể', - 'ể' => 'ể', - 'Ễ' => 'Ễ', - 'ễ' => 'ễ', - 'Ệ' => 'Ệ', - 'ệ' => 'ệ', - 'Ỉ' => 'Ỉ', - 'ỉ' => 'ỉ', - 'Ị' => 'Ị', - 'ị' => 'ị', - 'Ọ' => 'Ọ', - 'ọ' => 'ọ', - 'Ỏ' => 'Ỏ', - 'ỏ' => 'ỏ', - 'Ố' => 'Ố', - 'ố' => 'ố', - 'Ồ' => 'Ồ', - 'ồ' => 'ồ', - 'Ổ' => 'Ổ', - 'ổ' => 'ổ', - 'Ỗ' => 'Ỗ', - 'ỗ' => 'ỗ', - 'Ộ' => 'Ộ', - 'ộ' => 'ộ', - 'Ớ' => 'Ớ', - 'ớ' => 'ớ', - 'Ờ' => 'Ờ', - 'ờ' => 'ờ', - 'Ở' => 'Ở', - 'ở' => 'ở', - 'Ỡ' => 'Ỡ', - 'ỡ' => 'ỡ', - 'Ợ' => 'Ợ', - 'ợ' => 'ợ', - 'Ụ' => 'Ụ', - 'ụ' => 'ụ', - 'Ủ' => 'Ủ', - 'ủ' => 'ủ', - 'Ứ' => 'Ứ', - 'ứ' => 'ứ', - 'Ừ' => 'Ừ', - 'ừ' => 'ừ', - 'Ử' => 'Ử', - 'ử' => 'ử', - 'Ữ' => 'Ữ', - 'ữ' => 'ữ', - 'Ự' => 'Ự', - 'ự' => 'ự', - 'Ỳ' => 'Ỳ', - 'ỳ' => 'ỳ', - 'Ỵ' => 'Ỵ', - 'ỵ' => 'ỵ', - 'Ỷ' => 'Ỷ', - 'ỷ' => 'ỷ', - 'Ỹ' => 'Ỹ', - 'ỹ' => 'ỹ', - 'ἀ' => 'ἀ', - 'ἁ' => 'ἁ', - 'ἂ' => 'ἂ', - 'ἃ' => 'ἃ', - 'ἄ' => 'ἄ', - 'ἅ' => 'ἅ', - 'ἆ' => 'ἆ', - 'ἇ' => 'ἇ', - 'Ἀ' => 'Ἀ', - 'Ἁ' => 'Ἁ', - 'Ἂ' => 'Ἂ', - 'Ἃ' => 'Ἃ', - 'Ἄ' => 'Ἄ', - 'Ἅ' => 'Ἅ', - 'Ἆ' => 'Ἆ', - 'Ἇ' => 'Ἇ', - 'ἐ' => 'ἐ', - 'ἑ' => 'ἑ', - 'ἒ' => 'ἒ', - 'ἓ' => 'ἓ', - 'ἔ' => 'ἔ', - 'ἕ' => 'ἕ', - 'Ἐ' => 'Ἐ', - 'Ἑ' => 'Ἑ', - 'Ἒ' => 'Ἒ', - 'Ἓ' => 'Ἓ', - 'Ἔ' => 'Ἔ', - 'Ἕ' => 'Ἕ', - 'ἠ' => 'ἠ', - 'ἡ' => 'ἡ', - 'ἢ' => 'ἢ', - 'ἣ' => 'ἣ', - 'ἤ' => 'ἤ', - 'ἥ' => 'ἥ', - 'ἦ' => 'ἦ', - 'ἧ' => 'ἧ', - 'Ἠ' => 'Ἠ', - 'Ἡ' => 'Ἡ', - 'Ἢ' => 'Ἢ', - 'Ἣ' => 'Ἣ', - 'Ἤ' => 'Ἤ', - 'Ἥ' => 'Ἥ', - 'Ἦ' => 'Ἦ', - 'Ἧ' => 'Ἧ', - 'ἰ' => 'ἰ', - 'ἱ' => 'ἱ', - 'ἲ' => 'ἲ', - 'ἳ' => 'ἳ', - 'ἴ' => 'ἴ', - 'ἵ' => 'ἵ', - 'ἶ' => 'ἶ', - 'ἷ' => 'ἷ', - 'Ἰ' => 'Ἰ', - 'Ἱ' => 'Ἱ', - 'Ἲ' => 'Ἲ', - 'Ἳ' => 'Ἳ', - 'Ἴ' => 'Ἴ', - 'Ἵ' => 'Ἵ', - 'Ἶ' => 'Ἶ', - 'Ἷ' => 'Ἷ', - 'ὀ' => 'ὀ', - 'ὁ' => 'ὁ', - 'ὂ' => 'ὂ', - 'ὃ' => 'ὃ', - 'ὄ' => 'ὄ', - 'ὅ' => 'ὅ', - 'Ὀ' => 'Ὀ', - 'Ὁ' => 'Ὁ', - 'Ὂ' => 'Ὂ', - 'Ὃ' => 'Ὃ', - 'Ὄ' => 'Ὄ', - 'Ὅ' => 'Ὅ', - 'ὐ' => 'ὐ', - 'ὑ' => 'ὑ', - 'ὒ' => 'ὒ', - 'ὓ' => 'ὓ', - 'ὔ' => 'ὔ', - 'ὕ' => 'ὕ', - 'ὖ' => 'ὖ', - 'ὗ' => 'ὗ', - 'Ὑ' => 'Ὑ', - 'Ὓ' => 'Ὓ', - 'Ὕ' => 'Ὕ', - 'Ὗ' => 'Ὗ', - 'ὠ' => 'ὠ', - 'ὡ' => 'ὡ', - 'ὢ' => 'ὢ', - 'ὣ' => 'ὣ', - 'ὤ' => 'ὤ', - 'ὥ' => 'ὥ', - 'ὦ' => 'ὦ', - 'ὧ' => 'ὧ', - 'Ὠ' => 'Ὠ', - 'Ὡ' => 'Ὡ', - 'Ὢ' => 'Ὢ', - 'Ὣ' => 'Ὣ', - 'Ὤ' => 'Ὤ', - 'Ὥ' => 'Ὥ', - 'Ὦ' => 'Ὦ', - 'Ὧ' => 'Ὧ', - 'ὰ' => 'ὰ', - 'ά' => 'ά', - 'ὲ' => 'ὲ', - 'έ' => 'έ', - 'ὴ' => 'ὴ', - 'ή' => 'ή', - 'ὶ' => 'ὶ', - 'ί' => 'ί', - 'ὸ' => 'ὸ', - 'ό' => 'ό', - 'ὺ' => 'ὺ', - 'ύ' => 'ύ', - 'ὼ' => 'ὼ', - 'ώ' => 'ώ', - 'ᾀ' => 'ᾀ', - 'ᾁ' => 'ᾁ', - 'ᾂ' => 'ᾂ', - 'ᾃ' => 'ᾃ', - 'ᾄ' => 'ᾄ', - 'ᾅ' => 'ᾅ', - 'ᾆ' => 'ᾆ', - 'ᾇ' => 'ᾇ', - 'ᾈ' => 'ᾈ', - 'ᾉ' => 'ᾉ', - 'ᾊ' => 'ᾊ', - 'ᾋ' => 'ᾋ', - 'ᾌ' => 'ᾌ', - 'ᾍ' => 'ᾍ', - 'ᾎ' => 'ᾎ', - 'ᾏ' => 'ᾏ', - 'ᾐ' => 'ᾐ', - 'ᾑ' => 'ᾑ', - 'ᾒ' => 'ᾒ', - 'ᾓ' => 'ᾓ', - 'ᾔ' => 'ᾔ', - 'ᾕ' => 'ᾕ', - 'ᾖ' => 'ᾖ', - 'ᾗ' => 'ᾗ', - 'ᾘ' => 'ᾘ', - 'ᾙ' => 'ᾙ', - 'ᾚ' => 'ᾚ', - 'ᾛ' => 'ᾛ', - 'ᾜ' => 'ᾜ', - 'ᾝ' => 'ᾝ', - 'ᾞ' => 'ᾞ', - 'ᾟ' => 'ᾟ', - 'ᾠ' => 'ᾠ', - 'ᾡ' => 'ᾡ', - 'ᾢ' => 'ᾢ', - 'ᾣ' => 'ᾣ', - 'ᾤ' => 'ᾤ', - 'ᾥ' => 'ᾥ', - 'ᾦ' => 'ᾦ', - 'ᾧ' => 'ᾧ', - 'ᾨ' => 'ᾨ', - 'ᾩ' => 'ᾩ', - 'ᾪ' => 'ᾪ', - 'ᾫ' => 'ᾫ', - 'ᾬ' => 'ᾬ', - 'ᾭ' => 'ᾭ', - 'ᾮ' => 'ᾮ', - 'ᾯ' => 'ᾯ', - 'ᾰ' => 'ᾰ', - 'ᾱ' => 'ᾱ', - 'ᾲ' => 'ᾲ', - 'ᾳ' => 'ᾳ', - 'ᾴ' => 'ᾴ', - 'ᾶ' => 'ᾶ', - 'ᾷ' => 'ᾷ', - 'Ᾰ' => 'Ᾰ', - 'Ᾱ' => 'Ᾱ', - 'Ὰ' => 'Ὰ', - 'Ά' => 'Ά', - 'ᾼ' => 'ᾼ', - 'ι' => 'ι', - '῁' => '῁', - 'ῂ' => 'ῂ', - 'ῃ' => 'ῃ', - 'ῄ' => 'ῄ', - 'ῆ' => 'ῆ', - 'ῇ' => 'ῇ', - 'Ὲ' => 'Ὲ', - 'Έ' => 'Έ', - 'Ὴ' => 'Ὴ', - 'Ή' => 'Ή', - 'ῌ' => 'ῌ', - '῍' => '῍', - '῎' => '῎', - '῏' => '῏', - 'ῐ' => 'ῐ', - 'ῑ' => 'ῑ', - 'ῒ' => 'ῒ', - 'ΐ' => 'ΐ', - 'ῖ' => 'ῖ', - 'ῗ' => 'ῗ', - 'Ῐ' => 'Ῐ', - 'Ῑ' => 'Ῑ', - 'Ὶ' => 'Ὶ', - 'Ί' => 'Ί', - '῝' => '῝', - '῞' => '῞', - '῟' => '῟', - 'ῠ' => 'ῠ', - 'ῡ' => 'ῡ', - 'ῢ' => 'ῢ', - 'ΰ' => 'ΰ', - 'ῤ' => 'ῤ', - 'ῥ' => 'ῥ', - 'ῦ' => 'ῦ', - 'ῧ' => 'ῧ', - 'Ῠ' => 'Ῠ', - 'Ῡ' => 'Ῡ', - 'Ὺ' => 'Ὺ', - 'Ύ' => 'Ύ', - 'Ῥ' => 'Ῥ', - '῭' => '῭', - '΅' => '΅', - '`' => '`', - 'ῲ' => 'ῲ', - 'ῳ' => 'ῳ', - 'ῴ' => 'ῴ', - 'ῶ' => 'ῶ', - 'ῷ' => 'ῷ', - 'Ὸ' => 'Ὸ', - 'Ό' => 'Ό', - 'Ὼ' => 'Ὼ', - 'Ώ' => 'Ώ', - 'ῼ' => 'ῼ', - '´' => '´', - ' ' => ' ', - ' ' => ' ', - 'Ω' => 'Ω', - 'K' => 'K', - 'Å' => 'Å', - '↚' => '↚', - '↛' => '↛', - '↮' => '↮', - '⇍' => '⇍', - '⇎' => '⇎', - '⇏' => '⇏', - '∄' => '∄', - '∉' => '∉', - '∌' => '∌', - '∤' => '∤', - '∦' => '∦', - '≁' => '≁', - '≄' => '≄', - '≇' => '≇', - '≉' => '≉', - '≠' => '≠', - '≢' => '≢', - '≭' => '≭', - '≮' => '≮', - '≯' => '≯', - '≰' => '≰', - '≱' => '≱', - '≴' => '≴', - '≵' => '≵', - '≸' => '≸', - '≹' => '≹', - '⊀' => '⊀', - '⊁' => '⊁', - '⊄' => '⊄', - '⊅' => '⊅', - '⊈' => '⊈', - '⊉' => '⊉', - '⊬' => '⊬', - '⊭' => '⊭', - '⊮' => '⊮', - '⊯' => '⊯', - '⋠' => '⋠', - '⋡' => '⋡', - '⋢' => '⋢', - '⋣' => '⋣', - '⋪' => '⋪', - '⋫' => '⋫', - '⋬' => '⋬', - '⋭' => '⋭', - '〈' => '〈', - '〉' => '〉', - '⫝̸' => '⫝̸', - 'が' => 'が', - 'ぎ' => 'ぎ', - 'ぐ' => 'ぐ', - 'げ' => 'げ', - 'ご' => 'ご', - 'ざ' => 'ざ', - 'じ' => 'じ', - 'ず' => 'ず', - 'ぜ' => 'ぜ', - 'ぞ' => 'ぞ', - 'だ' => 'だ', - 'ぢ' => 'ぢ', - 'づ' => 'づ', - 'で' => 'で', - 'ど' => 'ど', - 'ば' => 'ば', - 'ぱ' => 'ぱ', - 'び' => 'び', - 'ぴ' => 'ぴ', - 'ぶ' => 'ぶ', - 'ぷ' => 'ぷ', - 'べ' => 'べ', - 'ぺ' => 'ぺ', - 'ぼ' => 'ぼ', - 'ぽ' => 'ぽ', - 'ゔ' => 'ゔ', - 'ゞ' => 'ゞ', - 'ガ' => 'ガ', - 'ギ' => 'ギ', - 'グ' => 'グ', - 'ゲ' => 'ゲ', - 'ゴ' => 'ゴ', - 'ザ' => 'ザ', - 'ジ' => 'ジ', - 'ズ' => 'ズ', - 'ゼ' => 'ゼ', - 'ゾ' => 'ゾ', - 'ダ' => 'ダ', - 'ヂ' => 'ヂ', - 'ヅ' => 'ヅ', - 'デ' => 'デ', - 'ド' => 'ド', - 'バ' => 'バ', - 'パ' => 'パ', - 'ビ' => 'ビ', - 'ピ' => 'ピ', - 'ブ' => 'ブ', - 'プ' => 'プ', - 'ベ' => 'ベ', - 'ペ' => 'ペ', - 'ボ' => 'ボ', - 'ポ' => 'ポ', - 'ヴ' => 'ヴ', - 'ヷ' => 'ヷ', - 'ヸ' => 'ヸ', - 'ヹ' => 'ヹ', - 'ヺ' => 'ヺ', - 'ヾ' => 'ヾ', - '豈' => '豈', - '更' => '更', - '車' => '車', - '賈' => '賈', - '滑' => '滑', - '串' => '串', - '句' => '句', - '龜' => '龜', - '龜' => '龜', - '契' => '契', - '金' => '金', - '喇' => '喇', - '奈' => '奈', - '懶' => '懶', - '癩' => '癩', - '羅' => '羅', - '蘿' => '蘿', - '螺' => '螺', - '裸' => '裸', - '邏' => '邏', - '樂' => '樂', - '洛' => '洛', - '烙' => '烙', - '珞' => '珞', - '落' => '落', - '酪' => '酪', - '駱' => '駱', - '亂' => '亂', - '卵' => '卵', - '欄' => '欄', - '爛' => '爛', - '蘭' => '蘭', - '鸞' => '鸞', - '嵐' => '嵐', - '濫' => '濫', - '藍' => '藍', - '襤' => '襤', - '拉' => '拉', - '臘' => '臘', - '蠟' => '蠟', - '廊' => '廊', - '朗' => '朗', - '浪' => '浪', - '狼' => '狼', - '郎' => '郎', - '來' => '來', - '冷' => '冷', - '勞' => '勞', - '擄' => '擄', - '櫓' => '櫓', - '爐' => '爐', - '盧' => '盧', - '老' => '老', - '蘆' => '蘆', - '虜' => '虜', - '路' => '路', - '露' => '露', - '魯' => '魯', - '鷺' => '鷺', - '碌' => '碌', - '祿' => '祿', - '綠' => '綠', - '菉' => '菉', - '錄' => '錄', - '鹿' => '鹿', - '論' => '論', - '壟' => '壟', - '弄' => '弄', - '籠' => '籠', - '聾' => '聾', - '牢' => '牢', - '磊' => '磊', - '賂' => '賂', - '雷' => '雷', - '壘' => '壘', - '屢' => '屢', - '樓' => '樓', - '淚' => '淚', - '漏' => '漏', - '累' => '累', - '縷' => '縷', - '陋' => '陋', - '勒' => '勒', - '肋' => '肋', - '凜' => '凜', - '凌' => '凌', - '稜' => '稜', - '綾' => '綾', - '菱' => '菱', - '陵' => '陵', - '讀' => '讀', - '拏' => '拏', - '樂' => '樂', - '諾' => '諾', - '丹' => '丹', - '寧' => '寧', - '怒' => '怒', - '率' => '率', - '異' => '異', - '北' => '北', - '磻' => '磻', - '便' => '便', - '復' => '復', - '不' => '不', - '泌' => '泌', - '數' => '數', - '索' => '索', - '參' => '參', - '塞' => '塞', - '省' => '省', - '葉' => '葉', - '說' => '說', - '殺' => '殺', - '辰' => '辰', - '沈' => '沈', - '拾' => '拾', - '若' => '若', - '掠' => '掠', - '略' => '略', - '亮' => '亮', - '兩' => '兩', - '凉' => '凉', - '梁' => '梁', - '糧' => '糧', - '良' => '良', - '諒' => '諒', - '量' => '量', - '勵' => '勵', - '呂' => '呂', - '女' => '女', - '廬' => '廬', - '旅' => '旅', - '濾' => '濾', - '礪' => '礪', - '閭' => '閭', - '驪' => '驪', - '麗' => '麗', - '黎' => '黎', - '力' => '力', - '曆' => '曆', - '歷' => '歷', - '轢' => '轢', - '年' => '年', - '憐' => '憐', - '戀' => '戀', - '撚' => '撚', - '漣' => '漣', - '煉' => '煉', - '璉' => '璉', - '秊' => '秊', - '練' => '練', - '聯' => '聯', - '輦' => '輦', - '蓮' => '蓮', - '連' => '連', - '鍊' => '鍊', - '列' => '列', - '劣' => '劣', - '咽' => '咽', - '烈' => '烈', - '裂' => '裂', - '說' => '說', - '廉' => '廉', - '念' => '念', - '捻' => '捻', - '殮' => '殮', - '簾' => '簾', - '獵' => '獵', - '令' => '令', - '囹' => '囹', - '寧' => '寧', - '嶺' => '嶺', - '怜' => '怜', - '玲' => '玲', - '瑩' => '瑩', - '羚' => '羚', - '聆' => '聆', - '鈴' => '鈴', - '零' => '零', - '靈' => '靈', - '領' => '領', - '例' => '例', - '禮' => '禮', - '醴' => '醴', - '隸' => '隸', - '惡' => '惡', - '了' => '了', - '僚' => '僚', - '寮' => '寮', - '尿' => '尿', - '料' => '料', - '樂' => '樂', - '燎' => '燎', - '療' => '療', - '蓼' => '蓼', - '遼' => '遼', - '龍' => '龍', - '暈' => '暈', - '阮' => '阮', - '劉' => '劉', - '杻' => '杻', - '柳' => '柳', - '流' => '流', - '溜' => '溜', - '琉' => '琉', - '留' => '留', - '硫' => '硫', - '紐' => '紐', - '類' => '類', - '六' => '六', - '戮' => '戮', - '陸' => '陸', - '倫' => '倫', - '崙' => '崙', - '淪' => '淪', - '輪' => '輪', - '律' => '律', - '慄' => '慄', - '栗' => '栗', - '率' => '率', - '隆' => '隆', - '利' => '利', - '吏' => '吏', - '履' => '履', - '易' => '易', - '李' => '李', - '梨' => '梨', - '泥' => '泥', - '理' => '理', - '痢' => '痢', - '罹' => '罹', - '裏' => '裏', - '裡' => '裡', - '里' => '里', - '離' => '離', - '匿' => '匿', - '溺' => '溺', - '吝' => '吝', - '燐' => '燐', - '璘' => '璘', - '藺' => '藺', - '隣' => '隣', - '鱗' => '鱗', - '麟' => '麟', - '林' => '林', - '淋' => '淋', - '臨' => '臨', - '立' => '立', - '笠' => '笠', - '粒' => '粒', - '狀' => '狀', - '炙' => '炙', - '識' => '識', - '什' => '什', - '茶' => '茶', - '刺' => '刺', - '切' => '切', - '度' => '度', - '拓' => '拓', - '糖' => '糖', - '宅' => '宅', - '洞' => '洞', - '暴' => '暴', - '輻' => '輻', - '行' => '行', - '降' => '降', - '見' => '見', - '廓' => '廓', - '兀' => '兀', - '嗀' => '嗀', - '塚' => '塚', - '晴' => '晴', - '凞' => '凞', - '猪' => '猪', - '益' => '益', - '礼' => '礼', - '神' => '神', - '祥' => '祥', - '福' => '福', - '靖' => '靖', - '精' => '精', - '羽' => '羽', - '蘒' => '蘒', - '諸' => '諸', - '逸' => '逸', - '都' => '都', - '飯' => '飯', - '飼' => '飼', - '館' => '館', - '鶴' => '鶴', - '郞' => '郞', - '隷' => '隷', - '侮' => '侮', - '僧' => '僧', - '免' => '免', - '勉' => '勉', - '勤' => '勤', - '卑' => '卑', - '喝' => '喝', - '嘆' => '嘆', - '器' => '器', - '塀' => '塀', - '墨' => '墨', - '層' => '層', - '屮' => '屮', - '悔' => '悔', - '慨' => '慨', - '憎' => '憎', - '懲' => '懲', - '敏' => '敏', - '既' => '既', - '暑' => '暑', - '梅' => '梅', - '海' => '海', - '渚' => '渚', - '漢' => '漢', - '煮' => '煮', - '爫' => '爫', - '琢' => '琢', - '碑' => '碑', - '社' => '社', - '祉' => '祉', - '祈' => '祈', - '祐' => '祐', - '祖' => '祖', - '祝' => '祝', - '禍' => '禍', - '禎' => '禎', - '穀' => '穀', - '突' => '突', - '節' => '節', - '練' => '練', - '縉' => '縉', - '繁' => '繁', - '署' => '署', - '者' => '者', - '臭' => '臭', - '艹' => '艹', - '艹' => '艹', - '著' => '著', - '褐' => '褐', - '視' => '視', - '謁' => '謁', - '謹' => '謹', - '賓' => '賓', - '贈' => '贈', - '辶' => '辶', - '逸' => '逸', - '難' => '難', - '響' => '響', - '頻' => '頻', - '恵' => '恵', - '𤋮' => '𤋮', - '舘' => '舘', - '並' => '並', - '况' => '况', - '全' => '全', - '侀' => '侀', - '充' => '充', - '冀' => '冀', - '勇' => '勇', - '勺' => '勺', - '喝' => '喝', - '啕' => '啕', - '喙' => '喙', - '嗢' => '嗢', - '塚' => '塚', - '墳' => '墳', - '奄' => '奄', - '奔' => '奔', - '婢' => '婢', - '嬨' => '嬨', - '廒' => '廒', - '廙' => '廙', - '彩' => '彩', - '徭' => '徭', - '惘' => '惘', - '慎' => '慎', - '愈' => '愈', - '憎' => '憎', - '慠' => '慠', - '懲' => '懲', - '戴' => '戴', - '揄' => '揄', - '搜' => '搜', - '摒' => '摒', - '敖' => '敖', - '晴' => '晴', - '朗' => '朗', - '望' => '望', - '杖' => '杖', - '歹' => '歹', - '殺' => '殺', - '流' => '流', - '滛' => '滛', - '滋' => '滋', - '漢' => '漢', - '瀞' => '瀞', - '煮' => '煮', - '瞧' => '瞧', - '爵' => '爵', - '犯' => '犯', - '猪' => '猪', - '瑱' => '瑱', - '甆' => '甆', - '画' => '画', - '瘝' => '瘝', - '瘟' => '瘟', - '益' => '益', - '盛' => '盛', - '直' => '直', - '睊' => '睊', - '着' => '着', - '磌' => '磌', - '窱' => '窱', - '節' => '節', - '类' => '类', - '絛' => '絛', - '練' => '練', - '缾' => '缾', - '者' => '者', - '荒' => '荒', - '華' => '華', - '蝹' => '蝹', - '襁' => '襁', - '覆' => '覆', - '視' => '視', - '調' => '調', - '諸' => '諸', - '請' => '請', - '謁' => '謁', - '諾' => '諾', - '諭' => '諭', - '謹' => '謹', - '變' => '變', - '贈' => '贈', - '輸' => '輸', - '遲' => '遲', - '醙' => '醙', - '鉶' => '鉶', - '陼' => '陼', - '難' => '難', - '靖' => '靖', - '韛' => '韛', - '響' => '響', - '頋' => '頋', - '頻' => '頻', - '鬒' => '鬒', - '龜' => '龜', - '𢡊' => '𢡊', - '𢡄' => '𢡄', - '𣏕' => '𣏕', - '㮝' => '㮝', - '䀘' => '䀘', - '䀹' => '䀹', - '𥉉' => '𥉉', - '𥳐' => '𥳐', - '𧻓' => '𧻓', - '齃' => '齃', - '龎' => '龎', - 'יִ' => 'יִ', - 'ײַ' => 'ײַ', - 'שׁ' => 'שׁ', - 'שׂ' => 'שׂ', - 'שּׁ' => 'שּׁ', - 'שּׂ' => 'שּׂ', - 'אַ' => 'אַ', - 'אָ' => 'אָ', - 'אּ' => 'אּ', - 'בּ' => 'בּ', - 'גּ' => 'גּ', - 'דּ' => 'דּ', - 'הּ' => 'הּ', - 'וּ' => 'וּ', - 'זּ' => 'זּ', - 'טּ' => 'טּ', - 'יּ' => 'יּ', - 'ךּ' => 'ךּ', - 'כּ' => 'כּ', - 'לּ' => 'לּ', - 'מּ' => 'מּ', - 'נּ' => 'נּ', - 'סּ' => 'סּ', - 'ףּ' => 'ףּ', - 'פּ' => 'פּ', - 'צּ' => 'צּ', - 'קּ' => 'קּ', - 'רּ' => 'רּ', - 'שּ' => 'שּ', - 'תּ' => 'תּ', - 'וֹ' => 'וֹ', - 'בֿ' => 'בֿ', - 'כֿ' => 'כֿ', - 'פֿ' => 'פֿ', - '𑂚' => '𑂚', - '𑂜' => '𑂜', - '𑂫' => '𑂫', - '𑄮' => '𑄮', - '𑄯' => '𑄯', - '𑍋' => '𑍋', - '𑍌' => '𑍌', - '𑒻' => '𑒻', - '𑒼' => '𑒼', - '𑒾' => '𑒾', - '𑖺' => '𑖺', - '𑖻' => '𑖻', - '𑤸' => '𑤸', - '𝅗𝅥' => '𝅗𝅥', - '𝅘𝅥' => '𝅘𝅥', - '𝅘𝅥𝅮' => '𝅘𝅥𝅮', - '𝅘𝅥𝅯' => '𝅘𝅥𝅯', - '𝅘𝅥𝅰' => '𝅘𝅥𝅰', - '𝅘𝅥𝅱' => '𝅘𝅥𝅱', - '𝅘𝅥𝅲' => '𝅘𝅥𝅲', - '𝆹𝅥' => '𝆹𝅥', - '𝆺𝅥' => '𝆺𝅥', - '𝆹𝅥𝅮' => '𝆹𝅥𝅮', - '𝆺𝅥𝅮' => '𝆺𝅥𝅮', - '𝆹𝅥𝅯' => '𝆹𝅥𝅯', - '𝆺𝅥𝅯' => '𝆺𝅥𝅯', - '丽' => '丽', - '丸' => '丸', - '乁' => '乁', - '𠄢' => '𠄢', - '你' => '你', - '侮' => '侮', - '侻' => '侻', - '倂' => '倂', - '偺' => '偺', - '備' => '備', - '僧' => '僧', - '像' => '像', - '㒞' => '㒞', - '𠘺' => '𠘺', - '免' => '免', - '兔' => '兔', - '兤' => '兤', - '具' => '具', - '𠔜' => '𠔜', - '㒹' => '㒹', - '內' => '內', - '再' => '再', - '𠕋' => '𠕋', - '冗' => '冗', - '冤' => '冤', - '仌' => '仌', - '冬' => '冬', - '况' => '况', - '𩇟' => '𩇟', - '凵' => '凵', - '刃' => '刃', - '㓟' => '㓟', - '刻' => '刻', - '剆' => '剆', - '割' => '割', - '剷' => '剷', - '㔕' => '㔕', - '勇' => '勇', - '勉' => '勉', - '勤' => '勤', - '勺' => '勺', - '包' => '包', - '匆' => '匆', - '北' => '北', - '卉' => '卉', - '卑' => '卑', - '博' => '博', - '即' => '即', - '卽' => '卽', - '卿' => '卿', - '卿' => '卿', - '卿' => '卿', - '𠨬' => '𠨬', - '灰' => '灰', - '及' => '及', - '叟' => '叟', - '𠭣' => '𠭣', - '叫' => '叫', - '叱' => '叱', - '吆' => '吆', - '咞' => '咞', - '吸' => '吸', - '呈' => '呈', - '周' => '周', - '咢' => '咢', - '哶' => '哶', - '唐' => '唐', - '啓' => '啓', - '啣' => '啣', - '善' => '善', - '善' => '善', - '喙' => '喙', - '喫' => '喫', - '喳' => '喳', - '嗂' => '嗂', - '圖' => '圖', - '嘆' => '嘆', - '圗' => '圗', - '噑' => '噑', - '噴' => '噴', - '切' => '切', - '壮' => '壮', - '城' => '城', - '埴' => '埴', - '堍' => '堍', - '型' => '型', - '堲' => '堲', - '報' => '報', - '墬' => '墬', - '𡓤' => '𡓤', - '売' => '売', - '壷' => '壷', - '夆' => '夆', - '多' => '多', - '夢' => '夢', - '奢' => '奢', - '𡚨' => '𡚨', - '𡛪' => '𡛪', - '姬' => '姬', - '娛' => '娛', - '娧' => '娧', - '姘' => '姘', - '婦' => '婦', - '㛮' => '㛮', - '㛼' => '㛼', - '嬈' => '嬈', - '嬾' => '嬾', - '嬾' => '嬾', - '𡧈' => '𡧈', - '寃' => '寃', - '寘' => '寘', - '寧' => '寧', - '寳' => '寳', - '𡬘' => '𡬘', - '寿' => '寿', - '将' => '将', - '当' => '当', - '尢' => '尢', - '㞁' => '㞁', - '屠' => '屠', - '屮' => '屮', - '峀' => '峀', - '岍' => '岍', - '𡷤' => '𡷤', - '嵃' => '嵃', - '𡷦' => '𡷦', - '嵮' => '嵮', - '嵫' => '嵫', - '嵼' => '嵼', - '巡' => '巡', - '巢' => '巢', - '㠯' => '㠯', - '巽' => '巽', - '帨' => '帨', - '帽' => '帽', - '幩' => '幩', - '㡢' => '㡢', - '𢆃' => '𢆃', - '㡼' => '㡼', - '庰' => '庰', - '庳' => '庳', - '庶' => '庶', - '廊' => '廊', - '𪎒' => '𪎒', - '廾' => '廾', - '𢌱' => '𢌱', - '𢌱' => '𢌱', - '舁' => '舁', - '弢' => '弢', - '弢' => '弢', - '㣇' => '㣇', - '𣊸' => '𣊸', - '𦇚' => '𦇚', - '形' => '形', - '彫' => '彫', - '㣣' => '㣣', - '徚' => '徚', - '忍' => '忍', - '志' => '志', - '忹' => '忹', - '悁' => '悁', - '㤺' => '㤺', - '㤜' => '㤜', - '悔' => '悔', - '𢛔' => '𢛔', - '惇' => '惇', - '慈' => '慈', - '慌' => '慌', - '慎' => '慎', - '慌' => '慌', - '慺' => '慺', - '憎' => '憎', - '憲' => '憲', - '憤' => '憤', - '憯' => '憯', - '懞' => '懞', - '懲' => '懲', - '懶' => '懶', - '成' => '成', - '戛' => '戛', - '扝' => '扝', - '抱' => '抱', - '拔' => '拔', - '捐' => '捐', - '𢬌' => '𢬌', - '挽' => '挽', - '拼' => '拼', - '捨' => '捨', - '掃' => '掃', - '揤' => '揤', - '𢯱' => '𢯱', - '搢' => '搢', - '揅' => '揅', - '掩' => '掩', - '㨮' => '㨮', - '摩' => '摩', - '摾' => '摾', - '撝' => '撝', - '摷' => '摷', - '㩬' => '㩬', - '敏' => '敏', - '敬' => '敬', - '𣀊' => '𣀊', - '旣' => '旣', - '書' => '書', - '晉' => '晉', - '㬙' => '㬙', - '暑' => '暑', - '㬈' => '㬈', - '㫤' => '㫤', - '冒' => '冒', - '冕' => '冕', - '最' => '最', - '暜' => '暜', - '肭' => '肭', - '䏙' => '䏙', - '朗' => '朗', - '望' => '望', - '朡' => '朡', - '杞' => '杞', - '杓' => '杓', - '𣏃' => '𣏃', - '㭉' => '㭉', - '柺' => '柺', - '枅' => '枅', - '桒' => '桒', - '梅' => '梅', - '𣑭' => '𣑭', - '梎' => '梎', - '栟' => '栟', - '椔' => '椔', - '㮝' => '㮝', - '楂' => '楂', - '榣' => '榣', - '槪' => '槪', - '檨' => '檨', - '𣚣' => '𣚣', - '櫛' => '櫛', - '㰘' => '㰘', - '次' => '次', - '𣢧' => '𣢧', - '歔' => '歔', - '㱎' => '㱎', - '歲' => '歲', - '殟' => '殟', - '殺' => '殺', - '殻' => '殻', - '𣪍' => '𣪍', - '𡴋' => '𡴋', - '𣫺' => '𣫺', - '汎' => '汎', - '𣲼' => '𣲼', - '沿' => '沿', - '泍' => '泍', - '汧' => '汧', - '洖' => '洖', - '派' => '派', - '海' => '海', - '流' => '流', - '浩' => '浩', - '浸' => '浸', - '涅' => '涅', - '𣴞' => '𣴞', - '洴' => '洴', - '港' => '港', - '湮' => '湮', - '㴳' => '㴳', - '滋' => '滋', - '滇' => '滇', - '𣻑' => '𣻑', - '淹' => '淹', - '潮' => '潮', - '𣽞' => '𣽞', - '𣾎' => '𣾎', - '濆' => '濆', - '瀹' => '瀹', - '瀞' => '瀞', - '瀛' => '瀛', - '㶖' => '㶖', - '灊' => '灊', - '災' => '災', - '灷' => '灷', - '炭' => '炭', - '𠔥' => '𠔥', - '煅' => '煅', - '𤉣' => '𤉣', - '熜' => '熜', - '𤎫' => '𤎫', - '爨' => '爨', - '爵' => '爵', - '牐' => '牐', - '𤘈' => '𤘈', - '犀' => '犀', - '犕' => '犕', - '𤜵' => '𤜵', - '𤠔' => '𤠔', - '獺' => '獺', - '王' => '王', - '㺬' => '㺬', - '玥' => '玥', - '㺸' => '㺸', - '㺸' => '㺸', - '瑇' => '瑇', - '瑜' => '瑜', - '瑱' => '瑱', - '璅' => '璅', - '瓊' => '瓊', - '㼛' => '㼛', - '甤' => '甤', - '𤰶' => '𤰶', - '甾' => '甾', - '𤲒' => '𤲒', - '異' => '異', - '𢆟' => '𢆟', - '瘐' => '瘐', - '𤾡' => '𤾡', - '𤾸' => '𤾸', - '𥁄' => '𥁄', - '㿼' => '㿼', - '䀈' => '䀈', - '直' => '直', - '𥃳' => '𥃳', - '𥃲' => '𥃲', - '𥄙' => '𥄙', - '𥄳' => '𥄳', - '眞' => '眞', - '真' => '真', - '真' => '真', - '睊' => '睊', - '䀹' => '䀹', - '瞋' => '瞋', - '䁆' => '䁆', - '䂖' => '䂖', - '𥐝' => '𥐝', - '硎' => '硎', - '碌' => '碌', - '磌' => '磌', - '䃣' => '䃣', - '𥘦' => '𥘦', - '祖' => '祖', - '𥚚' => '𥚚', - '𥛅' => '𥛅', - '福' => '福', - '秫' => '秫', - '䄯' => '䄯', - '穀' => '穀', - '穊' => '穊', - '穏' => '穏', - '𥥼' => '𥥼', - '𥪧' => '𥪧', - '𥪧' => '𥪧', - '竮' => '竮', - '䈂' => '䈂', - '𥮫' => '𥮫', - '篆' => '篆', - '築' => '築', - '䈧' => '䈧', - '𥲀' => '𥲀', - '糒' => '糒', - '䊠' => '䊠', - '糨' => '糨', - '糣' => '糣', - '紀' => '紀', - '𥾆' => '𥾆', - '絣' => '絣', - '䌁' => '䌁', - '緇' => '緇', - '縂' => '縂', - '繅' => '繅', - '䌴' => '䌴', - '𦈨' => '𦈨', - '𦉇' => '𦉇', - '䍙' => '䍙', - '𦋙' => '𦋙', - '罺' => '罺', - '𦌾' => '𦌾', - '羕' => '羕', - '翺' => '翺', - '者' => '者', - '𦓚' => '𦓚', - '𦔣' => '𦔣', - '聠' => '聠', - '𦖨' => '𦖨', - '聰' => '聰', - '𣍟' => '𣍟', - '䏕' => '䏕', - '育' => '育', - '脃' => '脃', - '䐋' => '䐋', - '脾' => '脾', - '媵' => '媵', - '𦞧' => '𦞧', - '𦞵' => '𦞵', - '𣎓' => '𣎓', - '𣎜' => '𣎜', - '舁' => '舁', - '舄' => '舄', - '辞' => '辞', - '䑫' => '䑫', - '芑' => '芑', - '芋' => '芋', - '芝' => '芝', - '劳' => '劳', - '花' => '花', - '芳' => '芳', - '芽' => '芽', - '苦' => '苦', - '𦬼' => '𦬼', - '若' => '若', - '茝' => '茝', - '荣' => '荣', - '莭' => '莭', - '茣' => '茣', - '莽' => '莽', - '菧' => '菧', - '著' => '著', - '荓' => '荓', - '菊' => '菊', - '菌' => '菌', - '菜' => '菜', - '𦰶' => '𦰶', - '𦵫' => '𦵫', - '𦳕' => '𦳕', - '䔫' => '䔫', - '蓱' => '蓱', - '蓳' => '蓳', - '蔖' => '蔖', - '𧏊' => '𧏊', - '蕤' => '蕤', - '𦼬' => '𦼬', - '䕝' => '䕝', - '䕡' => '䕡', - '𦾱' => '𦾱', - '𧃒' => '𧃒', - '䕫' => '䕫', - '虐' => '虐', - '虜' => '虜', - '虧' => '虧', - '虩' => '虩', - '蚩' => '蚩', - '蚈' => '蚈', - '蜎' => '蜎', - '蛢' => '蛢', - '蝹' => '蝹', - '蜨' => '蜨', - '蝫' => '蝫', - '螆' => '螆', - '䗗' => '䗗', - '蟡' => '蟡', - '蠁' => '蠁', - '䗹' => '䗹', - '衠' => '衠', - '衣' => '衣', - '𧙧' => '𧙧', - '裗' => '裗', - '裞' => '裞', - '䘵' => '䘵', - '裺' => '裺', - '㒻' => '㒻', - '𧢮' => '𧢮', - '𧥦' => '𧥦', - '䚾' => '䚾', - '䛇' => '䛇', - '誠' => '誠', - '諭' => '諭', - '變' => '變', - '豕' => '豕', - '𧲨' => '𧲨', - '貫' => '貫', - '賁' => '賁', - '贛' => '贛', - '起' => '起', - '𧼯' => '𧼯', - '𠠄' => '𠠄', - '跋' => '跋', - '趼' => '趼', - '跰' => '跰', - '𠣞' => '𠣞', - '軔' => '軔', - '輸' => '輸', - '𨗒' => '𨗒', - '𨗭' => '𨗭', - '邔' => '邔', - '郱' => '郱', - '鄑' => '鄑', - '𨜮' => '𨜮', - '鄛' => '鄛', - '鈸' => '鈸', - '鋗' => '鋗', - '鋘' => '鋘', - '鉼' => '鉼', - '鏹' => '鏹', - '鐕' => '鐕', - '𨯺' => '𨯺', - '開' => '開', - '䦕' => '䦕', - '閷' => '閷', - '𨵷' => '𨵷', - '䧦' => '䧦', - '雃' => '雃', - '嶲' => '嶲', - '霣' => '霣', - '𩅅' => '𩅅', - '𩈚' => '𩈚', - '䩮' => '䩮', - '䩶' => '䩶', - '韠' => '韠', - '𩐊' => '𩐊', - '䪲' => '䪲', - '𩒖' => '𩒖', - '頋' => '頋', - '頋' => '頋', - '頩' => '頩', - '𩖶' => '𩖶', - '飢' => '飢', - '䬳' => '䬳', - '餩' => '餩', - '馧' => '馧', - '駂' => '駂', - '駾' => '駾', - '䯎' => '䯎', - '𩬰' => '𩬰', - '鬒' => '鬒', - '鱀' => '鱀', - '鳽' => '鳽', - '䳎' => '䳎', - '䳭' => '䳭', - '鵧' => '鵧', - '𪃎' => '𪃎', - '䳸' => '䳸', - '𪄅' => '𪄅', - '𪈎' => '𪈎', - '𪊑' => '𪊑', - '麻' => '麻', - '䵖' => '䵖', - '黹' => '黹', - '黾' => '黾', - '鼅' => '鼅', - '鼏' => '鼏', - '鼖' => '鼖', - '鼻' => '鼻', - '𪘀' => '𪘀', -); diff --git a/tools/php-cs-fixer/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/combiningClass.php b/tools/php-cs-fixer/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/combiningClass.php deleted file mode 100644 index ec90f36..0000000 --- a/tools/php-cs-fixer/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/combiningClass.php +++ /dev/null @@ -1,876 +0,0 @@ - 230, - '́' => 230, - '̂' => 230, - '̃' => 230, - '̄' => 230, - '̅' => 230, - '̆' => 230, - '̇' => 230, - '̈' => 230, - '̉' => 230, - '̊' => 230, - '̋' => 230, - '̌' => 230, - '̍' => 230, - '̎' => 230, - '̏' => 230, - '̐' => 230, - '̑' => 230, - '̒' => 230, - '̓' => 230, - '̔' => 230, - '̕' => 232, - '̖' => 220, - '̗' => 220, - '̘' => 220, - '̙' => 220, - '̚' => 232, - '̛' => 216, - '̜' => 220, - '̝' => 220, - '̞' => 220, - '̟' => 220, - '̠' => 220, - '̡' => 202, - '̢' => 202, - '̣' => 220, - '̤' => 220, - '̥' => 220, - '̦' => 220, - '̧' => 202, - '̨' => 202, - '̩' => 220, - '̪' => 220, - '̫' => 220, - '̬' => 220, - '̭' => 220, - '̮' => 220, - '̯' => 220, - '̰' => 220, - '̱' => 220, - '̲' => 220, - '̳' => 220, - '̴' => 1, - '̵' => 1, - '̶' => 1, - '̷' => 1, - '̸' => 1, - '̹' => 220, - '̺' => 220, - '̻' => 220, - '̼' => 220, - '̽' => 230, - '̾' => 230, - '̿' => 230, - '̀' => 230, - '́' => 230, - '͂' => 230, - '̓' => 230, - '̈́' => 230, - 'ͅ' => 240, - '͆' => 230, - '͇' => 220, - '͈' => 220, - '͉' => 220, - '͊' => 230, - '͋' => 230, - '͌' => 230, - '͍' => 220, - '͎' => 220, - '͐' => 230, - '͑' => 230, - '͒' => 230, - '͓' => 220, - '͔' => 220, - '͕' => 220, - '͖' => 220, - '͗' => 230, - '͘' => 232, - '͙' => 220, - '͚' => 220, - '͛' => 230, - '͜' => 233, - '͝' => 234, - '͞' => 234, - '͟' => 233, - '͠' => 234, - '͡' => 234, - '͢' => 233, - 'ͣ' => 230, - 'ͤ' => 230, - 'ͥ' => 230, - 'ͦ' => 230, - 'ͧ' => 230, - 'ͨ' => 230, - 'ͩ' => 230, - 'ͪ' => 230, - 'ͫ' => 230, - 'ͬ' => 230, - 'ͭ' => 230, - 'ͮ' => 230, - 'ͯ' => 230, - '҃' => 230, - '҄' => 230, - '҅' => 230, - '҆' => 230, - '҇' => 230, - '֑' => 220, - '֒' => 230, - '֓' => 230, - '֔' => 230, - '֕' => 230, - '֖' => 220, - '֗' => 230, - '֘' => 230, - '֙' => 230, - '֚' => 222, - '֛' => 220, - '֜' => 230, - '֝' => 230, - '֞' => 230, - '֟' => 230, - '֠' => 230, - '֡' => 230, - '֢' => 220, - '֣' => 220, - '֤' => 220, - '֥' => 220, - '֦' => 220, - '֧' => 220, - '֨' => 230, - '֩' => 230, - '֪' => 220, - '֫' => 230, - '֬' => 230, - '֭' => 222, - '֮' => 228, - '֯' => 230, - 'ְ' => 10, - 'ֱ' => 11, - 'ֲ' => 12, - 'ֳ' => 13, - 'ִ' => 14, - 'ֵ' => 15, - 'ֶ' => 16, - 'ַ' => 17, - 'ָ' => 18, - 'ֹ' => 19, - 'ֺ' => 19, - 'ֻ' => 20, - 'ּ' => 21, - 'ֽ' => 22, - 'ֿ' => 23, - 'ׁ' => 24, - 'ׂ' => 25, - 'ׄ' => 230, - 'ׅ' => 220, - 'ׇ' => 18, - 'ؐ' => 230, - 'ؑ' => 230, - 'ؒ' => 230, - 'ؓ' => 230, - 'ؔ' => 230, - 'ؕ' => 230, - 'ؖ' => 230, - 'ؗ' => 230, - 'ؘ' => 30, - 'ؙ' => 31, - 'ؚ' => 32, - 'ً' => 27, - 'ٌ' => 28, - 'ٍ' => 29, - 'َ' => 30, - 'ُ' => 31, - 'ِ' => 32, - 'ّ' => 33, - 'ْ' => 34, - 'ٓ' => 230, - 'ٔ' => 230, - 'ٕ' => 220, - 'ٖ' => 220, - 'ٗ' => 230, - '٘' => 230, - 'ٙ' => 230, - 'ٚ' => 230, - 'ٛ' => 230, - 'ٜ' => 220, - 'ٝ' => 230, - 'ٞ' => 230, - 'ٟ' => 220, - 'ٰ' => 35, - 'ۖ' => 230, - 'ۗ' => 230, - 'ۘ' => 230, - 'ۙ' => 230, - 'ۚ' => 230, - 'ۛ' => 230, - 'ۜ' => 230, - '۟' => 230, - '۠' => 230, - 'ۡ' => 230, - 'ۢ' => 230, - 'ۣ' => 220, - 'ۤ' => 230, - 'ۧ' => 230, - 'ۨ' => 230, - '۪' => 220, - '۫' => 230, - '۬' => 230, - 'ۭ' => 220, - 'ܑ' => 36, - 'ܰ' => 230, - 'ܱ' => 220, - 'ܲ' => 230, - 'ܳ' => 230, - 'ܴ' => 220, - 'ܵ' => 230, - 'ܶ' => 230, - 'ܷ' => 220, - 'ܸ' => 220, - 'ܹ' => 220, - 'ܺ' => 230, - 'ܻ' => 220, - 'ܼ' => 220, - 'ܽ' => 230, - 'ܾ' => 220, - 'ܿ' => 230, - '݀' => 230, - '݁' => 230, - '݂' => 220, - '݃' => 230, - '݄' => 220, - '݅' => 230, - '݆' => 220, - '݇' => 230, - '݈' => 220, - '݉' => 230, - '݊' => 230, - '߫' => 230, - '߬' => 230, - '߭' => 230, - '߮' => 230, - '߯' => 230, - '߰' => 230, - '߱' => 230, - '߲' => 220, - '߳' => 230, - '߽' => 220, - 'ࠖ' => 230, - 'ࠗ' => 230, - '࠘' => 230, - '࠙' => 230, - 'ࠛ' => 230, - 'ࠜ' => 230, - 'ࠝ' => 230, - 'ࠞ' => 230, - 'ࠟ' => 230, - 'ࠠ' => 230, - 'ࠡ' => 230, - 'ࠢ' => 230, - 'ࠣ' => 230, - 'ࠥ' => 230, - 'ࠦ' => 230, - 'ࠧ' => 230, - 'ࠩ' => 230, - 'ࠪ' => 230, - 'ࠫ' => 230, - 'ࠬ' => 230, - '࠭' => 230, - '࡙' => 220, - '࡚' => 220, - '࡛' => 220, - '࣓' => 220, - 'ࣔ' => 230, - 'ࣕ' => 230, - 'ࣖ' => 230, - 'ࣗ' => 230, - 'ࣘ' => 230, - 'ࣙ' => 230, - 'ࣚ' => 230, - 'ࣛ' => 230, - 'ࣜ' => 230, - 'ࣝ' => 230, - 'ࣞ' => 230, - 'ࣟ' => 230, - '࣠' => 230, - '࣡' => 230, - 'ࣣ' => 220, - 'ࣤ' => 230, - 'ࣥ' => 230, - 'ࣦ' => 220, - 'ࣧ' => 230, - 'ࣨ' => 230, - 'ࣩ' => 220, - '࣪' => 230, - '࣫' => 230, - '࣬' => 230, - '࣭' => 220, - '࣮' => 220, - '࣯' => 220, - 'ࣰ' => 27, - 'ࣱ' => 28, - 'ࣲ' => 29, - 'ࣳ' => 230, - 'ࣴ' => 230, - 'ࣵ' => 230, - 'ࣶ' => 220, - 'ࣷ' => 230, - 'ࣸ' => 230, - 'ࣹ' => 220, - 'ࣺ' => 220, - 'ࣻ' => 230, - 'ࣼ' => 230, - 'ࣽ' => 230, - 'ࣾ' => 230, - 'ࣿ' => 230, - '़' => 7, - '्' => 9, - '॑' => 230, - '॒' => 220, - '॓' => 230, - '॔' => 230, - '়' => 7, - '্' => 9, - '৾' => 230, - '਼' => 7, - '੍' => 9, - '઼' => 7, - '્' => 9, - '଼' => 7, - '୍' => 9, - '்' => 9, - '్' => 9, - 'ౕ' => 84, - 'ౖ' => 91, - '಼' => 7, - '್' => 9, - '഻' => 9, - '഼' => 9, - '്' => 9, - '්' => 9, - 'ุ' => 103, - 'ู' => 103, - 'ฺ' => 9, - '่' => 107, - '้' => 107, - '๊' => 107, - '๋' => 107, - 'ຸ' => 118, - 'ູ' => 118, - '຺' => 9, - '່' => 122, - '້' => 122, - '໊' => 122, - '໋' => 122, - '༘' => 220, - '༙' => 220, - '༵' => 220, - '༷' => 220, - '༹' => 216, - 'ཱ' => 129, - 'ི' => 130, - 'ུ' => 132, - 'ེ' => 130, - 'ཻ' => 130, - 'ོ' => 130, - 'ཽ' => 130, - 'ྀ' => 130, - 'ྂ' => 230, - 'ྃ' => 230, - '྄' => 9, - '྆' => 230, - '྇' => 230, - '࿆' => 220, - '့' => 7, - '္' => 9, - '်' => 9, - 'ႍ' => 220, - '፝' => 230, - '፞' => 230, - '፟' => 230, - '᜔' => 9, - '᜴' => 9, - '្' => 9, - '៝' => 230, - 'ᢩ' => 228, - '᤹' => 222, - '᤺' => 230, - '᤻' => 220, - 'ᨗ' => 230, - 'ᨘ' => 220, - '᩠' => 9, - '᩵' => 230, - '᩶' => 230, - '᩷' => 230, - '᩸' => 230, - '᩹' => 230, - '᩺' => 230, - '᩻' => 230, - '᩼' => 230, - '᩿' => 220, - '᪰' => 230, - '᪱' => 230, - '᪲' => 230, - '᪳' => 230, - '᪴' => 230, - '᪵' => 220, - '᪶' => 220, - '᪷' => 220, - '᪸' => 220, - '᪹' => 220, - '᪺' => 220, - '᪻' => 230, - '᪼' => 230, - '᪽' => 220, - 'ᪿ' => 220, - 'ᫀ' => 220, - '᬴' => 7, - '᭄' => 9, - '᭫' => 230, - '᭬' => 220, - '᭭' => 230, - '᭮' => 230, - '᭯' => 230, - '᭰' => 230, - '᭱' => 230, - '᭲' => 230, - '᭳' => 230, - '᮪' => 9, - '᮫' => 9, - '᯦' => 7, - '᯲' => 9, - '᯳' => 9, - '᰷' => 7, - '᳐' => 230, - '᳑' => 230, - '᳒' => 230, - '᳔' => 1, - '᳕' => 220, - '᳖' => 220, - '᳗' => 220, - '᳘' => 220, - '᳙' => 220, - '᳚' => 230, - '᳛' => 230, - '᳜' => 220, - '᳝' => 220, - '᳞' => 220, - '᳟' => 220, - '᳠' => 230, - '᳢' => 1, - '᳣' => 1, - '᳤' => 1, - '᳥' => 1, - '᳦' => 1, - '᳧' => 1, - '᳨' => 1, - '᳭' => 220, - '᳴' => 230, - '᳸' => 230, - '᳹' => 230, - '᷀' => 230, - '᷁' => 230, - '᷂' => 220, - '᷃' => 230, - '᷄' => 230, - '᷅' => 230, - '᷆' => 230, - '᷇' => 230, - '᷈' => 230, - '᷉' => 230, - '᷊' => 220, - '᷋' => 230, - '᷌' => 230, - '᷍' => 234, - '᷎' => 214, - '᷏' => 220, - '᷐' => 202, - '᷑' => 230, - '᷒' => 230, - 'ᷓ' => 230, - 'ᷔ' => 230, - 'ᷕ' => 230, - 'ᷖ' => 230, - 'ᷗ' => 230, - 'ᷘ' => 230, - 'ᷙ' => 230, - 'ᷚ' => 230, - 'ᷛ' => 230, - 'ᷜ' => 230, - 'ᷝ' => 230, - 'ᷞ' => 230, - 'ᷟ' => 230, - 'ᷠ' => 230, - 'ᷡ' => 230, - 'ᷢ' => 230, - 'ᷣ' => 230, - 'ᷤ' => 230, - 'ᷥ' => 230, - 'ᷦ' => 230, - 'ᷧ' => 230, - 'ᷨ' => 230, - 'ᷩ' => 230, - 'ᷪ' => 230, - 'ᷫ' => 230, - 'ᷬ' => 230, - 'ᷭ' => 230, - 'ᷮ' => 230, - 'ᷯ' => 230, - 'ᷰ' => 230, - 'ᷱ' => 230, - 'ᷲ' => 230, - 'ᷳ' => 230, - 'ᷴ' => 230, - '᷵' => 230, - '᷶' => 232, - '᷷' => 228, - '᷸' => 228, - '᷹' => 220, - '᷻' => 230, - '᷼' => 233, - '᷽' => 220, - '᷾' => 230, - '᷿' => 220, - '⃐' => 230, - '⃑' => 230, - '⃒' => 1, - '⃓' => 1, - '⃔' => 230, - '⃕' => 230, - '⃖' => 230, - '⃗' => 230, - '⃘' => 1, - '⃙' => 1, - '⃚' => 1, - '⃛' => 230, - '⃜' => 230, - '⃡' => 230, - '⃥' => 1, - '⃦' => 1, - '⃧' => 230, - '⃨' => 220, - '⃩' => 230, - '⃪' => 1, - '⃫' => 1, - '⃬' => 220, - '⃭' => 220, - '⃮' => 220, - '⃯' => 220, - '⃰' => 230, - '⳯' => 230, - '⳰' => 230, - '⳱' => 230, - '⵿' => 9, - 'ⷠ' => 230, - 'ⷡ' => 230, - 'ⷢ' => 230, - 'ⷣ' => 230, - 'ⷤ' => 230, - 'ⷥ' => 230, - 'ⷦ' => 230, - 'ⷧ' => 230, - 'ⷨ' => 230, - 'ⷩ' => 230, - 'ⷪ' => 230, - 'ⷫ' => 230, - 'ⷬ' => 230, - 'ⷭ' => 230, - 'ⷮ' => 230, - 'ⷯ' => 230, - 'ⷰ' => 230, - 'ⷱ' => 230, - 'ⷲ' => 230, - 'ⷳ' => 230, - 'ⷴ' => 230, - 'ⷵ' => 230, - 'ⷶ' => 230, - 'ⷷ' => 230, - 'ⷸ' => 230, - 'ⷹ' => 230, - 'ⷺ' => 230, - 'ⷻ' => 230, - 'ⷼ' => 230, - 'ⷽ' => 230, - 'ⷾ' => 230, - 'ⷿ' => 230, - '〪' => 218, - '〫' => 228, - '〬' => 232, - '〭' => 222, - '〮' => 224, - '〯' => 224, - '゙' => 8, - '゚' => 8, - '꙯' => 230, - 'ꙴ' => 230, - 'ꙵ' => 230, - 'ꙶ' => 230, - 'ꙷ' => 230, - 'ꙸ' => 230, - 'ꙹ' => 230, - 'ꙺ' => 230, - 'ꙻ' => 230, - '꙼' => 230, - '꙽' => 230, - 'ꚞ' => 230, - 'ꚟ' => 230, - '꛰' => 230, - '꛱' => 230, - '꠆' => 9, - '꠬' => 9, - '꣄' => 9, - '꣠' => 230, - '꣡' => 230, - '꣢' => 230, - '꣣' => 230, - '꣤' => 230, - '꣥' => 230, - '꣦' => 230, - '꣧' => 230, - '꣨' => 230, - '꣩' => 230, - '꣪' => 230, - '꣫' => 230, - '꣬' => 230, - '꣭' => 230, - '꣮' => 230, - '꣯' => 230, - '꣰' => 230, - '꣱' => 230, - '꤫' => 220, - '꤬' => 220, - '꤭' => 220, - '꥓' => 9, - '꦳' => 7, - '꧀' => 9, - 'ꪰ' => 230, - 'ꪲ' => 230, - 'ꪳ' => 230, - 'ꪴ' => 220, - 'ꪷ' => 230, - 'ꪸ' => 230, - 'ꪾ' => 230, - '꪿' => 230, - '꫁' => 230, - '꫶' => 9, - '꯭' => 9, - 'ﬞ' => 26, - '︠' => 230, - '︡' => 230, - '︢' => 230, - '︣' => 230, - '︤' => 230, - '︥' => 230, - '︦' => 230, - '︧' => 220, - '︨' => 220, - '︩' => 220, - '︪' => 220, - '︫' => 220, - '︬' => 220, - '︭' => 220, - '︮' => 230, - '︯' => 230, - '𐇽' => 220, - '𐋠' => 220, - '𐍶' => 230, - '𐍷' => 230, - '𐍸' => 230, - '𐍹' => 230, - '𐍺' => 230, - '𐨍' => 220, - '𐨏' => 230, - '𐨸' => 230, - '𐨹' => 1, - '𐨺' => 220, - '𐨿' => 9, - '𐫥' => 230, - '𐫦' => 220, - '𐴤' => 230, - '𐴥' => 230, - '𐴦' => 230, - '𐴧' => 230, - '𐺫' => 230, - '𐺬' => 230, - '𐽆' => 220, - '𐽇' => 220, - '𐽈' => 230, - '𐽉' => 230, - '𐽊' => 230, - '𐽋' => 220, - '𐽌' => 230, - '𐽍' => 220, - '𐽎' => 220, - '𐽏' => 220, - '𐽐' => 220, - '𑁆' => 9, - '𑁿' => 9, - '𑂹' => 9, - '𑂺' => 7, - '𑄀' => 230, - '𑄁' => 230, - '𑄂' => 230, - '𑄳' => 9, - '𑄴' => 9, - '𑅳' => 7, - '𑇀' => 9, - '𑇊' => 7, - '𑈵' => 9, - '𑈶' => 7, - '𑋩' => 7, - '𑋪' => 9, - '𑌻' => 7, - '𑌼' => 7, - '𑍍' => 9, - '𑍦' => 230, - '𑍧' => 230, - '𑍨' => 230, - '𑍩' => 230, - '𑍪' => 230, - '𑍫' => 230, - '𑍬' => 230, - '𑍰' => 230, - '𑍱' => 230, - '𑍲' => 230, - '𑍳' => 230, - '𑍴' => 230, - '𑑂' => 9, - '𑑆' => 7, - '𑑞' => 230, - '𑓂' => 9, - '𑓃' => 7, - '𑖿' => 9, - '𑗀' => 7, - '𑘿' => 9, - '𑚶' => 9, - '𑚷' => 7, - '𑜫' => 9, - '𑠹' => 9, - '𑠺' => 7, - '𑤽' => 9, - '𑤾' => 9, - '𑥃' => 7, - '𑧠' => 9, - '𑨴' => 9, - '𑩇' => 9, - '𑪙' => 9, - '𑰿' => 9, - '𑵂' => 7, - '𑵄' => 9, - '𑵅' => 9, - '𑶗' => 9, - '𖫰' => 1, - '𖫱' => 1, - '𖫲' => 1, - '𖫳' => 1, - '𖫴' => 1, - '𖬰' => 230, - '𖬱' => 230, - '𖬲' => 230, - '𖬳' => 230, - '𖬴' => 230, - '𖬵' => 230, - '𖬶' => 230, - '𖿰' => 6, - '𖿱' => 6, - '𛲞' => 1, - '𝅥' => 216, - '𝅦' => 216, - '𝅧' => 1, - '𝅨' => 1, - '𝅩' => 1, - '𝅭' => 226, - '𝅮' => 216, - '𝅯' => 216, - '𝅰' => 216, - '𝅱' => 216, - '𝅲' => 216, - '𝅻' => 220, - '𝅼' => 220, - '𝅽' => 220, - '𝅾' => 220, - '𝅿' => 220, - '𝆀' => 220, - '𝆁' => 220, - '𝆂' => 220, - '𝆅' => 230, - '𝆆' => 230, - '𝆇' => 230, - '𝆈' => 230, - '𝆉' => 230, - '𝆊' => 220, - '𝆋' => 220, - '𝆪' => 230, - '𝆫' => 230, - '𝆬' => 230, - '𝆭' => 230, - '𝉂' => 230, - '𝉃' => 230, - '𝉄' => 230, - '𞀀' => 230, - '𞀁' => 230, - '𞀂' => 230, - '𞀃' => 230, - '𞀄' => 230, - '𞀅' => 230, - '𞀆' => 230, - '𞀈' => 230, - '𞀉' => 230, - '𞀊' => 230, - '𞀋' => 230, - '𞀌' => 230, - '𞀍' => 230, - '𞀎' => 230, - '𞀏' => 230, - '𞀐' => 230, - '𞀑' => 230, - '𞀒' => 230, - '𞀓' => 230, - '𞀔' => 230, - '𞀕' => 230, - '𞀖' => 230, - '𞀗' => 230, - '𞀘' => 230, - '𞀛' => 230, - '𞀜' => 230, - '𞀝' => 230, - '𞀞' => 230, - '𞀟' => 230, - '𞀠' => 230, - '𞀡' => 230, - '𞀣' => 230, - '𞀤' => 230, - '𞀦' => 230, - '𞀧' => 230, - '𞀨' => 230, - '𞀩' => 230, - '𞀪' => 230, - '𞄰' => 230, - '𞄱' => 230, - '𞄲' => 230, - '𞄳' => 230, - '𞄴' => 230, - '𞄵' => 230, - '𞄶' => 230, - '𞋬' => 230, - '𞋭' => 230, - '𞋮' => 230, - '𞋯' => 230, - '𞣐' => 220, - '𞣑' => 220, - '𞣒' => 220, - '𞣓' => 220, - '𞣔' => 220, - '𞣕' => 220, - '𞣖' => 220, - '𞥄' => 230, - '𞥅' => 230, - '𞥆' => 230, - '𞥇' => 230, - '𞥈' => 230, - '𞥉' => 230, - '𞥊' => 7, -); diff --git a/tools/php-cs-fixer/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/compatibilityDecomposition.php b/tools/php-cs-fixer/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/compatibilityDecomposition.php deleted file mode 100644 index 1574902..0000000 --- a/tools/php-cs-fixer/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/compatibilityDecomposition.php +++ /dev/null @@ -1,3695 +0,0 @@ - ' ', - '¨' => ' ̈', - 'ª' => 'a', - '¯' => ' ̄', - '²' => '2', - '³' => '3', - '´' => ' ́', - 'µ' => 'μ', - '¸' => ' ̧', - '¹' => '1', - 'º' => 'o', - '¼' => '1⁄4', - '½' => '1⁄2', - '¾' => '3⁄4', - 'IJ' => 'IJ', - 'ij' => 'ij', - 'Ŀ' => 'L·', - 'ŀ' => 'l·', - 'ʼn' => 'ʼn', - 'ſ' => 's', - 'DŽ' => 'DŽ', - 'Dž' => 'Dž', - 'dž' => 'dž', - 'LJ' => 'LJ', - 'Lj' => 'Lj', - 'lj' => 'lj', - 'NJ' => 'NJ', - 'Nj' => 'Nj', - 'nj' => 'nj', - 'DZ' => 'DZ', - 'Dz' => 'Dz', - 'dz' => 'dz', - 'ʰ' => 'h', - 'ʱ' => 'ɦ', - 'ʲ' => 'j', - 'ʳ' => 'r', - 'ʴ' => 'ɹ', - 'ʵ' => 'ɻ', - 'ʶ' => 'ʁ', - 'ʷ' => 'w', - 'ʸ' => 'y', - '˘' => ' ̆', - '˙' => ' ̇', - '˚' => ' ̊', - '˛' => ' ̨', - '˜' => ' ̃', - '˝' => ' ̋', - 'ˠ' => 'ɣ', - 'ˡ' => 'l', - 'ˢ' => 's', - 'ˣ' => 'x', - 'ˤ' => 'ʕ', - 'ͺ' => ' ͅ', - '΄' => ' ́', - '΅' => ' ̈́', - 'ϐ' => 'β', - 'ϑ' => 'θ', - 'ϒ' => 'Υ', - 'ϓ' => 'Ύ', - 'ϔ' => 'Ϋ', - 'ϕ' => 'φ', - 'ϖ' => 'π', - 'ϰ' => 'κ', - 'ϱ' => 'ρ', - 'ϲ' => 'ς', - 'ϴ' => 'Θ', - 'ϵ' => 'ε', - 'Ϲ' => 'Σ', - 'և' => 'եւ', - 'ٵ' => 'اٴ', - 'ٶ' => 'وٴ', - 'ٷ' => 'ۇٴ', - 'ٸ' => 'يٴ', - 'ำ' => 'ํา', - 'ຳ' => 'ໍາ', - 'ໜ' => 'ຫນ', - 'ໝ' => 'ຫມ', - '༌' => '་', - 'ཷ' => 'ྲཱྀ', - 'ཹ' => 'ླཱྀ', - 'ჼ' => 'ნ', - 'ᴬ' => 'A', - 'ᴭ' => 'Æ', - 'ᴮ' => 'B', - 'ᴰ' => 'D', - 'ᴱ' => 'E', - 'ᴲ' => 'Ǝ', - 'ᴳ' => 'G', - 'ᴴ' => 'H', - 'ᴵ' => 'I', - 'ᴶ' => 'J', - 'ᴷ' => 'K', - 'ᴸ' => 'L', - 'ᴹ' => 'M', - 'ᴺ' => 'N', - 'ᴼ' => 'O', - 'ᴽ' => 'Ȣ', - 'ᴾ' => 'P', - 'ᴿ' => 'R', - 'ᵀ' => 'T', - 'ᵁ' => 'U', - 'ᵂ' => 'W', - 'ᵃ' => 'a', - 'ᵄ' => 'ɐ', - 'ᵅ' => 'ɑ', - 'ᵆ' => 'ᴂ', - 'ᵇ' => 'b', - 'ᵈ' => 'd', - 'ᵉ' => 'e', - 'ᵊ' => 'ə', - 'ᵋ' => 'ɛ', - 'ᵌ' => 'ɜ', - 'ᵍ' => 'g', - 'ᵏ' => 'k', - 'ᵐ' => 'm', - 'ᵑ' => 'ŋ', - 'ᵒ' => 'o', - 'ᵓ' => 'ɔ', - 'ᵔ' => 'ᴖ', - 'ᵕ' => 'ᴗ', - 'ᵖ' => 'p', - 'ᵗ' => 't', - 'ᵘ' => 'u', - 'ᵙ' => 'ᴝ', - 'ᵚ' => 'ɯ', - 'ᵛ' => 'v', - 'ᵜ' => 'ᴥ', - 'ᵝ' => 'β', - 'ᵞ' => 'γ', - 'ᵟ' => 'δ', - 'ᵠ' => 'φ', - 'ᵡ' => 'χ', - 'ᵢ' => 'i', - 'ᵣ' => 'r', - 'ᵤ' => 'u', - 'ᵥ' => 'v', - 'ᵦ' => 'β', - 'ᵧ' => 'γ', - 'ᵨ' => 'ρ', - 'ᵩ' => 'φ', - 'ᵪ' => 'χ', - 'ᵸ' => 'н', - 'ᶛ' => 'ɒ', - 'ᶜ' => 'c', - 'ᶝ' => 'ɕ', - 'ᶞ' => 'ð', - 'ᶟ' => 'ɜ', - 'ᶠ' => 'f', - 'ᶡ' => 'ɟ', - 'ᶢ' => 'ɡ', - 'ᶣ' => 'ɥ', - 'ᶤ' => 'ɨ', - 'ᶥ' => 'ɩ', - 'ᶦ' => 'ɪ', - 'ᶧ' => 'ᵻ', - 'ᶨ' => 'ʝ', - 'ᶩ' => 'ɭ', - 'ᶪ' => 'ᶅ', - 'ᶫ' => 'ʟ', - 'ᶬ' => 'ɱ', - 'ᶭ' => 'ɰ', - 'ᶮ' => 'ɲ', - 'ᶯ' => 'ɳ', - 'ᶰ' => 'ɴ', - 'ᶱ' => 'ɵ', - 'ᶲ' => 'ɸ', - 'ᶳ' => 'ʂ', - 'ᶴ' => 'ʃ', - 'ᶵ' => 'ƫ', - 'ᶶ' => 'ʉ', - 'ᶷ' => 'ʊ', - 'ᶸ' => 'ᴜ', - 'ᶹ' => 'ʋ', - 'ᶺ' => 'ʌ', - 'ᶻ' => 'z', - 'ᶼ' => 'ʐ', - 'ᶽ' => 'ʑ', - 'ᶾ' => 'ʒ', - 'ᶿ' => 'θ', - 'ẚ' => 'aʾ', - 'ẛ' => 'ṡ', - '᾽' => ' ̓', - '᾿' => ' ̓', - '῀' => ' ͂', - '῁' => ' ̈͂', - '῍' => ' ̓̀', - '῎' => ' ̓́', - '῏' => ' ̓͂', - '῝' => ' ̔̀', - '῞' => ' ̔́', - '῟' => ' ̔͂', - '῭' => ' ̈̀', - '΅' => ' ̈́', - '´' => ' ́', - '῾' => ' ̔', - ' ' => ' ', - ' ' => ' ', - ' ' => ' ', - ' ' => ' ', - ' ' => ' ', - ' ' => ' ', - ' ' => ' ', - ' ' => ' ', - ' ' => ' ', - ' ' => ' ', - ' ' => ' ', - '‑' => '‐', - '‗' => ' ̳', - '․' => '.', - '‥' => '..', - '…' => '...', - ' ' => ' ', - '″' => '′′', - '‴' => '′′′', - '‶' => '‵‵', - '‷' => '‵‵‵', - '‼' => '!!', - '‾' => ' ̅', - '⁇' => '??', - '⁈' => '?!', - '⁉' => '!?', - '⁗' => '′′′′', - ' ' => ' ', - '⁰' => '0', - 'ⁱ' => 'i', - '⁴' => '4', - '⁵' => '5', - '⁶' => '6', - '⁷' => '7', - '⁸' => '8', - '⁹' => '9', - '⁺' => '+', - '⁻' => '−', - '⁼' => '=', - '⁽' => '(', - '⁾' => ')', - 'ⁿ' => 'n', - '₀' => '0', - '₁' => '1', - '₂' => '2', - '₃' => '3', - '₄' => '4', - '₅' => '5', - '₆' => '6', - '₇' => '7', - '₈' => '8', - '₉' => '9', - '₊' => '+', - '₋' => '−', - '₌' => '=', - '₍' => '(', - '₎' => ')', - 'ₐ' => 'a', - 'ₑ' => 'e', - 'ₒ' => 'o', - 'ₓ' => 'x', - 'ₔ' => 'ə', - 'ₕ' => 'h', - 'ₖ' => 'k', - 'ₗ' => 'l', - 'ₘ' => 'm', - 'ₙ' => 'n', - 'ₚ' => 'p', - 'ₛ' => 's', - 'ₜ' => 't', - '₨' => 'Rs', - '℀' => 'a/c', - '℁' => 'a/s', - 'ℂ' => 'C', - '℃' => '°C', - '℅' => 'c/o', - '℆' => 'c/u', - 'ℇ' => 'Ɛ', - '℉' => '°F', - 'ℊ' => 'g', - 'ℋ' => 'H', - 'ℌ' => 'H', - 'ℍ' => 'H', - 'ℎ' => 'h', - 'ℏ' => 'ħ', - 'ℐ' => 'I', - 'ℑ' => 'I', - 'ℒ' => 'L', - 'ℓ' => 'l', - 'ℕ' => 'N', - '№' => 'No', - 'ℙ' => 'P', - 'ℚ' => 'Q', - 'ℛ' => 'R', - 'ℜ' => 'R', - 'ℝ' => 'R', - '℠' => 'SM', - '℡' => 'TEL', - '™' => 'TM', - 'ℤ' => 'Z', - 'ℨ' => 'Z', - 'ℬ' => 'B', - 'ℭ' => 'C', - 'ℯ' => 'e', - 'ℰ' => 'E', - 'ℱ' => 'F', - 'ℳ' => 'M', - 'ℴ' => 'o', - 'ℵ' => 'א', - 'ℶ' => 'ב', - 'ℷ' => 'ג', - 'ℸ' => 'ד', - 'ℹ' => 'i', - '℻' => 'FAX', - 'ℼ' => 'π', - 'ℽ' => 'γ', - 'ℾ' => 'Γ', - 'ℿ' => 'Π', - '⅀' => '∑', - 'ⅅ' => 'D', - 'ⅆ' => 'd', - 'ⅇ' => 'e', - 'ⅈ' => 'i', - 'ⅉ' => 'j', - '⅐' => '1⁄7', - '⅑' => '1⁄9', - '⅒' => '1⁄10', - '⅓' => '1⁄3', - '⅔' => '2⁄3', - '⅕' => '1⁄5', - '⅖' => '2⁄5', - '⅗' => '3⁄5', - '⅘' => '4⁄5', - '⅙' => '1⁄6', - '⅚' => '5⁄6', - '⅛' => '1⁄8', - '⅜' => '3⁄8', - '⅝' => '5⁄8', - '⅞' => '7⁄8', - '⅟' => '1⁄', - 'Ⅰ' => 'I', - 'Ⅱ' => 'II', - 'Ⅲ' => 'III', - 'Ⅳ' => 'IV', - 'Ⅴ' => 'V', - 'Ⅵ' => 'VI', - 'Ⅶ' => 'VII', - 'Ⅷ' => 'VIII', - 'Ⅸ' => 'IX', - 'Ⅹ' => 'X', - 'Ⅺ' => 'XI', - 'Ⅻ' => 'XII', - 'Ⅼ' => 'L', - 'Ⅽ' => 'C', - 'Ⅾ' => 'D', - 'Ⅿ' => 'M', - 'ⅰ' => 'i', - 'ⅱ' => 'ii', - 'ⅲ' => 'iii', - 'ⅳ' => 'iv', - 'ⅴ' => 'v', - 'ⅵ' => 'vi', - 'ⅶ' => 'vii', - 'ⅷ' => 'viii', - 'ⅸ' => 'ix', - 'ⅹ' => 'x', - 'ⅺ' => 'xi', - 'ⅻ' => 'xii', - 'ⅼ' => 'l', - 'ⅽ' => 'c', - 'ⅾ' => 'd', - 'ⅿ' => 'm', - '↉' => '0⁄3', - '∬' => '∫∫', - '∭' => '∫∫∫', - '∯' => '∮∮', - '∰' => '∮∮∮', - '①' => '1', - '②' => '2', - '③' => '3', - '④' => '4', - '⑤' => '5', - '⑥' => '6', - '⑦' => '7', - '⑧' => '8', - '⑨' => '9', - '⑩' => '10', - '⑪' => '11', - '⑫' => '12', - '⑬' => '13', - '⑭' => '14', - '⑮' => '15', - '⑯' => '16', - '⑰' => '17', - '⑱' => '18', - '⑲' => '19', - '⑳' => '20', - '⑴' => '(1)', - '⑵' => '(2)', - '⑶' => '(3)', - '⑷' => '(4)', - '⑸' => '(5)', - '⑹' => '(6)', - '⑺' => '(7)', - '⑻' => '(8)', - '⑼' => '(9)', - '⑽' => '(10)', - '⑾' => '(11)', - '⑿' => '(12)', - '⒀' => '(13)', - '⒁' => '(14)', - '⒂' => '(15)', - '⒃' => '(16)', - '⒄' => '(17)', - '⒅' => '(18)', - '⒆' => '(19)', - '⒇' => '(20)', - '⒈' => '1.', - '⒉' => '2.', - '⒊' => '3.', - '⒋' => '4.', - '⒌' => '5.', - '⒍' => '6.', - '⒎' => '7.', - '⒏' => '8.', - '⒐' => '9.', - '⒑' => '10.', - '⒒' => '11.', - '⒓' => '12.', - '⒔' => '13.', - '⒕' => '14.', - '⒖' => '15.', - '⒗' => '16.', - '⒘' => '17.', - '⒙' => '18.', - '⒚' => '19.', - '⒛' => '20.', - '⒜' => '(a)', - '⒝' => '(b)', - '⒞' => '(c)', - '⒟' => '(d)', - '⒠' => '(e)', - '⒡' => '(f)', - '⒢' => '(g)', - '⒣' => '(h)', - '⒤' => '(i)', - '⒥' => '(j)', - '⒦' => '(k)', - '⒧' => '(l)', - '⒨' => '(m)', - '⒩' => '(n)', - '⒪' => '(o)', - '⒫' => '(p)', - '⒬' => '(q)', - '⒭' => '(r)', - '⒮' => '(s)', - '⒯' => '(t)', - '⒰' => '(u)', - '⒱' => '(v)', - '⒲' => '(w)', - '⒳' => '(x)', - '⒴' => '(y)', - '⒵' => '(z)', - 'Ⓐ' => 'A', - 'Ⓑ' => 'B', - 'Ⓒ' => 'C', - 'Ⓓ' => 'D', - 'Ⓔ' => 'E', - 'Ⓕ' => 'F', - 'Ⓖ' => 'G', - 'Ⓗ' => 'H', - 'Ⓘ' => 'I', - 'Ⓙ' => 'J', - 'Ⓚ' => 'K', - 'Ⓛ' => 'L', - 'Ⓜ' => 'M', - 'Ⓝ' => 'N', - 'Ⓞ' => 'O', - 'Ⓟ' => 'P', - 'Ⓠ' => 'Q', - 'Ⓡ' => 'R', - 'Ⓢ' => 'S', - 'Ⓣ' => 'T', - 'Ⓤ' => 'U', - 'Ⓥ' => 'V', - 'Ⓦ' => 'W', - 'Ⓧ' => 'X', - 'Ⓨ' => 'Y', - 'Ⓩ' => 'Z', - 'ⓐ' => 'a', - 'ⓑ' => 'b', - 'ⓒ' => 'c', - 'ⓓ' => 'd', - 'ⓔ' => 'e', - 'ⓕ' => 'f', - 'ⓖ' => 'g', - 'ⓗ' => 'h', - 'ⓘ' => 'i', - 'ⓙ' => 'j', - 'ⓚ' => 'k', - 'ⓛ' => 'l', - 'ⓜ' => 'm', - 'ⓝ' => 'n', - 'ⓞ' => 'o', - 'ⓟ' => 'p', - 'ⓠ' => 'q', - 'ⓡ' => 'r', - 'ⓢ' => 's', - 'ⓣ' => 't', - 'ⓤ' => 'u', - 'ⓥ' => 'v', - 'ⓦ' => 'w', - 'ⓧ' => 'x', - 'ⓨ' => 'y', - 'ⓩ' => 'z', - '⓪' => '0', - '⨌' => '∫∫∫∫', - '⩴' => '::=', - '⩵' => '==', - '⩶' => '===', - 'ⱼ' => 'j', - 'ⱽ' => 'V', - 'ⵯ' => 'ⵡ', - '⺟' => '母', - '⻳' => '龟', - '⼀' => '一', - '⼁' => '丨', - '⼂' => '丶', - '⼃' => '丿', - '⼄' => '乙', - '⼅' => '亅', - '⼆' => '二', - '⼇' => '亠', - '⼈' => '人', - '⼉' => '儿', - '⼊' => '入', - '⼋' => '八', - '⼌' => '冂', - '⼍' => '冖', - '⼎' => '冫', - '⼏' => '几', - '⼐' => '凵', - '⼑' => '刀', - '⼒' => '力', - '⼓' => '勹', - '⼔' => '匕', - '⼕' => '匚', - '⼖' => '匸', - '⼗' => '十', - '⼘' => '卜', - '⼙' => '卩', - '⼚' => '厂', - '⼛' => '厶', - '⼜' => '又', - '⼝' => '口', - '⼞' => '囗', - '⼟' => '土', - '⼠' => '士', - '⼡' => '夂', - '⼢' => '夊', - '⼣' => '夕', - '⼤' => '大', - '⼥' => '女', - '⼦' => '子', - '⼧' => '宀', - '⼨' => '寸', - '⼩' => '小', - '⼪' => '尢', - '⼫' => '尸', - '⼬' => '屮', - '⼭' => '山', - '⼮' => '巛', - '⼯' => '工', - '⼰' => '己', - '⼱' => '巾', - '⼲' => '干', - '⼳' => '幺', - '⼴' => '广', - '⼵' => '廴', - '⼶' => '廾', - '⼷' => '弋', - '⼸' => '弓', - '⼹' => '彐', - '⼺' => '彡', - '⼻' => '彳', - '⼼' => '心', - '⼽' => '戈', - '⼾' => '戶', - '⼿' => '手', - '⽀' => '支', - '⽁' => '攴', - '⽂' => '文', - '⽃' => '斗', - '⽄' => '斤', - '⽅' => '方', - '⽆' => '无', - '⽇' => '日', - '⽈' => '曰', - '⽉' => '月', - '⽊' => '木', - '⽋' => '欠', - '⽌' => '止', - '⽍' => '歹', - '⽎' => '殳', - '⽏' => '毋', - '⽐' => '比', - '⽑' => '毛', - '⽒' => '氏', - '⽓' => '气', - '⽔' => '水', - '⽕' => '火', - '⽖' => '爪', - '⽗' => '父', - '⽘' => '爻', - '⽙' => '爿', - '⽚' => '片', - '⽛' => '牙', - '⽜' => '牛', - '⽝' => '犬', - '⽞' => '玄', - '⽟' => '玉', - '⽠' => '瓜', - '⽡' => '瓦', - '⽢' => '甘', - '⽣' => '生', - '⽤' => '用', - '⽥' => '田', - '⽦' => '疋', - '⽧' => '疒', - '⽨' => '癶', - '⽩' => '白', - '⽪' => '皮', - '⽫' => '皿', - '⽬' => '目', - '⽭' => '矛', - '⽮' => '矢', - '⽯' => '石', - '⽰' => '示', - '⽱' => '禸', - '⽲' => '禾', - '⽳' => '穴', - '⽴' => '立', - '⽵' => '竹', - '⽶' => '米', - '⽷' => '糸', - '⽸' => '缶', - '⽹' => '网', - '⽺' => '羊', - '⽻' => '羽', - '⽼' => '老', - '⽽' => '而', - '⽾' => '耒', - '⽿' => '耳', - '⾀' => '聿', - '⾁' => '肉', - '⾂' => '臣', - '⾃' => '自', - '⾄' => '至', - '⾅' => '臼', - '⾆' => '舌', - '⾇' => '舛', - '⾈' => '舟', - '⾉' => '艮', - '⾊' => '色', - '⾋' => '艸', - '⾌' => '虍', - '⾍' => '虫', - '⾎' => '血', - '⾏' => '行', - '⾐' => '衣', - '⾑' => '襾', - '⾒' => '見', - '⾓' => '角', - '⾔' => '言', - '⾕' => '谷', - '⾖' => '豆', - '⾗' => '豕', - '⾘' => '豸', - '⾙' => '貝', - '⾚' => '赤', - '⾛' => '走', - '⾜' => '足', - '⾝' => '身', - '⾞' => '車', - '⾟' => '辛', - '⾠' => '辰', - '⾡' => '辵', - '⾢' => '邑', - '⾣' => '酉', - '⾤' => '釆', - '⾥' => '里', - '⾦' => '金', - '⾧' => '長', - '⾨' => '門', - '⾩' => '阜', - '⾪' => '隶', - '⾫' => '隹', - '⾬' => '雨', - '⾭' => '靑', - '⾮' => '非', - '⾯' => '面', - '⾰' => '革', - '⾱' => '韋', - '⾲' => '韭', - '⾳' => '音', - '⾴' => '頁', - '⾵' => '風', - '⾶' => '飛', - '⾷' => '食', - '⾸' => '首', - '⾹' => '香', - '⾺' => '馬', - '⾻' => '骨', - '⾼' => '高', - '⾽' => '髟', - '⾾' => '鬥', - '⾿' => '鬯', - '⿀' => '鬲', - '⿁' => '鬼', - '⿂' => '魚', - '⿃' => '鳥', - '⿄' => '鹵', - '⿅' => '鹿', - '⿆' => '麥', - '⿇' => '麻', - '⿈' => '黃', - '⿉' => '黍', - '⿊' => '黑', - '⿋' => '黹', - '⿌' => '黽', - '⿍' => '鼎', - '⿎' => '鼓', - '⿏' => '鼠', - '⿐' => '鼻', - '⿑' => '齊', - '⿒' => '齒', - '⿓' => '龍', - '⿔' => '龜', - '⿕' => '龠', - ' ' => ' ', - '〶' => '〒', - '〸' => '十', - '〹' => '卄', - '〺' => '卅', - '゛' => ' ゙', - '゜' => ' ゚', - 'ゟ' => 'より', - 'ヿ' => 'コト', - 'ㄱ' => 'ᄀ', - 'ㄲ' => 'ᄁ', - 'ㄳ' => 'ᆪ', - 'ㄴ' => 'ᄂ', - 'ㄵ' => 'ᆬ', - 'ㄶ' => 'ᆭ', - 'ㄷ' => 'ᄃ', - 'ㄸ' => 'ᄄ', - 'ㄹ' => 'ᄅ', - 'ㄺ' => 'ᆰ', - 'ㄻ' => 'ᆱ', - 'ㄼ' => 'ᆲ', - 'ㄽ' => 'ᆳ', - 'ㄾ' => 'ᆴ', - 'ㄿ' => 'ᆵ', - 'ㅀ' => 'ᄚ', - 'ㅁ' => 'ᄆ', - 'ㅂ' => 'ᄇ', - 'ㅃ' => 'ᄈ', - 'ㅄ' => 'ᄡ', - 'ㅅ' => 'ᄉ', - 'ㅆ' => 'ᄊ', - 'ㅇ' => 'ᄋ', - 'ㅈ' => 'ᄌ', - 'ㅉ' => 'ᄍ', - 'ㅊ' => 'ᄎ', - 'ㅋ' => 'ᄏ', - 'ㅌ' => 'ᄐ', - 'ㅍ' => 'ᄑ', - 'ㅎ' => 'ᄒ', - 'ㅏ' => 'ᅡ', - 'ㅐ' => 'ᅢ', - 'ㅑ' => 'ᅣ', - 'ㅒ' => 'ᅤ', - 'ㅓ' => 'ᅥ', - 'ㅔ' => 'ᅦ', - 'ㅕ' => 'ᅧ', - 'ㅖ' => 'ᅨ', - 'ㅗ' => 'ᅩ', - 'ㅘ' => 'ᅪ', - 'ㅙ' => 'ᅫ', - 'ㅚ' => 'ᅬ', - 'ㅛ' => 'ᅭ', - 'ㅜ' => 'ᅮ', - 'ㅝ' => 'ᅯ', - 'ㅞ' => 'ᅰ', - 'ㅟ' => 'ᅱ', - 'ㅠ' => 'ᅲ', - 'ㅡ' => 'ᅳ', - 'ㅢ' => 'ᅴ', - 'ㅣ' => 'ᅵ', - 'ㅤ' => 'ᅠ', - 'ㅥ' => 'ᄔ', - 'ㅦ' => 'ᄕ', - 'ㅧ' => 'ᇇ', - 'ㅨ' => 'ᇈ', - 'ㅩ' => 'ᇌ', - 'ㅪ' => 'ᇎ', - 'ㅫ' => 'ᇓ', - 'ㅬ' => 'ᇗ', - 'ㅭ' => 'ᇙ', - 'ㅮ' => 'ᄜ', - 'ㅯ' => 'ᇝ', - 'ㅰ' => 'ᇟ', - 'ㅱ' => 'ᄝ', - 'ㅲ' => 'ᄞ', - 'ㅳ' => 'ᄠ', - 'ㅴ' => 'ᄢ', - 'ㅵ' => 'ᄣ', - 'ㅶ' => 'ᄧ', - 'ㅷ' => 'ᄩ', - 'ㅸ' => 'ᄫ', - 'ㅹ' => 'ᄬ', - 'ㅺ' => 'ᄭ', - 'ㅻ' => 'ᄮ', - 'ㅼ' => 'ᄯ', - 'ㅽ' => 'ᄲ', - 'ㅾ' => 'ᄶ', - 'ㅿ' => 'ᅀ', - 'ㆀ' => 'ᅇ', - 'ㆁ' => 'ᅌ', - 'ㆂ' => 'ᇱ', - 'ㆃ' => 'ᇲ', - 'ㆄ' => 'ᅗ', - 'ㆅ' => 'ᅘ', - 'ㆆ' => 'ᅙ', - 'ㆇ' => 'ᆄ', - 'ㆈ' => 'ᆅ', - 'ㆉ' => 'ᆈ', - 'ㆊ' => 'ᆑ', - 'ㆋ' => 'ᆒ', - 'ㆌ' => 'ᆔ', - 'ㆍ' => 'ᆞ', - 'ㆎ' => 'ᆡ', - '㆒' => '一', - '㆓' => '二', - '㆔' => '三', - '㆕' => '四', - '㆖' => '上', - '㆗' => '中', - '㆘' => '下', - '㆙' => '甲', - '㆚' => '乙', - '㆛' => '丙', - '㆜' => '丁', - '㆝' => '天', - '㆞' => '地', - '㆟' => '人', - '㈀' => '(ᄀ)', - '㈁' => '(ᄂ)', - '㈂' => '(ᄃ)', - '㈃' => '(ᄅ)', - '㈄' => '(ᄆ)', - '㈅' => '(ᄇ)', - '㈆' => '(ᄉ)', - '㈇' => '(ᄋ)', - '㈈' => '(ᄌ)', - '㈉' => '(ᄎ)', - '㈊' => '(ᄏ)', - '㈋' => '(ᄐ)', - '㈌' => '(ᄑ)', - '㈍' => '(ᄒ)', - '㈎' => '(가)', - '㈏' => '(나)', - '㈐' => '(다)', - '㈑' => '(라)', - '㈒' => '(마)', - '㈓' => '(바)', - '㈔' => '(사)', - '㈕' => '(아)', - '㈖' => '(자)', - '㈗' => '(차)', - '㈘' => '(카)', - '㈙' => '(타)', - '㈚' => '(파)', - '㈛' => '(하)', - '㈜' => '(주)', - '㈝' => '(오전)', - '㈞' => '(오후)', - '㈠' => '(一)', - '㈡' => '(二)', - '㈢' => '(三)', - '㈣' => '(四)', - '㈤' => '(五)', - '㈥' => '(六)', - '㈦' => '(七)', - '㈧' => '(八)', - '㈨' => '(九)', - '㈩' => '(十)', - '㈪' => '(月)', - '㈫' => '(火)', - '㈬' => '(水)', - '㈭' => '(木)', - '㈮' => '(金)', - '㈯' => '(土)', - '㈰' => '(日)', - '㈱' => '(株)', - '㈲' => '(有)', - '㈳' => '(社)', - '㈴' => '(名)', - '㈵' => '(特)', - '㈶' => '(財)', - '㈷' => '(祝)', - '㈸' => '(労)', - '㈹' => '(代)', - '㈺' => '(呼)', - '㈻' => '(学)', - '㈼' => '(監)', - '㈽' => '(企)', - '㈾' => '(資)', - '㈿' => '(協)', - '㉀' => '(祭)', - '㉁' => '(休)', - '㉂' => '(自)', - '㉃' => '(至)', - '㉄' => '問', - '㉅' => '幼', - '㉆' => '文', - '㉇' => '箏', - '㉐' => 'PTE', - '㉑' => '21', - '㉒' => '22', - '㉓' => '23', - '㉔' => '24', - '㉕' => '25', - '㉖' => '26', - '㉗' => '27', - '㉘' => '28', - '㉙' => '29', - '㉚' => '30', - '㉛' => '31', - '㉜' => '32', - '㉝' => '33', - '㉞' => '34', - '㉟' => '35', - '㉠' => 'ᄀ', - '㉡' => 'ᄂ', - '㉢' => 'ᄃ', - '㉣' => 'ᄅ', - '㉤' => 'ᄆ', - '㉥' => 'ᄇ', - '㉦' => 'ᄉ', - '㉧' => 'ᄋ', - '㉨' => 'ᄌ', - '㉩' => 'ᄎ', - '㉪' => 'ᄏ', - '㉫' => 'ᄐ', - '㉬' => 'ᄑ', - '㉭' => 'ᄒ', - '㉮' => '가', - '㉯' => '나', - '㉰' => '다', - '㉱' => '라', - '㉲' => '마', - '㉳' => '바', - '㉴' => '사', - '㉵' => '아', - '㉶' => '자', - '㉷' => '차', - '㉸' => '카', - '㉹' => '타', - '㉺' => '파', - '㉻' => '하', - '㉼' => '참고', - '㉽' => '주의', - '㉾' => '우', - '㊀' => '一', - '㊁' => '二', - '㊂' => '三', - '㊃' => '四', - '㊄' => '五', - '㊅' => '六', - '㊆' => '七', - '㊇' => '八', - '㊈' => '九', - '㊉' => '十', - '㊊' => '月', - '㊋' => '火', - '㊌' => '水', - '㊍' => '木', - '㊎' => '金', - '㊏' => '土', - '㊐' => '日', - '㊑' => '株', - '㊒' => '有', - '㊓' => '社', - '㊔' => '名', - '㊕' => '特', - '㊖' => '財', - '㊗' => '祝', - '㊘' => '労', - '㊙' => '秘', - '㊚' => '男', - '㊛' => '女', - '㊜' => '適', - '㊝' => '優', - '㊞' => '印', - '㊟' => '注', - '㊠' => '項', - '㊡' => '休', - '㊢' => '写', - '㊣' => '正', - '㊤' => '上', - '㊥' => '中', - '㊦' => '下', - '㊧' => '左', - '㊨' => '右', - '㊩' => '医', - '㊪' => '宗', - '㊫' => '学', - '㊬' => '監', - '㊭' => '企', - '㊮' => '資', - '㊯' => '協', - '㊰' => '夜', - '㊱' => '36', - '㊲' => '37', - '㊳' => '38', - '㊴' => '39', - '㊵' => '40', - '㊶' => '41', - '㊷' => '42', - '㊸' => '43', - '㊹' => '44', - '㊺' => '45', - '㊻' => '46', - '㊼' => '47', - '㊽' => '48', - '㊾' => '49', - '㊿' => '50', - '㋀' => '1月', - '㋁' => '2月', - '㋂' => '3月', - '㋃' => '4月', - '㋄' => '5月', - '㋅' => '6月', - '㋆' => '7月', - '㋇' => '8月', - '㋈' => '9月', - '㋉' => '10月', - '㋊' => '11月', - '㋋' => '12月', - '㋌' => 'Hg', - '㋍' => 'erg', - '㋎' => 'eV', - '㋏' => 'LTD', - '㋐' => 'ア', - '㋑' => 'イ', - '㋒' => 'ウ', - '㋓' => 'エ', - '㋔' => 'オ', - '㋕' => 'カ', - '㋖' => 'キ', - '㋗' => 'ク', - '㋘' => 'ケ', - '㋙' => 'コ', - '㋚' => 'サ', - '㋛' => 'シ', - '㋜' => 'ス', - '㋝' => 'セ', - '㋞' => 'ソ', - '㋟' => 'タ', - '㋠' => 'チ', - '㋡' => 'ツ', - '㋢' => 'テ', - '㋣' => 'ト', - '㋤' => 'ナ', - '㋥' => 'ニ', - '㋦' => 'ヌ', - '㋧' => 'ネ', - '㋨' => 'ノ', - '㋩' => 'ハ', - '㋪' => 'ヒ', - '㋫' => 'フ', - '㋬' => 'ヘ', - '㋭' => 'ホ', - '㋮' => 'マ', - '㋯' => 'ミ', - '㋰' => 'ム', - '㋱' => 'メ', - '㋲' => 'モ', - '㋳' => 'ヤ', - '㋴' => 'ユ', - '㋵' => 'ヨ', - '㋶' => 'ラ', - '㋷' => 'リ', - '㋸' => 'ル', - '㋹' => 'レ', - '㋺' => 'ロ', - '㋻' => 'ワ', - '㋼' => 'ヰ', - '㋽' => 'ヱ', - '㋾' => 'ヲ', - '㋿' => '令和', - '㌀' => 'アパート', - '㌁' => 'アルファ', - '㌂' => 'アンペア', - '㌃' => 'アール', - '㌄' => 'イニング', - '㌅' => 'インチ', - '㌆' => 'ウォン', - '㌇' => 'エスクード', - '㌈' => 'エーカー', - '㌉' => 'オンス', - '㌊' => 'オーム', - '㌋' => 'カイリ', - '㌌' => 'カラット', - '㌍' => 'カロリー', - '㌎' => 'ガロン', - '㌏' => 'ガンマ', - '㌐' => 'ギガ', - '㌑' => 'ギニー', - '㌒' => 'キュリー', - '㌓' => 'ギルダー', - '㌔' => 'キロ', - '㌕' => 'キログラム', - '㌖' => 'キロメートル', - '㌗' => 'キロワット', - '㌘' => 'グラム', - '㌙' => 'グラムトン', - '㌚' => 'クルゼイロ', - '㌛' => 'クローネ', - '㌜' => 'ケース', - '㌝' => 'コルナ', - '㌞' => 'コーポ', - '㌟' => 'サイクル', - '㌠' => 'サンチーム', - '㌡' => 'シリング', - '㌢' => 'センチ', - '㌣' => 'セント', - '㌤' => 'ダース', - '㌥' => 'デシ', - '㌦' => 'ドル', - '㌧' => 'トン', - '㌨' => 'ナノ', - '㌩' => 'ノット', - '㌪' => 'ハイツ', - '㌫' => 'パーセント', - '㌬' => 'パーツ', - '㌭' => 'バーレル', - '㌮' => 'ピアストル', - '㌯' => 'ピクル', - '㌰' => 'ピコ', - '㌱' => 'ビル', - '㌲' => 'ファラッド', - '㌳' => 'フィート', - '㌴' => 'ブッシェル', - '㌵' => 'フラン', - '㌶' => 'ヘクタール', - '㌷' => 'ペソ', - '㌸' => 'ペニヒ', - '㌹' => 'ヘルツ', - '㌺' => 'ペンス', - '㌻' => 'ページ', - '㌼' => 'ベータ', - '㌽' => 'ポイント', - '㌾' => 'ボルト', - '㌿' => 'ホン', - '㍀' => 'ポンド', - '㍁' => 'ホール', - '㍂' => 'ホーン', - '㍃' => 'マイクロ', - '㍄' => 'マイル', - '㍅' => 'マッハ', - '㍆' => 'マルク', - '㍇' => 'マンション', - '㍈' => 'ミクロン', - '㍉' => 'ミリ', - '㍊' => 'ミリバール', - '㍋' => 'メガ', - '㍌' => 'メガトン', - '㍍' => 'メートル', - '㍎' => 'ヤード', - '㍏' => 'ヤール', - '㍐' => 'ユアン', - '㍑' => 'リットル', - '㍒' => 'リラ', - '㍓' => 'ルピー', - '㍔' => 'ルーブル', - '㍕' => 'レム', - '㍖' => 'レントゲン', - '㍗' => 'ワット', - '㍘' => '0点', - '㍙' => '1点', - '㍚' => '2点', - '㍛' => '3点', - '㍜' => '4点', - '㍝' => '5点', - '㍞' => '6点', - '㍟' => '7点', - '㍠' => '8点', - '㍡' => '9点', - '㍢' => '10点', - '㍣' => '11点', - '㍤' => '12点', - '㍥' => '13点', - '㍦' => '14点', - '㍧' => '15点', - '㍨' => '16点', - '㍩' => '17点', - '㍪' => '18点', - '㍫' => '19点', - '㍬' => '20点', - '㍭' => '21点', - '㍮' => '22点', - '㍯' => '23点', - '㍰' => '24点', - '㍱' => 'hPa', - '㍲' => 'da', - '㍳' => 'AU', - '㍴' => 'bar', - '㍵' => 'oV', - '㍶' => 'pc', - '㍷' => 'dm', - '㍸' => 'dm2', - '㍹' => 'dm3', - '㍺' => 'IU', - '㍻' => '平成', - '㍼' => '昭和', - '㍽' => '大正', - '㍾' => '明治', - '㍿' => '株式会社', - '㎀' => 'pA', - '㎁' => 'nA', - '㎂' => 'μA', - '㎃' => 'mA', - '㎄' => 'kA', - '㎅' => 'KB', - '㎆' => 'MB', - '㎇' => 'GB', - '㎈' => 'cal', - '㎉' => 'kcal', - '㎊' => 'pF', - '㎋' => 'nF', - '㎌' => 'μF', - '㎍' => 'μg', - '㎎' => 'mg', - '㎏' => 'kg', - '㎐' => 'Hz', - '㎑' => 'kHz', - '㎒' => 'MHz', - '㎓' => 'GHz', - '㎔' => 'THz', - '㎕' => 'μl', - '㎖' => 'ml', - '㎗' => 'dl', - '㎘' => 'kl', - '㎙' => 'fm', - '㎚' => 'nm', - '㎛' => 'μm', - '㎜' => 'mm', - '㎝' => 'cm', - '㎞' => 'km', - '㎟' => 'mm2', - '㎠' => 'cm2', - '㎡' => 'm2', - '㎢' => 'km2', - '㎣' => 'mm3', - '㎤' => 'cm3', - '㎥' => 'm3', - '㎦' => 'km3', - '㎧' => 'm∕s', - '㎨' => 'm∕s2', - '㎩' => 'Pa', - '㎪' => 'kPa', - '㎫' => 'MPa', - '㎬' => 'GPa', - '㎭' => 'rad', - '㎮' => 'rad∕s', - '㎯' => 'rad∕s2', - '㎰' => 'ps', - '㎱' => 'ns', - '㎲' => 'μs', - '㎳' => 'ms', - '㎴' => 'pV', - '㎵' => 'nV', - '㎶' => 'μV', - '㎷' => 'mV', - '㎸' => 'kV', - '㎹' => 'MV', - '㎺' => 'pW', - '㎻' => 'nW', - '㎼' => 'μW', - '㎽' => 'mW', - '㎾' => 'kW', - '㎿' => 'MW', - '㏀' => 'kΩ', - '㏁' => 'MΩ', - '㏂' => 'a.m.', - '㏃' => 'Bq', - '㏄' => 'cc', - '㏅' => 'cd', - '㏆' => 'C∕kg', - '㏇' => 'Co.', - '㏈' => 'dB', - '㏉' => 'Gy', - '㏊' => 'ha', - '㏋' => 'HP', - '㏌' => 'in', - '㏍' => 'KK', - '㏎' => 'KM', - '㏏' => 'kt', - '㏐' => 'lm', - '㏑' => 'ln', - '㏒' => 'log', - '㏓' => 'lx', - '㏔' => 'mb', - '㏕' => 'mil', - '㏖' => 'mol', - '㏗' => 'PH', - '㏘' => 'p.m.', - '㏙' => 'PPM', - '㏚' => 'PR', - '㏛' => 'sr', - '㏜' => 'Sv', - '㏝' => 'Wb', - '㏞' => 'V∕m', - '㏟' => 'A∕m', - '㏠' => '1日', - '㏡' => '2日', - '㏢' => '3日', - '㏣' => '4日', - '㏤' => '5日', - '㏥' => '6日', - '㏦' => '7日', - '㏧' => '8日', - '㏨' => '9日', - '㏩' => '10日', - '㏪' => '11日', - '㏫' => '12日', - '㏬' => '13日', - '㏭' => '14日', - '㏮' => '15日', - '㏯' => '16日', - '㏰' => '17日', - '㏱' => '18日', - '㏲' => '19日', - '㏳' => '20日', - '㏴' => '21日', - '㏵' => '22日', - '㏶' => '23日', - '㏷' => '24日', - '㏸' => '25日', - '㏹' => '26日', - '㏺' => '27日', - '㏻' => '28日', - '㏼' => '29日', - '㏽' => '30日', - '㏾' => '31日', - '㏿' => 'gal', - 'ꚜ' => 'ъ', - 'ꚝ' => 'ь', - 'ꝰ' => 'ꝯ', - 'ꟸ' => 'Ħ', - 'ꟹ' => 'œ', - 'ꭜ' => 'ꜧ', - 'ꭝ' => 'ꬷ', - 'ꭞ' => 'ɫ', - 'ꭟ' => 'ꭒ', - 'ꭩ' => 'ʍ', - 'ff' => 'ff', - 'fi' => 'fi', - 'fl' => 'fl', - 'ffi' => 'ffi', - 'ffl' => 'ffl', - 'ſt' => 'st', - 'st' => 'st', - 'ﬓ' => 'մն', - 'ﬔ' => 'մե', - 'ﬕ' => 'մի', - 'ﬖ' => 'վն', - 'ﬗ' => 'մխ', - 'ﬠ' => 'ע', - 'ﬡ' => 'א', - 'ﬢ' => 'ד', - 'ﬣ' => 'ה', - 'ﬤ' => 'כ', - 'ﬥ' => 'ל', - 'ﬦ' => 'ם', - 'ﬧ' => 'ר', - 'ﬨ' => 'ת', - '﬩' => '+', - 'ﭏ' => 'אל', - 'ﭐ' => 'ٱ', - 'ﭑ' => 'ٱ', - 'ﭒ' => 'ٻ', - 'ﭓ' => 'ٻ', - 'ﭔ' => 'ٻ', - 'ﭕ' => 'ٻ', - 'ﭖ' => 'پ', - 'ﭗ' => 'پ', - 'ﭘ' => 'پ', - 'ﭙ' => 'پ', - 'ﭚ' => 'ڀ', - 'ﭛ' => 'ڀ', - 'ﭜ' => 'ڀ', - 'ﭝ' => 'ڀ', - 'ﭞ' => 'ٺ', - 'ﭟ' => 'ٺ', - 'ﭠ' => 'ٺ', - 'ﭡ' => 'ٺ', - 'ﭢ' => 'ٿ', - 'ﭣ' => 'ٿ', - 'ﭤ' => 'ٿ', - 'ﭥ' => 'ٿ', - 'ﭦ' => 'ٹ', - 'ﭧ' => 'ٹ', - 'ﭨ' => 'ٹ', - 'ﭩ' => 'ٹ', - 'ﭪ' => 'ڤ', - 'ﭫ' => 'ڤ', - 'ﭬ' => 'ڤ', - 'ﭭ' => 'ڤ', - 'ﭮ' => 'ڦ', - 'ﭯ' => 'ڦ', - 'ﭰ' => 'ڦ', - 'ﭱ' => 'ڦ', - 'ﭲ' => 'ڄ', - 'ﭳ' => 'ڄ', - 'ﭴ' => 'ڄ', - 'ﭵ' => 'ڄ', - 'ﭶ' => 'ڃ', - 'ﭷ' => 'ڃ', - 'ﭸ' => 'ڃ', - 'ﭹ' => 'ڃ', - 'ﭺ' => 'چ', - 'ﭻ' => 'چ', - 'ﭼ' => 'چ', - 'ﭽ' => 'چ', - 'ﭾ' => 'ڇ', - 'ﭿ' => 'ڇ', - 'ﮀ' => 'ڇ', - 'ﮁ' => 'ڇ', - 'ﮂ' => 'ڍ', - 'ﮃ' => 'ڍ', - 'ﮄ' => 'ڌ', - 'ﮅ' => 'ڌ', - 'ﮆ' => 'ڎ', - 'ﮇ' => 'ڎ', - 'ﮈ' => 'ڈ', - 'ﮉ' => 'ڈ', - 'ﮊ' => 'ژ', - 'ﮋ' => 'ژ', - 'ﮌ' => 'ڑ', - 'ﮍ' => 'ڑ', - 'ﮎ' => 'ک', - 'ﮏ' => 'ک', - 'ﮐ' => 'ک', - 'ﮑ' => 'ک', - 'ﮒ' => 'گ', - 'ﮓ' => 'گ', - 'ﮔ' => 'گ', - 'ﮕ' => 'گ', - 'ﮖ' => 'ڳ', - 'ﮗ' => 'ڳ', - 'ﮘ' => 'ڳ', - 'ﮙ' => 'ڳ', - 'ﮚ' => 'ڱ', - 'ﮛ' => 'ڱ', - 'ﮜ' => 'ڱ', - 'ﮝ' => 'ڱ', - 'ﮞ' => 'ں', - 'ﮟ' => 'ں', - 'ﮠ' => 'ڻ', - 'ﮡ' => 'ڻ', - 'ﮢ' => 'ڻ', - 'ﮣ' => 'ڻ', - 'ﮤ' => 'ۀ', - 'ﮥ' => 'ۀ', - 'ﮦ' => 'ہ', - 'ﮧ' => 'ہ', - 'ﮨ' => 'ہ', - 'ﮩ' => 'ہ', - 'ﮪ' => 'ھ', - 'ﮫ' => 'ھ', - 'ﮬ' => 'ھ', - 'ﮭ' => 'ھ', - 'ﮮ' => 'ے', - 'ﮯ' => 'ے', - 'ﮰ' => 'ۓ', - 'ﮱ' => 'ۓ', - 'ﯓ' => 'ڭ', - 'ﯔ' => 'ڭ', - 'ﯕ' => 'ڭ', - 'ﯖ' => 'ڭ', - 'ﯗ' => 'ۇ', - 'ﯘ' => 'ۇ', - 'ﯙ' => 'ۆ', - 'ﯚ' => 'ۆ', - 'ﯛ' => 'ۈ', - 'ﯜ' => 'ۈ', - 'ﯝ' => 'ۇٴ', - 'ﯞ' => 'ۋ', - 'ﯟ' => 'ۋ', - 'ﯠ' => 'ۅ', - 'ﯡ' => 'ۅ', - 'ﯢ' => 'ۉ', - 'ﯣ' => 'ۉ', - 'ﯤ' => 'ې', - 'ﯥ' => 'ې', - 'ﯦ' => 'ې', - 'ﯧ' => 'ې', - 'ﯨ' => 'ى', - 'ﯩ' => 'ى', - 'ﯪ' => 'ئا', - 'ﯫ' => 'ئا', - 'ﯬ' => 'ئە', - 'ﯭ' => 'ئە', - 'ﯮ' => 'ئو', - 'ﯯ' => 'ئو', - 'ﯰ' => 'ئۇ', - 'ﯱ' => 'ئۇ', - 'ﯲ' => 'ئۆ', - 'ﯳ' => 'ئۆ', - 'ﯴ' => 'ئۈ', - 'ﯵ' => 'ئۈ', - 'ﯶ' => 'ئې', - 'ﯷ' => 'ئې', - 'ﯸ' => 'ئې', - 'ﯹ' => 'ئى', - 'ﯺ' => 'ئى', - 'ﯻ' => 'ئى', - 'ﯼ' => 'ی', - 'ﯽ' => 'ی', - 'ﯾ' => 'ی', - 'ﯿ' => 'ی', - 'ﰀ' => 'ئج', - 'ﰁ' => 'ئح', - 'ﰂ' => 'ئم', - 'ﰃ' => 'ئى', - 'ﰄ' => 'ئي', - 'ﰅ' => 'بج', - 'ﰆ' => 'بح', - 'ﰇ' => 'بخ', - 'ﰈ' => 'بم', - 'ﰉ' => 'بى', - 'ﰊ' => 'بي', - 'ﰋ' => 'تج', - 'ﰌ' => 'تح', - 'ﰍ' => 'تخ', - 'ﰎ' => 'تم', - 'ﰏ' => 'تى', - 'ﰐ' => 'تي', - 'ﰑ' => 'ثج', - 'ﰒ' => 'ثم', - 'ﰓ' => 'ثى', - 'ﰔ' => 'ثي', - 'ﰕ' => 'جح', - 'ﰖ' => 'جم', - 'ﰗ' => 'حج', - 'ﰘ' => 'حم', - 'ﰙ' => 'خج', - 'ﰚ' => 'خح', - 'ﰛ' => 'خم', - 'ﰜ' => 'سج', - 'ﰝ' => 'سح', - 'ﰞ' => 'سخ', - 'ﰟ' => 'سم', - 'ﰠ' => 'صح', - 'ﰡ' => 'صم', - 'ﰢ' => 'ضج', - 'ﰣ' => 'ضح', - 'ﰤ' => 'ضخ', - 'ﰥ' => 'ضم', - 'ﰦ' => 'طح', - 'ﰧ' => 'طم', - 'ﰨ' => 'ظم', - 'ﰩ' => 'عج', - 'ﰪ' => 'عم', - 'ﰫ' => 'غج', - 'ﰬ' => 'غم', - 'ﰭ' => 'فج', - 'ﰮ' => 'فح', - 'ﰯ' => 'فخ', - 'ﰰ' => 'فم', - 'ﰱ' => 'فى', - 'ﰲ' => 'في', - 'ﰳ' => 'قح', - 'ﰴ' => 'قم', - 'ﰵ' => 'قى', - 'ﰶ' => 'قي', - 'ﰷ' => 'كا', - 'ﰸ' => 'كج', - 'ﰹ' => 'كح', - 'ﰺ' => 'كخ', - 'ﰻ' => 'كل', - 'ﰼ' => 'كم', - 'ﰽ' => 'كى', - 'ﰾ' => 'كي', - 'ﰿ' => 'لج', - 'ﱀ' => 'لح', - 'ﱁ' => 'لخ', - 'ﱂ' => 'لم', - 'ﱃ' => 'لى', - 'ﱄ' => 'لي', - 'ﱅ' => 'مج', - 'ﱆ' => 'مح', - 'ﱇ' => 'مخ', - 'ﱈ' => 'مم', - 'ﱉ' => 'مى', - 'ﱊ' => 'مي', - 'ﱋ' => 'نج', - 'ﱌ' => 'نح', - 'ﱍ' => 'نخ', - 'ﱎ' => 'نم', - 'ﱏ' => 'نى', - 'ﱐ' => 'ني', - 'ﱑ' => 'هج', - 'ﱒ' => 'هم', - 'ﱓ' => 'هى', - 'ﱔ' => 'هي', - 'ﱕ' => 'يج', - 'ﱖ' => 'يح', - 'ﱗ' => 'يخ', - 'ﱘ' => 'يم', - 'ﱙ' => 'يى', - 'ﱚ' => 'يي', - 'ﱛ' => 'ذٰ', - 'ﱜ' => 'رٰ', - 'ﱝ' => 'ىٰ', - 'ﱞ' => ' ٌّ', - 'ﱟ' => ' ٍّ', - 'ﱠ' => ' َّ', - 'ﱡ' => ' ُّ', - 'ﱢ' => ' ِّ', - 'ﱣ' => ' ّٰ', - 'ﱤ' => 'ئر', - 'ﱥ' => 'ئز', - 'ﱦ' => 'ئم', - 'ﱧ' => 'ئن', - 'ﱨ' => 'ئى', - 'ﱩ' => 'ئي', - 'ﱪ' => 'بر', - 'ﱫ' => 'بز', - 'ﱬ' => 'بم', - 'ﱭ' => 'بن', - 'ﱮ' => 'بى', - 'ﱯ' => 'بي', - 'ﱰ' => 'تر', - 'ﱱ' => 'تز', - 'ﱲ' => 'تم', - 'ﱳ' => 'تن', - 'ﱴ' => 'تى', - 'ﱵ' => 'تي', - 'ﱶ' => 'ثر', - 'ﱷ' => 'ثز', - 'ﱸ' => 'ثم', - 'ﱹ' => 'ثن', - 'ﱺ' => 'ثى', - 'ﱻ' => 'ثي', - 'ﱼ' => 'فى', - 'ﱽ' => 'في', - 'ﱾ' => 'قى', - 'ﱿ' => 'قي', - 'ﲀ' => 'كا', - 'ﲁ' => 'كل', - 'ﲂ' => 'كم', - 'ﲃ' => 'كى', - 'ﲄ' => 'كي', - 'ﲅ' => 'لم', - 'ﲆ' => 'لى', - 'ﲇ' => 'لي', - 'ﲈ' => 'ما', - 'ﲉ' => 'مم', - 'ﲊ' => 'نر', - 'ﲋ' => 'نز', - 'ﲌ' => 'نم', - 'ﲍ' => 'نن', - 'ﲎ' => 'نى', - 'ﲏ' => 'ني', - 'ﲐ' => 'ىٰ', - 'ﲑ' => 'ير', - 'ﲒ' => 'يز', - 'ﲓ' => 'يم', - 'ﲔ' => 'ين', - 'ﲕ' => 'يى', - 'ﲖ' => 'يي', - 'ﲗ' => 'ئج', - 'ﲘ' => 'ئح', - 'ﲙ' => 'ئخ', - 'ﲚ' => 'ئم', - 'ﲛ' => 'ئه', - 'ﲜ' => 'بج', - 'ﲝ' => 'بح', - 'ﲞ' => 'بخ', - 'ﲟ' => 'بم', - 'ﲠ' => 'به', - 'ﲡ' => 'تج', - 'ﲢ' => 'تح', - 'ﲣ' => 'تخ', - 'ﲤ' => 'تم', - 'ﲥ' => 'ته', - 'ﲦ' => 'ثم', - 'ﲧ' => 'جح', - 'ﲨ' => 'جم', - 'ﲩ' => 'حج', - 'ﲪ' => 'حم', - 'ﲫ' => 'خج', - 'ﲬ' => 'خم', - 'ﲭ' => 'سج', - 'ﲮ' => 'سح', - 'ﲯ' => 'سخ', - 'ﲰ' => 'سم', - 'ﲱ' => 'صح', - 'ﲲ' => 'صخ', - 'ﲳ' => 'صم', - 'ﲴ' => 'ضج', - 'ﲵ' => 'ضح', - 'ﲶ' => 'ضخ', - 'ﲷ' => 'ضم', - 'ﲸ' => 'طح', - 'ﲹ' => 'ظم', - 'ﲺ' => 'عج', - 'ﲻ' => 'عم', - 'ﲼ' => 'غج', - 'ﲽ' => 'غم', - 'ﲾ' => 'فج', - 'ﲿ' => 'فح', - 'ﳀ' => 'فخ', - 'ﳁ' => 'فم', - 'ﳂ' => 'قح', - 'ﳃ' => 'قم', - 'ﳄ' => 'كج', - 'ﳅ' => 'كح', - 'ﳆ' => 'كخ', - 'ﳇ' => 'كل', - 'ﳈ' => 'كم', - 'ﳉ' => 'لج', - 'ﳊ' => 'لح', - 'ﳋ' => 'لخ', - 'ﳌ' => 'لم', - 'ﳍ' => 'له', - 'ﳎ' => 'مج', - 'ﳏ' => 'مح', - 'ﳐ' => 'مخ', - 'ﳑ' => 'مم', - 'ﳒ' => 'نج', - 'ﳓ' => 'نح', - 'ﳔ' => 'نخ', - 'ﳕ' => 'نم', - 'ﳖ' => 'نه', - 'ﳗ' => 'هج', - 'ﳘ' => 'هم', - 'ﳙ' => 'هٰ', - 'ﳚ' => 'يج', - 'ﳛ' => 'يح', - 'ﳜ' => 'يخ', - 'ﳝ' => 'يم', - 'ﳞ' => 'يه', - 'ﳟ' => 'ئم', - 'ﳠ' => 'ئه', - 'ﳡ' => 'بم', - 'ﳢ' => 'به', - 'ﳣ' => 'تم', - 'ﳤ' => 'ته', - 'ﳥ' => 'ثم', - 'ﳦ' => 'ثه', - 'ﳧ' => 'سم', - 'ﳨ' => 'سه', - 'ﳩ' => 'شم', - 'ﳪ' => 'شه', - 'ﳫ' => 'كل', - 'ﳬ' => 'كم', - 'ﳭ' => 'لم', - 'ﳮ' => 'نم', - 'ﳯ' => 'نه', - 'ﳰ' => 'يم', - 'ﳱ' => 'يه', - 'ﳲ' => 'ـَّ', - 'ﳳ' => 'ـُّ', - 'ﳴ' => 'ـِّ', - 'ﳵ' => 'طى', - 'ﳶ' => 'طي', - 'ﳷ' => 'عى', - 'ﳸ' => 'عي', - 'ﳹ' => 'غى', - 'ﳺ' => 'غي', - 'ﳻ' => 'سى', - 'ﳼ' => 'سي', - 'ﳽ' => 'شى', - 'ﳾ' => 'شي', - 'ﳿ' => 'حى', - 'ﴀ' => 'حي', - 'ﴁ' => 'جى', - 'ﴂ' => 'جي', - 'ﴃ' => 'خى', - 'ﴄ' => 'خي', - 'ﴅ' => 'صى', - 'ﴆ' => 'صي', - 'ﴇ' => 'ضى', - 'ﴈ' => 'ضي', - 'ﴉ' => 'شج', - 'ﴊ' => 'شح', - 'ﴋ' => 'شخ', - 'ﴌ' => 'شم', - 'ﴍ' => 'شر', - 'ﴎ' => 'سر', - 'ﴏ' => 'صر', - 'ﴐ' => 'ضر', - 'ﴑ' => 'طى', - 'ﴒ' => 'طي', - 'ﴓ' => 'عى', - 'ﴔ' => 'عي', - 'ﴕ' => 'غى', - 'ﴖ' => 'غي', - 'ﴗ' => 'سى', - 'ﴘ' => 'سي', - 'ﴙ' => 'شى', - 'ﴚ' => 'شي', - 'ﴛ' => 'حى', - 'ﴜ' => 'حي', - 'ﴝ' => 'جى', - 'ﴞ' => 'جي', - 'ﴟ' => 'خى', - 'ﴠ' => 'خي', - 'ﴡ' => 'صى', - 'ﴢ' => 'صي', - 'ﴣ' => 'ضى', - 'ﴤ' => 'ضي', - 'ﴥ' => 'شج', - 'ﴦ' => 'شح', - 'ﴧ' => 'شخ', - 'ﴨ' => 'شم', - 'ﴩ' => 'شر', - 'ﴪ' => 'سر', - 'ﴫ' => 'صر', - 'ﴬ' => 'ضر', - 'ﴭ' => 'شج', - 'ﴮ' => 'شح', - 'ﴯ' => 'شخ', - 'ﴰ' => 'شم', - 'ﴱ' => 'سه', - 'ﴲ' => 'شه', - 'ﴳ' => 'طم', - 'ﴴ' => 'سج', - 'ﴵ' => 'سح', - 'ﴶ' => 'سخ', - 'ﴷ' => 'شج', - 'ﴸ' => 'شح', - 'ﴹ' => 'شخ', - 'ﴺ' => 'طم', - 'ﴻ' => 'ظم', - 'ﴼ' => 'اً', - 'ﴽ' => 'اً', - 'ﵐ' => 'تجم', - 'ﵑ' => 'تحج', - 'ﵒ' => 'تحج', - 'ﵓ' => 'تحم', - 'ﵔ' => 'تخم', - 'ﵕ' => 'تمج', - 'ﵖ' => 'تمح', - 'ﵗ' => 'تمخ', - 'ﵘ' => 'جمح', - 'ﵙ' => 'جمح', - 'ﵚ' => 'حمي', - 'ﵛ' => 'حمى', - 'ﵜ' => 'سحج', - 'ﵝ' => 'سجح', - 'ﵞ' => 'سجى', - 'ﵟ' => 'سمح', - 'ﵠ' => 'سمح', - 'ﵡ' => 'سمج', - 'ﵢ' => 'سمم', - 'ﵣ' => 'سمم', - 'ﵤ' => 'صحح', - 'ﵥ' => 'صحح', - 'ﵦ' => 'صمم', - 'ﵧ' => 'شحم', - 'ﵨ' => 'شحم', - 'ﵩ' => 'شجي', - 'ﵪ' => 'شمخ', - 'ﵫ' => 'شمخ', - 'ﵬ' => 'شمم', - 'ﵭ' => 'شمم', - 'ﵮ' => 'ضحى', - 'ﵯ' => 'ضخم', - 'ﵰ' => 'ضخم', - 'ﵱ' => 'طمح', - 'ﵲ' => 'طمح', - 'ﵳ' => 'طمم', - 'ﵴ' => 'طمي', - 'ﵵ' => 'عجم', - 'ﵶ' => 'عمم', - 'ﵷ' => 'عمم', - 'ﵸ' => 'عمى', - 'ﵹ' => 'غمم', - 'ﵺ' => 'غمي', - 'ﵻ' => 'غمى', - 'ﵼ' => 'فخم', - 'ﵽ' => 'فخم', - 'ﵾ' => 'قمح', - 'ﵿ' => 'قمم', - 'ﶀ' => 'لحم', - 'ﶁ' => 'لحي', - 'ﶂ' => 'لحى', - 'ﶃ' => 'لجج', - 'ﶄ' => 'لجج', - 'ﶅ' => 'لخم', - 'ﶆ' => 'لخم', - 'ﶇ' => 'لمح', - 'ﶈ' => 'لمح', - 'ﶉ' => 'محج', - 'ﶊ' => 'محم', - 'ﶋ' => 'محي', - 'ﶌ' => 'مجح', - 'ﶍ' => 'مجم', - 'ﶎ' => 'مخج', - 'ﶏ' => 'مخم', - 'ﶒ' => 'مجخ', - 'ﶓ' => 'همج', - 'ﶔ' => 'همم', - 'ﶕ' => 'نحم', - 'ﶖ' => 'نحى', - 'ﶗ' => 'نجم', - 'ﶘ' => 'نجم', - 'ﶙ' => 'نجى', - 'ﶚ' => 'نمي', - 'ﶛ' => 'نمى', - 'ﶜ' => 'يمم', - 'ﶝ' => 'يمم', - 'ﶞ' => 'بخي', - 'ﶟ' => 'تجي', - 'ﶠ' => 'تجى', - 'ﶡ' => 'تخي', - 'ﶢ' => 'تخى', - 'ﶣ' => 'تمي', - 'ﶤ' => 'تمى', - 'ﶥ' => 'جمي', - 'ﶦ' => 'جحى', - 'ﶧ' => 'جمى', - 'ﶨ' => 'سخى', - 'ﶩ' => 'صحي', - 'ﶪ' => 'شحي', - 'ﶫ' => 'ضحي', - 'ﶬ' => 'لجي', - 'ﶭ' => 'لمي', - 'ﶮ' => 'يحي', - 'ﶯ' => 'يجي', - 'ﶰ' => 'يمي', - 'ﶱ' => 'ممي', - 'ﶲ' => 'قمي', - 'ﶳ' => 'نحي', - 'ﶴ' => 'قمح', - 'ﶵ' => 'لحم', - 'ﶶ' => 'عمي', - 'ﶷ' => 'كمي', - 'ﶸ' => 'نجح', - 'ﶹ' => 'مخي', - 'ﶺ' => 'لجم', - 'ﶻ' => 'كمم', - 'ﶼ' => 'لجم', - 'ﶽ' => 'نجح', - 'ﶾ' => 'جحي', - 'ﶿ' => 'حجي', - 'ﷀ' => 'مجي', - 'ﷁ' => 'فمي', - 'ﷂ' => 'بحي', - 'ﷃ' => 'كمم', - 'ﷄ' => 'عجم', - 'ﷅ' => 'صمم', - 'ﷆ' => 'سخي', - 'ﷇ' => 'نجي', - 'ﷰ' => 'صلے', - 'ﷱ' => 'قلے', - 'ﷲ' => 'الله', - 'ﷳ' => 'اكبر', - 'ﷴ' => 'محمد', - 'ﷵ' => 'صلعم', - 'ﷶ' => 'رسول', - 'ﷷ' => 'عليه', - 'ﷸ' => 'وسلم', - 'ﷹ' => 'صلى', - 'ﷺ' => 'صلى الله عليه وسلم', - 'ﷻ' => 'جل جلاله', - '﷼' => 'ریال', - '︐' => ',', - '︑' => '、', - '︒' => '。', - '︓' => ':', - '︔' => ';', - '︕' => '!', - '︖' => '?', - '︗' => '〖', - '︘' => '〗', - '︙' => '...', - '︰' => '..', - '︱' => '—', - '︲' => '–', - '︳' => '_', - '︴' => '_', - '︵' => '(', - '︶' => ')', - '︷' => '{', - '︸' => '}', - '︹' => '〔', - '︺' => '〕', - '︻' => '【', - '︼' => '】', - '︽' => '《', - '︾' => '》', - '︿' => '〈', - '﹀' => '〉', - '﹁' => '「', - '﹂' => '」', - '﹃' => '『', - '﹄' => '』', - '﹇' => '[', - '﹈' => ']', - '﹉' => ' ̅', - '﹊' => ' ̅', - '﹋' => ' ̅', - '﹌' => ' ̅', - '﹍' => '_', - '﹎' => '_', - '﹏' => '_', - '﹐' => ',', - '﹑' => '、', - '﹒' => '.', - '﹔' => ';', - '﹕' => ':', - '﹖' => '?', - '﹗' => '!', - '﹘' => '—', - '﹙' => '(', - '﹚' => ')', - '﹛' => '{', - '﹜' => '}', - '﹝' => '〔', - '﹞' => '〕', - '﹟' => '#', - '﹠' => '&', - '﹡' => '*', - '﹢' => '+', - '﹣' => '-', - '﹤' => '<', - '﹥' => '>', - '﹦' => '=', - '﹨' => '\\', - '﹩' => '$', - '﹪' => '%', - '﹫' => '@', - 'ﹰ' => ' ً', - 'ﹱ' => 'ـً', - 'ﹲ' => ' ٌ', - 'ﹴ' => ' ٍ', - 'ﹶ' => ' َ', - 'ﹷ' => 'ـَ', - 'ﹸ' => ' ُ', - 'ﹹ' => 'ـُ', - 'ﹺ' => ' ِ', - 'ﹻ' => 'ـِ', - 'ﹼ' => ' ّ', - 'ﹽ' => 'ـّ', - 'ﹾ' => ' ْ', - 'ﹿ' => 'ـْ', - 'ﺀ' => 'ء', - 'ﺁ' => 'آ', - 'ﺂ' => 'آ', - 'ﺃ' => 'أ', - 'ﺄ' => 'أ', - 'ﺅ' => 'ؤ', - 'ﺆ' => 'ؤ', - 'ﺇ' => 'إ', - 'ﺈ' => 'إ', - 'ﺉ' => 'ئ', - 'ﺊ' => 'ئ', - 'ﺋ' => 'ئ', - 'ﺌ' => 'ئ', - 'ﺍ' => 'ا', - 'ﺎ' => 'ا', - 'ﺏ' => 'ب', - 'ﺐ' => 'ب', - 'ﺑ' => 'ب', - 'ﺒ' => 'ب', - 'ﺓ' => 'ة', - 'ﺔ' => 'ة', - 'ﺕ' => 'ت', - 'ﺖ' => 'ت', - 'ﺗ' => 'ت', - 'ﺘ' => 'ت', - 'ﺙ' => 'ث', - 'ﺚ' => 'ث', - 'ﺛ' => 'ث', - 'ﺜ' => 'ث', - 'ﺝ' => 'ج', - 'ﺞ' => 'ج', - 'ﺟ' => 'ج', - 'ﺠ' => 'ج', - 'ﺡ' => 'ح', - 'ﺢ' => 'ح', - 'ﺣ' => 'ح', - 'ﺤ' => 'ح', - 'ﺥ' => 'خ', - 'ﺦ' => 'خ', - 'ﺧ' => 'خ', - 'ﺨ' => 'خ', - 'ﺩ' => 'د', - 'ﺪ' => 'د', - 'ﺫ' => 'ذ', - 'ﺬ' => 'ذ', - 'ﺭ' => 'ر', - 'ﺮ' => 'ر', - 'ﺯ' => 'ز', - 'ﺰ' => 'ز', - 'ﺱ' => 'س', - 'ﺲ' => 'س', - 'ﺳ' => 'س', - 'ﺴ' => 'س', - 'ﺵ' => 'ش', - 'ﺶ' => 'ش', - 'ﺷ' => 'ش', - 'ﺸ' => 'ش', - 'ﺹ' => 'ص', - 'ﺺ' => 'ص', - 'ﺻ' => 'ص', - 'ﺼ' => 'ص', - 'ﺽ' => 'ض', - 'ﺾ' => 'ض', - 'ﺿ' => 'ض', - 'ﻀ' => 'ض', - 'ﻁ' => 'ط', - 'ﻂ' => 'ط', - 'ﻃ' => 'ط', - 'ﻄ' => 'ط', - 'ﻅ' => 'ظ', - 'ﻆ' => 'ظ', - 'ﻇ' => 'ظ', - 'ﻈ' => 'ظ', - 'ﻉ' => 'ع', - 'ﻊ' => 'ع', - 'ﻋ' => 'ع', - 'ﻌ' => 'ع', - 'ﻍ' => 'غ', - 'ﻎ' => 'غ', - 'ﻏ' => 'غ', - 'ﻐ' => 'غ', - 'ﻑ' => 'ف', - 'ﻒ' => 'ف', - 'ﻓ' => 'ف', - 'ﻔ' => 'ف', - 'ﻕ' => 'ق', - 'ﻖ' => 'ق', - 'ﻗ' => 'ق', - 'ﻘ' => 'ق', - 'ﻙ' => 'ك', - 'ﻚ' => 'ك', - 'ﻛ' => 'ك', - 'ﻜ' => 'ك', - 'ﻝ' => 'ل', - 'ﻞ' => 'ل', - 'ﻟ' => 'ل', - 'ﻠ' => 'ل', - 'ﻡ' => 'م', - 'ﻢ' => 'م', - 'ﻣ' => 'م', - 'ﻤ' => 'م', - 'ﻥ' => 'ن', - 'ﻦ' => 'ن', - 'ﻧ' => 'ن', - 'ﻨ' => 'ن', - 'ﻩ' => 'ه', - 'ﻪ' => 'ه', - 'ﻫ' => 'ه', - 'ﻬ' => 'ه', - 'ﻭ' => 'و', - 'ﻮ' => 'و', - 'ﻯ' => 'ى', - 'ﻰ' => 'ى', - 'ﻱ' => 'ي', - 'ﻲ' => 'ي', - 'ﻳ' => 'ي', - 'ﻴ' => 'ي', - 'ﻵ' => 'لآ', - 'ﻶ' => 'لآ', - 'ﻷ' => 'لأ', - 'ﻸ' => 'لأ', - 'ﻹ' => 'لإ', - 'ﻺ' => 'لإ', - 'ﻻ' => 'لا', - 'ﻼ' => 'لا', - '!' => '!', - '"' => '"', - '#' => '#', - '$' => '$', - '%' => '%', - '&' => '&', - ''' => '\'', - '(' => '(', - ')' => ')', - '*' => '*', - '+' => '+', - ',' => ',', - '-' => '-', - '.' => '.', - '/' => '/', - '0' => '0', - '1' => '1', - '2' => '2', - '3' => '3', - '4' => '4', - '5' => '5', - '6' => '6', - '7' => '7', - '8' => '8', - '9' => '9', - ':' => ':', - ';' => ';', - '<' => '<', - '=' => '=', - '>' => '>', - '?' => '?', - '@' => '@', - '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', - '[' => '[', - '\' => '\\', - ']' => ']', - '^' => '^', - '_' => '_', - '`' => '`', - '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', - '{' => '{', - '|' => '|', - '}' => '}', - '~' => '~', - '⦅' => '⦅', - '⦆' => '⦆', - '。' => '。', - '「' => '「', - '」' => '」', - '、' => '、', - '・' => '・', - 'ヲ' => 'ヲ', - 'ァ' => 'ァ', - 'ィ' => 'ィ', - 'ゥ' => 'ゥ', - 'ェ' => 'ェ', - 'ォ' => 'ォ', - 'ャ' => 'ャ', - 'ュ' => 'ュ', - 'ョ' => 'ョ', - 'ッ' => 'ッ', - 'ー' => 'ー', - 'ア' => 'ア', - 'イ' => 'イ', - 'ウ' => 'ウ', - 'エ' => 'エ', - 'オ' => 'オ', - 'カ' => 'カ', - 'キ' => 'キ', - 'ク' => 'ク', - 'ケ' => 'ケ', - 'コ' => 'コ', - 'サ' => 'サ', - 'シ' => 'シ', - 'ス' => 'ス', - 'セ' => 'セ', - 'ソ' => 'ソ', - 'タ' => 'タ', - 'チ' => 'チ', - 'ツ' => 'ツ', - 'テ' => 'テ', - 'ト' => 'ト', - 'ナ' => 'ナ', - 'ニ' => 'ニ', - 'ヌ' => 'ヌ', - 'ネ' => 'ネ', - 'ノ' => 'ノ', - 'ハ' => 'ハ', - 'ヒ' => 'ヒ', - 'フ' => 'フ', - 'ヘ' => 'ヘ', - 'ホ' => 'ホ', - 'マ' => 'マ', - 'ミ' => 'ミ', - 'ム' => 'ム', - 'メ' => 'メ', - 'モ' => 'モ', - 'ヤ' => 'ヤ', - 'ユ' => 'ユ', - 'ヨ' => 'ヨ', - 'ラ' => 'ラ', - 'リ' => 'リ', - 'ル' => 'ル', - 'レ' => 'レ', - 'ロ' => 'ロ', - 'ワ' => 'ワ', - 'ン' => 'ン', - '゙' => '゙', - '゚' => '゚', - 'ᅠ' => 'ᅠ', - 'ᄀ' => 'ᄀ', - 'ᄁ' => 'ᄁ', - 'ᆪ' => 'ᆪ', - 'ᄂ' => 'ᄂ', - 'ᆬ' => 'ᆬ', - 'ᆭ' => 'ᆭ', - 'ᄃ' => 'ᄃ', - 'ᄄ' => 'ᄄ', - 'ᄅ' => 'ᄅ', - 'ᆰ' => 'ᆰ', - 'ᆱ' => 'ᆱ', - 'ᆲ' => 'ᆲ', - 'ᆳ' => 'ᆳ', - 'ᆴ' => 'ᆴ', - 'ᆵ' => 'ᆵ', - 'ᄚ' => 'ᄚ', - 'ᄆ' => 'ᄆ', - 'ᄇ' => 'ᄇ', - 'ᄈ' => 'ᄈ', - 'ᄡ' => 'ᄡ', - 'ᄉ' => 'ᄉ', - 'ᄊ' => 'ᄊ', - 'ᄋ' => 'ᄋ', - 'ᄌ' => 'ᄌ', - 'ᄍ' => 'ᄍ', - 'ᄎ' => 'ᄎ', - 'ᄏ' => 'ᄏ', - 'ᄐ' => 'ᄐ', - 'ᄑ' => 'ᄑ', - 'ᄒ' => 'ᄒ', - 'ᅡ' => 'ᅡ', - 'ᅢ' => 'ᅢ', - 'ᅣ' => 'ᅣ', - 'ᅤ' => 'ᅤ', - 'ᅥ' => 'ᅥ', - 'ᅦ' => 'ᅦ', - 'ᅧ' => 'ᅧ', - 'ᅨ' => 'ᅨ', - 'ᅩ' => 'ᅩ', - 'ᅪ' => 'ᅪ', - 'ᅫ' => 'ᅫ', - 'ᅬ' => 'ᅬ', - 'ᅭ' => 'ᅭ', - 'ᅮ' => 'ᅮ', - 'ᅯ' => 'ᅯ', - 'ᅰ' => 'ᅰ', - 'ᅱ' => 'ᅱ', - 'ᅲ' => 'ᅲ', - 'ᅳ' => 'ᅳ', - 'ᅴ' => 'ᅴ', - 'ᅵ' => 'ᅵ', - '¢' => '¢', - '£' => '£', - '¬' => '¬', - ' ̄' => ' ̄', - '¦' => '¦', - '¥' => '¥', - '₩' => '₩', - '│' => '│', - '←' => '←', - '↑' => '↑', - '→' => '→', - '↓' => '↓', - '■' => '■', - '○' => '○', - '𝐀' => 'A', - '𝐁' => 'B', - '𝐂' => 'C', - '𝐃' => 'D', - '𝐄' => 'E', - '𝐅' => 'F', - '𝐆' => 'G', - '𝐇' => 'H', - '𝐈' => 'I', - '𝐉' => 'J', - '𝐊' => 'K', - '𝐋' => 'L', - '𝐌' => 'M', - '𝐍' => 'N', - '𝐎' => 'O', - '𝐏' => 'P', - '𝐐' => 'Q', - '𝐑' => 'R', - '𝐒' => 'S', - '𝐓' => 'T', - '𝐔' => 'U', - '𝐕' => 'V', - '𝐖' => 'W', - '𝐗' => 'X', - '𝐘' => 'Y', - '𝐙' => 'Z', - '𝐚' => 'a', - '𝐛' => 'b', - '𝐜' => 'c', - '𝐝' => 'd', - '𝐞' => 'e', - '𝐟' => 'f', - '𝐠' => 'g', - '𝐡' => 'h', - '𝐢' => 'i', - '𝐣' => 'j', - '𝐤' => 'k', - '𝐥' => 'l', - '𝐦' => 'm', - '𝐧' => 'n', - '𝐨' => 'o', - '𝐩' => 'p', - '𝐪' => 'q', - '𝐫' => 'r', - '𝐬' => 's', - '𝐭' => 't', - '𝐮' => 'u', - '𝐯' => 'v', - '𝐰' => 'w', - '𝐱' => 'x', - '𝐲' => 'y', - '𝐳' => 'z', - '𝐴' => 'A', - '𝐵' => 'B', - '𝐶' => 'C', - '𝐷' => 'D', - '𝐸' => 'E', - '𝐹' => 'F', - '𝐺' => 'G', - '𝐻' => 'H', - '𝐼' => 'I', - '𝐽' => 'J', - '𝐾' => 'K', - '𝐿' => 'L', - '𝑀' => 'M', - '𝑁' => 'N', - '𝑂' => 'O', - '𝑃' => 'P', - '𝑄' => 'Q', - '𝑅' => 'R', - '𝑆' => 'S', - '𝑇' => 'T', - '𝑈' => 'U', - '𝑉' => 'V', - '𝑊' => 'W', - '𝑋' => 'X', - '𝑌' => 'Y', - '𝑍' => 'Z', - '𝑎' => 'a', - '𝑏' => 'b', - '𝑐' => 'c', - '𝑑' => 'd', - '𝑒' => 'e', - '𝑓' => 'f', - '𝑔' => 'g', - '𝑖' => 'i', - '𝑗' => 'j', - '𝑘' => 'k', - '𝑙' => 'l', - '𝑚' => 'm', - '𝑛' => 'n', - '𝑜' => 'o', - '𝑝' => 'p', - '𝑞' => 'q', - '𝑟' => 'r', - '𝑠' => 's', - '𝑡' => 't', - '𝑢' => 'u', - '𝑣' => 'v', - '𝑤' => 'w', - '𝑥' => 'x', - '𝑦' => 'y', - '𝑧' => 'z', - '𝑨' => 'A', - '𝑩' => 'B', - '𝑪' => 'C', - '𝑫' => 'D', - '𝑬' => 'E', - '𝑭' => 'F', - '𝑮' => 'G', - '𝑯' => 'H', - '𝑰' => 'I', - '𝑱' => 'J', - '𝑲' => 'K', - '𝑳' => 'L', - '𝑴' => 'M', - '𝑵' => 'N', - '𝑶' => 'O', - '𝑷' => 'P', - '𝑸' => 'Q', - '𝑹' => 'R', - '𝑺' => 'S', - '𝑻' => 'T', - '𝑼' => 'U', - '𝑽' => 'V', - '𝑾' => 'W', - '𝑿' => 'X', - '𝒀' => 'Y', - '𝒁' => 'Z', - '𝒂' => 'a', - '𝒃' => 'b', - '𝒄' => 'c', - '𝒅' => 'd', - '𝒆' => 'e', - '𝒇' => 'f', - '𝒈' => 'g', - '𝒉' => 'h', - '𝒊' => 'i', - '𝒋' => 'j', - '𝒌' => 'k', - '𝒍' => 'l', - '𝒎' => 'm', - '𝒏' => 'n', - '𝒐' => 'o', - '𝒑' => 'p', - '𝒒' => 'q', - '𝒓' => 'r', - '𝒔' => 's', - '𝒕' => 't', - '𝒖' => 'u', - '𝒗' => 'v', - '𝒘' => 'w', - '𝒙' => 'x', - '𝒚' => 'y', - '𝒛' => 'z', - '𝒜' => 'A', - '𝒞' => 'C', - '𝒟' => 'D', - '𝒢' => 'G', - '𝒥' => 'J', - '𝒦' => 'K', - '𝒩' => 'N', - '𝒪' => 'O', - '𝒫' => 'P', - '𝒬' => 'Q', - '𝒮' => 'S', - '𝒯' => 'T', - '𝒰' => 'U', - '𝒱' => 'V', - '𝒲' => 'W', - '𝒳' => 'X', - '𝒴' => 'Y', - '𝒵' => 'Z', - '𝒶' => 'a', - '𝒷' => 'b', - '𝒸' => 'c', - '𝒹' => 'd', - '𝒻' => 'f', - '𝒽' => 'h', - '𝒾' => 'i', - '𝒿' => 'j', - '𝓀' => 'k', - '𝓁' => 'l', - '𝓂' => 'm', - '𝓃' => 'n', - '𝓅' => 'p', - '𝓆' => 'q', - '𝓇' => 'r', - '𝓈' => 's', - '𝓉' => 't', - '𝓊' => 'u', - '𝓋' => 'v', - '𝓌' => 'w', - '𝓍' => 'x', - '𝓎' => 'y', - '𝓏' => 'z', - '𝓐' => 'A', - '𝓑' => 'B', - '𝓒' => 'C', - '𝓓' => 'D', - '𝓔' => 'E', - '𝓕' => 'F', - '𝓖' => 'G', - '𝓗' => 'H', - '𝓘' => 'I', - '𝓙' => 'J', - '𝓚' => 'K', - '𝓛' => 'L', - '𝓜' => 'M', - '𝓝' => 'N', - '𝓞' => 'O', - '𝓟' => 'P', - '𝓠' => 'Q', - '𝓡' => 'R', - '𝓢' => 'S', - '𝓣' => 'T', - '𝓤' => 'U', - '𝓥' => 'V', - '𝓦' => 'W', - '𝓧' => 'X', - '𝓨' => 'Y', - '𝓩' => 'Z', - '𝓪' => 'a', - '𝓫' => 'b', - '𝓬' => 'c', - '𝓭' => 'd', - '𝓮' => 'e', - '𝓯' => 'f', - '𝓰' => 'g', - '𝓱' => 'h', - '𝓲' => 'i', - '𝓳' => 'j', - '𝓴' => 'k', - '𝓵' => 'l', - '𝓶' => 'm', - '𝓷' => 'n', - '𝓸' => 'o', - '𝓹' => 'p', - '𝓺' => 'q', - '𝓻' => 'r', - '𝓼' => 's', - '𝓽' => 't', - '𝓾' => 'u', - '𝓿' => 'v', - '𝔀' => 'w', - '𝔁' => 'x', - '𝔂' => 'y', - '𝔃' => 'z', - '𝔄' => 'A', - '𝔅' => 'B', - '𝔇' => 'D', - '𝔈' => 'E', - '𝔉' => 'F', - '𝔊' => 'G', - '𝔍' => 'J', - '𝔎' => 'K', - '𝔏' => 'L', - '𝔐' => 'M', - '𝔑' => 'N', - '𝔒' => 'O', - '𝔓' => 'P', - '𝔔' => 'Q', - '𝔖' => 'S', - '𝔗' => 'T', - '𝔘' => 'U', - '𝔙' => 'V', - '𝔚' => 'W', - '𝔛' => 'X', - '𝔜' => 'Y', - '𝔞' => 'a', - '𝔟' => 'b', - '𝔠' => 'c', - '𝔡' => 'd', - '𝔢' => 'e', - '𝔣' => 'f', - '𝔤' => 'g', - '𝔥' => 'h', - '𝔦' => 'i', - '𝔧' => 'j', - '𝔨' => 'k', - '𝔩' => 'l', - '𝔪' => 'm', - '𝔫' => 'n', - '𝔬' => 'o', - '𝔭' => 'p', - '𝔮' => 'q', - '𝔯' => 'r', - '𝔰' => 's', - '𝔱' => 't', - '𝔲' => 'u', - '𝔳' => 'v', - '𝔴' => 'w', - '𝔵' => 'x', - '𝔶' => 'y', - '𝔷' => 'z', - '𝔸' => 'A', - '𝔹' => 'B', - '𝔻' => 'D', - '𝔼' => 'E', - '𝔽' => 'F', - '𝔾' => 'G', - '𝕀' => 'I', - '𝕁' => 'J', - '𝕂' => 'K', - '𝕃' => 'L', - '𝕄' => 'M', - '𝕆' => 'O', - '𝕊' => 'S', - '𝕋' => 'T', - '𝕌' => 'U', - '𝕍' => 'V', - '𝕎' => 'W', - '𝕏' => 'X', - '𝕐' => 'Y', - '𝕒' => 'a', - '𝕓' => 'b', - '𝕔' => 'c', - '𝕕' => 'd', - '𝕖' => 'e', - '𝕗' => 'f', - '𝕘' => 'g', - '𝕙' => 'h', - '𝕚' => 'i', - '𝕛' => 'j', - '𝕜' => 'k', - '𝕝' => 'l', - '𝕞' => 'm', - '𝕟' => 'n', - '𝕠' => 'o', - '𝕡' => 'p', - '𝕢' => 'q', - '𝕣' => 'r', - '𝕤' => 's', - '𝕥' => 't', - '𝕦' => 'u', - '𝕧' => 'v', - '𝕨' => 'w', - '𝕩' => 'x', - '𝕪' => 'y', - '𝕫' => 'z', - '𝕬' => 'A', - '𝕭' => 'B', - '𝕮' => 'C', - '𝕯' => 'D', - '𝕰' => 'E', - '𝕱' => 'F', - '𝕲' => 'G', - '𝕳' => 'H', - '𝕴' => 'I', - '𝕵' => 'J', - '𝕶' => 'K', - '𝕷' => 'L', - '𝕸' => 'M', - '𝕹' => 'N', - '𝕺' => 'O', - '𝕻' => 'P', - '𝕼' => 'Q', - '𝕽' => 'R', - '𝕾' => 'S', - '𝕿' => 'T', - '𝖀' => 'U', - '𝖁' => 'V', - '𝖂' => 'W', - '𝖃' => 'X', - '𝖄' => 'Y', - '𝖅' => 'Z', - '𝖆' => 'a', - '𝖇' => 'b', - '𝖈' => 'c', - '𝖉' => 'd', - '𝖊' => 'e', - '𝖋' => 'f', - '𝖌' => 'g', - '𝖍' => 'h', - '𝖎' => 'i', - '𝖏' => 'j', - '𝖐' => 'k', - '𝖑' => 'l', - '𝖒' => 'm', - '𝖓' => 'n', - '𝖔' => 'o', - '𝖕' => 'p', - '𝖖' => 'q', - '𝖗' => 'r', - '𝖘' => 's', - '𝖙' => 't', - '𝖚' => 'u', - '𝖛' => 'v', - '𝖜' => 'w', - '𝖝' => 'x', - '𝖞' => 'y', - '𝖟' => 'z', - '𝖠' => 'A', - '𝖡' => 'B', - '𝖢' => 'C', - '𝖣' => 'D', - '𝖤' => 'E', - '𝖥' => 'F', - '𝖦' => 'G', - '𝖧' => 'H', - '𝖨' => 'I', - '𝖩' => 'J', - '𝖪' => 'K', - '𝖫' => 'L', - '𝖬' => 'M', - '𝖭' => 'N', - '𝖮' => 'O', - '𝖯' => 'P', - '𝖰' => 'Q', - '𝖱' => 'R', - '𝖲' => 'S', - '𝖳' => 'T', - '𝖴' => 'U', - '𝖵' => 'V', - '𝖶' => 'W', - '𝖷' => 'X', - '𝖸' => 'Y', - '𝖹' => 'Z', - '𝖺' => 'a', - '𝖻' => 'b', - '𝖼' => 'c', - '𝖽' => 'd', - '𝖾' => 'e', - '𝖿' => 'f', - '𝗀' => 'g', - '𝗁' => 'h', - '𝗂' => 'i', - '𝗃' => 'j', - '𝗄' => 'k', - '𝗅' => 'l', - '𝗆' => 'm', - '𝗇' => 'n', - '𝗈' => 'o', - '𝗉' => 'p', - '𝗊' => 'q', - '𝗋' => 'r', - '𝗌' => 's', - '𝗍' => 't', - '𝗎' => 'u', - '𝗏' => 'v', - '𝗐' => 'w', - '𝗑' => 'x', - '𝗒' => 'y', - '𝗓' => 'z', - '𝗔' => 'A', - '𝗕' => 'B', - '𝗖' => 'C', - '𝗗' => 'D', - '𝗘' => 'E', - '𝗙' => 'F', - '𝗚' => 'G', - '𝗛' => 'H', - '𝗜' => 'I', - '𝗝' => 'J', - '𝗞' => 'K', - '𝗟' => 'L', - '𝗠' => 'M', - '𝗡' => 'N', - '𝗢' => 'O', - '𝗣' => 'P', - '𝗤' => 'Q', - '𝗥' => 'R', - '𝗦' => 'S', - '𝗧' => 'T', - '𝗨' => 'U', - '𝗩' => 'V', - '𝗪' => 'W', - '𝗫' => 'X', - '𝗬' => 'Y', - '𝗭' => 'Z', - '𝗮' => 'a', - '𝗯' => 'b', - '𝗰' => 'c', - '𝗱' => 'd', - '𝗲' => 'e', - '𝗳' => 'f', - '𝗴' => 'g', - '𝗵' => 'h', - '𝗶' => 'i', - '𝗷' => 'j', - '𝗸' => 'k', - '𝗹' => 'l', - '𝗺' => 'm', - '𝗻' => 'n', - '𝗼' => 'o', - '𝗽' => 'p', - '𝗾' => 'q', - '𝗿' => 'r', - '𝘀' => 's', - '𝘁' => 't', - '𝘂' => 'u', - '𝘃' => 'v', - '𝘄' => 'w', - '𝘅' => 'x', - '𝘆' => 'y', - '𝘇' => 'z', - '𝘈' => 'A', - '𝘉' => 'B', - '𝘊' => 'C', - '𝘋' => 'D', - '𝘌' => 'E', - '𝘍' => 'F', - '𝘎' => 'G', - '𝘏' => 'H', - '𝘐' => 'I', - '𝘑' => 'J', - '𝘒' => 'K', - '𝘓' => 'L', - '𝘔' => 'M', - '𝘕' => 'N', - '𝘖' => 'O', - '𝘗' => 'P', - '𝘘' => 'Q', - '𝘙' => 'R', - '𝘚' => 'S', - '𝘛' => 'T', - '𝘜' => 'U', - '𝘝' => 'V', - '𝘞' => 'W', - '𝘟' => 'X', - '𝘠' => 'Y', - '𝘡' => 'Z', - '𝘢' => 'a', - '𝘣' => 'b', - '𝘤' => 'c', - '𝘥' => 'd', - '𝘦' => 'e', - '𝘧' => 'f', - '𝘨' => 'g', - '𝘩' => 'h', - '𝘪' => 'i', - '𝘫' => 'j', - '𝘬' => 'k', - '𝘭' => 'l', - '𝘮' => 'm', - '𝘯' => 'n', - '𝘰' => 'o', - '𝘱' => 'p', - '𝘲' => 'q', - '𝘳' => 'r', - '𝘴' => 's', - '𝘵' => 't', - '𝘶' => 'u', - '𝘷' => 'v', - '𝘸' => 'w', - '𝘹' => 'x', - '𝘺' => 'y', - '𝘻' => 'z', - '𝘼' => 'A', - '𝘽' => 'B', - '𝘾' => 'C', - '𝘿' => 'D', - '𝙀' => 'E', - '𝙁' => 'F', - '𝙂' => 'G', - '𝙃' => 'H', - '𝙄' => 'I', - '𝙅' => 'J', - '𝙆' => 'K', - '𝙇' => 'L', - '𝙈' => 'M', - '𝙉' => 'N', - '𝙊' => 'O', - '𝙋' => 'P', - '𝙌' => 'Q', - '𝙍' => 'R', - '𝙎' => 'S', - '𝙏' => 'T', - '𝙐' => 'U', - '𝙑' => 'V', - '𝙒' => 'W', - '𝙓' => 'X', - '𝙔' => 'Y', - '𝙕' => 'Z', - '𝙖' => 'a', - '𝙗' => 'b', - '𝙘' => 'c', - '𝙙' => 'd', - '𝙚' => 'e', - '𝙛' => 'f', - '𝙜' => 'g', - '𝙝' => 'h', - '𝙞' => 'i', - '𝙟' => 'j', - '𝙠' => 'k', - '𝙡' => 'l', - '𝙢' => 'm', - '𝙣' => 'n', - '𝙤' => 'o', - '𝙥' => 'p', - '𝙦' => 'q', - '𝙧' => 'r', - '𝙨' => 's', - '𝙩' => 't', - '𝙪' => 'u', - '𝙫' => 'v', - '𝙬' => 'w', - '𝙭' => 'x', - '𝙮' => 'y', - '𝙯' => 'z', - '𝙰' => 'A', - '𝙱' => 'B', - '𝙲' => 'C', - '𝙳' => 'D', - '𝙴' => 'E', - '𝙵' => 'F', - '𝙶' => 'G', - '𝙷' => 'H', - '𝙸' => 'I', - '𝙹' => 'J', - '𝙺' => 'K', - '𝙻' => 'L', - '𝙼' => 'M', - '𝙽' => 'N', - '𝙾' => 'O', - '𝙿' => 'P', - '𝚀' => 'Q', - '𝚁' => 'R', - '𝚂' => 'S', - '𝚃' => 'T', - '𝚄' => 'U', - '𝚅' => 'V', - '𝚆' => 'W', - '𝚇' => 'X', - '𝚈' => 'Y', - '𝚉' => 'Z', - '𝚊' => 'a', - '𝚋' => 'b', - '𝚌' => 'c', - '𝚍' => 'd', - '𝚎' => 'e', - '𝚏' => 'f', - '𝚐' => 'g', - '𝚑' => 'h', - '𝚒' => 'i', - '𝚓' => 'j', - '𝚔' => 'k', - '𝚕' => 'l', - '𝚖' => 'm', - '𝚗' => 'n', - '𝚘' => 'o', - '𝚙' => 'p', - '𝚚' => 'q', - '𝚛' => 'r', - '𝚜' => 's', - '𝚝' => 't', - '𝚞' => 'u', - '𝚟' => 'v', - '𝚠' => 'w', - '𝚡' => 'x', - '𝚢' => 'y', - '𝚣' => 'z', - '𝚤' => 'ı', - '𝚥' => 'ȷ', - '𝚨' => 'Α', - '𝚩' => 'Β', - '𝚪' => 'Γ', - '𝚫' => 'Δ', - '𝚬' => 'Ε', - '𝚭' => 'Ζ', - '𝚮' => 'Η', - '𝚯' => 'Θ', - '𝚰' => 'Ι', - '𝚱' => 'Κ', - '𝚲' => 'Λ', - '𝚳' => 'Μ', - '𝚴' => 'Ν', - '𝚵' => 'Ξ', - '𝚶' => 'Ο', - '𝚷' => 'Π', - '𝚸' => 'Ρ', - '𝚹' => 'Θ', - '𝚺' => 'Σ', - '𝚻' => 'Τ', - '𝚼' => 'Υ', - '𝚽' => 'Φ', - '𝚾' => 'Χ', - '𝚿' => 'Ψ', - '𝛀' => 'Ω', - '𝛁' => '∇', - '𝛂' => 'α', - '𝛃' => 'β', - '𝛄' => 'γ', - '𝛅' => 'δ', - '𝛆' => 'ε', - '𝛇' => 'ζ', - '𝛈' => 'η', - '𝛉' => 'θ', - '𝛊' => 'ι', - '𝛋' => 'κ', - '𝛌' => 'λ', - '𝛍' => 'μ', - '𝛎' => 'ν', - '𝛏' => 'ξ', - '𝛐' => 'ο', - '𝛑' => 'π', - '𝛒' => 'ρ', - '𝛓' => 'ς', - '𝛔' => 'σ', - '𝛕' => 'τ', - '𝛖' => 'υ', - '𝛗' => 'φ', - '𝛘' => 'χ', - '𝛙' => 'ψ', - '𝛚' => 'ω', - '𝛛' => '∂', - '𝛜' => 'ε', - '𝛝' => 'θ', - '𝛞' => 'κ', - '𝛟' => 'φ', - '𝛠' => 'ρ', - '𝛡' => 'π', - '𝛢' => 'Α', - '𝛣' => 'Β', - '𝛤' => 'Γ', - '𝛥' => 'Δ', - '𝛦' => 'Ε', - '𝛧' => 'Ζ', - '𝛨' => 'Η', - '𝛩' => 'Θ', - '𝛪' => 'Ι', - '𝛫' => 'Κ', - '𝛬' => 'Λ', - '𝛭' => 'Μ', - '𝛮' => 'Ν', - '𝛯' => 'Ξ', - '𝛰' => 'Ο', - '𝛱' => 'Π', - '𝛲' => 'Ρ', - '𝛳' => 'Θ', - '𝛴' => 'Σ', - '𝛵' => 'Τ', - '𝛶' => 'Υ', - '𝛷' => 'Φ', - '𝛸' => 'Χ', - '𝛹' => 'Ψ', - '𝛺' => 'Ω', - '𝛻' => '∇', - '𝛼' => 'α', - '𝛽' => 'β', - '𝛾' => 'γ', - '𝛿' => 'δ', - '𝜀' => 'ε', - '𝜁' => 'ζ', - '𝜂' => 'η', - '𝜃' => 'θ', - '𝜄' => 'ι', - '𝜅' => 'κ', - '𝜆' => 'λ', - '𝜇' => 'μ', - '𝜈' => 'ν', - '𝜉' => 'ξ', - '𝜊' => 'ο', - '𝜋' => 'π', - '𝜌' => 'ρ', - '𝜍' => 'ς', - '𝜎' => 'σ', - '𝜏' => 'τ', - '𝜐' => 'υ', - '𝜑' => 'φ', - '𝜒' => 'χ', - '𝜓' => 'ψ', - '𝜔' => 'ω', - '𝜕' => '∂', - '𝜖' => 'ε', - '𝜗' => 'θ', - '𝜘' => 'κ', - '𝜙' => 'φ', - '𝜚' => 'ρ', - '𝜛' => 'π', - '𝜜' => 'Α', - '𝜝' => 'Β', - '𝜞' => 'Γ', - '𝜟' => 'Δ', - '𝜠' => 'Ε', - '𝜡' => 'Ζ', - '𝜢' => 'Η', - '𝜣' => 'Θ', - '𝜤' => 'Ι', - '𝜥' => 'Κ', - '𝜦' => 'Λ', - '𝜧' => 'Μ', - '𝜨' => 'Ν', - '𝜩' => 'Ξ', - '𝜪' => 'Ο', - '𝜫' => 'Π', - '𝜬' => 'Ρ', - '𝜭' => 'Θ', - '𝜮' => 'Σ', - '𝜯' => 'Τ', - '𝜰' => 'Υ', - '𝜱' => 'Φ', - '𝜲' => 'Χ', - '𝜳' => 'Ψ', - '𝜴' => 'Ω', - '𝜵' => '∇', - '𝜶' => 'α', - '𝜷' => 'β', - '𝜸' => 'γ', - '𝜹' => 'δ', - '𝜺' => 'ε', - '𝜻' => 'ζ', - '𝜼' => 'η', - '𝜽' => 'θ', - '𝜾' => 'ι', - '𝜿' => 'κ', - '𝝀' => 'λ', - '𝝁' => 'μ', - '𝝂' => 'ν', - '𝝃' => 'ξ', - '𝝄' => 'ο', - '𝝅' => 'π', - '𝝆' => 'ρ', - '𝝇' => 'ς', - '𝝈' => 'σ', - '𝝉' => 'τ', - '𝝊' => 'υ', - '𝝋' => 'φ', - '𝝌' => 'χ', - '𝝍' => 'ψ', - '𝝎' => 'ω', - '𝝏' => '∂', - '𝝐' => 'ε', - '𝝑' => 'θ', - '𝝒' => 'κ', - '𝝓' => 'φ', - '𝝔' => 'ρ', - '𝝕' => 'π', - '𝝖' => 'Α', - '𝝗' => 'Β', - '𝝘' => 'Γ', - '𝝙' => 'Δ', - '𝝚' => 'Ε', - '𝝛' => 'Ζ', - '𝝜' => 'Η', - '𝝝' => 'Θ', - '𝝞' => 'Ι', - '𝝟' => 'Κ', - '𝝠' => 'Λ', - '𝝡' => 'Μ', - '𝝢' => 'Ν', - '𝝣' => 'Ξ', - '𝝤' => 'Ο', - '𝝥' => 'Π', - '𝝦' => 'Ρ', - '𝝧' => 'Θ', - '𝝨' => 'Σ', - '𝝩' => 'Τ', - '𝝪' => 'Υ', - '𝝫' => 'Φ', - '𝝬' => 'Χ', - '𝝭' => 'Ψ', - '𝝮' => 'Ω', - '𝝯' => '∇', - '𝝰' => 'α', - '𝝱' => 'β', - '𝝲' => 'γ', - '𝝳' => 'δ', - '𝝴' => 'ε', - '𝝵' => 'ζ', - '𝝶' => 'η', - '𝝷' => 'θ', - '𝝸' => 'ι', - '𝝹' => 'κ', - '𝝺' => 'λ', - '𝝻' => 'μ', - '𝝼' => 'ν', - '𝝽' => 'ξ', - '𝝾' => 'ο', - '𝝿' => 'π', - '𝞀' => 'ρ', - '𝞁' => 'ς', - '𝞂' => 'σ', - '𝞃' => 'τ', - '𝞄' => 'υ', - '𝞅' => 'φ', - '𝞆' => 'χ', - '𝞇' => 'ψ', - '𝞈' => 'ω', - '𝞉' => '∂', - '𝞊' => 'ε', - '𝞋' => 'θ', - '𝞌' => 'κ', - '𝞍' => 'φ', - '𝞎' => 'ρ', - '𝞏' => 'π', - '𝞐' => 'Α', - '𝞑' => 'Β', - '𝞒' => 'Γ', - '𝞓' => 'Δ', - '𝞔' => 'Ε', - '𝞕' => 'Ζ', - '𝞖' => 'Η', - '𝞗' => 'Θ', - '𝞘' => 'Ι', - '𝞙' => 'Κ', - '𝞚' => 'Λ', - '𝞛' => 'Μ', - '𝞜' => 'Ν', - '𝞝' => 'Ξ', - '𝞞' => 'Ο', - '𝞟' => 'Π', - '𝞠' => 'Ρ', - '𝞡' => 'Θ', - '𝞢' => 'Σ', - '𝞣' => 'Τ', - '𝞤' => 'Υ', - '𝞥' => 'Φ', - '𝞦' => 'Χ', - '𝞧' => 'Ψ', - '𝞨' => 'Ω', - '𝞩' => '∇', - '𝞪' => 'α', - '𝞫' => 'β', - '𝞬' => 'γ', - '𝞭' => 'δ', - '𝞮' => 'ε', - '𝞯' => 'ζ', - '𝞰' => 'η', - '𝞱' => 'θ', - '𝞲' => 'ι', - '𝞳' => 'κ', - '𝞴' => 'λ', - '𝞵' => 'μ', - '𝞶' => 'ν', - '𝞷' => 'ξ', - '𝞸' => 'ο', - '𝞹' => 'π', - '𝞺' => 'ρ', - '𝞻' => 'ς', - '𝞼' => 'σ', - '𝞽' => 'τ', - '𝞾' => 'υ', - '𝞿' => 'φ', - '𝟀' => 'χ', - '𝟁' => 'ψ', - '𝟂' => 'ω', - '𝟃' => '∂', - '𝟄' => 'ε', - '𝟅' => 'θ', - '𝟆' => 'κ', - '𝟇' => 'φ', - '𝟈' => 'ρ', - '𝟉' => 'π', - '𝟊' => 'Ϝ', - '𝟋' => 'ϝ', - '𝟎' => '0', - '𝟏' => '1', - '𝟐' => '2', - '𝟑' => '3', - '𝟒' => '4', - '𝟓' => '5', - '𝟔' => '6', - '𝟕' => '7', - '𝟖' => '8', - '𝟗' => '9', - '𝟘' => '0', - '𝟙' => '1', - '𝟚' => '2', - '𝟛' => '3', - '𝟜' => '4', - '𝟝' => '5', - '𝟞' => '6', - '𝟟' => '7', - '𝟠' => '8', - '𝟡' => '9', - '𝟢' => '0', - '𝟣' => '1', - '𝟤' => '2', - '𝟥' => '3', - '𝟦' => '4', - '𝟧' => '5', - '𝟨' => '6', - '𝟩' => '7', - '𝟪' => '8', - '𝟫' => '9', - '𝟬' => '0', - '𝟭' => '1', - '𝟮' => '2', - '𝟯' => '3', - '𝟰' => '4', - '𝟱' => '5', - '𝟲' => '6', - '𝟳' => '7', - '𝟴' => '8', - '𝟵' => '9', - '𝟶' => '0', - '𝟷' => '1', - '𝟸' => '2', - '𝟹' => '3', - '𝟺' => '4', - '𝟻' => '5', - '𝟼' => '6', - '𝟽' => '7', - '𝟾' => '8', - '𝟿' => '9', - '𞸀' => 'ا', - '𞸁' => 'ب', - '𞸂' => 'ج', - '𞸃' => 'د', - '𞸅' => 'و', - '𞸆' => 'ز', - '𞸇' => 'ح', - '𞸈' => 'ط', - '𞸉' => 'ي', - '𞸊' => 'ك', - '𞸋' => 'ل', - '𞸌' => 'م', - '𞸍' => 'ن', - '𞸎' => 'س', - '𞸏' => 'ع', - '𞸐' => 'ف', - '𞸑' => 'ص', - '𞸒' => 'ق', - '𞸓' => 'ر', - '𞸔' => 'ش', - '𞸕' => 'ت', - '𞸖' => 'ث', - '𞸗' => 'خ', - '𞸘' => 'ذ', - '𞸙' => 'ض', - '𞸚' => 'ظ', - '𞸛' => 'غ', - '𞸜' => 'ٮ', - '𞸝' => 'ں', - '𞸞' => 'ڡ', - '𞸟' => 'ٯ', - '𞸡' => 'ب', - '𞸢' => 'ج', - '𞸤' => 'ه', - '𞸧' => 'ح', - '𞸩' => 'ي', - '𞸪' => 'ك', - '𞸫' => 'ل', - '𞸬' => 'م', - '𞸭' => 'ن', - '𞸮' => 'س', - '𞸯' => 'ع', - '𞸰' => 'ف', - '𞸱' => 'ص', - '𞸲' => 'ق', - '𞸴' => 'ش', - '𞸵' => 'ت', - '𞸶' => 'ث', - '𞸷' => 'خ', - '𞸹' => 'ض', - '𞸻' => 'غ', - '𞹂' => 'ج', - '𞹇' => 'ح', - '𞹉' => 'ي', - '𞹋' => 'ل', - '𞹍' => 'ن', - '𞹎' => 'س', - '𞹏' => 'ع', - '𞹑' => 'ص', - '𞹒' => 'ق', - '𞹔' => 'ش', - '𞹗' => 'خ', - '𞹙' => 'ض', - '𞹛' => 'غ', - '𞹝' => 'ں', - '𞹟' => 'ٯ', - '𞹡' => 'ب', - '𞹢' => 'ج', - '𞹤' => 'ه', - '𞹧' => 'ح', - '𞹨' => 'ط', - '𞹩' => 'ي', - '𞹪' => 'ك', - '𞹬' => 'م', - '𞹭' => 'ن', - '𞹮' => 'س', - '𞹯' => 'ع', - '𞹰' => 'ف', - '𞹱' => 'ص', - '𞹲' => 'ق', - '𞹴' => 'ش', - '𞹵' => 'ت', - '𞹶' => 'ث', - '𞹷' => 'خ', - '𞹹' => 'ض', - '𞹺' => 'ظ', - '𞹻' => 'غ', - '𞹼' => 'ٮ', - '𞹾' => 'ڡ', - '𞺀' => 'ا', - '𞺁' => 'ب', - '𞺂' => 'ج', - '𞺃' => 'د', - '𞺄' => 'ه', - '𞺅' => 'و', - '𞺆' => 'ز', - '𞺇' => 'ح', - '𞺈' => 'ط', - '𞺉' => 'ي', - '𞺋' => 'ل', - '𞺌' => 'م', - '𞺍' => 'ن', - '𞺎' => 'س', - '𞺏' => 'ع', - '𞺐' => 'ف', - '𞺑' => 'ص', - '𞺒' => 'ق', - '𞺓' => 'ر', - '𞺔' => 'ش', - '𞺕' => 'ت', - '𞺖' => 'ث', - '𞺗' => 'خ', - '𞺘' => 'ذ', - '𞺙' => 'ض', - '𞺚' => 'ظ', - '𞺛' => 'غ', - '𞺡' => 'ب', - '𞺢' => 'ج', - '𞺣' => 'د', - '𞺥' => 'و', - '𞺦' => 'ز', - '𞺧' => 'ح', - '𞺨' => 'ط', - '𞺩' => 'ي', - '𞺫' => 'ل', - '𞺬' => 'م', - '𞺭' => 'ن', - '𞺮' => 'س', - '𞺯' => 'ع', - '𞺰' => 'ف', - '𞺱' => 'ص', - '𞺲' => 'ق', - '𞺳' => 'ر', - '𞺴' => 'ش', - '𞺵' => 'ت', - '𞺶' => 'ث', - '𞺷' => 'خ', - '𞺸' => 'ذ', - '𞺹' => 'ض', - '𞺺' => 'ظ', - '𞺻' => 'غ', - '🄀' => '0.', - '🄁' => '0,', - '🄂' => '1,', - '🄃' => '2,', - '🄄' => '3,', - '🄅' => '4,', - '🄆' => '5,', - '🄇' => '6,', - '🄈' => '7,', - '🄉' => '8,', - '🄊' => '9,', - '🄐' => '(A)', - '🄑' => '(B)', - '🄒' => '(C)', - '🄓' => '(D)', - '🄔' => '(E)', - '🄕' => '(F)', - '🄖' => '(G)', - '🄗' => '(H)', - '🄘' => '(I)', - '🄙' => '(J)', - '🄚' => '(K)', - '🄛' => '(L)', - '🄜' => '(M)', - '🄝' => '(N)', - '🄞' => '(O)', - '🄟' => '(P)', - '🄠' => '(Q)', - '🄡' => '(R)', - '🄢' => '(S)', - '🄣' => '(T)', - '🄤' => '(U)', - '🄥' => '(V)', - '🄦' => '(W)', - '🄧' => '(X)', - '🄨' => '(Y)', - '🄩' => '(Z)', - '🄪' => '〔S〕', - '🄫' => 'C', - '🄬' => 'R', - '🄭' => 'CD', - '🄮' => 'WZ', - '🄰' => 'A', - '🄱' => 'B', - '🄲' => 'C', - '🄳' => 'D', - '🄴' => 'E', - '🄵' => 'F', - '🄶' => 'G', - '🄷' => 'H', - '🄸' => 'I', - '🄹' => 'J', - '🄺' => 'K', - '🄻' => 'L', - '🄼' => 'M', - '🄽' => 'N', - '🄾' => 'O', - '🄿' => 'P', - '🅀' => 'Q', - '🅁' => 'R', - '🅂' => 'S', - '🅃' => 'T', - '🅄' => 'U', - '🅅' => 'V', - '🅆' => 'W', - '🅇' => 'X', - '🅈' => 'Y', - '🅉' => 'Z', - '🅊' => 'HV', - '🅋' => 'MV', - '🅌' => 'SD', - '🅍' => 'SS', - '🅎' => 'PPV', - '🅏' => 'WC', - '🅪' => 'MC', - '🅫' => 'MD', - '🅬' => 'MR', - '🆐' => 'DJ', - '🈀' => 'ほか', - '🈁' => 'ココ', - '🈂' => 'サ', - '🈐' => '手', - '🈑' => '字', - '🈒' => '双', - '🈓' => 'デ', - '🈔' => '二', - '🈕' => '多', - '🈖' => '解', - '🈗' => '天', - '🈘' => '交', - '🈙' => '映', - '🈚' => '無', - '🈛' => '料', - '🈜' => '前', - '🈝' => '後', - '🈞' => '再', - '🈟' => '新', - '🈠' => '初', - '🈡' => '終', - '🈢' => '生', - '🈣' => '販', - '🈤' => '声', - '🈥' => '吹', - '🈦' => '演', - '🈧' => '投', - '🈨' => '捕', - '🈩' => '一', - '🈪' => '三', - '🈫' => '遊', - '🈬' => '左', - '🈭' => '中', - '🈮' => '右', - '🈯' => '指', - '🈰' => '走', - '🈱' => '打', - '🈲' => '禁', - '🈳' => '空', - '🈴' => '合', - '🈵' => '満', - '🈶' => '有', - '🈷' => '月', - '🈸' => '申', - '🈹' => '割', - '🈺' => '営', - '🈻' => '配', - '🉀' => '〔本〕', - '🉁' => '〔三〕', - '🉂' => '〔二〕', - '🉃' => '〔安〕', - '🉄' => '〔点〕', - '🉅' => '〔打〕', - '🉆' => '〔盗〕', - '🉇' => '〔勝〕', - '🉈' => '〔敗〕', - '🉐' => '得', - '🉑' => '可', - '🯰' => '0', - '🯱' => '1', - '🯲' => '2', - '🯳' => '3', - '🯴' => '4', - '🯵' => '5', - '🯶' => '6', - '🯷' => '7', - '🯸' => '8', - '🯹' => '9', -); diff --git a/tools/php-cs-fixer/vendor/symfony/polyfill-intl-normalizer/bootstrap.php b/tools/php-cs-fixer/vendor/symfony/polyfill-intl-normalizer/bootstrap.php deleted file mode 100644 index 3608e5c..0000000 --- a/tools/php-cs-fixer/vendor/symfony/polyfill-intl-normalizer/bootstrap.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use Symfony\Polyfill\Intl\Normalizer as p; - -if (\PHP_VERSION_ID >= 80000) { - return require __DIR__.'/bootstrap80.php'; -} - -if (!function_exists('normalizer_is_normalized')) { - function normalizer_is_normalized($string, $form = p\Normalizer::FORM_C) { return p\Normalizer::isNormalized($string, $form); } -} -if (!function_exists('normalizer_normalize')) { - function normalizer_normalize($string, $form = p\Normalizer::FORM_C) { return p\Normalizer::normalize($string, $form); } -} diff --git a/tools/php-cs-fixer/vendor/symfony/polyfill-intl-normalizer/bootstrap80.php b/tools/php-cs-fixer/vendor/symfony/polyfill-intl-normalizer/bootstrap80.php deleted file mode 100644 index e36d1a9..0000000 --- a/tools/php-cs-fixer/vendor/symfony/polyfill-intl-normalizer/bootstrap80.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use Symfony\Polyfill\Intl\Normalizer as p; - -if (!function_exists('normalizer_is_normalized')) { - function normalizer_is_normalized(?string $string, ?int $form = p\Normalizer::FORM_C): bool { return p\Normalizer::isNormalized((string) $string, (int) $form); } -} -if (!function_exists('normalizer_normalize')) { - function normalizer_normalize(?string $string, ?int $form = p\Normalizer::FORM_C): string|false { return p\Normalizer::normalize((string) $string, (int) $form); } -} diff --git a/tools/php-cs-fixer/vendor/symfony/polyfill-intl-normalizer/composer.json b/tools/php-cs-fixer/vendor/symfony/polyfill-intl-normalizer/composer.json deleted file mode 100644 index 393edf7..0000000 --- a/tools/php-cs-fixer/vendor/symfony/polyfill-intl-normalizer/composer.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "name": "symfony/polyfill-intl-normalizer", - "type": "library", - "description": "Symfony polyfill for intl's Normalizer class and related functions", - "keywords": ["polyfill", "shim", "compatibility", "portable", "intl", "normalizer"], - "homepage": "https://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "require": { - "php": ">=7.1" - }, - "autoload": { - "psr-4": { "Symfony\\Polyfill\\Intl\\Normalizer\\": "" }, - "files": [ "bootstrap.php" ], - "classmap": [ "Resources/stubs" ] - }, - "suggest": { - "ext-intl": "For best performance" - }, - "minimum-stability": "dev", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/polyfill-mbstring/LICENSE b/tools/php-cs-fixer/vendor/symfony/polyfill-mbstring/LICENSE deleted file mode 100644 index 4cd8bdd..0000000 --- a/tools/php-cs-fixer/vendor/symfony/polyfill-mbstring/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2015-2019 Fabien Potencier - -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/tools/php-cs-fixer/vendor/symfony/polyfill-mbstring/Mbstring.php b/tools/php-cs-fixer/vendor/symfony/polyfill-mbstring/Mbstring.php deleted file mode 100644 index b599095..0000000 --- a/tools/php-cs-fixer/vendor/symfony/polyfill-mbstring/Mbstring.php +++ /dev/null @@ -1,870 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Polyfill\Mbstring; - -/** - * Partial mbstring implementation in PHP, iconv based, UTF-8 centric. - * - * Implemented: - * - mb_chr - Returns a specific character from its Unicode code point - * - mb_convert_encoding - Convert character encoding - * - mb_convert_variables - Convert character code in variable(s) - * - mb_decode_mimeheader - Decode string in MIME header field - * - mb_encode_mimeheader - Encode string for MIME header XXX NATIVE IMPLEMENTATION IS REALLY BUGGED - * - mb_decode_numericentity - Decode HTML numeric string reference to character - * - mb_encode_numericentity - Encode character to HTML numeric string reference - * - mb_convert_case - Perform case folding on a string - * - mb_detect_encoding - Detect character encoding - * - mb_get_info - Get internal settings of mbstring - * - mb_http_input - Detect HTTP input character encoding - * - mb_http_output - Set/Get HTTP output character encoding - * - mb_internal_encoding - Set/Get internal character encoding - * - mb_list_encodings - Returns an array of all supported encodings - * - mb_ord - Returns the Unicode code point of a character - * - mb_output_handler - Callback function converts character encoding in output buffer - * - mb_scrub - Replaces ill-formed byte sequences with substitute characters - * - mb_strlen - Get string length - * - mb_strpos - Find position of first occurrence of string in a string - * - mb_strrpos - Find position of last occurrence of a string in a string - * - mb_str_split - Convert a string to an array - * - mb_strtolower - Make a string lowercase - * - mb_strtoupper - Make a string uppercase - * - mb_substitute_character - Set/Get substitution character - * - mb_substr - Get part of string - * - mb_stripos - Finds position of first occurrence of a string within another, case insensitive - * - mb_stristr - Finds first occurrence of a string within another, case insensitive - * - mb_strrchr - Finds the last occurrence of a character in a string within another - * - mb_strrichr - Finds the last occurrence of a character in a string within another, case insensitive - * - mb_strripos - Finds position of last occurrence of a string within another, case insensitive - * - mb_strstr - Finds first occurrence of a string within another - * - mb_strwidth - Return width of string - * - mb_substr_count - Count the number of substring occurrences - * - * Not implemented: - * - mb_convert_kana - Convert "kana" one from another ("zen-kaku", "han-kaku" and more) - * - mb_ereg_* - Regular expression with multibyte support - * - mb_parse_str - Parse GET/POST/COOKIE data and set global variable - * - mb_preferred_mime_name - Get MIME charset string - * - mb_regex_encoding - Returns current encoding for multibyte regex as string - * - mb_regex_set_options - Set/Get the default options for mbregex functions - * - mb_send_mail - Send encoded mail - * - mb_split - Split multibyte string using regular expression - * - mb_strcut - Get part of string - * - mb_strimwidth - Get truncated string with specified width - * - * @author Nicolas Grekas - * - * @internal - */ -final class Mbstring -{ - public const MB_CASE_FOLD = \PHP_INT_MAX; - - private const CASE_FOLD = [ - ['µ', 'ſ', "\xCD\x85", 'ς', "\xCF\x90", "\xCF\x91", "\xCF\x95", "\xCF\x96", "\xCF\xB0", "\xCF\xB1", "\xCF\xB5", "\xE1\xBA\x9B", "\xE1\xBE\xBE"], - ['μ', 's', 'ι', 'σ', 'β', 'θ', 'φ', 'π', 'κ', 'ρ', 'ε', "\xE1\xB9\xA1", 'ι'], - ]; - - private static $encodingList = ['ASCII', 'UTF-8']; - private static $language = 'neutral'; - private static $internalEncoding = 'UTF-8'; - - public static function mb_convert_encoding($s, $toEncoding, $fromEncoding = null) - { - if (\is_array($fromEncoding) || false !== strpos($fromEncoding, ',')) { - $fromEncoding = self::mb_detect_encoding($s, $fromEncoding); - } else { - $fromEncoding = self::getEncoding($fromEncoding); - } - - $toEncoding = self::getEncoding($toEncoding); - - if ('BASE64' === $fromEncoding) { - $s = base64_decode($s); - $fromEncoding = $toEncoding; - } - - if ('BASE64' === $toEncoding) { - return base64_encode($s); - } - - if ('HTML-ENTITIES' === $toEncoding || 'HTML' === $toEncoding) { - if ('HTML-ENTITIES' === $fromEncoding || 'HTML' === $fromEncoding) { - $fromEncoding = 'Windows-1252'; - } - if ('UTF-8' !== $fromEncoding) { - $s = \iconv($fromEncoding, 'UTF-8//IGNORE', $s); - } - - return preg_replace_callback('/[\x80-\xFF]+/', [__CLASS__, 'html_encoding_callback'], $s); - } - - if ('HTML-ENTITIES' === $fromEncoding) { - $s = html_entity_decode($s, \ENT_COMPAT, 'UTF-8'); - $fromEncoding = 'UTF-8'; - } - - return \iconv($fromEncoding, $toEncoding.'//IGNORE', $s); - } - - public static function mb_convert_variables($toEncoding, $fromEncoding, &...$vars) - { - $ok = true; - array_walk_recursive($vars, function (&$v) use (&$ok, $toEncoding, $fromEncoding) { - if (false === $v = self::mb_convert_encoding($v, $toEncoding, $fromEncoding)) { - $ok = false; - } - }); - - return $ok ? $fromEncoding : false; - } - - public static function mb_decode_mimeheader($s) - { - return \iconv_mime_decode($s, 2, self::$internalEncoding); - } - - public static function mb_encode_mimeheader($s, $charset = null, $transferEncoding = null, $linefeed = null, $indent = null) - { - trigger_error('mb_encode_mimeheader() is bugged. Please use iconv_mime_encode() instead', \E_USER_WARNING); - } - - public static function mb_decode_numericentity($s, $convmap, $encoding = null) - { - if (null !== $s && !is_scalar($s) && !(\is_object($s) && method_exists($s, '__toString'))) { - trigger_error('mb_decode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', \E_USER_WARNING); - - return null; - } - - if (!\is_array($convmap) || (80000 > \PHP_VERSION_ID && !$convmap)) { - return false; - } - - if (null !== $encoding && !is_scalar($encoding)) { - trigger_error('mb_decode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', \E_USER_WARNING); - - return ''; // Instead of null (cf. mb_encode_numericentity). - } - - $s = (string) $s; - if ('' === $s) { - return ''; - } - - $encoding = self::getEncoding($encoding); - - if ('UTF-8' === $encoding) { - $encoding = null; - if (!preg_match('//u', $s)) { - $s = @\iconv('UTF-8', 'UTF-8//IGNORE', $s); - } - } else { - $s = \iconv($encoding, 'UTF-8//IGNORE', $s); - } - - $cnt = floor(\count($convmap) / 4) * 4; - - for ($i = 0; $i < $cnt; $i += 4) { - // collector_decode_htmlnumericentity ignores $convmap[$i + 3] - $convmap[$i] += $convmap[$i + 2]; - $convmap[$i + 1] += $convmap[$i + 2]; - } - - $s = preg_replace_callback('/&#(?:0*([0-9]+)|x0*([0-9a-fA-F]+))(?!&);?/', function (array $m) use ($cnt, $convmap) { - $c = isset($m[2]) ? (int) hexdec($m[2]) : $m[1]; - for ($i = 0; $i < $cnt; $i += 4) { - if ($c >= $convmap[$i] && $c <= $convmap[$i + 1]) { - return self::mb_chr($c - $convmap[$i + 2]); - } - } - - return $m[0]; - }, $s); - - if (null === $encoding) { - return $s; - } - - return \iconv('UTF-8', $encoding.'//IGNORE', $s); - } - - public static function mb_encode_numericentity($s, $convmap, $encoding = null, $is_hex = false) - { - if (null !== $s && !is_scalar($s) && !(\is_object($s) && method_exists($s, '__toString'))) { - trigger_error('mb_encode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', \E_USER_WARNING); - - return null; - } - - if (!\is_array($convmap) || (80000 > \PHP_VERSION_ID && !$convmap)) { - return false; - } - - if (null !== $encoding && !is_scalar($encoding)) { - trigger_error('mb_encode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', \E_USER_WARNING); - - return null; // Instead of '' (cf. mb_decode_numericentity). - } - - if (null !== $is_hex && !is_scalar($is_hex)) { - trigger_error('mb_encode_numericentity() expects parameter 4 to be boolean, '.\gettype($s).' given', \E_USER_WARNING); - - return null; - } - - $s = (string) $s; - if ('' === $s) { - return ''; - } - - $encoding = self::getEncoding($encoding); - - if ('UTF-8' === $encoding) { - $encoding = null; - if (!preg_match('//u', $s)) { - $s = @\iconv('UTF-8', 'UTF-8//IGNORE', $s); - } - } else { - $s = \iconv($encoding, 'UTF-8//IGNORE', $s); - } - - static $ulenMask = ["\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4]; - - $cnt = floor(\count($convmap) / 4) * 4; - $i = 0; - $len = \strlen($s); - $result = ''; - - while ($i < $len) { - $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xF0"]; - $uchr = substr($s, $i, $ulen); - $i += $ulen; - $c = self::mb_ord($uchr); - - for ($j = 0; $j < $cnt; $j += 4) { - if ($c >= $convmap[$j] && $c <= $convmap[$j + 1]) { - $cOffset = ($c + $convmap[$j + 2]) & $convmap[$j + 3]; - $result .= $is_hex ? sprintf('&#x%X;', $cOffset) : '&#'.$cOffset.';'; - continue 2; - } - } - $result .= $uchr; - } - - if (null === $encoding) { - return $result; - } - - return \iconv('UTF-8', $encoding.'//IGNORE', $result); - } - - public static function mb_convert_case($s, $mode, $encoding = null) - { - $s = (string) $s; - if ('' === $s) { - return ''; - } - - $encoding = self::getEncoding($encoding); - - if ('UTF-8' === $encoding) { - $encoding = null; - if (!preg_match('//u', $s)) { - $s = @\iconv('UTF-8', 'UTF-8//IGNORE', $s); - } - } else { - $s = \iconv($encoding, 'UTF-8//IGNORE', $s); - } - - if (\MB_CASE_TITLE == $mode) { - static $titleRegexp = null; - if (null === $titleRegexp) { - $titleRegexp = self::getData('titleCaseRegexp'); - } - $s = preg_replace_callback($titleRegexp, [__CLASS__, 'title_case'], $s); - } else { - if (\MB_CASE_UPPER == $mode) { - static $upper = null; - if (null === $upper) { - $upper = self::getData('upperCase'); - } - $map = $upper; - } else { - if (self::MB_CASE_FOLD === $mode) { - $s = str_replace(self::CASE_FOLD[0], self::CASE_FOLD[1], $s); - } - - static $lower = null; - if (null === $lower) { - $lower = self::getData('lowerCase'); - } - $map = $lower; - } - - static $ulenMask = ["\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4]; - - $i = 0; - $len = \strlen($s); - - while ($i < $len) { - $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xF0"]; - $uchr = substr($s, $i, $ulen); - $i += $ulen; - - if (isset($map[$uchr])) { - $uchr = $map[$uchr]; - $nlen = \strlen($uchr); - - if ($nlen == $ulen) { - $nlen = $i; - do { - $s[--$nlen] = $uchr[--$ulen]; - } while ($ulen); - } else { - $s = substr_replace($s, $uchr, $i - $ulen, $ulen); - $len += $nlen - $ulen; - $i += $nlen - $ulen; - } - } - } - } - - if (null === $encoding) { - return $s; - } - - return \iconv('UTF-8', $encoding.'//IGNORE', $s); - } - - public static function mb_internal_encoding($encoding = null) - { - if (null === $encoding) { - return self::$internalEncoding; - } - - $normalizedEncoding = self::getEncoding($encoding); - - if ('UTF-8' === $normalizedEncoding || false !== @\iconv($normalizedEncoding, $normalizedEncoding, ' ')) { - self::$internalEncoding = $normalizedEncoding; - - return true; - } - - if (80000 > \PHP_VERSION_ID) { - return false; - } - - throw new \ValueError(sprintf('Argument #1 ($encoding) must be a valid encoding, "%s" given', $encoding)); - } - - public static function mb_language($lang = null) - { - if (null === $lang) { - return self::$language; - } - - switch ($normalizedLang = strtolower($lang)) { - case 'uni': - case 'neutral': - self::$language = $normalizedLang; - - return true; - } - - if (80000 > \PHP_VERSION_ID) { - return false; - } - - throw new \ValueError(sprintf('Argument #1 ($language) must be a valid language, "%s" given', $lang)); - } - - public static function mb_list_encodings() - { - return ['UTF-8']; - } - - public static function mb_encoding_aliases($encoding) - { - switch (strtoupper($encoding)) { - case 'UTF8': - case 'UTF-8': - return ['utf8']; - } - - return false; - } - - public static function mb_check_encoding($var = null, $encoding = null) - { - if (null === $encoding) { - if (null === $var) { - return false; - } - $encoding = self::$internalEncoding; - } - - return self::mb_detect_encoding($var, [$encoding]) || false !== @\iconv($encoding, $encoding, $var); - } - - public static function mb_detect_encoding($str, $encodingList = null, $strict = false) - { - if (null === $encodingList) { - $encodingList = self::$encodingList; - } else { - if (!\is_array($encodingList)) { - $encodingList = array_map('trim', explode(',', $encodingList)); - } - $encodingList = array_map('strtoupper', $encodingList); - } - - foreach ($encodingList as $enc) { - switch ($enc) { - case 'ASCII': - if (!preg_match('/[\x80-\xFF]/', $str)) { - return $enc; - } - break; - - case 'UTF8': - case 'UTF-8': - if (preg_match('//u', $str)) { - return 'UTF-8'; - } - break; - - default: - if (0 === strncmp($enc, 'ISO-8859-', 9)) { - return $enc; - } - } - } - - return false; - } - - public static function mb_detect_order($encodingList = null) - { - if (null === $encodingList) { - return self::$encodingList; - } - - if (!\is_array($encodingList)) { - $encodingList = array_map('trim', explode(',', $encodingList)); - } - $encodingList = array_map('strtoupper', $encodingList); - - foreach ($encodingList as $enc) { - switch ($enc) { - default: - if (strncmp($enc, 'ISO-8859-', 9)) { - return false; - } - // no break - case 'ASCII': - case 'UTF8': - case 'UTF-8': - } - } - - self::$encodingList = $encodingList; - - return true; - } - - public static function mb_strlen($s, $encoding = null) - { - $encoding = self::getEncoding($encoding); - if ('CP850' === $encoding || 'ASCII' === $encoding) { - return \strlen($s); - } - - return @\iconv_strlen($s, $encoding); - } - - public static function mb_strpos($haystack, $needle, $offset = 0, $encoding = null) - { - $encoding = self::getEncoding($encoding); - if ('CP850' === $encoding || 'ASCII' === $encoding) { - return strpos($haystack, $needle, $offset); - } - - $needle = (string) $needle; - if ('' === $needle) { - if (80000 > \PHP_VERSION_ID) { - trigger_error(__METHOD__.': Empty delimiter', \E_USER_WARNING); - - return false; - } - - return 0; - } - - return \iconv_strpos($haystack, $needle, $offset, $encoding); - } - - public static function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null) - { - $encoding = self::getEncoding($encoding); - if ('CP850' === $encoding || 'ASCII' === $encoding) { - return strrpos($haystack, $needle, $offset); - } - - if ($offset != (int) $offset) { - $offset = 0; - } elseif ($offset = (int) $offset) { - if ($offset < 0) { - if (0 > $offset += self::mb_strlen($needle)) { - $haystack = self::mb_substr($haystack, 0, $offset, $encoding); - } - $offset = 0; - } else { - $haystack = self::mb_substr($haystack, $offset, 2147483647, $encoding); - } - } - - $pos = '' !== $needle || 80000 > \PHP_VERSION_ID - ? \iconv_strrpos($haystack, $needle, $encoding) - : self::mb_strlen($haystack, $encoding); - - return false !== $pos ? $offset + $pos : false; - } - - public static function mb_str_split($string, $split_length = 1, $encoding = null) - { - if (null !== $string && !is_scalar($string) && !(\is_object($string) && method_exists($string, '__toString'))) { - trigger_error('mb_str_split() expects parameter 1 to be string, '.\gettype($string).' given', \E_USER_WARNING); - - return null; - } - - if (1 > $split_length = (int) $split_length) { - if (80000 > \PHP_VERSION_ID) { - trigger_error('The length of each segment must be greater than zero', \E_USER_WARNING); - return false; - } - - throw new \ValueError('Argument #2 ($length) must be greater than 0'); - } - - if (null === $encoding) { - $encoding = mb_internal_encoding(); - } - - if ('UTF-8' === $encoding = self::getEncoding($encoding)) { - $rx = '/('; - while (65535 < $split_length) { - $rx .= '.{65535}'; - $split_length -= 65535; - } - $rx .= '.{'.$split_length.'})/us'; - - return preg_split($rx, $string, null, \PREG_SPLIT_DELIM_CAPTURE | \PREG_SPLIT_NO_EMPTY); - } - - $result = []; - $length = mb_strlen($string, $encoding); - - for ($i = 0; $i < $length; $i += $split_length) { - $result[] = mb_substr($string, $i, $split_length, $encoding); - } - - return $result; - } - - public static function mb_strtolower($s, $encoding = null) - { - return self::mb_convert_case($s, \MB_CASE_LOWER, $encoding); - } - - public static function mb_strtoupper($s, $encoding = null) - { - return self::mb_convert_case($s, \MB_CASE_UPPER, $encoding); - } - - public static function mb_substitute_character($c = null) - { - if (null === $c) { - return 'none'; - } - if (0 === strcasecmp($c, 'none')) { - return true; - } - if (80000 > \PHP_VERSION_ID) { - return false; - } - - throw new \ValueError('Argument #1 ($substitute_character) must be "none", "long", "entity" or a valid codepoint'); - } - - public static function mb_substr($s, $start, $length = null, $encoding = null) - { - $encoding = self::getEncoding($encoding); - if ('CP850' === $encoding || 'ASCII' === $encoding) { - return (string) substr($s, $start, null === $length ? 2147483647 : $length); - } - - if ($start < 0) { - $start = \iconv_strlen($s, $encoding) + $start; - if ($start < 0) { - $start = 0; - } - } - - if (null === $length) { - $length = 2147483647; - } elseif ($length < 0) { - $length = \iconv_strlen($s, $encoding) + $length - $start; - if ($length < 0) { - return ''; - } - } - - return (string) \iconv_substr($s, $start, $length, $encoding); - } - - public static function mb_stripos($haystack, $needle, $offset = 0, $encoding = null) - { - $haystack = self::mb_convert_case($haystack, self::MB_CASE_FOLD, $encoding); - $needle = self::mb_convert_case($needle, self::MB_CASE_FOLD, $encoding); - - return self::mb_strpos($haystack, $needle, $offset, $encoding); - } - - public static function mb_stristr($haystack, $needle, $part = false, $encoding = null) - { - $pos = self::mb_stripos($haystack, $needle, 0, $encoding); - - return self::getSubpart($pos, $part, $haystack, $encoding); - } - - public static function mb_strrchr($haystack, $needle, $part = false, $encoding = null) - { - $encoding = self::getEncoding($encoding); - if ('CP850' === $encoding || 'ASCII' === $encoding) { - $pos = strrpos($haystack, $needle); - } else { - $needle = self::mb_substr($needle, 0, 1, $encoding); - $pos = \iconv_strrpos($haystack, $needle, $encoding); - } - - return self::getSubpart($pos, $part, $haystack, $encoding); - } - - public static function mb_strrichr($haystack, $needle, $part = false, $encoding = null) - { - $needle = self::mb_substr($needle, 0, 1, $encoding); - $pos = self::mb_strripos($haystack, $needle, $encoding); - - return self::getSubpart($pos, $part, $haystack, $encoding); - } - - public static function mb_strripos($haystack, $needle, $offset = 0, $encoding = null) - { - $haystack = self::mb_convert_case($haystack, self::MB_CASE_FOLD, $encoding); - $needle = self::mb_convert_case($needle, self::MB_CASE_FOLD, $encoding); - - return self::mb_strrpos($haystack, $needle, $offset, $encoding); - } - - public static function mb_strstr($haystack, $needle, $part = false, $encoding = null) - { - $pos = strpos($haystack, $needle); - if (false === $pos) { - return false; - } - if ($part) { - return substr($haystack, 0, $pos); - } - - return substr($haystack, $pos); - } - - public static function mb_get_info($type = 'all') - { - $info = [ - 'internal_encoding' => self::$internalEncoding, - 'http_output' => 'pass', - 'http_output_conv_mimetypes' => '^(text/|application/xhtml\+xml)', - 'func_overload' => 0, - 'func_overload_list' => 'no overload', - 'mail_charset' => 'UTF-8', - 'mail_header_encoding' => 'BASE64', - 'mail_body_encoding' => 'BASE64', - 'illegal_chars' => 0, - 'encoding_translation' => 'Off', - 'language' => self::$language, - 'detect_order' => self::$encodingList, - 'substitute_character' => 'none', - 'strict_detection' => 'Off', - ]; - - if ('all' === $type) { - return $info; - } - if (isset($info[$type])) { - return $info[$type]; - } - - return false; - } - - public static function mb_http_input($type = '') - { - return false; - } - - public static function mb_http_output($encoding = null) - { - return null !== $encoding ? 'pass' === $encoding : 'pass'; - } - - public static function mb_strwidth($s, $encoding = null) - { - $encoding = self::getEncoding($encoding); - - if ('UTF-8' !== $encoding) { - $s = \iconv($encoding, 'UTF-8//IGNORE', $s); - } - - $s = preg_replace('/[\x{1100}-\x{115F}\x{2329}\x{232A}\x{2E80}-\x{303E}\x{3040}-\x{A4CF}\x{AC00}-\x{D7A3}\x{F900}-\x{FAFF}\x{FE10}-\x{FE19}\x{FE30}-\x{FE6F}\x{FF00}-\x{FF60}\x{FFE0}-\x{FFE6}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}]/u', '', $s, -1, $wide); - - return ($wide << 1) + \iconv_strlen($s, 'UTF-8'); - } - - public static function mb_substr_count($haystack, $needle, $encoding = null) - { - return substr_count($haystack, $needle); - } - - public static function mb_output_handler($contents, $status) - { - return $contents; - } - - public static function mb_chr($code, $encoding = null) - { - if (0x80 > $code %= 0x200000) { - $s = \chr($code); - } elseif (0x800 > $code) { - $s = \chr(0xC0 | $code >> 6).\chr(0x80 | $code & 0x3F); - } elseif (0x10000 > $code) { - $s = \chr(0xE0 | $code >> 12).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F); - } else { - $s = \chr(0xF0 | $code >> 18).\chr(0x80 | $code >> 12 & 0x3F).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F); - } - - if ('UTF-8' !== $encoding = self::getEncoding($encoding)) { - $s = mb_convert_encoding($s, $encoding, 'UTF-8'); - } - - return $s; - } - - public static function mb_ord($s, $encoding = null) - { - if ('UTF-8' !== $encoding = self::getEncoding($encoding)) { - $s = mb_convert_encoding($s, 'UTF-8', $encoding); - } - - if (1 === \strlen($s)) { - return \ord($s); - } - - $code = ($s = unpack('C*', substr($s, 0, 4))) ? $s[1] : 0; - if (0xF0 <= $code) { - return (($code - 0xF0) << 18) + (($s[2] - 0x80) << 12) + (($s[3] - 0x80) << 6) + $s[4] - 0x80; - } - if (0xE0 <= $code) { - return (($code - 0xE0) << 12) + (($s[2] - 0x80) << 6) + $s[3] - 0x80; - } - if (0xC0 <= $code) { - return (($code - 0xC0) << 6) + $s[2] - 0x80; - } - - return $code; - } - - private static function getSubpart($pos, $part, $haystack, $encoding) - { - if (false === $pos) { - return false; - } - if ($part) { - return self::mb_substr($haystack, 0, $pos, $encoding); - } - - return self::mb_substr($haystack, $pos, null, $encoding); - } - - private static function html_encoding_callback(array $m) - { - $i = 1; - $entities = ''; - $m = unpack('C*', htmlentities($m[0], \ENT_COMPAT, 'UTF-8')); - - while (isset($m[$i])) { - if (0x80 > $m[$i]) { - $entities .= \chr($m[$i++]); - continue; - } - if (0xF0 <= $m[$i]) { - $c = (($m[$i++] - 0xF0) << 18) + (($m[$i++] - 0x80) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80; - } elseif (0xE0 <= $m[$i]) { - $c = (($m[$i++] - 0xE0) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80; - } else { - $c = (($m[$i++] - 0xC0) << 6) + $m[$i++] - 0x80; - } - - $entities .= '&#'.$c.';'; - } - - return $entities; - } - - private static function title_case(array $s) - { - return self::mb_convert_case($s[1], \MB_CASE_UPPER, 'UTF-8').self::mb_convert_case($s[2], \MB_CASE_LOWER, 'UTF-8'); - } - - private static function getData($file) - { - if (file_exists($file = __DIR__.'/Resources/unidata/'.$file.'.php')) { - return require $file; - } - - return false; - } - - private static function getEncoding($encoding) - { - if (null === $encoding) { - return self::$internalEncoding; - } - - if ('UTF-8' === $encoding) { - return 'UTF-8'; - } - - $encoding = strtoupper($encoding); - - if ('8BIT' === $encoding || 'BINARY' === $encoding) { - return 'CP850'; - } - - if ('UTF8' === $encoding) { - return 'UTF-8'; - } - - return $encoding; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/polyfill-mbstring/README.md b/tools/php-cs-fixer/vendor/symfony/polyfill-mbstring/README.md deleted file mode 100644 index 4efb599..0000000 --- a/tools/php-cs-fixer/vendor/symfony/polyfill-mbstring/README.md +++ /dev/null @@ -1,13 +0,0 @@ -Symfony Polyfill / Mbstring -=========================== - -This component provides a partial, native PHP implementation for the -[Mbstring](https://php.net/mbstring) extension. - -More information can be found in the -[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). - -License -======= - -This library is released under the [MIT license](LICENSE). diff --git a/tools/php-cs-fixer/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php b/tools/php-cs-fixer/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php deleted file mode 100644 index fac60b0..0000000 --- a/tools/php-cs-fixer/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php +++ /dev/null @@ -1,1397 +0,0 @@ - '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/tools/php-cs-fixer/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php b/tools/php-cs-fixer/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php deleted file mode 100644 index 2a8f6e7..0000000 --- a/tools/php-cs-fixer/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php +++ /dev/null @@ -1,5 +0,0 @@ - '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/tools/php-cs-fixer/vendor/symfony/polyfill-mbstring/bootstrap.php b/tools/php-cs-fixer/vendor/symfony/polyfill-mbstring/bootstrap.php deleted file mode 100644 index 1fedd1f..0000000 --- a/tools/php-cs-fixer/vendor/symfony/polyfill-mbstring/bootstrap.php +++ /dev/null @@ -1,147 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use Symfony\Polyfill\Mbstring as p; - -if (\PHP_VERSION_ID >= 80000) { - return require __DIR__.'/bootstrap80.php'; -} - -if (!function_exists('mb_convert_encoding')) { - function mb_convert_encoding($string, $to_encoding, $from_encoding = null) { return p\Mbstring::mb_convert_encoding($string, $to_encoding, $from_encoding); } -} -if (!function_exists('mb_decode_mimeheader')) { - function mb_decode_mimeheader($string) { return p\Mbstring::mb_decode_mimeheader($string); } -} -if (!function_exists('mb_encode_mimeheader')) { - function mb_encode_mimeheader($string, $charset = null, $transfer_encoding = null, $newline = "\r\n", $indent = 0) { return p\Mbstring::mb_encode_mimeheader($string, $charset, $transfer_encoding, $newline, $indent); } -} -if (!function_exists('mb_decode_numericentity')) { - function mb_decode_numericentity($string, $map, $encoding = null) { return p\Mbstring::mb_decode_numericentity($string, $map, $encoding); } -} -if (!function_exists('mb_encode_numericentity')) { - function mb_encode_numericentity($string, $map, $encoding = null, $hex = false) { return p\Mbstring::mb_encode_numericentity($string, $map, $encoding, $hex); } -} -if (!function_exists('mb_convert_case')) { - function mb_convert_case($string, $mode, $encoding = null) { return p\Mbstring::mb_convert_case($string, $mode, $encoding); } -} -if (!function_exists('mb_internal_encoding')) { - function mb_internal_encoding($encoding = null) { return p\Mbstring::mb_internal_encoding($encoding); } -} -if (!function_exists('mb_language')) { - function mb_language($language = null) { return p\Mbstring::mb_language($language); } -} -if (!function_exists('mb_list_encodings')) { - function mb_list_encodings() { return p\Mbstring::mb_list_encodings(); } -} -if (!function_exists('mb_encoding_aliases')) { - function mb_encoding_aliases($encoding) { return p\Mbstring::mb_encoding_aliases($encoding); } -} -if (!function_exists('mb_check_encoding')) { - function mb_check_encoding($value = null, $encoding = null) { return p\Mbstring::mb_check_encoding($value, $encoding); } -} -if (!function_exists('mb_detect_encoding')) { - function mb_detect_encoding($string, $encodings = null, $strict = false) { return p\Mbstring::mb_detect_encoding($string, $encodings, $strict); } -} -if (!function_exists('mb_detect_order')) { - function mb_detect_order($encoding = null) { return p\Mbstring::mb_detect_order($encoding); } -} -if (!function_exists('mb_parse_str')) { - function mb_parse_str($string, &$result = []) { parse_str($string, $result); return (bool) $result; } -} -if (!function_exists('mb_strlen')) { - function mb_strlen($string, $encoding = null) { return p\Mbstring::mb_strlen($string, $encoding); } -} -if (!function_exists('mb_strpos')) { - function mb_strpos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strpos($haystack, $needle, $offset, $encoding); } -} -if (!function_exists('mb_strtolower')) { - function mb_strtolower($string, $encoding = null) { return p\Mbstring::mb_strtolower($string, $encoding); } -} -if (!function_exists('mb_strtoupper')) { - function mb_strtoupper($string, $encoding = null) { return p\Mbstring::mb_strtoupper($string, $encoding); } -} -if (!function_exists('mb_substitute_character')) { - function mb_substitute_character($substitute_character = null) { return p\Mbstring::mb_substitute_character($substitute_character); } -} -if (!function_exists('mb_substr')) { - function mb_substr($string, $start, $length = 2147483647, $encoding = null) { return p\Mbstring::mb_substr($string, $start, $length, $encoding); } -} -if (!function_exists('mb_stripos')) { - function mb_stripos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_stripos($haystack, $needle, $offset, $encoding); } -} -if (!function_exists('mb_stristr')) { - function mb_stristr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_stristr($haystack, $needle, $before_needle, $encoding); } -} -if (!function_exists('mb_strrchr')) { - function mb_strrchr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_strrchr($haystack, $needle, $before_needle, $encoding); } -} -if (!function_exists('mb_strrichr')) { - function mb_strrichr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_strrichr($haystack, $needle, $before_needle, $encoding); } -} -if (!function_exists('mb_strripos')) { - function mb_strripos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strripos($haystack, $needle, $offset, $encoding); } -} -if (!function_exists('mb_strrpos')) { - function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strrpos($haystack, $needle, $offset, $encoding); } -} -if (!function_exists('mb_strstr')) { - function mb_strstr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_strstr($haystack, $needle, $before_needle, $encoding); } -} -if (!function_exists('mb_get_info')) { - function mb_get_info($type = 'all') { return p\Mbstring::mb_get_info($type); } -} -if (!function_exists('mb_http_output')) { - function mb_http_output($encoding = null) { return p\Mbstring::mb_http_output($encoding); } -} -if (!function_exists('mb_strwidth')) { - function mb_strwidth($string, $encoding = null) { return p\Mbstring::mb_strwidth($string, $encoding); } -} -if (!function_exists('mb_substr_count')) { - function mb_substr_count($haystack, $needle, $encoding = null) { return p\Mbstring::mb_substr_count($haystack, $needle, $encoding); } -} -if (!function_exists('mb_output_handler')) { - function mb_output_handler($string, $status) { return p\Mbstring::mb_output_handler($string, $status); } -} -if (!function_exists('mb_http_input')) { - function mb_http_input($type = null) { return p\Mbstring::mb_http_input($type); } -} - -if (!function_exists('mb_convert_variables')) { - function mb_convert_variables($to_encoding, $from_encoding, &...$vars) { return p\Mbstring::mb_convert_variables($to_encoding, $from_encoding, ...$vars); } -} - -if (!function_exists('mb_ord')) { - function mb_ord($string, $encoding = null) { return p\Mbstring::mb_ord($string, $encoding); } -} -if (!function_exists('mb_chr')) { - function mb_chr($codepoint, $encoding = null) { return p\Mbstring::mb_chr($codepoint, $encoding); } -} -if (!function_exists('mb_scrub')) { - function mb_scrub($string, $encoding = null) { $encoding = null === $encoding ? mb_internal_encoding() : $encoding; return mb_convert_encoding($string, $encoding, $encoding); } -} -if (!function_exists('mb_str_split')) { - function mb_str_split($string, $length = 1, $encoding = null) { return p\Mbstring::mb_str_split($string, $length, $encoding); } -} - -if (extension_loaded('mbstring')) { - return; -} - -if (!defined('MB_CASE_UPPER')) { - define('MB_CASE_UPPER', 0); -} -if (!defined('MB_CASE_LOWER')) { - define('MB_CASE_LOWER', 1); -} -if (!defined('MB_CASE_TITLE')) { - define('MB_CASE_TITLE', 2); -} diff --git a/tools/php-cs-fixer/vendor/symfony/polyfill-mbstring/bootstrap80.php b/tools/php-cs-fixer/vendor/symfony/polyfill-mbstring/bootstrap80.php deleted file mode 100644 index 82f5ac4..0000000 --- a/tools/php-cs-fixer/vendor/symfony/polyfill-mbstring/bootstrap80.php +++ /dev/null @@ -1,143 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use Symfony\Polyfill\Mbstring as p; - -if (!function_exists('mb_convert_encoding')) { - function mb_convert_encoding(array|string|null $string, ?string $to_encoding, array|string|null $from_encoding = null): array|string|false { return p\Mbstring::mb_convert_encoding($string ?? '', (string) $to_encoding, $from_encoding); } -} -if (!function_exists('mb_decode_mimeheader')) { - function mb_decode_mimeheader(?string $string): string { return p\Mbstring::mb_decode_mimeheader((string) $string); } -} -if (!function_exists('mb_encode_mimeheader')) { - function mb_encode_mimeheader(?string $string, ?string $charset = null, ?string $transfer_encoding = null, ?string $newline = "\r\n", ?int $indent = 0): string { return p\Mbstring::mb_encode_mimeheader((string) $string, $charset, $transfer_encoding, (string) $newline, (int) $indent); } -} -if (!function_exists('mb_decode_numericentity')) { - function mb_decode_numericentity(?string $string, array $map, ?string $encoding = null): string { return p\Mbstring::mb_decode_numericentity((string) $string, $map, $encoding); } -} -if (!function_exists('mb_encode_numericentity')) { - function mb_encode_numericentity(?string $string, array $map, ?string $encoding = null, ?bool $hex = false): string { return p\Mbstring::mb_encode_numericentity((string) $string, $map, $encoding, (bool) $hex); } -} -if (!function_exists('mb_convert_case')) { - function mb_convert_case(?string $string, ?int $mode, ?string $encoding = null): string { return p\Mbstring::mb_convert_case((string) $string, (int) $mode, $encoding); } -} -if (!function_exists('mb_internal_encoding')) { - function mb_internal_encoding(?string $encoding = null): string|bool { return p\Mbstring::mb_internal_encoding($encoding); } -} -if (!function_exists('mb_language')) { - function mb_language(?string $language = null): string|bool { return p\Mbstring::mb_language($language); } -} -if (!function_exists('mb_list_encodings')) { - function mb_list_encodings(): array { return p\Mbstring::mb_list_encodings(); } -} -if (!function_exists('mb_encoding_aliases')) { - function mb_encoding_aliases(?string $encoding): array { return p\Mbstring::mb_encoding_aliases((string) $encoding); } -} -if (!function_exists('mb_check_encoding')) { - function mb_check_encoding(array|string|null $value = null, ?string $encoding = null): bool { return p\Mbstring::mb_check_encoding($value, $encoding); } -} -if (!function_exists('mb_detect_encoding')) { - function mb_detect_encoding(?string $string, array|string|null $encodings = null, ?bool $strict = false): string|false { return p\Mbstring::mb_detect_encoding((string) $string, $encodings, (bool) $strict); } -} -if (!function_exists('mb_detect_order')) { - function mb_detect_order(array|string|null $encoding = null): array|bool { return p\Mbstring::mb_detect_order($encoding); } -} -if (!function_exists('mb_parse_str')) { - function mb_parse_str(?string $string, &$result = []): bool { parse_str((string) $string, $result); return (bool) $result; } -} -if (!function_exists('mb_strlen')) { - function mb_strlen(?string $string, ?string $encoding = null): int { return p\Mbstring::mb_strlen((string) $string, $encoding); } -} -if (!function_exists('mb_strpos')) { - function mb_strpos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\Mbstring::mb_strpos((string) $haystack, (string) $needle, (int) $offset, $encoding); } -} -if (!function_exists('mb_strtolower')) { - function mb_strtolower(?string $string, ?string $encoding = null): string { return p\Mbstring::mb_strtolower((string) $string, $encoding); } -} -if (!function_exists('mb_strtoupper')) { - function mb_strtoupper(?string $string, ?string $encoding = null): string { return p\Mbstring::mb_strtoupper((string) $string, $encoding); } -} -if (!function_exists('mb_substitute_character')) { - function mb_substitute_character(string|int|null $substitute_character = null): string|int|bool { return p\Mbstring::mb_substitute_character($substitute_character); } -} -if (!function_exists('mb_substr')) { - function mb_substr(?string $string, ?int $start, ?int $length = null, ?string $encoding = null): string { return p\Mbstring::mb_substr((string) $string, (int) $start, $length, $encoding); } -} -if (!function_exists('mb_stripos')) { - function mb_stripos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\Mbstring::mb_stripos((string) $haystack, (string) $needle, (int) $offset, $encoding); } -} -if (!function_exists('mb_stristr')) { - function mb_stristr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_stristr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); } -} -if (!function_exists('mb_strrchr')) { - function mb_strrchr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_strrchr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); } -} -if (!function_exists('mb_strrichr')) { - function mb_strrichr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_strrichr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); } -} -if (!function_exists('mb_strripos')) { - function mb_strripos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\Mbstring::mb_strripos((string) $haystack, (string) $needle, (int) $offset, $encoding); } -} -if (!function_exists('mb_strrpos')) { - function mb_strrpos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\Mbstring::mb_strrpos((string) $haystack, (string) $needle, (int) $offset, $encoding); } -} -if (!function_exists('mb_strstr')) { - function mb_strstr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_strstr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); } -} -if (!function_exists('mb_get_info')) { - function mb_get_info(?string $type = 'all'): array|string|int|false { return p\Mbstring::mb_get_info((string) $type); } -} -if (!function_exists('mb_http_output')) { - function mb_http_output(?string $encoding = null): string|bool { return p\Mbstring::mb_http_output($encoding); } -} -if (!function_exists('mb_strwidth')) { - function mb_strwidth(?string $string, ?string $encoding = null): int { return p\Mbstring::mb_strwidth((string) $string, $encoding); } -} -if (!function_exists('mb_substr_count')) { - function mb_substr_count(?string $haystack, ?string $needle, ?string $encoding = null): int { return p\Mbstring::mb_substr_count((string) $haystack, (string) $needle, $encoding); } -} -if (!function_exists('mb_output_handler')) { - function mb_output_handler(?string $string, ?int $status): string { return p\Mbstring::mb_output_handler((string) $string, (int) $status); } -} -if (!function_exists('mb_http_input')) { - function mb_http_input(?string $type = null): array|string|false { return p\Mbstring::mb_http_input($type); } -} - -if (!function_exists('mb_convert_variables')) { - function mb_convert_variables(?string $to_encoding, array|string|null $from_encoding, mixed &$var, mixed &...$vars): string|false { return p\Mbstring::mb_convert_variables((string) $to_encoding, $from_encoding ?? '', $var, ...$vars); } -} - -if (!function_exists('mb_ord')) { - function mb_ord(?string $string, ?string $encoding = null): int|false { return p\Mbstring::mb_ord((string) $string, $encoding); } -} -if (!function_exists('mb_chr')) { - function mb_chr(?int $codepoint, ?string $encoding = null): string|false { return p\Mbstring::mb_chr((int) $codepoint, $encoding); } -} -if (!function_exists('mb_scrub')) { - 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); } -} - -if (extension_loaded('mbstring')) { - return; -} - -if (!defined('MB_CASE_UPPER')) { - define('MB_CASE_UPPER', 0); -} -if (!defined('MB_CASE_LOWER')) { - define('MB_CASE_LOWER', 1); -} -if (!defined('MB_CASE_TITLE')) { - define('MB_CASE_TITLE', 2); -} diff --git a/tools/php-cs-fixer/vendor/symfony/polyfill-mbstring/composer.json b/tools/php-cs-fixer/vendor/symfony/polyfill-mbstring/composer.json deleted file mode 100644 index 2ed7a74..0000000 --- a/tools/php-cs-fixer/vendor/symfony/polyfill-mbstring/composer.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "symfony/polyfill-mbstring", - "type": "library", - "description": "Symfony polyfill for the Mbstring extension", - "keywords": ["polyfill", "shim", "compatibility", "portable", "mbstring"], - "homepage": "https://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "require": { - "php": ">=7.1" - }, - "autoload": { - "psr-4": { "Symfony\\Polyfill\\Mbstring\\": "" }, - "files": [ "bootstrap.php" ] - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "minimum-stability": "dev", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/polyfill-php72/LICENSE b/tools/php-cs-fixer/vendor/symfony/polyfill-php72/LICENSE deleted file mode 100644 index 4cd8bdd..0000000 --- a/tools/php-cs-fixer/vendor/symfony/polyfill-php72/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2015-2019 Fabien Potencier - -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/tools/php-cs-fixer/vendor/symfony/polyfill-php72/Php72.php b/tools/php-cs-fixer/vendor/symfony/polyfill-php72/Php72.php deleted file mode 100644 index 5e20d5b..0000000 --- a/tools/php-cs-fixer/vendor/symfony/polyfill-php72/Php72.php +++ /dev/null @@ -1,217 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Polyfill\Php72; - -/** - * @author Nicolas Grekas - * @author Dariusz Rumiński - * - * @internal - */ -final class Php72 -{ - private static $hashMask; - - public static function utf8_encode($s) - { - $s .= $s; - $len = \strlen($s); - - for ($i = $len >> 1, $j = 0; $i < $len; ++$i, ++$j) { - switch (true) { - case $s[$i] < "\x80": $s[$j] = $s[$i]; break; - case $s[$i] < "\xC0": $s[$j] = "\xC2"; $s[++$j] = $s[$i]; break; - default: $s[$j] = "\xC3"; $s[++$j] = \chr(\ord($s[$i]) - 64); break; - } - } - - return substr($s, 0, $j); - } - - public static function utf8_decode($s) - { - $s = (string) $s; - $len = \strlen($s); - - for ($i = 0, $j = 0; $i < $len; ++$i, ++$j) { - switch ($s[$i] & "\xF0") { - case "\xC0": - case "\xD0": - $c = (\ord($s[$i] & "\x1F") << 6) | \ord($s[++$i] & "\x3F"); - $s[$j] = $c < 256 ? \chr($c) : '?'; - break; - - case "\xF0": - ++$i; - // no break - - case "\xE0": - $s[$j] = '?'; - $i += 2; - break; - - default: - $s[$j] = $s[$i]; - } - } - - return substr($s, 0, $j); - } - - public static function php_os_family() - { - if ('\\' === \DIRECTORY_SEPARATOR) { - return 'Windows'; - } - - $map = [ - 'Darwin' => 'Darwin', - 'DragonFly' => 'BSD', - 'FreeBSD' => 'BSD', - 'NetBSD' => 'BSD', - 'OpenBSD' => 'BSD', - 'Linux' => 'Linux', - 'SunOS' => 'Solaris', - ]; - - return isset($map[\PHP_OS]) ? $map[\PHP_OS] : 'Unknown'; - } - - public static function spl_object_id($object) - { - if (null === self::$hashMask) { - self::initHashMask(); - } - if (null === $hash = spl_object_hash($object)) { - return; - } - - // On 32-bit systems, PHP_INT_SIZE is 4, - return self::$hashMask ^ hexdec(substr($hash, 16 - (\PHP_INT_SIZE * 2 - 1), (\PHP_INT_SIZE * 2 - 1))); - } - - public static function sapi_windows_vt100_support($stream, $enable = null) - { - if (!\is_resource($stream)) { - trigger_error('sapi_windows_vt100_support() expects parameter 1 to be resource, '.\gettype($stream).' given', \E_USER_WARNING); - - return false; - } - - $meta = stream_get_meta_data($stream); - - if ('STDIO' !== $meta['stream_type']) { - trigger_error('sapi_windows_vt100_support() was not able to analyze the specified stream', \E_USER_WARNING); - - return false; - } - - // We cannot actually disable vt100 support if it is set - if (false === $enable || !self::stream_isatty($stream)) { - return false; - } - - // The native function does not apply to stdin - $meta = array_map('strtolower', $meta); - $stdin = 'php://stdin' === $meta['uri'] || 'php://fd/0' === $meta['uri']; - - return !$stdin - && (false !== getenv('ANSICON') - || 'ON' === getenv('ConEmuANSI') - || 'xterm' === getenv('TERM') - || 'Hyper' === getenv('TERM_PROGRAM')); - } - - public static function stream_isatty($stream) - { - if (!\is_resource($stream)) { - trigger_error('stream_isatty() expects parameter 1 to be resource, '.\gettype($stream).' given', \E_USER_WARNING); - - return false; - } - - if ('\\' === \DIRECTORY_SEPARATOR) { - $stat = @fstat($stream); - // Check if formatted mode is S_IFCHR - return $stat ? 0020000 === ($stat['mode'] & 0170000) : false; - } - - return \function_exists('posix_isatty') && @posix_isatty($stream); - } - - private static function initHashMask() - { - $obj = (object) []; - self::$hashMask = -1; - - // check if we are nested in an output buffering handler to prevent a fatal error with ob_start() below - $obFuncs = ['ob_clean', 'ob_end_clean', 'ob_flush', 'ob_end_flush', 'ob_get_contents', 'ob_get_flush']; - foreach (debug_backtrace(\PHP_VERSION_ID >= 50400 ? \DEBUG_BACKTRACE_IGNORE_ARGS : false) as $frame) { - if (isset($frame['function'][0]) && !isset($frame['class']) && 'o' === $frame['function'][0] && \in_array($frame['function'], $obFuncs)) { - $frame['line'] = 0; - break; - } - } - if (!empty($frame['line'])) { - ob_start(); - debug_zval_dump($obj); - self::$hashMask = (int) substr(ob_get_clean(), 17); - } - - self::$hashMask ^= hexdec(substr(spl_object_hash($obj), 16 - (\PHP_INT_SIZE * 2 - 1), (\PHP_INT_SIZE * 2 - 1))); - } - - public static function mb_chr($code, $encoding = null) - { - if (0x80 > $code %= 0x200000) { - $s = \chr($code); - } elseif (0x800 > $code) { - $s = \chr(0xC0 | $code >> 6).\chr(0x80 | $code & 0x3F); - } elseif (0x10000 > $code) { - $s = \chr(0xE0 | $code >> 12).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F); - } else { - $s = \chr(0xF0 | $code >> 18).\chr(0x80 | $code >> 12 & 0x3F).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F); - } - - if ('UTF-8' !== $encoding = $encoding ?? mb_internal_encoding()) { - $s = mb_convert_encoding($s, $encoding, 'UTF-8'); - } - - return $s; - } - - public static function mb_ord($s, $encoding = null) - { - if (null === $encoding) { - $s = mb_convert_encoding($s, 'UTF-8'); - } elseif ('UTF-8' !== $encoding) { - $s = mb_convert_encoding($s, 'UTF-8', $encoding); - } - - if (1 === \strlen($s)) { - return \ord($s); - } - - $code = ($s = unpack('C*', substr($s, 0, 4))) ? $s[1] : 0; - if (0xF0 <= $code) { - return (($code - 0xF0) << 18) + (($s[2] - 0x80) << 12) + (($s[3] - 0x80) << 6) + $s[4] - 0x80; - } - if (0xE0 <= $code) { - return (($code - 0xE0) << 12) + (($s[2] - 0x80) << 6) + $s[3] - 0x80; - } - if (0xC0 <= $code) { - return (($code - 0xC0) << 6) + $s[2] - 0x80; - } - - return $code; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/polyfill-php72/README.md b/tools/php-cs-fixer/vendor/symfony/polyfill-php72/README.md deleted file mode 100644 index 59dec8a..0000000 --- a/tools/php-cs-fixer/vendor/symfony/polyfill-php72/README.md +++ /dev/null @@ -1,28 +0,0 @@ -Symfony Polyfill / Php72 -======================== - -This component provides functions added to PHP 7.2 core: - -- [`spl_object_id`](https://php.net/spl_object_id) -- [`stream_isatty`](https://php.net/stream_isatty) - -On Windows only: - -- [`sapi_windows_vt100_support`](https://php.net/sapi_windows_vt100_support) - -Moved to core since 7.2 (was in the optional XML extension earlier): - -- [`utf8_encode`](https://php.net/utf8_encode) -- [`utf8_decode`](https://php.net/utf8_decode) - -Also, it provides constants added to PHP 7.2: -- [`PHP_FLOAT_*`](https://php.net/reserved.constants#constant.php-float-dig) -- [`PHP_OS_FAMILY`](https://php.net/reserved.constants#constant.php-os-family) - -More information can be found in the -[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). - -License -======= - -This library is released under the [MIT license](LICENSE). diff --git a/tools/php-cs-fixer/vendor/symfony/polyfill-php72/bootstrap.php b/tools/php-cs-fixer/vendor/symfony/polyfill-php72/bootstrap.php deleted file mode 100644 index b5c92d4..0000000 --- a/tools/php-cs-fixer/vendor/symfony/polyfill-php72/bootstrap.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use Symfony\Polyfill\Php72 as p; - -if (\PHP_VERSION_ID >= 70200) { - return; -} - -if (!defined('PHP_FLOAT_DIG')) { - define('PHP_FLOAT_DIG', 15); -} -if (!defined('PHP_FLOAT_EPSILON')) { - define('PHP_FLOAT_EPSILON', 2.2204460492503E-16); -} -if (!defined('PHP_FLOAT_MIN')) { - define('PHP_FLOAT_MIN', 2.2250738585072E-308); -} -if (!defined('PHP_FLOAT_MAX')) { - define('PHP_FLOAT_MAX', 1.7976931348623157E+308); -} -if (!defined('PHP_OS_FAMILY')) { - define('PHP_OS_FAMILY', p\Php72::php_os_family()); -} - -if ('\\' === \DIRECTORY_SEPARATOR && !function_exists('sapi_windows_vt100_support')) { - function sapi_windows_vt100_support($stream, $enable = null) { return p\Php72::sapi_windows_vt100_support($stream, $enable); } -} -if (!function_exists('stream_isatty')) { - function stream_isatty($stream) { return p\Php72::stream_isatty($stream); } -} -if (!function_exists('utf8_encode')) { - function utf8_encode($string) { return p\Php72::utf8_encode($string); } -} -if (!function_exists('utf8_decode')) { - function utf8_decode($string) { return p\Php72::utf8_decode($string); } -} -if (!function_exists('spl_object_id')) { - function spl_object_id($object) { return p\Php72::spl_object_id($object); } -} -if (!function_exists('mb_ord')) { - function mb_ord($string, $encoding = null) { return p\Php72::mb_ord($string, $encoding); } -} -if (!function_exists('mb_chr')) { - function mb_chr($codepoint, $encoding = null) { return p\Php72::mb_chr($codepoint, $encoding); } -} -if (!function_exists('mb_scrub')) { - function mb_scrub($string, $encoding = null) { $encoding = null === $encoding ? mb_internal_encoding() : $encoding; return mb_convert_encoding($string, $encoding, $encoding); } -} diff --git a/tools/php-cs-fixer/vendor/symfony/polyfill-php72/composer.json b/tools/php-cs-fixer/vendor/symfony/polyfill-php72/composer.json deleted file mode 100644 index c96c844..0000000 --- a/tools/php-cs-fixer/vendor/symfony/polyfill-php72/composer.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "symfony/polyfill-php72", - "type": "library", - "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", - "keywords": ["polyfill", "shim", "compatibility", "portable"], - "homepage": "https://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "require": { - "php": ">=7.1" - }, - "autoload": { - "psr-4": { "Symfony\\Polyfill\\Php72\\": "" }, - "files": [ "bootstrap.php" ] - }, - "minimum-stability": "dev", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/polyfill-php73/LICENSE b/tools/php-cs-fixer/vendor/symfony/polyfill-php73/LICENSE deleted file mode 100644 index 3f853aa..0000000 --- a/tools/php-cs-fixer/vendor/symfony/polyfill-php73/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2018-2019 Fabien Potencier - -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/tools/php-cs-fixer/vendor/symfony/polyfill-php73/Php73.php b/tools/php-cs-fixer/vendor/symfony/polyfill-php73/Php73.php deleted file mode 100644 index 65c35a6..0000000 --- a/tools/php-cs-fixer/vendor/symfony/polyfill-php73/Php73.php +++ /dev/null @@ -1,43 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Polyfill\Php73; - -/** - * @author Gabriel Caruso - * @author Ion Bazan - * - * @internal - */ -final class Php73 -{ - public static $startAt = 1533462603; - - /** - * @param bool $asNum - * - * @return array|float|int - */ - public static function hrtime($asNum = false) - { - $ns = microtime(false); - $s = substr($ns, 11) - self::$startAt; - $ns = 1E9 * (float) $ns; - - if ($asNum) { - $ns += $s * 1E9; - - return \PHP_INT_SIZE === 4 ? $ns : (int) $ns; - } - - return [$s, (int) $ns]; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/polyfill-php73/README.md b/tools/php-cs-fixer/vendor/symfony/polyfill-php73/README.md deleted file mode 100644 index b3ebbce..0000000 --- a/tools/php-cs-fixer/vendor/symfony/polyfill-php73/README.md +++ /dev/null @@ -1,18 +0,0 @@ -Symfony Polyfill / Php73 -======================== - -This component provides functions added to PHP 7.3 core: - -- [`array_key_first`](https://php.net/array_key_first) -- [`array_key_last`](https://php.net/array_key_last) -- [`hrtime`](https://php.net/function.hrtime) -- [`is_countable`](https://php.net/is_countable) -- [`JsonException`](https://php.net/JsonException) - -More information can be found in the -[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). - -License -======= - -This library is released under the [MIT license](LICENSE). diff --git a/tools/php-cs-fixer/vendor/symfony/polyfill-php73/Resources/stubs/JsonException.php b/tools/php-cs-fixer/vendor/symfony/polyfill-php73/Resources/stubs/JsonException.php deleted file mode 100644 index 673d100..0000000 --- a/tools/php-cs-fixer/vendor/symfony/polyfill-php73/Resources/stubs/JsonException.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -class JsonException extends Exception -{ -} diff --git a/tools/php-cs-fixer/vendor/symfony/polyfill-php73/bootstrap.php b/tools/php-cs-fixer/vendor/symfony/polyfill-php73/bootstrap.php deleted file mode 100644 index d6b2153..0000000 --- a/tools/php-cs-fixer/vendor/symfony/polyfill-php73/bootstrap.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use Symfony\Polyfill\Php73 as p; - -if (\PHP_VERSION_ID >= 70300) { - return; -} - -if (!function_exists('is_countable')) { - function is_countable($value) { return is_array($value) || $value instanceof Countable || $value instanceof ResourceBundle || $value instanceof SimpleXmlElement; } -} -if (!function_exists('hrtime')) { - require_once __DIR__.'/Php73.php'; - p\Php73::$startAt = (int) microtime(true); - function hrtime($as_number = false) { return p\Php73::hrtime($as_number); } -} -if (!function_exists('array_key_first')) { - function array_key_first(array $array) { foreach ($array as $key => $value) { return $key; } } -} -if (!function_exists('array_key_last')) { - function array_key_last(array $array) { return key(array_slice($array, -1, 1, true)); } -} diff --git a/tools/php-cs-fixer/vendor/symfony/polyfill-php73/composer.json b/tools/php-cs-fixer/vendor/symfony/polyfill-php73/composer.json deleted file mode 100644 index a7fe478..0000000 --- a/tools/php-cs-fixer/vendor/symfony/polyfill-php73/composer.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "name": "symfony/polyfill-php73", - "type": "library", - "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", - "keywords": ["polyfill", "shim", "compatibility", "portable"], - "homepage": "https://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "require": { - "php": ">=7.1" - }, - "autoload": { - "psr-4": { "Symfony\\Polyfill\\Php73\\": "" }, - "files": [ "bootstrap.php" ], - "classmap": [ "Resources/stubs" ] - }, - "minimum-stability": "dev", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/polyfill-php80/LICENSE b/tools/php-cs-fixer/vendor/symfony/polyfill-php80/LICENSE deleted file mode 100644 index 5593b1d..0000000 --- a/tools/php-cs-fixer/vendor/symfony/polyfill-php80/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2020 Fabien Potencier - -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/tools/php-cs-fixer/vendor/symfony/polyfill-php80/Php80.php b/tools/php-cs-fixer/vendor/symfony/polyfill-php80/Php80.php deleted file mode 100644 index 5fef511..0000000 --- a/tools/php-cs-fixer/vendor/symfony/polyfill-php80/Php80.php +++ /dev/null @@ -1,105 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Polyfill\Php80; - -/** - * @author Ion Bazan - * @author Nico Oelgart - * @author Nicolas Grekas - * - * @internal - */ -final class Php80 -{ - public static function fdiv(float $dividend, float $divisor): float - { - return @($dividend / $divisor); - } - - public static function get_debug_type($value): string - { - switch (true) { - case null === $value: return 'null'; - case \is_bool($value): return 'bool'; - case \is_string($value): return 'string'; - case \is_array($value): return 'array'; - case \is_int($value): return 'int'; - case \is_float($value): return 'float'; - case \is_object($value): break; - case $value instanceof \__PHP_Incomplete_Class: return '__PHP_Incomplete_Class'; - default: - if (null === $type = @get_resource_type($value)) { - return 'unknown'; - } - - if ('Unknown' === $type) { - $type = 'closed'; - } - - return "resource ($type)"; - } - - $class = \get_class($value); - - if (false === strpos($class, '@')) { - return $class; - } - - return (get_parent_class($class) ?: key(class_implements($class)) ?: 'class').'@anonymous'; - } - - public static function get_resource_id($res): int - { - if (!\is_resource($res) && null === @get_resource_type($res)) { - throw new \TypeError(sprintf('Argument 1 passed to get_resource_id() must be of the type resource, %s given', get_debug_type($res))); - } - - return (int) $res; - } - - public static function preg_last_error_msg(): string - { - switch (preg_last_error()) { - case \PREG_INTERNAL_ERROR: - return 'Internal error'; - case \PREG_BAD_UTF8_ERROR: - return 'Malformed UTF-8 characters, possibly incorrectly encoded'; - case \PREG_BAD_UTF8_OFFSET_ERROR: - return 'The offset did not correspond to the beginning of a valid UTF-8 code point'; - case \PREG_BACKTRACK_LIMIT_ERROR: - return 'Backtrack limit exhausted'; - case \PREG_RECURSION_LIMIT_ERROR: - return 'Recursion limit exhausted'; - case \PREG_JIT_STACKLIMIT_ERROR: - return 'JIT stack limit exhausted'; - case \PREG_NO_ERROR: - return 'No error'; - default: - return 'Unknown error'; - } - } - - public static function str_contains(string $haystack, string $needle): bool - { - return '' === $needle || false !== strpos($haystack, $needle); - } - - public static function str_starts_with(string $haystack, string $needle): bool - { - return 0 === strncmp($haystack, $needle, \strlen($needle)); - } - - public static function str_ends_with(string $haystack, string $needle): bool - { - return '' === $needle || ('' !== $haystack && 0 === substr_compare($haystack, $needle, -\strlen($needle))); - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/polyfill-php80/README.md b/tools/php-cs-fixer/vendor/symfony/polyfill-php80/README.md deleted file mode 100644 index 10b8ee4..0000000 --- a/tools/php-cs-fixer/vendor/symfony/polyfill-php80/README.md +++ /dev/null @@ -1,24 +0,0 @@ -Symfony Polyfill / Php80 -======================== - -This component provides features added to PHP 8.0 core: - -- `Stringable` interface -- [`fdiv`](https://php.net/fdiv) -- `ValueError` class -- `UnhandledMatchError` class -- `FILTER_VALIDATE_BOOL` constant -- [`get_debug_type`](https://php.net/get_debug_type) -- [`preg_last_error_msg`](https://php.net/preg_last_error_msg) -- [`str_contains`](https://php.net/str_contains) -- [`str_starts_with`](https://php.net/str_starts_with) -- [`str_ends_with`](https://php.net/str_ends_with) -- [`get_resource_id`](https://php.net/get_resource_id) - -More information can be found in the -[main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md). - -License -======= - -This library is released under the [MIT license](LICENSE). diff --git a/tools/php-cs-fixer/vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php b/tools/php-cs-fixer/vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php deleted file mode 100644 index 7ea6d27..0000000 --- a/tools/php-cs-fixer/vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php +++ /dev/null @@ -1,22 +0,0 @@ -flags = $flags; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php b/tools/php-cs-fixer/vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php deleted file mode 100644 index 77e037c..0000000 --- a/tools/php-cs-fixer/vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php +++ /dev/null @@ -1,11 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use Symfony\Polyfill\Php80 as p; - -if (\PHP_VERSION_ID >= 80000) { - return; -} - -if (!defined('FILTER_VALIDATE_BOOL') && defined('FILTER_VALIDATE_BOOLEAN')) { - define('FILTER_VALIDATE_BOOL', \FILTER_VALIDATE_BOOLEAN); -} - -if (!function_exists('fdiv')) { - function fdiv(float $num1, float $num2): float { return p\Php80::fdiv($num1, $num2); } -} -if (!function_exists('preg_last_error_msg')) { - function preg_last_error_msg(): string { return p\Php80::preg_last_error_msg(); } -} -if (!function_exists('str_contains')) { - function str_contains(?string $haystack, ?string $needle): bool { return p\Php80::str_contains($haystack ?? '', $needle ?? ''); } -} -if (!function_exists('str_starts_with')) { - function str_starts_with(?string $haystack, ?string $needle): bool { return p\Php80::str_starts_with($haystack ?? '', $needle ?? ''); } -} -if (!function_exists('str_ends_with')) { - function str_ends_with(?string $haystack, ?string $needle): bool { return p\Php80::str_ends_with($haystack ?? '', $needle ?? ''); } -} -if (!function_exists('get_debug_type')) { - function get_debug_type($value): string { return p\Php80::get_debug_type($value); } -} -if (!function_exists('get_resource_id')) { - function get_resource_id($resource): int { return p\Php80::get_resource_id($resource); } -} diff --git a/tools/php-cs-fixer/vendor/symfony/polyfill-php80/composer.json b/tools/php-cs-fixer/vendor/symfony/polyfill-php80/composer.json deleted file mode 100644 index 5fe679d..0000000 --- a/tools/php-cs-fixer/vendor/symfony/polyfill-php80/composer.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "symfony/polyfill-php80", - "type": "library", - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", - "keywords": ["polyfill", "shim", "compatibility", "portable"], - "homepage": "https://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "require": { - "php": ">=7.1" - }, - "autoload": { - "psr-4": { "Symfony\\Polyfill\\Php80\\": "" }, - "files": [ "bootstrap.php" ], - "classmap": [ "Resources/stubs" ] - }, - "minimum-stability": "dev", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/polyfill-php81/LICENSE b/tools/php-cs-fixer/vendor/symfony/polyfill-php81/LICENSE deleted file mode 100644 index efb17f9..0000000 --- a/tools/php-cs-fixer/vendor/symfony/polyfill-php81/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2021 Fabien Potencier - -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/tools/php-cs-fixer/vendor/symfony/polyfill-php81/Php81.php b/tools/php-cs-fixer/vendor/symfony/polyfill-php81/Php81.php deleted file mode 100644 index 709c20b..0000000 --- a/tools/php-cs-fixer/vendor/symfony/polyfill-php81/Php81.php +++ /dev/null @@ -1,37 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Polyfill\Php81; - -/** - * @author Nicolas Grekas - * - * @internal - */ -final class Php81 -{ - public static function array_is_list(array $array): bool - { - if ([] === $array) { - return true; - } - - $nextKey = -1; - - foreach ($array as $k => $v) { - if ($k !== ++$nextKey) { - return false; - } - } - - return true; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/polyfill-php81/README.md b/tools/php-cs-fixer/vendor/symfony/polyfill-php81/README.md deleted file mode 100644 index 5ef61be..0000000 --- a/tools/php-cs-fixer/vendor/symfony/polyfill-php81/README.md +++ /dev/null @@ -1,16 +0,0 @@ -Symfony Polyfill / Php81 -======================== - -This component provides features added to PHP 8.1 core: - -- [`array_is_list`](https://php.net/array_is_list) -- [`MYSQLI_REFRESH_REPLICA`](https://www.php.net/manual/en/mysqli.constants.php#constantmysqli-refresh-replica) constant -- [`ReturnTypeWillChange`](https://wiki.php.net/rfc/internal_method_return_types) - -More information can be found in the -[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). - -License -======= - -This library is released under the [MIT license](LICENSE). diff --git a/tools/php-cs-fixer/vendor/symfony/polyfill-php81/Resources/stubs/ReturnTypeWillChange.php b/tools/php-cs-fixer/vendor/symfony/polyfill-php81/Resources/stubs/ReturnTypeWillChange.php deleted file mode 100644 index 197709b..0000000 --- a/tools/php-cs-fixer/vendor/symfony/polyfill-php81/Resources/stubs/ReturnTypeWillChange.php +++ /dev/null @@ -1,9 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use Symfony\Polyfill\Php81 as p; - -if (\PHP_VERSION_ID >= 80100) { - return; -} - -if (defined('MYSQLI_REFRESH_SLAVE') && !defined('MYSQLI_REFRESH_REPLICA')) { - define('MYSQLI_REFRESH_REPLICA', 64); -} - -if (!function_exists('array_is_list')) { - function array_is_list(array $array): bool { return p\Php81::array_is_list($array); } -} - -if (!function_exists('enum_exists')) { - function enum_exists(string $enum, bool $autoload = true): bool { return $autoload && class_exists($enum) && false; } -} diff --git a/tools/php-cs-fixer/vendor/symfony/polyfill-php81/composer.json b/tools/php-cs-fixer/vendor/symfony/polyfill-php81/composer.json deleted file mode 100644 index c39ccf4..0000000 --- a/tools/php-cs-fixer/vendor/symfony/polyfill-php81/composer.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "name": "symfony/polyfill-php81", - "type": "library", - "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", - "keywords": ["polyfill", "shim", "compatibility", "portable"], - "homepage": "https://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "require": { - "php": ">=7.1" - }, - "autoload": { - "psr-4": { "Symfony\\Polyfill\\Php81\\": "" }, - "files": [ "bootstrap.php" ], - "classmap": [ "Resources/stubs" ] - }, - "minimum-stability": "dev", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/process/CHANGELOG.md b/tools/php-cs-fixer/vendor/symfony/process/CHANGELOG.md deleted file mode 100644 index 31b9ee6..0000000 --- a/tools/php-cs-fixer/vendor/symfony/process/CHANGELOG.md +++ /dev/null @@ -1,116 +0,0 @@ -CHANGELOG -========= - -5.2.0 ------ - - * added `Process::setOptions()` to set `Process` specific options - * added option `create_new_console` to allow a subprocess to continue - to run after the main script exited, both on Linux and on Windows - -5.1.0 ------ - - * added `Process::getStartTime()` to retrieve the start time of the process as float - -5.0.0 ------ - - * removed `Process::inheritEnvironmentVariables()` - * removed `PhpProcess::setPhpBinary()` - * `Process` must be instantiated with a command array, use `Process::fromShellCommandline()` when the command should be parsed by the shell - * removed `Process::setCommandLine()` - -4.4.0 ------ - - * deprecated `Process::inheritEnvironmentVariables()`: env variables are always inherited. - * added `Process::getLastOutputTime()` method - -4.2.0 ------ - - * added the `Process::fromShellCommandline()` to run commands in a shell wrapper - * deprecated passing a command as string when creating a `Process` instance - * deprecated the `Process::setCommandline()` and the `PhpProcess::setPhpBinary()` methods - * added the `Process::waitUntil()` method to wait for the process only for a - specific output, then continue the normal execution of your application - -4.1.0 ------ - - * added the `Process::isTtySupported()` method that allows to check for TTY support - * made `PhpExecutableFinder` look for the `PHP_BINARY` env var when searching the php binary - * added the `ProcessSignaledException` class to properly catch signaled process errors - -4.0.0 ------ - - * environment variables will always be inherited - * added a second `array $env = []` argument to the `start()`, `run()`, - `mustRun()`, and `restart()` methods of the `Process` class - * added a second `array $env = []` argument to the `start()` method of the - `PhpProcess` class - * the `ProcessUtils::escapeArgument()` method has been removed - * the `areEnvironmentVariablesInherited()`, `getOptions()`, and `setOptions()` - methods of the `Process` class have been removed - * support for passing `proc_open()` options has been removed - * removed the `ProcessBuilder` class, use the `Process` class instead - * removed the `getEnhanceWindowsCompatibility()` and `setEnhanceWindowsCompatibility()` methods of the `Process` class - * passing a not existing working directory to the constructor of the `Symfony\Component\Process\Process` class is not - supported anymore - -3.4.0 ------ - - * deprecated the ProcessBuilder class - * deprecated calling `Process::start()` without setting a valid working directory beforehand (via `setWorkingDirectory()` or constructor) - -3.3.0 ------ - - * added command line arrays in the `Process` class - * added `$env` argument to `Process::start()`, `run()`, `mustRun()` and `restart()` methods - * deprecated the `ProcessUtils::escapeArgument()` method - * deprecated not inheriting environment variables - * deprecated configuring `proc_open()` options - * deprecated configuring enhanced Windows compatibility - * deprecated configuring enhanced sigchild compatibility - -2.5.0 ------ - - * added support for PTY mode - * added the convenience method "mustRun" - * deprecation: Process::setStdin() is deprecated in favor of Process::setInput() - * deprecation: Process::getStdin() is deprecated in favor of Process::getInput() - * deprecation: Process::setInput() and ProcessBuilder::setInput() do not accept non-scalar types - -2.4.0 ------ - - * added the ability to define an idle timeout - -2.3.0 ------ - - * added ProcessUtils::escapeArgument() to fix the bug in escapeshellarg() function on Windows - * added Process::signal() - * added Process::getPid() - * added support for a TTY mode - -2.2.0 ------ - - * added ProcessBuilder::setArguments() to reset the arguments on a builder - * added a way to retrieve the standard and error output incrementally - * added Process:restart() - -2.1.0 ------ - - * added support for non-blocking processes (start(), wait(), isRunning(), stop()) - * enhanced Windows compatibility - * added Process::getExitCodeText() that returns a string representation for - the exit code returned by the process - * added ProcessBuilder diff --git a/tools/php-cs-fixer/vendor/symfony/process/Exception/ExceptionInterface.php b/tools/php-cs-fixer/vendor/symfony/process/Exception/ExceptionInterface.php deleted file mode 100644 index bd4a604..0000000 --- a/tools/php-cs-fixer/vendor/symfony/process/Exception/ExceptionInterface.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Process\Exception; - -/** - * Marker Interface for the Process Component. - * - * @author Johannes M. Schmitt - */ -interface ExceptionInterface extends \Throwable -{ -} diff --git a/tools/php-cs-fixer/vendor/symfony/process/Exception/InvalidArgumentException.php b/tools/php-cs-fixer/vendor/symfony/process/Exception/InvalidArgumentException.php deleted file mode 100644 index 926ee21..0000000 --- a/tools/php-cs-fixer/vendor/symfony/process/Exception/InvalidArgumentException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Process\Exception; - -/** - * InvalidArgumentException for the Process Component. - * - * @author Romain Neutron - */ -class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface -{ -} diff --git a/tools/php-cs-fixer/vendor/symfony/process/Exception/LogicException.php b/tools/php-cs-fixer/vendor/symfony/process/Exception/LogicException.php deleted file mode 100644 index be3d490..0000000 --- a/tools/php-cs-fixer/vendor/symfony/process/Exception/LogicException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Process\Exception; - -/** - * LogicException for the Process Component. - * - * @author Romain Neutron - */ -class LogicException extends \LogicException implements ExceptionInterface -{ -} diff --git a/tools/php-cs-fixer/vendor/symfony/process/Exception/ProcessFailedException.php b/tools/php-cs-fixer/vendor/symfony/process/Exception/ProcessFailedException.php deleted file mode 100644 index 328acfd..0000000 --- a/tools/php-cs-fixer/vendor/symfony/process/Exception/ProcessFailedException.php +++ /dev/null @@ -1,54 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Process\Exception; - -use Symfony\Component\Process\Process; - -/** - * Exception for failed processes. - * - * @author Johannes M. Schmitt - */ -class ProcessFailedException extends RuntimeException -{ - private $process; - - public function __construct(Process $process) - { - if ($process->isSuccessful()) { - throw new InvalidArgumentException('Expected a failed process, but the given process was successful.'); - } - - $error = sprintf('The command "%s" failed.'."\n\nExit Code: %s(%s)\n\nWorking directory: %s", - $process->getCommandLine(), - $process->getExitCode(), - $process->getExitCodeText(), - $process->getWorkingDirectory() - ); - - if (!$process->isOutputDisabled()) { - $error .= sprintf("\n\nOutput:\n================\n%s\n\nError Output:\n================\n%s", - $process->getOutput(), - $process->getErrorOutput() - ); - } - - parent::__construct($error); - - $this->process = $process; - } - - public function getProcess() - { - return $this->process; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/process/Exception/ProcessSignaledException.php b/tools/php-cs-fixer/vendor/symfony/process/Exception/ProcessSignaledException.php deleted file mode 100644 index d4d3227..0000000 --- a/tools/php-cs-fixer/vendor/symfony/process/Exception/ProcessSignaledException.php +++ /dev/null @@ -1,41 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Process\Exception; - -use Symfony\Component\Process\Process; - -/** - * Exception that is thrown when a process has been signaled. - * - * @author Sullivan Senechal - */ -final class ProcessSignaledException extends RuntimeException -{ - private $process; - - public function __construct(Process $process) - { - $this->process = $process; - - parent::__construct(sprintf('The process has been signaled with signal "%s".', $process->getTermSignal())); - } - - public function getProcess(): Process - { - return $this->process; - } - - public function getSignal(): int - { - return $this->getProcess()->getTermSignal(); - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/process/Exception/ProcessTimedOutException.php b/tools/php-cs-fixer/vendor/symfony/process/Exception/ProcessTimedOutException.php deleted file mode 100644 index 94391a4..0000000 --- a/tools/php-cs-fixer/vendor/symfony/process/Exception/ProcessTimedOutException.php +++ /dev/null @@ -1,69 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Process\Exception; - -use Symfony\Component\Process\Process; - -/** - * Exception that is thrown when a process times out. - * - * @author Johannes M. Schmitt - */ -class ProcessTimedOutException extends RuntimeException -{ - public const TYPE_GENERAL = 1; - public const TYPE_IDLE = 2; - - private $process; - private $timeoutType; - - public function __construct(Process $process, int $timeoutType) - { - $this->process = $process; - $this->timeoutType = $timeoutType; - - parent::__construct(sprintf( - 'The process "%s" exceeded the timeout of %s seconds.', - $process->getCommandLine(), - $this->getExceededTimeout() - )); - } - - public function getProcess() - { - return $this->process; - } - - public function isGeneralTimeout() - { - return self::TYPE_GENERAL === $this->timeoutType; - } - - public function isIdleTimeout() - { - return self::TYPE_IDLE === $this->timeoutType; - } - - public function getExceededTimeout() - { - switch ($this->timeoutType) { - case self::TYPE_GENERAL: - return $this->process->getTimeout(); - - case self::TYPE_IDLE: - return $this->process->getIdleTimeout(); - - default: - throw new \LogicException(sprintf('Unknown timeout type "%d".', $this->timeoutType)); - } - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/process/Exception/RuntimeException.php b/tools/php-cs-fixer/vendor/symfony/process/Exception/RuntimeException.php deleted file mode 100644 index adead25..0000000 --- a/tools/php-cs-fixer/vendor/symfony/process/Exception/RuntimeException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Process\Exception; - -/** - * RuntimeException for the Process Component. - * - * @author Johannes M. Schmitt - */ -class RuntimeException extends \RuntimeException implements ExceptionInterface -{ -} diff --git a/tools/php-cs-fixer/vendor/symfony/process/ExecutableFinder.php b/tools/php-cs-fixer/vendor/symfony/process/ExecutableFinder.php deleted file mode 100644 index feee4ad..0000000 --- a/tools/php-cs-fixer/vendor/symfony/process/ExecutableFinder.php +++ /dev/null @@ -1,86 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Process; - -/** - * Generic executable finder. - * - * @author Fabien Potencier - * @author Johannes M. Schmitt - */ -class ExecutableFinder -{ - private $suffixes = ['.exe', '.bat', '.cmd', '.com']; - - /** - * Replaces default suffixes of executable. - */ - public function setSuffixes(array $suffixes) - { - $this->suffixes = $suffixes; - } - - /** - * Adds new possible suffix to check for executable. - */ - public function addSuffix(string $suffix) - { - $this->suffixes[] = $suffix; - } - - /** - * Finds an executable by name. - * - * @param string $name The executable name (without the extension) - * @param string|null $default The default to return if no executable is found - * @param array $extraDirs Additional dirs to check into - * - * @return string|null The executable path or default value - */ - public function find(string $name, string $default = null, array $extraDirs = []) - { - if (ini_get('open_basedir')) { - $searchPath = array_merge(explode(\PATH_SEPARATOR, ini_get('open_basedir')), $extraDirs); - $dirs = []; - foreach ($searchPath as $path) { - // Silencing against https://bugs.php.net/69240 - if (@is_dir($path)) { - $dirs[] = $path; - } else { - if (basename($path) == $name && @is_executable($path)) { - return $path; - } - } - } - } else { - $dirs = array_merge( - explode(\PATH_SEPARATOR, getenv('PATH') ?: getenv('Path')), - $extraDirs - ); - } - - $suffixes = ['']; - if ('\\' === \DIRECTORY_SEPARATOR) { - $pathExt = getenv('PATHEXT'); - $suffixes = array_merge($pathExt ? explode(\PATH_SEPARATOR, $pathExt) : $this->suffixes, $suffixes); - } - foreach ($suffixes as $suffix) { - foreach ($dirs as $dir) { - if (@is_file($file = $dir.\DIRECTORY_SEPARATOR.$name.$suffix) && ('\\' === \DIRECTORY_SEPARATOR || @is_executable($file))) { - return $file; - } - } - } - - return $default; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/process/InputStream.php b/tools/php-cs-fixer/vendor/symfony/process/InputStream.php deleted file mode 100644 index 4f8f713..0000000 --- a/tools/php-cs-fixer/vendor/symfony/process/InputStream.php +++ /dev/null @@ -1,94 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Process; - -use Symfony\Component\Process\Exception\RuntimeException; - -/** - * Provides a way to continuously write to the input of a Process until the InputStream is closed. - * - * @author Nicolas Grekas - */ -class InputStream implements \IteratorAggregate -{ - /** @var callable|null */ - private $onEmpty = null; - private $input = []; - private $open = true; - - /** - * Sets a callback that is called when the write buffer becomes empty. - */ - public function onEmpty(callable $onEmpty = null) - { - $this->onEmpty = $onEmpty; - } - - /** - * Appends an input to the write buffer. - * - * @param resource|string|int|float|bool|\Traversable|null $input The input to append as scalar, - * stream resource or \Traversable - */ - public function write($input) - { - if (null === $input) { - return; - } - if ($this->isClosed()) { - throw new RuntimeException(sprintf('"%s" is closed.', static::class)); - } - $this->input[] = ProcessUtils::validateInput(__METHOD__, $input); - } - - /** - * Closes the write buffer. - */ - public function close() - { - $this->open = false; - } - - /** - * Tells whether the write buffer is closed or not. - */ - public function isClosed() - { - return !$this->open; - } - - /** - * @return \Traversable - */ - #[\ReturnTypeWillChange] - public function getIterator() - { - $this->open = true; - - while ($this->open || $this->input) { - if (!$this->input) { - yield ''; - continue; - } - $current = array_shift($this->input); - - if ($current instanceof \Iterator) { - yield from $current; - } else { - yield $current; - } - if (!$this->input && $this->open && null !== $onEmpty = $this->onEmpty) { - $this->write($onEmpty($this)); - } - } - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/process/LICENSE b/tools/php-cs-fixer/vendor/symfony/process/LICENSE deleted file mode 100644 index 9ff2d0d..0000000 --- a/tools/php-cs-fixer/vendor/symfony/process/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2004-2021 Fabien Potencier - -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/tools/php-cs-fixer/vendor/symfony/process/PhpExecutableFinder.php b/tools/php-cs-fixer/vendor/symfony/process/PhpExecutableFinder.php deleted file mode 100644 index e4f03f7..0000000 --- a/tools/php-cs-fixer/vendor/symfony/process/PhpExecutableFinder.php +++ /dev/null @@ -1,99 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Process; - -/** - * An executable finder specifically designed for the PHP executable. - * - * @author Fabien Potencier - * @author Johannes M. Schmitt - */ -class PhpExecutableFinder -{ - private $executableFinder; - - public function __construct() - { - $this->executableFinder = new ExecutableFinder(); - } - - /** - * Finds The PHP executable. - * - * @return string|false The PHP executable path or false if it cannot be found - */ - public function find(bool $includeArgs = true) - { - if ($php = getenv('PHP_BINARY')) { - if (!is_executable($php)) { - $command = '\\' === \DIRECTORY_SEPARATOR ? 'where' : 'command -v'; - if ($php = strtok(exec($command.' '.escapeshellarg($php)), \PHP_EOL)) { - if (!is_executable($php)) { - return false; - } - } else { - return false; - } - } - - return $php; - } - - $args = $this->findArguments(); - $args = $includeArgs && $args ? ' '.implode(' ', $args) : ''; - - // PHP_BINARY return the current sapi executable - if (\PHP_BINARY && \in_array(\PHP_SAPI, ['cgi-fcgi', 'cli', 'cli-server', 'phpdbg'], true)) { - return \PHP_BINARY.$args; - } - - if ($php = getenv('PHP_PATH')) { - if (!@is_executable($php)) { - return false; - } - - return $php; - } - - if ($php = getenv('PHP_PEAR_PHP_BIN')) { - if (@is_executable($php)) { - return $php; - } - } - - if (@is_executable($php = \PHP_BINDIR.('\\' === \DIRECTORY_SEPARATOR ? '\\php.exe' : '/php'))) { - return $php; - } - - $dirs = [\PHP_BINDIR]; - if ('\\' === \DIRECTORY_SEPARATOR) { - $dirs[] = 'C:\xampp\php\\'; - } - - return $this->executableFinder->find('php', false, $dirs); - } - - /** - * Finds the PHP executable arguments. - * - * @return array The PHP executable arguments - */ - public function findArguments() - { - $arguments = []; - if ('phpdbg' === \PHP_SAPI) { - $arguments[] = '-qrr'; - } - - return $arguments; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/process/PhpProcess.php b/tools/php-cs-fixer/vendor/symfony/process/PhpProcess.php deleted file mode 100644 index 2bc338e..0000000 --- a/tools/php-cs-fixer/vendor/symfony/process/PhpProcess.php +++ /dev/null @@ -1,72 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Process; - -use Symfony\Component\Process\Exception\LogicException; -use Symfony\Component\Process\Exception\RuntimeException; - -/** - * PhpProcess runs a PHP script in an independent process. - * - * $p = new PhpProcess(''); - * $p->run(); - * print $p->getOutput()."\n"; - * - * @author Fabien Potencier - */ -class PhpProcess extends Process -{ - /** - * @param string $script The PHP script to run (as a string) - * @param string|null $cwd The working directory or null to use the working dir of the current PHP process - * @param array|null $env The environment variables or null to use the same environment as the current PHP process - * @param int $timeout The timeout in seconds - * @param array|null $php Path to the PHP binary to use with any additional arguments - */ - public function __construct(string $script, string $cwd = null, array $env = null, int $timeout = 60, array $php = null) - { - if (null === $php) { - $executableFinder = new PhpExecutableFinder(); - $php = $executableFinder->find(false); - $php = false === $php ? null : array_merge([$php], $executableFinder->findArguments()); - } - if ('phpdbg' === \PHP_SAPI) { - $file = tempnam(sys_get_temp_dir(), 'dbg'); - file_put_contents($file, $script); - register_shutdown_function('unlink', $file); - $php[] = $file; - $script = null; - } - - parent::__construct($php, $cwd, $env, $script, $timeout); - } - - /** - * {@inheritdoc} - */ - public static function fromShellCommandline(string $command, string $cwd = null, array $env = null, $input = null, ?float $timeout = 60) - { - throw new LogicException(sprintf('The "%s()" method cannot be called when using "%s".', __METHOD__, self::class)); - } - - /** - * {@inheritdoc} - */ - public function start(callable $callback = null, array $env = []) - { - if (null === $this->getCommandLine()) { - throw new RuntimeException('Unable to find the PHP executable.'); - } - - parent::start($callback, $env); - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/process/Pipes/AbstractPipes.php b/tools/php-cs-fixer/vendor/symfony/process/Pipes/AbstractPipes.php deleted file mode 100644 index 2d14587..0000000 --- a/tools/php-cs-fixer/vendor/symfony/process/Pipes/AbstractPipes.php +++ /dev/null @@ -1,178 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Process\Pipes; - -use Symfony\Component\Process\Exception\InvalidArgumentException; - -/** - * @author Romain Neutron - * - * @internal - */ -abstract class AbstractPipes implements PipesInterface -{ - public $pipes = []; - - private $inputBuffer = ''; - private $input; - private $blocked = true; - private $lastError; - - /** - * @param resource|string|int|float|bool|\Iterator|null $input - */ - public function __construct($input) - { - if (\is_resource($input) || $input instanceof \Iterator) { - $this->input = $input; - } elseif (\is_string($input)) { - $this->inputBuffer = $input; - } else { - $this->inputBuffer = (string) $input; - } - } - - /** - * {@inheritdoc} - */ - public function close() - { - foreach ($this->pipes as $pipe) { - fclose($pipe); - } - $this->pipes = []; - } - - /** - * Returns true if a system call has been interrupted. - */ - protected function hasSystemCallBeenInterrupted(): bool - { - $lastError = $this->lastError; - $this->lastError = null; - - // stream_select returns false when the `select` system call is interrupted by an incoming signal - return null !== $lastError && false !== stripos($lastError, 'interrupted system call'); - } - - /** - * Unblocks streams. - */ - protected function unblock() - { - if (!$this->blocked) { - return; - } - - foreach ($this->pipes as $pipe) { - stream_set_blocking($pipe, 0); - } - if (\is_resource($this->input)) { - stream_set_blocking($this->input, 0); - } - - $this->blocked = false; - } - - /** - * Writes input to stdin. - * - * @throws InvalidArgumentException When an input iterator yields a non supported value - */ - protected function write(): ?array - { - if (!isset($this->pipes[0])) { - return null; - } - $input = $this->input; - - if ($input instanceof \Iterator) { - if (!$input->valid()) { - $input = null; - } elseif (\is_resource($input = $input->current())) { - stream_set_blocking($input, 0); - } elseif (!isset($this->inputBuffer[0])) { - if (!\is_string($input)) { - if (!is_scalar($input)) { - throw new InvalidArgumentException(sprintf('"%s" yielded a value of type "%s", but only scalars and stream resources are supported.', get_debug_type($this->input), get_debug_type($input))); - } - $input = (string) $input; - } - $this->inputBuffer = $input; - $this->input->next(); - $input = null; - } else { - $input = null; - } - } - - $r = $e = []; - $w = [$this->pipes[0]]; - - // let's have a look if something changed in streams - if (false === @stream_select($r, $w, $e, 0, 0)) { - return null; - } - - foreach ($w as $stdin) { - if (isset($this->inputBuffer[0])) { - $written = fwrite($stdin, $this->inputBuffer); - $this->inputBuffer = substr($this->inputBuffer, $written); - if (isset($this->inputBuffer[0])) { - return [$this->pipes[0]]; - } - } - - if ($input) { - for (;;) { - $data = fread($input, self::CHUNK_SIZE); - if (!isset($data[0])) { - break; - } - $written = fwrite($stdin, $data); - $data = substr($data, $written); - if (isset($data[0])) { - $this->inputBuffer = $data; - - return [$this->pipes[0]]; - } - } - if (feof($input)) { - if ($this->input instanceof \Iterator) { - $this->input->next(); - } else { - $this->input = null; - } - } - } - } - - // no input to read on resource, buffer is empty - if (!isset($this->inputBuffer[0]) && !($this->input instanceof \Iterator ? $this->input->valid() : $this->input)) { - $this->input = null; - fclose($this->pipes[0]); - unset($this->pipes[0]); - } elseif (!$w) { - return [$this->pipes[0]]; - } - - return null; - } - - /** - * @internal - */ - public function handleError(int $type, string $msg) - { - $this->lastError = $msg; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/process/Pipes/PipesInterface.php b/tools/php-cs-fixer/vendor/symfony/process/Pipes/PipesInterface.php deleted file mode 100644 index 50eb5c4..0000000 --- a/tools/php-cs-fixer/vendor/symfony/process/Pipes/PipesInterface.php +++ /dev/null @@ -1,61 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Process\Pipes; - -/** - * PipesInterface manages descriptors and pipes for the use of proc_open. - * - * @author Romain Neutron - * - * @internal - */ -interface PipesInterface -{ - public const CHUNK_SIZE = 16384; - - /** - * Returns an array of descriptors for the use of proc_open. - */ - public function getDescriptors(): array; - - /** - * Returns an array of filenames indexed by their related stream in case these pipes use temporary files. - * - * @return string[] - */ - public function getFiles(): array; - - /** - * Reads data in file handles and pipes. - * - * @param bool $blocking Whether to use blocking calls or not - * @param bool $close Whether to close pipes if they've reached EOF - * - * @return string[] An array of read data indexed by their fd - */ - public function readAndWrite(bool $blocking, bool $close = false): array; - - /** - * Returns if the current state has open file handles or pipes. - */ - public function areOpen(): bool; - - /** - * Returns if pipes are able to read output. - */ - public function haveReadSupport(): bool; - - /** - * Closes file handles and pipes. - */ - public function close(); -} diff --git a/tools/php-cs-fixer/vendor/symfony/process/Pipes/UnixPipes.php b/tools/php-cs-fixer/vendor/symfony/process/Pipes/UnixPipes.php deleted file mode 100644 index 58a8da0..0000000 --- a/tools/php-cs-fixer/vendor/symfony/process/Pipes/UnixPipes.php +++ /dev/null @@ -1,166 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Process\Pipes; - -use Symfony\Component\Process\Process; - -/** - * UnixPipes implementation uses unix pipes as handles. - * - * @author Romain Neutron - * - * @internal - */ -class UnixPipes extends AbstractPipes -{ - private $ttyMode; - private $ptyMode; - private $haveReadSupport; - - public function __construct(?bool $ttyMode, bool $ptyMode, $input, bool $haveReadSupport) - { - $this->ttyMode = $ttyMode; - $this->ptyMode = $ptyMode; - $this->haveReadSupport = $haveReadSupport; - - parent::__construct($input); - } - - /** - * @return array - */ - public function __sleep() - { - throw new \BadMethodCallException('Cannot serialize '.__CLASS__); - } - - public function __wakeup() - { - throw new \BadMethodCallException('Cannot unserialize '.__CLASS__); - } - - public function __destruct() - { - $this->close(); - } - - /** - * {@inheritdoc} - */ - public function getDescriptors(): array - { - if (!$this->haveReadSupport) { - $nullstream = fopen('/dev/null', 'c'); - - return [ - ['pipe', 'r'], - $nullstream, - $nullstream, - ]; - } - - if ($this->ttyMode) { - return [ - ['file', '/dev/tty', 'r'], - ['file', '/dev/tty', 'w'], - ['file', '/dev/tty', 'w'], - ]; - } - - if ($this->ptyMode && Process::isPtySupported()) { - return [ - ['pty'], - ['pty'], - ['pty'], - ]; - } - - return [ - ['pipe', 'r'], - ['pipe', 'w'], // stdout - ['pipe', 'w'], // stderr - ]; - } - - /** - * {@inheritdoc} - */ - public function getFiles(): array - { - return []; - } - - /** - * {@inheritdoc} - */ - public function readAndWrite(bool $blocking, bool $close = false): array - { - $this->unblock(); - $w = $this->write(); - - $read = $e = []; - $r = $this->pipes; - unset($r[0]); - - // let's have a look if something changed in streams - set_error_handler([$this, 'handleError']); - if (($r || $w) && false === stream_select($r, $w, $e, 0, $blocking ? Process::TIMEOUT_PRECISION * 1E6 : 0)) { - restore_error_handler(); - // if a system call has been interrupted, forget about it, let's try again - // otherwise, an error occurred, let's reset pipes - if (!$this->hasSystemCallBeenInterrupted()) { - $this->pipes = []; - } - - return $read; - } - restore_error_handler(); - - foreach ($r as $pipe) { - // prior PHP 5.4 the array passed to stream_select is modified and - // lose key association, we have to find back the key - $read[$type = array_search($pipe, $this->pipes, true)] = ''; - - do { - $data = @fread($pipe, self::CHUNK_SIZE); - $read[$type] .= $data; - } while (isset($data[0]) && ($close || isset($data[self::CHUNK_SIZE - 1]))); - - if (!isset($read[$type][0])) { - unset($read[$type]); - } - - if ($close && feof($pipe)) { - fclose($pipe); - unset($this->pipes[$type]); - } - } - - return $read; - } - - /** - * {@inheritdoc} - */ - public function haveReadSupport(): bool - { - return $this->haveReadSupport; - } - - /** - * {@inheritdoc} - */ - public function areOpen(): bool - { - return (bool) $this->pipes; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/process/Pipes/WindowsPipes.php b/tools/php-cs-fixer/vendor/symfony/process/Pipes/WindowsPipes.php deleted file mode 100644 index 69768f3..0000000 --- a/tools/php-cs-fixer/vendor/symfony/process/Pipes/WindowsPipes.php +++ /dev/null @@ -1,207 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Process\Pipes; - -use Symfony\Component\Process\Exception\RuntimeException; -use Symfony\Component\Process\Process; - -/** - * WindowsPipes implementation uses temporary files as handles. - * - * @see https://bugs.php.net/51800 - * @see https://bugs.php.net/65650 - * - * @author Romain Neutron - * - * @internal - */ -class WindowsPipes extends AbstractPipes -{ - private $files = []; - private $fileHandles = []; - private $lockHandles = []; - private $readBytes = [ - Process::STDOUT => 0, - Process::STDERR => 0, - ]; - private $haveReadSupport; - - public function __construct($input, bool $haveReadSupport) - { - $this->haveReadSupport = $haveReadSupport; - - if ($this->haveReadSupport) { - // Fix for PHP bug #51800: reading from STDOUT pipe hangs forever on Windows if the output is too big. - // Workaround for this problem is to use temporary files instead of pipes on Windows platform. - // - // @see https://bugs.php.net/51800 - $pipes = [ - Process::STDOUT => Process::OUT, - Process::STDERR => Process::ERR, - ]; - $tmpDir = sys_get_temp_dir(); - $lastError = 'unknown reason'; - set_error_handler(function ($type, $msg) use (&$lastError) { $lastError = $msg; }); - for ($i = 0;; ++$i) { - foreach ($pipes as $pipe => $name) { - $file = sprintf('%s\\sf_proc_%02X.%s', $tmpDir, $i, $name); - - if (!$h = fopen($file.'.lock', 'w')) { - if (file_exists($file.'.lock')) { - continue 2; - } - restore_error_handler(); - throw new RuntimeException('A temporary file could not be opened to write the process output: '.$lastError); - } - if (!flock($h, \LOCK_EX | \LOCK_NB)) { - continue 2; - } - if (isset($this->lockHandles[$pipe])) { - flock($this->lockHandles[$pipe], \LOCK_UN); - fclose($this->lockHandles[$pipe]); - } - $this->lockHandles[$pipe] = $h; - - if (!($h = fopen($file, 'w')) || !fclose($h) || !$h = fopen($file, 'r')) { - flock($this->lockHandles[$pipe], \LOCK_UN); - fclose($this->lockHandles[$pipe]); - unset($this->lockHandles[$pipe]); - continue 2; - } - $this->fileHandles[$pipe] = $h; - $this->files[$pipe] = $file; - } - break; - } - restore_error_handler(); - } - - parent::__construct($input); - } - - /** - * @return array - */ - public function __sleep() - { - throw new \BadMethodCallException('Cannot serialize '.__CLASS__); - } - - public function __wakeup() - { - throw new \BadMethodCallException('Cannot unserialize '.__CLASS__); - } - - public function __destruct() - { - $this->close(); - } - - /** - * {@inheritdoc} - */ - public function getDescriptors(): array - { - if (!$this->haveReadSupport) { - $nullstream = fopen('NUL', 'c'); - - return [ - ['pipe', 'r'], - $nullstream, - $nullstream, - ]; - } - - // We're not using pipe on Windows platform as it hangs (https://bugs.php.net/51800) - // We're not using file handles as it can produce corrupted output https://bugs.php.net/65650 - // So we redirect output within the commandline and pass the nul device to the process - return [ - ['pipe', 'r'], - ['file', 'NUL', 'w'], - ['file', 'NUL', 'w'], - ]; - } - - /** - * {@inheritdoc} - */ - public function getFiles(): array - { - return $this->files; - } - - /** - * {@inheritdoc} - */ - public function readAndWrite(bool $blocking, bool $close = false): array - { - $this->unblock(); - $w = $this->write(); - $read = $r = $e = []; - - if ($blocking) { - if ($w) { - @stream_select($r, $w, $e, 0, Process::TIMEOUT_PRECISION * 1E6); - } elseif ($this->fileHandles) { - usleep(Process::TIMEOUT_PRECISION * 1E6); - } - } - foreach ($this->fileHandles as $type => $fileHandle) { - $data = stream_get_contents($fileHandle, -1, $this->readBytes[$type]); - - if (isset($data[0])) { - $this->readBytes[$type] += \strlen($data); - $read[$type] = $data; - } - if ($close) { - ftruncate($fileHandle, 0); - fclose($fileHandle); - flock($this->lockHandles[$type], \LOCK_UN); - fclose($this->lockHandles[$type]); - unset($this->fileHandles[$type], $this->lockHandles[$type]); - } - } - - return $read; - } - - /** - * {@inheritdoc} - */ - public function haveReadSupport(): bool - { - return $this->haveReadSupport; - } - - /** - * {@inheritdoc} - */ - public function areOpen(): bool - { - return $this->pipes && $this->fileHandles; - } - - /** - * {@inheritdoc} - */ - public function close() - { - parent::close(); - foreach ($this->fileHandles as $type => $handle) { - ftruncate($handle, 0); - fclose($handle); - flock($this->lockHandles[$type], \LOCK_UN); - fclose($this->lockHandles[$type]); - } - $this->fileHandles = $this->lockHandles = []; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/process/Process.php b/tools/php-cs-fixer/vendor/symfony/process/Process.php deleted file mode 100644 index a541cd6..0000000 --- a/tools/php-cs-fixer/vendor/symfony/process/Process.php +++ /dev/null @@ -1,1678 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Process; - -use Symfony\Component\Process\Exception\InvalidArgumentException; -use Symfony\Component\Process\Exception\LogicException; -use Symfony\Component\Process\Exception\ProcessFailedException; -use Symfony\Component\Process\Exception\ProcessSignaledException; -use Symfony\Component\Process\Exception\ProcessTimedOutException; -use Symfony\Component\Process\Exception\RuntimeException; -use Symfony\Component\Process\Pipes\PipesInterface; -use Symfony\Component\Process\Pipes\UnixPipes; -use Symfony\Component\Process\Pipes\WindowsPipes; - -/** - * Process is a thin wrapper around proc_* functions to easily - * start independent PHP processes. - * - * @author Fabien Potencier - * @author Romain Neutron - */ -class Process implements \IteratorAggregate -{ - public const ERR = 'err'; - public const OUT = 'out'; - - public const STATUS_READY = 'ready'; - public const STATUS_STARTED = 'started'; - public const STATUS_TERMINATED = 'terminated'; - - public const STDIN = 0; - public const STDOUT = 1; - public const STDERR = 2; - - // Timeout Precision in seconds. - public const TIMEOUT_PRECISION = 0.2; - - public const ITER_NON_BLOCKING = 1; // By default, iterating over outputs is a blocking call, use this flag to make it non-blocking - public const ITER_KEEP_OUTPUT = 2; // By default, outputs are cleared while iterating, use this flag to keep them in memory - public const ITER_SKIP_OUT = 4; // Use this flag to skip STDOUT while iterating - public const ITER_SKIP_ERR = 8; // Use this flag to skip STDERR while iterating - - private $callback; - private $hasCallback = false; - private $commandline; - private $cwd; - private $env; - private $input; - private $starttime; - private $lastOutputTime; - private $timeout; - private $idleTimeout; - private $exitcode; - private $fallbackStatus = []; - private $processInformation; - private $outputDisabled = false; - private $stdout; - private $stderr; - private $process; - private $status = self::STATUS_READY; - private $incrementalOutputOffset = 0; - private $incrementalErrorOutputOffset = 0; - private $tty = false; - private $pty; - private $options = ['suppress_errors' => true, 'bypass_shell' => true]; - - private $useFileHandles = false; - /** @var PipesInterface */ - private $processPipes; - - private $latestSignal; - - private static $sigchild; - - /** - * Exit codes translation table. - * - * User-defined errors must use exit codes in the 64-113 range. - */ - public static $exitCodes = [ - 0 => 'OK', - 1 => 'General error', - 2 => 'Misuse of shell builtins', - - 126 => 'Invoked command cannot execute', - 127 => 'Command not found', - 128 => 'Invalid exit argument', - - // signals - 129 => 'Hangup', - 130 => 'Interrupt', - 131 => 'Quit and dump core', - 132 => 'Illegal instruction', - 133 => 'Trace/breakpoint trap', - 134 => 'Process aborted', - 135 => 'Bus error: "access to undefined portion of memory object"', - 136 => 'Floating point exception: "erroneous arithmetic operation"', - 137 => 'Kill (terminate immediately)', - 138 => 'User-defined 1', - 139 => 'Segmentation violation', - 140 => 'User-defined 2', - 141 => 'Write to pipe with no one reading', - 142 => 'Signal raised by alarm', - 143 => 'Termination (request to terminate)', - // 144 - not defined - 145 => 'Child process terminated, stopped (or continued*)', - 146 => 'Continue if stopped', - 147 => 'Stop executing temporarily', - 148 => 'Terminal stop signal', - 149 => 'Background process attempting to read from tty ("in")', - 150 => 'Background process attempting to write to tty ("out")', - 151 => 'Urgent data available on socket', - 152 => 'CPU time limit exceeded', - 153 => 'File size limit exceeded', - 154 => 'Signal raised by timer counting virtual time: "virtual timer expired"', - 155 => 'Profiling timer expired', - // 156 - not defined - 157 => 'Pollable event', - // 158 - not defined - 159 => 'Bad syscall', - ]; - - /** - * @param array $command The command to run and its arguments listed as separate entries - * @param string|null $cwd The working directory or null to use the working dir of the current PHP process - * @param array|null $env The environment variables or null to use the same environment as the current PHP process - * @param mixed $input The input as stream resource, scalar or \Traversable, or null for no input - * @param int|float|null $timeout The timeout in seconds or null to disable - * - * @throws LogicException When proc_open is not installed - */ - public function __construct(array $command, string $cwd = null, array $env = null, $input = null, ?float $timeout = 60) - { - if (!\function_exists('proc_open')) { - throw new LogicException('The Process class relies on proc_open, which is not available on your PHP installation.'); - } - - $this->commandline = $command; - $this->cwd = $cwd; - - // on Windows, if the cwd changed via chdir(), proc_open defaults to the dir where PHP was started - // on Gnu/Linux, PHP builds with --enable-maintainer-zts are also affected - // @see : https://bugs.php.net/51800 - // @see : https://bugs.php.net/50524 - if (null === $this->cwd && (\defined('ZEND_THREAD_SAFE') || '\\' === \DIRECTORY_SEPARATOR)) { - $this->cwd = getcwd(); - } - if (null !== $env) { - $this->setEnv($env); - } - - $this->setInput($input); - $this->setTimeout($timeout); - $this->useFileHandles = '\\' === \DIRECTORY_SEPARATOR; - $this->pty = false; - } - - /** - * Creates a Process instance as a command-line to be run in a shell wrapper. - * - * Command-lines are parsed by the shell of your OS (/bin/sh on Unix-like, cmd.exe on Windows.) - * This allows using e.g. pipes or conditional execution. In this mode, signals are sent to the - * shell wrapper and not to your commands. - * - * In order to inject dynamic values into command-lines, we strongly recommend using placeholders. - * This will save escaping values, which is not portable nor secure anyway: - * - * $process = Process::fromShellCommandline('my_command "$MY_VAR"'); - * $process->run(null, ['MY_VAR' => $theValue]); - * - * @param string $command The command line to pass to the shell of the OS - * @param string|null $cwd The working directory or null to use the working dir of the current PHP process - * @param array|null $env The environment variables or null to use the same environment as the current PHP process - * @param mixed $input The input as stream resource, scalar or \Traversable, or null for no input - * @param int|float|null $timeout The timeout in seconds or null to disable - * - * @return static - * - * @throws LogicException When proc_open is not installed - */ - public static function fromShellCommandline(string $command, string $cwd = null, array $env = null, $input = null, ?float $timeout = 60) - { - $process = new static([], $cwd, $env, $input, $timeout); - $process->commandline = $command; - - return $process; - } - - /** - * @return array - */ - public function __sleep() - { - throw new \BadMethodCallException('Cannot serialize '.__CLASS__); - } - - public function __wakeup() - { - throw new \BadMethodCallException('Cannot unserialize '.__CLASS__); - } - - public function __destruct() - { - if ($this->options['create_new_console'] ?? false) { - $this->processPipes->close(); - } else { - $this->stop(0); - } - } - - public function __clone() - { - $this->resetProcessData(); - } - - /** - * Runs the process. - * - * The callback receives the type of output (out or err) and - * some bytes from the output in real-time. It allows to have feedback - * from the independent process during execution. - * - * The STDOUT and STDERR are also available after the process is finished - * via the getOutput() and getErrorOutput() methods. - * - * @param callable|null $callback A PHP callback to run whenever there is some - * output available on STDOUT or STDERR - * - * @return int The exit status code - * - * @throws RuntimeException When process can't be launched - * @throws RuntimeException When process is already running - * @throws ProcessTimedOutException When process timed out - * @throws ProcessSignaledException When process stopped after receiving signal - * @throws LogicException In case a callback is provided and output has been disabled - * - * @final - */ - public function run(callable $callback = null, array $env = []): int - { - $this->start($callback, $env); - - return $this->wait(); - } - - /** - * Runs the process. - * - * This is identical to run() except that an exception is thrown if the process - * exits with a non-zero exit code. - * - * @return $this - * - * @throws ProcessFailedException if the process didn't terminate successfully - * - * @final - */ - public function mustRun(callable $callback = null, array $env = []): self - { - if (0 !== $this->run($callback, $env)) { - throw new ProcessFailedException($this); - } - - return $this; - } - - /** - * Starts the process and returns after writing the input to STDIN. - * - * This method blocks until all STDIN data is sent to the process then it - * returns while the process runs in the background. - * - * The termination of the process can be awaited with wait(). - * - * The callback receives the type of output (out or err) and some bytes from - * the output in real-time while writing the standard input to the process. - * It allows to have feedback from the independent process during execution. - * - * @param callable|null $callback A PHP callback to run whenever there is some - * output available on STDOUT or STDERR - * - * @throws RuntimeException When process can't be launched - * @throws RuntimeException When process is already running - * @throws LogicException In case a callback is provided and output has been disabled - */ - public function start(callable $callback = null, array $env = []) - { - if ($this->isRunning()) { - throw new RuntimeException('Process is already running.'); - } - - $this->resetProcessData(); - $this->starttime = $this->lastOutputTime = microtime(true); - $this->callback = $this->buildCallback($callback); - $this->hasCallback = null !== $callback; - $descriptors = $this->getDescriptors(); - - if ($this->env) { - $env += $this->env; - } - - $env += $this->getDefaultEnv(); - - if (\is_array($commandline = $this->commandline)) { - $commandline = implode(' ', array_map([$this, 'escapeArgument'], $commandline)); - - if ('\\' !== \DIRECTORY_SEPARATOR) { - // exec is mandatory to deal with sending a signal to the process - $commandline = 'exec '.$commandline; - } - } else { - $commandline = $this->replacePlaceholders($commandline, $env); - } - - if ('\\' === \DIRECTORY_SEPARATOR) { - $commandline = $this->prepareWindowsCommandLine($commandline, $env); - } elseif (!$this->useFileHandles && $this->isSigchildEnabled()) { - // last exit code is output on the fourth pipe and caught to work around --enable-sigchild - $descriptors[3] = ['pipe', 'w']; - - // See https://unix.stackexchange.com/questions/71205/background-process-pipe-input - $commandline = '{ ('.$commandline.') <&3 3<&- 3>/dev/null & } 3<&0;'; - $commandline .= 'pid=$!; echo $pid >&3; wait $pid; code=$?; echo $code >&3; exit $code'; - - // Workaround for the bug, when PTS functionality is enabled. - // @see : https://bugs.php.net/69442 - $ptsWorkaround = fopen(__FILE__, 'r'); - } - - $envPairs = []; - foreach ($env as $k => $v) { - if (false !== $v) { - $envPairs[] = $k.'='.$v; - } - } - - if (!is_dir($this->cwd)) { - throw new RuntimeException(sprintf('The provided cwd "%s" does not exist.', $this->cwd)); - } - - $this->process = @proc_open($commandline, $descriptors, $this->processPipes->pipes, $this->cwd, $envPairs, $this->options); - - if (!\is_resource($this->process)) { - throw new RuntimeException('Unable to launch a new process.'); - } - $this->status = self::STATUS_STARTED; - - if (isset($descriptors[3])) { - $this->fallbackStatus['pid'] = (int) fgets($this->processPipes->pipes[3]); - } - - if ($this->tty) { - return; - } - - $this->updateStatus(false); - $this->checkTimeout(); - } - - /** - * Restarts the process. - * - * Be warned that the process is cloned before being started. - * - * @param callable|null $callback A PHP callback to run whenever there is some - * output available on STDOUT or STDERR - * - * @return static - * - * @throws RuntimeException When process can't be launched - * @throws RuntimeException When process is already running - * - * @see start() - * - * @final - */ - public function restart(callable $callback = null, array $env = []): self - { - if ($this->isRunning()) { - throw new RuntimeException('Process is already running.'); - } - - $process = clone $this; - $process->start($callback, $env); - - return $process; - } - - /** - * Waits for the process to terminate. - * - * The callback receives the type of output (out or err) and some bytes - * from the output in real-time while writing the standard input to the process. - * It allows to have feedback from the independent process during execution. - * - * @param callable|null $callback A valid PHP callback - * - * @return int The exitcode of the process - * - * @throws ProcessTimedOutException When process timed out - * @throws ProcessSignaledException When process stopped after receiving signal - * @throws LogicException When process is not yet started - */ - public function wait(callable $callback = null) - { - $this->requireProcessIsStarted(__FUNCTION__); - - $this->updateStatus(false); - - if (null !== $callback) { - if (!$this->processPipes->haveReadSupport()) { - $this->stop(0); - throw new LogicException('Pass the callback to the "Process::start" method or call enableOutput to use a callback with "Process::wait".'); - } - $this->callback = $this->buildCallback($callback); - } - - do { - $this->checkTimeout(); - $running = '\\' === \DIRECTORY_SEPARATOR ? $this->isRunning() : $this->processPipes->areOpen(); - $this->readPipes($running, '\\' !== \DIRECTORY_SEPARATOR || !$running); - } while ($running); - - while ($this->isRunning()) { - $this->checkTimeout(); - usleep(1000); - } - - if ($this->processInformation['signaled'] && $this->processInformation['termsig'] !== $this->latestSignal) { - throw new ProcessSignaledException($this); - } - - return $this->exitcode; - } - - /** - * Waits until the callback returns true. - * - * The callback receives the type of output (out or err) and some bytes - * from the output in real-time while writing the standard input to the process. - * It allows to have feedback from the independent process during execution. - * - * @throws RuntimeException When process timed out - * @throws LogicException When process is not yet started - * @throws ProcessTimedOutException In case the timeout was reached - */ - public function waitUntil(callable $callback): bool - { - $this->requireProcessIsStarted(__FUNCTION__); - $this->updateStatus(false); - - if (!$this->processPipes->haveReadSupport()) { - $this->stop(0); - throw new LogicException('Pass the callback to the "Process::start" method or call enableOutput to use a callback with "Process::waitUntil".'); - } - $callback = $this->buildCallback($callback); - - $ready = false; - while (true) { - $this->checkTimeout(); - $running = '\\' === \DIRECTORY_SEPARATOR ? $this->isRunning() : $this->processPipes->areOpen(); - $output = $this->processPipes->readAndWrite($running, '\\' !== \DIRECTORY_SEPARATOR || !$running); - - foreach ($output as $type => $data) { - if (3 !== $type) { - $ready = $callback(self::STDOUT === $type ? self::OUT : self::ERR, $data) || $ready; - } elseif (!isset($this->fallbackStatus['signaled'])) { - $this->fallbackStatus['exitcode'] = (int) $data; - } - } - if ($ready) { - return true; - } - if (!$running) { - return false; - } - - usleep(1000); - } - } - - /** - * Returns the Pid (process identifier), if applicable. - * - * @return int|null The process id if running, null otherwise - */ - public function getPid() - { - return $this->isRunning() ? $this->processInformation['pid'] : null; - } - - /** - * Sends a POSIX signal to the process. - * - * @param int $signal A valid POSIX signal (see https://php.net/pcntl.constants) - * - * @return $this - * - * @throws LogicException In case the process is not running - * @throws RuntimeException In case --enable-sigchild is activated and the process can't be killed - * @throws RuntimeException In case of failure - */ - public function signal(int $signal) - { - $this->doSignal($signal, true); - - return $this; - } - - /** - * Disables fetching output and error output from the underlying process. - * - * @return $this - * - * @throws RuntimeException In case the process is already running - * @throws LogicException if an idle timeout is set - */ - public function disableOutput() - { - if ($this->isRunning()) { - throw new RuntimeException('Disabling output while the process is running is not possible.'); - } - if (null !== $this->idleTimeout) { - throw new LogicException('Output can not be disabled while an idle timeout is set.'); - } - - $this->outputDisabled = true; - - return $this; - } - - /** - * Enables fetching output and error output from the underlying process. - * - * @return $this - * - * @throws RuntimeException In case the process is already running - */ - public function enableOutput() - { - if ($this->isRunning()) { - throw new RuntimeException('Enabling output while the process is running is not possible.'); - } - - $this->outputDisabled = false; - - return $this; - } - - /** - * Returns true in case the output is disabled, false otherwise. - * - * @return bool - */ - public function isOutputDisabled() - { - return $this->outputDisabled; - } - - /** - * Returns the current output of the process (STDOUT). - * - * @return string The process output - * - * @throws LogicException in case the output has been disabled - * @throws LogicException In case the process is not started - */ - public function getOutput() - { - $this->readPipesForOutput(__FUNCTION__); - - if (false === $ret = stream_get_contents($this->stdout, -1, 0)) { - return ''; - } - - return $ret; - } - - /** - * Returns the output incrementally. - * - * In comparison with the getOutput method which always return the whole - * output, this one returns the new output since the last call. - * - * @return string The process output since the last call - * - * @throws LogicException in case the output has been disabled - * @throws LogicException In case the process is not started - */ - public function getIncrementalOutput() - { - $this->readPipesForOutput(__FUNCTION__); - - $latest = stream_get_contents($this->stdout, -1, $this->incrementalOutputOffset); - $this->incrementalOutputOffset = ftell($this->stdout); - - if (false === $latest) { - return ''; - } - - return $latest; - } - - /** - * Returns an iterator to the output of the process, with the output type as keys (Process::OUT/ERR). - * - * @param int $flags A bit field of Process::ITER_* flags - * - * @throws LogicException in case the output has been disabled - * @throws LogicException In case the process is not started - * - * @return \Generator - */ - #[\ReturnTypeWillChange] - public function getIterator(int $flags = 0) - { - $this->readPipesForOutput(__FUNCTION__, false); - - $clearOutput = !(self::ITER_KEEP_OUTPUT & $flags); - $blocking = !(self::ITER_NON_BLOCKING & $flags); - $yieldOut = !(self::ITER_SKIP_OUT & $flags); - $yieldErr = !(self::ITER_SKIP_ERR & $flags); - - while (null !== $this->callback || ($yieldOut && !feof($this->stdout)) || ($yieldErr && !feof($this->stderr))) { - if ($yieldOut) { - $out = stream_get_contents($this->stdout, -1, $this->incrementalOutputOffset); - - if (isset($out[0])) { - if ($clearOutput) { - $this->clearOutput(); - } else { - $this->incrementalOutputOffset = ftell($this->stdout); - } - - yield self::OUT => $out; - } - } - - if ($yieldErr) { - $err = stream_get_contents($this->stderr, -1, $this->incrementalErrorOutputOffset); - - if (isset($err[0])) { - if ($clearOutput) { - $this->clearErrorOutput(); - } else { - $this->incrementalErrorOutputOffset = ftell($this->stderr); - } - - yield self::ERR => $err; - } - } - - if (!$blocking && !isset($out[0]) && !isset($err[0])) { - yield self::OUT => ''; - } - - $this->checkTimeout(); - $this->readPipesForOutput(__FUNCTION__, $blocking); - } - } - - /** - * Clears the process output. - * - * @return $this - */ - public function clearOutput() - { - ftruncate($this->stdout, 0); - fseek($this->stdout, 0); - $this->incrementalOutputOffset = 0; - - return $this; - } - - /** - * Returns the current error output of the process (STDERR). - * - * @return string The process error output - * - * @throws LogicException in case the output has been disabled - * @throws LogicException In case the process is not started - */ - public function getErrorOutput() - { - $this->readPipesForOutput(__FUNCTION__); - - if (false === $ret = stream_get_contents($this->stderr, -1, 0)) { - return ''; - } - - return $ret; - } - - /** - * Returns the errorOutput incrementally. - * - * In comparison with the getErrorOutput method which always return the - * whole error output, this one returns the new error output since the last - * call. - * - * @return string The process error output since the last call - * - * @throws LogicException in case the output has been disabled - * @throws LogicException In case the process is not started - */ - public function getIncrementalErrorOutput() - { - $this->readPipesForOutput(__FUNCTION__); - - $latest = stream_get_contents($this->stderr, -1, $this->incrementalErrorOutputOffset); - $this->incrementalErrorOutputOffset = ftell($this->stderr); - - if (false === $latest) { - return ''; - } - - return $latest; - } - - /** - * Clears the process output. - * - * @return $this - */ - public function clearErrorOutput() - { - ftruncate($this->stderr, 0); - fseek($this->stderr, 0); - $this->incrementalErrorOutputOffset = 0; - - return $this; - } - - /** - * Returns the exit code returned by the process. - * - * @return int|null The exit status code, null if the Process is not terminated - */ - public function getExitCode() - { - $this->updateStatus(false); - - return $this->exitcode; - } - - /** - * Returns a string representation for the exit code returned by the process. - * - * This method relies on the Unix exit code status standardization - * and might not be relevant for other operating systems. - * - * @return string|null A string representation for the exit status code, null if the Process is not terminated - * - * @see http://tldp.org/LDP/abs/html/exitcodes.html - * @see http://en.wikipedia.org/wiki/Unix_signal - */ - public function getExitCodeText() - { - if (null === $exitcode = $this->getExitCode()) { - return null; - } - - return self::$exitCodes[$exitcode] ?? 'Unknown error'; - } - - /** - * Checks if the process ended successfully. - * - * @return bool true if the process ended successfully, false otherwise - */ - public function isSuccessful() - { - return 0 === $this->getExitCode(); - } - - /** - * Returns true if the child process has been terminated by an uncaught signal. - * - * It always returns false on Windows. - * - * @return bool - * - * @throws LogicException In case the process is not terminated - */ - public function hasBeenSignaled() - { - $this->requireProcessIsTerminated(__FUNCTION__); - - return $this->processInformation['signaled']; - } - - /** - * Returns the number of the signal that caused the child process to terminate its execution. - * - * It is only meaningful if hasBeenSignaled() returns true. - * - * @return int - * - * @throws RuntimeException In case --enable-sigchild is activated - * @throws LogicException In case the process is not terminated - */ - public function getTermSignal() - { - $this->requireProcessIsTerminated(__FUNCTION__); - - if ($this->isSigchildEnabled() && -1 === $this->processInformation['termsig']) { - throw new RuntimeException('This PHP has been compiled with --enable-sigchild. Term signal can not be retrieved.'); - } - - return $this->processInformation['termsig']; - } - - /** - * Returns true if the child process has been stopped by a signal. - * - * It always returns false on Windows. - * - * @return bool - * - * @throws LogicException In case the process is not terminated - */ - public function hasBeenStopped() - { - $this->requireProcessIsTerminated(__FUNCTION__); - - return $this->processInformation['stopped']; - } - - /** - * Returns the number of the signal that caused the child process to stop its execution. - * - * It is only meaningful if hasBeenStopped() returns true. - * - * @return int - * - * @throws LogicException In case the process is not terminated - */ - public function getStopSignal() - { - $this->requireProcessIsTerminated(__FUNCTION__); - - return $this->processInformation['stopsig']; - } - - /** - * Checks if the process is currently running. - * - * @return bool true if the process is currently running, false otherwise - */ - public function isRunning() - { - if (self::STATUS_STARTED !== $this->status) { - return false; - } - - $this->updateStatus(false); - - return $this->processInformation['running']; - } - - /** - * Checks if the process has been started with no regard to the current state. - * - * @return bool true if status is ready, false otherwise - */ - public function isStarted() - { - return self::STATUS_READY != $this->status; - } - - /** - * Checks if the process is terminated. - * - * @return bool true if process is terminated, false otherwise - */ - public function isTerminated() - { - $this->updateStatus(false); - - return self::STATUS_TERMINATED == $this->status; - } - - /** - * Gets the process status. - * - * The status is one of: ready, started, terminated. - * - * @return string The current process status - */ - public function getStatus() - { - $this->updateStatus(false); - - return $this->status; - } - - /** - * Stops the process. - * - * @param int|float $timeout The timeout in seconds - * @param int $signal A POSIX signal to send in case the process has not stop at timeout, default is SIGKILL (9) - * - * @return int|null The exit-code of the process or null if it's not running - */ - public function stop(float $timeout = 10, int $signal = null) - { - $timeoutMicro = microtime(true) + $timeout; - if ($this->isRunning()) { - // given SIGTERM may not be defined and that "proc_terminate" uses the constant value and not the constant itself, we use the same here - $this->doSignal(15, false); - do { - usleep(1000); - } while ($this->isRunning() && microtime(true) < $timeoutMicro); - - if ($this->isRunning()) { - // Avoid exception here: process is supposed to be running, but it might have stopped just - // after this line. In any case, let's silently discard the error, we cannot do anything. - $this->doSignal($signal ?: 9, false); - } - } - - if ($this->isRunning()) { - if (isset($this->fallbackStatus['pid'])) { - unset($this->fallbackStatus['pid']); - - return $this->stop(0, $signal); - } - $this->close(); - } - - return $this->exitcode; - } - - /** - * Adds a line to the STDOUT stream. - * - * @internal - */ - public function addOutput(string $line) - { - $this->lastOutputTime = microtime(true); - - fseek($this->stdout, 0, \SEEK_END); - fwrite($this->stdout, $line); - fseek($this->stdout, $this->incrementalOutputOffset); - } - - /** - * Adds a line to the STDERR stream. - * - * @internal - */ - public function addErrorOutput(string $line) - { - $this->lastOutputTime = microtime(true); - - fseek($this->stderr, 0, \SEEK_END); - fwrite($this->stderr, $line); - fseek($this->stderr, $this->incrementalErrorOutputOffset); - } - - /** - * Gets the last output time in seconds. - * - * @return float|null The last output time in seconds or null if it isn't started - */ - public function getLastOutputTime(): ?float - { - return $this->lastOutputTime; - } - - /** - * Gets the command line to be executed. - * - * @return string The command to execute - */ - public function getCommandLine() - { - return \is_array($this->commandline) ? implode(' ', array_map([$this, 'escapeArgument'], $this->commandline)) : $this->commandline; - } - - /** - * Gets the process timeout (max. runtime). - * - * @return float|null The timeout in seconds or null if it's disabled - */ - public function getTimeout() - { - return $this->timeout; - } - - /** - * Gets the process idle timeout (max. time since last output). - * - * @return float|null The timeout in seconds or null if it's disabled - */ - public function getIdleTimeout() - { - return $this->idleTimeout; - } - - /** - * Sets the process timeout (max. runtime) in seconds. - * - * To disable the timeout, set this value to null. - * - * @return $this - * - * @throws InvalidArgumentException if the timeout is negative - */ - public function setTimeout(?float $timeout) - { - $this->timeout = $this->validateTimeout($timeout); - - return $this; - } - - /** - * Sets the process idle timeout (max. time since last output) in seconds. - * - * To disable the timeout, set this value to null. - * - * @return $this - * - * @throws LogicException if the output is disabled - * @throws InvalidArgumentException if the timeout is negative - */ - public function setIdleTimeout(?float $timeout) - { - if (null !== $timeout && $this->outputDisabled) { - throw new LogicException('Idle timeout can not be set while the output is disabled.'); - } - - $this->idleTimeout = $this->validateTimeout($timeout); - - return $this; - } - - /** - * Enables or disables the TTY mode. - * - * @return $this - * - * @throws RuntimeException In case the TTY mode is not supported - */ - public function setTty(bool $tty) - { - if ('\\' === \DIRECTORY_SEPARATOR && $tty) { - throw new RuntimeException('TTY mode is not supported on Windows platform.'); - } - - if ($tty && !self::isTtySupported()) { - throw new RuntimeException('TTY mode requires /dev/tty to be read/writable.'); - } - - $this->tty = $tty; - - return $this; - } - - /** - * Checks if the TTY mode is enabled. - * - * @return bool true if the TTY mode is enabled, false otherwise - */ - public function isTty() - { - return $this->tty; - } - - /** - * Sets PTY mode. - * - * @return $this - */ - public function setPty(bool $bool) - { - $this->pty = $bool; - - return $this; - } - - /** - * Returns PTY state. - * - * @return bool - */ - public function isPty() - { - return $this->pty; - } - - /** - * Gets the working directory. - * - * @return string|null The current working directory or null on failure - */ - public function getWorkingDirectory() - { - if (null === $this->cwd) { - // getcwd() will return false if any one of the parent directories does not have - // the readable or search mode set, even if the current directory does - return getcwd() ?: null; - } - - return $this->cwd; - } - - /** - * Sets the current working directory. - * - * @return $this - */ - public function setWorkingDirectory(string $cwd) - { - $this->cwd = $cwd; - - return $this; - } - - /** - * Gets the environment variables. - * - * @return array The current environment variables - */ - public function getEnv() - { - return $this->env; - } - - /** - * Sets the environment variables. - * - * Each environment variable value should be a string. - * If it is an array, the variable is ignored. - * If it is false or null, it will be removed when - * env vars are otherwise inherited. - * - * That happens in PHP when 'argv' is registered into - * the $_ENV array for instance. - * - * @param array $env The new environment variables - * - * @return $this - */ - public function setEnv(array $env) - { - // Process can not handle env values that are arrays - $env = array_filter($env, function ($value) { - return !\is_array($value); - }); - - $this->env = $env; - - return $this; - } - - /** - * Gets the Process input. - * - * @return resource|string|\Iterator|null The Process input - */ - public function getInput() - { - return $this->input; - } - - /** - * Sets the input. - * - * This content will be passed to the underlying process standard input. - * - * @param string|int|float|bool|resource|\Traversable|null $input The content - * - * @return $this - * - * @throws LogicException In case the process is running - */ - public function setInput($input) - { - if ($this->isRunning()) { - throw new LogicException('Input can not be set while the process is running.'); - } - - $this->input = ProcessUtils::validateInput(__METHOD__, $input); - - return $this; - } - - /** - * Performs a check between the timeout definition and the time the process started. - * - * In case you run a background process (with the start method), you should - * trigger this method regularly to ensure the process timeout - * - * @throws ProcessTimedOutException In case the timeout was reached - */ - public function checkTimeout() - { - if (self::STATUS_STARTED !== $this->status) { - return; - } - - if (null !== $this->timeout && $this->timeout < microtime(true) - $this->starttime) { - $this->stop(0); - - throw new ProcessTimedOutException($this, ProcessTimedOutException::TYPE_GENERAL); - } - - if (null !== $this->idleTimeout && $this->idleTimeout < microtime(true) - $this->lastOutputTime) { - $this->stop(0); - - throw new ProcessTimedOutException($this, ProcessTimedOutException::TYPE_IDLE); - } - } - - /** - * @throws LogicException in case process is not started - */ - public function getStartTime(): float - { - if (!$this->isStarted()) { - throw new LogicException('Start time is only available after process start.'); - } - - return $this->starttime; - } - - /** - * Defines options to pass to the underlying proc_open(). - * - * @see https://php.net/proc_open for the options supported by PHP. - * - * Enabling the "create_new_console" option allows a subprocess to continue - * to run after the main process exited, on both Windows and *nix - */ - public function setOptions(array $options) - { - if ($this->isRunning()) { - throw new RuntimeException('Setting options while the process is running is not possible.'); - } - - $defaultOptions = $this->options; - $existingOptions = ['blocking_pipes', 'create_process_group', 'create_new_console']; - - foreach ($options as $key => $value) { - if (!\in_array($key, $existingOptions)) { - $this->options = $defaultOptions; - throw new LogicException(sprintf('Invalid option "%s" passed to "%s()". Supported options are "%s".', $key, __METHOD__, implode('", "', $existingOptions))); - } - $this->options[$key] = $value; - } - } - - /** - * Returns whether TTY is supported on the current operating system. - */ - public static function isTtySupported(): bool - { - static $isTtySupported; - - if (null === $isTtySupported) { - $isTtySupported = (bool) @proc_open('echo 1 >/dev/null', [['file', '/dev/tty', 'r'], ['file', '/dev/tty', 'w'], ['file', '/dev/tty', 'w']], $pipes); - } - - return $isTtySupported; - } - - /** - * Returns whether PTY is supported on the current operating system. - * - * @return bool - */ - public static function isPtySupported() - { - static $result; - - if (null !== $result) { - return $result; - } - - if ('\\' === \DIRECTORY_SEPARATOR) { - return $result = false; - } - - return $result = (bool) @proc_open('echo 1 >/dev/null', [['pty'], ['pty'], ['pty']], $pipes); - } - - /** - * Creates the descriptors needed by the proc_open. - */ - private function getDescriptors(): array - { - if ($this->input instanceof \Iterator) { - $this->input->rewind(); - } - if ('\\' === \DIRECTORY_SEPARATOR) { - $this->processPipes = new WindowsPipes($this->input, !$this->outputDisabled || $this->hasCallback); - } else { - $this->processPipes = new UnixPipes($this->isTty(), $this->isPty(), $this->input, !$this->outputDisabled || $this->hasCallback); - } - - return $this->processPipes->getDescriptors(); - } - - /** - * Builds up the callback used by wait(). - * - * The callbacks adds all occurred output to the specific buffer and calls - * the user callback (if present) with the received output. - * - * @param callable|null $callback The user defined PHP callback - * - * @return \Closure A PHP closure - */ - protected function buildCallback(callable $callback = null) - { - if ($this->outputDisabled) { - return function ($type, $data) use ($callback): bool { - return null !== $callback && $callback($type, $data); - }; - } - - $out = self::OUT; - - return function ($type, $data) use ($callback, $out): bool { - if ($out == $type) { - $this->addOutput($data); - } else { - $this->addErrorOutput($data); - } - - return null !== $callback && $callback($type, $data); - }; - } - - /** - * Updates the status of the process, reads pipes. - * - * @param bool $blocking Whether to use a blocking read call - */ - protected function updateStatus(bool $blocking) - { - if (self::STATUS_STARTED !== $this->status) { - return; - } - - $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; - } - - if (!$running) { - $this->close(); - } - } - - /** - * Returns whether PHP has been compiled with the '--enable-sigchild' option or not. - * - * @return bool - */ - protected function isSigchildEnabled() - { - if (null !== self::$sigchild) { - return self::$sigchild; - } - - if (!\function_exists('phpinfo')) { - return self::$sigchild = false; - } - - ob_start(); - phpinfo(\INFO_GENERAL); - - return self::$sigchild = str_contains(ob_get_clean(), '--enable-sigchild'); - } - - /** - * Reads pipes for the freshest output. - * - * @param string $caller The name of the method that needs fresh outputs - * @param bool $blocking Whether to use blocking calls or not - * - * @throws LogicException in case output has been disabled or process is not started - */ - private function readPipesForOutput(string $caller, bool $blocking = false) - { - if ($this->outputDisabled) { - throw new LogicException('Output has been disabled.'); - } - - $this->requireProcessIsStarted($caller); - - $this->updateStatus($blocking); - } - - /** - * Validates and returns the filtered timeout. - * - * @throws InvalidArgumentException if the given timeout is a negative number - */ - private function validateTimeout(?float $timeout): ?float - { - $timeout = (float) $timeout; - - if (0.0 === $timeout) { - $timeout = null; - } elseif ($timeout < 0) { - throw new InvalidArgumentException('The timeout value must be a valid positive integer or float number.'); - } - - return $timeout; - } - - /** - * Reads pipes, executes callback. - * - * @param bool $blocking Whether to use blocking calls or not - * @param bool $close Whether to close file handles or not - */ - private function readPipes(bool $blocking, bool $close) - { - $result = $this->processPipes->readAndWrite($blocking, $close); - - $callback = $this->callback; - foreach ($result as $type => $data) { - if (3 !== $type) { - $callback(self::STDOUT === $type ? self::OUT : self::ERR, $data); - } elseif (!isset($this->fallbackStatus['signaled'])) { - $this->fallbackStatus['exitcode'] = (int) $data; - } - } - } - - /** - * Closes process resource, closes file handles, sets the exitcode. - * - * @return int The exitcode - */ - private function close(): int - { - $this->processPipes->close(); - if (\is_resource($this->process)) { - proc_close($this->process); - } - $this->exitcode = $this->processInformation['exitcode']; - $this->status = self::STATUS_TERMINATED; - - if (-1 === $this->exitcode) { - if ($this->processInformation['signaled'] && 0 < $this->processInformation['termsig']) { - // if process has been signaled, no exitcode but a valid termsig, apply Unix convention - $this->exitcode = 128 + $this->processInformation['termsig']; - } elseif ($this->isSigchildEnabled()) { - $this->processInformation['signaled'] = true; - $this->processInformation['termsig'] = -1; - } - } - - // Free memory from self-reference callback created by buildCallback - // Doing so in other contexts like __destruct or by garbage collector is ineffective - // Now pipes are closed, so the callback is no longer necessary - $this->callback = null; - - return $this->exitcode; - } - - /** - * Resets data related to the latest run of the process. - */ - private function resetProcessData() - { - $this->starttime = null; - $this->callback = null; - $this->exitcode = null; - $this->fallbackStatus = []; - $this->processInformation = null; - $this->stdout = fopen('php://temp/maxmemory:'.(1024 * 1024), 'w+'); - $this->stderr = fopen('php://temp/maxmemory:'.(1024 * 1024), 'w+'); - $this->process = null; - $this->latestSignal = null; - $this->status = self::STATUS_READY; - $this->incrementalOutputOffset = 0; - $this->incrementalErrorOutputOffset = 0; - } - - /** - * Sends a POSIX signal to the process. - * - * @param int $signal A valid POSIX signal (see https://php.net/pcntl.constants) - * @param bool $throwException Whether to throw exception in case signal failed - * - * @return bool True if the signal was sent successfully, false otherwise - * - * @throws LogicException In case the process is not running - * @throws RuntimeException In case --enable-sigchild is activated and the process can't be killed - * @throws RuntimeException In case of failure - */ - private function doSignal(int $signal, bool $throwException): bool - { - if (null === $pid = $this->getPid()) { - if ($throwException) { - throw new LogicException('Can not send signal on a non running process.'); - } - - return false; - } - - if ('\\' === \DIRECTORY_SEPARATOR) { - exec(sprintf('taskkill /F /T /PID %d 2>&1', $pid), $output, $exitCode); - if ($exitCode && $this->isRunning()) { - if ($throwException) { - throw new RuntimeException(sprintf('Unable to kill the process (%s).', implode(' ', $output))); - } - - return false; - } - } else { - if (!$this->isSigchildEnabled()) { - $ok = @proc_terminate($this->process, $signal); - } elseif (\function_exists('posix_kill')) { - $ok = @posix_kill($pid, $signal); - } elseif ($ok = proc_open(sprintf('kill -%d %d', $signal, $pid), [2 => ['pipe', 'w']], $pipes)) { - $ok = false === fgets($pipes[2]); - } - if (!$ok) { - if ($throwException) { - throw new RuntimeException(sprintf('Error while sending signal "%s".', $signal)); - } - - return false; - } - } - - $this->latestSignal = $signal; - $this->fallbackStatus['signaled'] = true; - $this->fallbackStatus['exitcode'] = -1; - $this->fallbackStatus['termsig'] = $this->latestSignal; - - return true; - } - - private function prepareWindowsCommandLine(string $cmd, array &$env): string - { - $uid = uniqid('', true); - $varCount = 0; - $varCache = []; - $cmd = preg_replace_callback( - '/"(?:( - [^"%!^]*+ - (?: - (?: !LF! | "(?:\^[%!^])?+" ) - [^"%!^]*+ - )++ - ) | [^"]*+ )"/x', - function ($m) use (&$env, &$varCache, &$varCount, $uid) { - if (!isset($m[1])) { - return $m[0]; - } - if (isset($varCache[$m[0]])) { - return $varCache[$m[0]]; - } - if (str_contains($value = $m[1], "\0")) { - $value = str_replace("\0", '?', $value); - } - if (false === strpbrk($value, "\"%!\n")) { - return '"'.$value.'"'; - } - - $value = str_replace(['!LF!', '"^!"', '"^%"', '"^^"', '""'], ["\n", '!', '%', '^', '"'], $value); - $value = '"'.preg_replace('/(\\\\*)"/', '$1$1\\"', $value).'"'; - $var = $uid.++$varCount; - - $env[$var] = $value; - - return $varCache[$m[0]] = '!'.$var.'!'; - }, - $cmd - ); - - $cmd = 'cmd /V:ON /E:ON /D /C ('.str_replace("\n", ' ', $cmd).')'; - foreach ($this->processPipes->getFiles() as $offset => $filename) { - $cmd .= ' '.$offset.'>"'.$filename.'"'; - } - - return $cmd; - } - - /** - * Ensures the process is running or terminated, throws a LogicException if the process has a not started. - * - * @throws LogicException if the process has not run - */ - private function requireProcessIsStarted(string $functionName) - { - if (!$this->isStarted()) { - throw new LogicException(sprintf('Process must be started before calling "%s()".', $functionName)); - } - } - - /** - * Ensures the process is terminated, throws a LogicException if the process has a status different than "terminated". - * - * @throws LogicException if the process is not yet terminated - */ - private function requireProcessIsTerminated(string $functionName) - { - if (!$this->isTerminated()) { - throw new LogicException(sprintf('Process must be terminated before calling "%s()".', $functionName)); - } - } - - /** - * Escapes a string to be used as a shell argument. - */ - private function escapeArgument(?string $argument): string - { - if ('' === $argument || null === $argument) { - return '""'; - } - if ('\\' !== \DIRECTORY_SEPARATOR) { - return "'".str_replace("'", "'\\''", $argument)."'"; - } - if (str_contains($argument, "\0")) { - $argument = str_replace("\0", '?', $argument); - } - if (!preg_match('/[\/()%!^"<>&|\s]/', $argument)) { - return $argument; - } - $argument = preg_replace('/(\\\\+)$/', '$1$1', $argument); - - return '"'.str_replace(['"', '^', '%', '!', "\n"], ['""', '"^^"', '"^%"', '"^!"', '!LF!'], $argument).'"'; - } - - private function replacePlaceholders(string $commandline, array $env) - { - return preg_replace_callback('/"\$\{:([_a-zA-Z]++[_a-zA-Z0-9]*+)\}"/', function ($matches) use ($commandline, $env) { - if (!isset($env[$matches[1]]) || false === $env[$matches[1]]) { - throw new InvalidArgumentException(sprintf('Command line is missing a value for parameter "%s": ', $matches[1]).$commandline); - } - - return $this->escapeArgument($env[$matches[1]]); - }, $commandline); - } - - private function getDefaultEnv(): array - { - $env = []; - - foreach ($_SERVER as $k => $v) { - if (\is_string($v) && false !== $v = getenv($k)) { - $env[$k] = $v; - } - } - - foreach ($_ENV as $k => $v) { - if (\is_string($v)) { - $env[$k] = $v; - } - } - - return $env; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/process/ProcessUtils.php b/tools/php-cs-fixer/vendor/symfony/process/ProcessUtils.php deleted file mode 100644 index 3be7e61..0000000 --- a/tools/php-cs-fixer/vendor/symfony/process/ProcessUtils.php +++ /dev/null @@ -1,69 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Process; - -use Symfony\Component\Process\Exception\InvalidArgumentException; - -/** - * ProcessUtils is a bunch of utility methods. - * - * This class contains static methods only and is not meant to be instantiated. - * - * @author Martin Hasoň - */ -class ProcessUtils -{ - /** - * This class should not be instantiated. - */ - private function __construct() - { - } - - /** - * Validates and normalizes a Process input. - * - * @param string $caller The name of method call that validates the input - * @param mixed $input The input to validate - * - * @return mixed The validated input - * - * @throws InvalidArgumentException In case the input is not valid - */ - public static function validateInput(string $caller, $input) - { - if (null !== $input) { - if (\is_resource($input)) { - return $input; - } - if (\is_string($input)) { - return $input; - } - if (is_scalar($input)) { - return (string) $input; - } - if ($input instanceof Process) { - return $input->getIterator($input::ITER_SKIP_ERR); - } - if ($input instanceof \Iterator) { - return $input; - } - if ($input instanceof \Traversable) { - return new \IteratorIterator($input); - } - - throw new InvalidArgumentException(sprintf('"%s" only accepts strings, Traversable objects or stream resources.', $caller)); - } - - return $input; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/process/README.md b/tools/php-cs-fixer/vendor/symfony/process/README.md deleted file mode 100644 index afce5e4..0000000 --- a/tools/php-cs-fixer/vendor/symfony/process/README.md +++ /dev/null @@ -1,13 +0,0 @@ -Process Component -================= - -The Process component executes commands in sub-processes. - -Resources ---------- - - * [Documentation](https://symfony.com/doc/current/components/process.html) - * [Contributing](https://symfony.com/doc/current/contributing/index.html) - * [Report issues](https://github.com/symfony/symfony/issues) and - [send Pull Requests](https://github.com/symfony/symfony/pulls) - in the [main Symfony repository](https://github.com/symfony/symfony) diff --git a/tools/php-cs-fixer/vendor/symfony/process/composer.json b/tools/php-cs-fixer/vendor/symfony/process/composer.json deleted file mode 100644 index 1669eba..0000000 --- a/tools/php-cs-fixer/vendor/symfony/process/composer.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "symfony/process", - "type": "library", - "description": "Executes commands in sub-processes", - "keywords": [], - "homepage": "https://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.16" - }, - "autoload": { - "psr-4": { "Symfony\\Component\\Process\\": "" }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "minimum-stability": "dev" -} diff --git a/tools/php-cs-fixer/vendor/symfony/service-contracts/.gitignore b/tools/php-cs-fixer/vendor/symfony/service-contracts/.gitignore deleted file mode 100644 index c49a5d8..0000000 --- a/tools/php-cs-fixer/vendor/symfony/service-contracts/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -vendor/ -composer.lock -phpunit.xml diff --git a/tools/php-cs-fixer/vendor/symfony/service-contracts/Attribute/Required.php b/tools/php-cs-fixer/vendor/symfony/service-contracts/Attribute/Required.php deleted file mode 100644 index 9df8511..0000000 --- a/tools/php-cs-fixer/vendor/symfony/service-contracts/Attribute/Required.php +++ /dev/null @@ -1,25 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Contracts\Service\Attribute; - -/** - * A required dependency. - * - * This attribute indicates that a property holds a required dependency. The annotated property or method should be - * considered during the instantiation process of the containing class. - * - * @author Alexander M. Turek - */ -#[\Attribute(\Attribute::TARGET_METHOD | \Attribute::TARGET_PROPERTY)] -final class Required -{ -} diff --git a/tools/php-cs-fixer/vendor/symfony/service-contracts/CHANGELOG.md b/tools/php-cs-fixer/vendor/symfony/service-contracts/CHANGELOG.md deleted file mode 100644 index 7932e26..0000000 --- a/tools/php-cs-fixer/vendor/symfony/service-contracts/CHANGELOG.md +++ /dev/null @@ -1,5 +0,0 @@ -CHANGELOG -========= - -The changelog is maintained for all Symfony contracts at the following URL: -https://github.com/symfony/contracts/blob/main/CHANGELOG.md diff --git a/tools/php-cs-fixer/vendor/symfony/service-contracts/LICENSE b/tools/php-cs-fixer/vendor/symfony/service-contracts/LICENSE deleted file mode 100644 index 2358414..0000000 --- a/tools/php-cs-fixer/vendor/symfony/service-contracts/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2018-2021 Fabien Potencier - -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/tools/php-cs-fixer/vendor/symfony/service-contracts/README.md b/tools/php-cs-fixer/vendor/symfony/service-contracts/README.md deleted file mode 100644 index 41e054a..0000000 --- a/tools/php-cs-fixer/vendor/symfony/service-contracts/README.md +++ /dev/null @@ -1,9 +0,0 @@ -Symfony Service Contracts -========================= - -A set of abstractions extracted out of the Symfony components. - -Can be used to build on semantics that the Symfony components proved useful - and -that already have battle tested implementations. - -See https://github.com/symfony/contracts/blob/main/README.md for more information. diff --git a/tools/php-cs-fixer/vendor/symfony/service-contracts/ResetInterface.php b/tools/php-cs-fixer/vendor/symfony/service-contracts/ResetInterface.php deleted file mode 100644 index 1af1075..0000000 --- a/tools/php-cs-fixer/vendor/symfony/service-contracts/ResetInterface.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Contracts\Service; - -/** - * Provides a way to reset an object to its initial state. - * - * When calling the "reset()" method on an object, it should be put back to its - * initial state. This usually means clearing any internal buffers and forwarding - * the call to internal dependencies. All properties of the object should be put - * back to the same state it had when it was first ready to use. - * - * This method could be called, for example, to recycle objects that are used as - * services, so that they can be used to handle several requests in the same - * process loop (note that we advise making your services stateless instead of - * implementing this interface when possible.) - */ -interface ResetInterface -{ - public function reset(); -} diff --git a/tools/php-cs-fixer/vendor/symfony/service-contracts/ServiceLocatorTrait.php b/tools/php-cs-fixer/vendor/symfony/service-contracts/ServiceLocatorTrait.php deleted file mode 100644 index 74dfa43..0000000 --- a/tools/php-cs-fixer/vendor/symfony/service-contracts/ServiceLocatorTrait.php +++ /dev/null @@ -1,128 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Contracts\Service; - -use Psr\Container\ContainerExceptionInterface; -use Psr\Container\NotFoundExceptionInterface; - -// Help opcache.preload discover always-needed symbols -class_exists(ContainerExceptionInterface::class); -class_exists(NotFoundExceptionInterface::class); - -/** - * A trait to help implement ServiceProviderInterface. - * - * @author Robin Chalas - * @author Nicolas Grekas - */ -trait ServiceLocatorTrait -{ - private $factories; - private $loading = []; - private $providedTypes; - - /** - * @param callable[] $factories - */ - public function __construct(array $factories) - { - $this->factories = $factories; - } - - /** - * {@inheritdoc} - * - * @return bool - */ - public function has(string $id) - { - return isset($this->factories[$id]); - } - - /** - * {@inheritdoc} - * - * @return mixed - */ - public function get(string $id) - { - if (!isset($this->factories[$id])) { - throw $this->createNotFoundException($id); - } - - if (isset($this->loading[$id])) { - $ids = array_values($this->loading); - $ids = \array_slice($this->loading, array_search($id, $ids)); - $ids[] = $id; - - throw $this->createCircularReferenceException($id, $ids); - } - - $this->loading[$id] = $id; - try { - return $this->factories[$id]($this); - } finally { - unset($this->loading[$id]); - } - } - - /** - * {@inheritdoc} - */ - public function getProvidedServices(): array - { - if (null === $this->providedTypes) { - $this->providedTypes = []; - - foreach ($this->factories as $name => $factory) { - if (!\is_callable($factory)) { - $this->providedTypes[$name] = '?'; - } else { - $type = (new \ReflectionFunction($factory))->getReturnType(); - - $this->providedTypes[$name] = $type ? ($type->allowsNull() ? '?' : '').($type instanceof \ReflectionNamedType ? $type->getName() : $type) : '?'; - } - } - } - - return $this->providedTypes; - } - - private function createNotFoundException(string $id): NotFoundExceptionInterface - { - if (!$alternatives = array_keys($this->factories)) { - $message = 'is empty...'; - } else { - $last = array_pop($alternatives); - if ($alternatives) { - $message = sprintf('only knows about the "%s" and "%s" services.', implode('", "', $alternatives), $last); - } else { - $message = sprintf('only knows about the "%s" service.', $last); - } - } - - if ($this->loading) { - $message = sprintf('The service "%s" has a dependency on a non-existent service "%s". This locator %s', end($this->loading), $id, $message); - } else { - $message = sprintf('Service "%s" not found: the current service locator %s', $id, $message); - } - - return new class($message) extends \InvalidArgumentException implements NotFoundExceptionInterface { - }; - } - - private function createCircularReferenceException(string $id, array $path): ContainerExceptionInterface - { - return new class(sprintf('Circular reference detected for service "%s", path: "%s".', $id, implode(' -> ', $path))) extends \RuntimeException implements ContainerExceptionInterface { - }; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/service-contracts/ServiceProviderInterface.php b/tools/php-cs-fixer/vendor/symfony/service-contracts/ServiceProviderInterface.php deleted file mode 100644 index c60ad0b..0000000 --- a/tools/php-cs-fixer/vendor/symfony/service-contracts/ServiceProviderInterface.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Contracts\Service; - -use Psr\Container\ContainerInterface; - -/** - * A ServiceProviderInterface exposes the identifiers and the types of services provided by a container. - * - * @author Nicolas Grekas - * @author Mateusz Sip - */ -interface ServiceProviderInterface extends ContainerInterface -{ - /** - * Returns an associative array of service types keyed by the identifiers provided by the current container. - * - * Examples: - * - * * ['logger' => 'Psr\Log\LoggerInterface'] means the object provides a service named "logger" that implements Psr\Log\LoggerInterface - * * ['foo' => '?'] means the container provides service name "foo" of unspecified type - * * ['bar' => '?Bar\Baz'] means the container provides a service "bar" of type Bar\Baz|null - * - * @return string[] The provided service types, keyed by service names - */ - public function getProvidedServices(): array; -} diff --git a/tools/php-cs-fixer/vendor/symfony/service-contracts/ServiceSubscriberInterface.php b/tools/php-cs-fixer/vendor/symfony/service-contracts/ServiceSubscriberInterface.php deleted file mode 100644 index 098ab90..0000000 --- a/tools/php-cs-fixer/vendor/symfony/service-contracts/ServiceSubscriberInterface.php +++ /dev/null @@ -1,53 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Contracts\Service; - -/** - * A ServiceSubscriber exposes its dependencies via the static {@link getSubscribedServices} method. - * - * The getSubscribedServices method returns an array of service types required by such instances, - * optionally keyed by the service names used internally. Service types that start with an interrogation - * mark "?" are optional, while the other ones are mandatory service dependencies. - * - * The injected service locators SHOULD NOT allow access to any other services not specified by the method. - * - * It is expected that ServiceSubscriber instances consume PSR-11-based service locators internally. - * This interface does not dictate any injection method for these service locators, although constructor - * injection is recommended. - * - * @author Nicolas Grekas - */ -interface ServiceSubscriberInterface -{ - /** - * Returns an array of service types required by such instances, optionally keyed by the service names used internally. - * - * For mandatory dependencies: - * - * * ['logger' => 'Psr\Log\LoggerInterface'] means the objects use the "logger" name - * internally to fetch a service which must implement Psr\Log\LoggerInterface. - * * ['loggers' => 'Psr\Log\LoggerInterface[]'] means the objects use the "loggers" name - * internally to fetch an iterable of Psr\Log\LoggerInterface instances. - * * ['Psr\Log\LoggerInterface'] is a shortcut for - * * ['Psr\Log\LoggerInterface' => 'Psr\Log\LoggerInterface'] - * - * otherwise: - * - * * ['logger' => '?Psr\Log\LoggerInterface'] denotes an optional dependency - * * ['loggers' => '?Psr\Log\LoggerInterface[]'] denotes an optional iterable dependency - * * ['?Psr\Log\LoggerInterface'] is a shortcut for - * * ['Psr\Log\LoggerInterface' => '?Psr\Log\LoggerInterface'] - * - * @return string[] The required service types, optionally keyed by service names - */ - public static function getSubscribedServices(); -} diff --git a/tools/php-cs-fixer/vendor/symfony/service-contracts/ServiceSubscriberTrait.php b/tools/php-cs-fixer/vendor/symfony/service-contracts/ServiceSubscriberTrait.php deleted file mode 100644 index 243e103..0000000 --- a/tools/php-cs-fixer/vendor/symfony/service-contracts/ServiceSubscriberTrait.php +++ /dev/null @@ -1,66 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Contracts\Service; - -use Psr\Container\ContainerInterface; - -/** - * Implementation of ServiceSubscriberInterface that determines subscribed services from - * private method return types. Service ids are available as "ClassName::methodName". - * - * @author Kevin Bond - */ -trait ServiceSubscriberTrait -{ - /** @var ContainerInterface */ - protected $container; - - /** - * {@inheritdoc} - */ - public static function getSubscribedServices(): array - { - static $services; - - if (null !== $services) { - return $services; - } - - $services = \is_callable(['parent', __FUNCTION__]) ? parent::getSubscribedServices() : []; - - foreach ((new \ReflectionClass(self::class))->getMethods() as $method) { - if ($method->isStatic() || $method->isAbstract() || $method->isGenerator() || $method->isInternal() || $method->getNumberOfRequiredParameters()) { - continue; - } - - if (self::class === $method->getDeclaringClass()->name && ($returnType = $method->getReturnType()) && !$returnType->isBuiltin()) { - $services[self::class.'::'.$method->name] = '?'.($returnType instanceof \ReflectionNamedType ? $returnType->getName() : $returnType); - } - } - - return $services; - } - - /** - * @required - */ - public function setContainer(ContainerInterface $container) - { - $this->container = $container; - - if (\is_callable(['parent', __FUNCTION__])) { - return parent::setContainer($container); - } - - return null; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/service-contracts/Test/ServiceLocatorTest.php b/tools/php-cs-fixer/vendor/symfony/service-contracts/Test/ServiceLocatorTest.php deleted file mode 100644 index d5b8267..0000000 --- a/tools/php-cs-fixer/vendor/symfony/service-contracts/Test/ServiceLocatorTest.php +++ /dev/null @@ -1,92 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Contracts\Service\Test; - -use PHPUnit\Framework\TestCase; -use Psr\Container\ContainerInterface; -use Symfony\Contracts\Service\ServiceLocatorTrait; - -abstract class ServiceLocatorTest extends TestCase -{ - protected function getServiceLocator(array $factories) - { - return new class($factories) implements ContainerInterface { - use ServiceLocatorTrait; - }; - } - - public function testHas() - { - $locator = $this->getServiceLocator([ - 'foo' => function () { return 'bar'; }, - 'bar' => function () { return 'baz'; }, - function () { return 'dummy'; }, - ]); - - $this->assertTrue($locator->has('foo')); - $this->assertTrue($locator->has('bar')); - $this->assertFalse($locator->has('dummy')); - } - - public function testGet() - { - $locator = $this->getServiceLocator([ - 'foo' => function () { return 'bar'; }, - 'bar' => function () { return 'baz'; }, - ]); - - $this->assertSame('bar', $locator->get('foo')); - $this->assertSame('baz', $locator->get('bar')); - } - - public function testGetDoesNotMemoize() - { - $i = 0; - $locator = $this->getServiceLocator([ - 'foo' => function () use (&$i) { - ++$i; - - return 'bar'; - }, - ]); - - $this->assertSame('bar', $locator->get('foo')); - $this->assertSame('bar', $locator->get('foo')); - $this->assertSame(2, $i); - } - - public function testThrowsOnUndefinedInternalService() - { - if (!$this->getExpectedException()) { - $this->expectException(\Psr\Container\NotFoundExceptionInterface::class); - $this->expectExceptionMessage('The service "foo" has a dependency on a non-existent service "bar". This locator only knows about the "foo" service.'); - } - $locator = $this->getServiceLocator([ - 'foo' => function () use (&$locator) { return $locator->get('bar'); }, - ]); - - $locator->get('foo'); - } - - public function testThrowsOnCircularReference() - { - $this->expectException(\Psr\Container\ContainerExceptionInterface::class); - $this->expectExceptionMessage('Circular reference detected for service "bar", path: "bar -> baz -> bar".'); - $locator = $this->getServiceLocator([ - 'foo' => function () use (&$locator) { return $locator->get('bar'); }, - 'bar' => function () use (&$locator) { return $locator->get('baz'); }, - 'baz' => function () use (&$locator) { return $locator->get('bar'); }, - ]); - - $locator->get('foo'); - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/service-contracts/composer.json b/tools/php-cs-fixer/vendor/symfony/service-contracts/composer.json deleted file mode 100644 index 353413f..0000000 --- a/tools/php-cs-fixer/vendor/symfony/service-contracts/composer.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "symfony/service-contracts", - "type": "library", - "description": "Generic abstractions related to writing services", - "keywords": ["abstractions", "contracts", "decoupling", "interfaces", "interoperability", "standards"], - "homepage": "https://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "require": { - "php": ">=7.2.5", - "psr/container": "^1.1" - }, - "suggest": { - "symfony/service-implementation": "" - }, - "autoload": { - "psr-4": { "Symfony\\Contracts\\Service\\": "" } - }, - "minimum-stability": "dev", - "extra": { - "branch-alias": { - "dev-main": "2.4-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/stopwatch/CHANGELOG.md b/tools/php-cs-fixer/vendor/symfony/stopwatch/CHANGELOG.md deleted file mode 100644 index f2fd7d0..0000000 --- a/tools/php-cs-fixer/vendor/symfony/stopwatch/CHANGELOG.md +++ /dev/null @@ -1,24 +0,0 @@ -CHANGELOG -========= - -5.2 ---- - - * Add `name` argument to the `StopWatchEvent` constructor, accessible via a new `StopwatchEvent::getName()` - -5.0.0 ------ - - * Removed support for passing `null` as 1st (`$id`) argument of `Section::get()` method, pass a valid child section identifier instead. - -4.4.0 ------ - - * Deprecated passing `null` as 1st (`$id`) argument of `Section::get()` method, pass a valid child section identifier instead. - -3.4.0 ------ - - * added the `Stopwatch::reset()` method - * allowed to measure sub-millisecond times by introducing an argument to the - constructor of `Stopwatch` diff --git a/tools/php-cs-fixer/vendor/symfony/stopwatch/LICENSE b/tools/php-cs-fixer/vendor/symfony/stopwatch/LICENSE deleted file mode 100644 index 9ff2d0d..0000000 --- a/tools/php-cs-fixer/vendor/symfony/stopwatch/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2004-2021 Fabien Potencier - -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/tools/php-cs-fixer/vendor/symfony/stopwatch/README.md b/tools/php-cs-fixer/vendor/symfony/stopwatch/README.md deleted file mode 100644 index 13a9dfa..0000000 --- a/tools/php-cs-fixer/vendor/symfony/stopwatch/README.md +++ /dev/null @@ -1,42 +0,0 @@ -Stopwatch Component -=================== - -The Stopwatch component provides a way to profile code. - -Getting Started ---------------- - -``` -$ composer require symfony/stopwatch -``` - -```php -use Symfony\Component\Stopwatch\Stopwatch; - -$stopwatch = new Stopwatch(); - -// optionally group events into sections (e.g. phases of the execution) -$stopwatch->openSection(); - -// starts event named 'eventName' -$stopwatch->start('eventName'); - -// ... run your code here - -// optionally, start a new "lap" time -$stopwatch->lap('foo'); - -// ... run your code here - -$event = $stopwatch->stop('eventName'); - -$stopwatch->stopSection('phase_1'); -``` - -Resources ---------- - - * [Contributing](https://symfony.com/doc/current/contributing/index.html) - * [Report issues](https://github.com/symfony/symfony/issues) and - [send Pull Requests](https://github.com/symfony/symfony/pulls) - in the [main Symfony repository](https://github.com/symfony/symfony) diff --git a/tools/php-cs-fixer/vendor/symfony/stopwatch/Section.php b/tools/php-cs-fixer/vendor/symfony/stopwatch/Section.php deleted file mode 100644 index 7f720d6..0000000 --- a/tools/php-cs-fixer/vendor/symfony/stopwatch/Section.php +++ /dev/null @@ -1,185 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Stopwatch; - -/** - * Stopwatch section. - * - * @author Fabien Potencier - */ -class Section -{ - /** - * @var StopwatchEvent[] - */ - private $events = []; - - /** - * @var float|null - */ - private $origin; - - /** - * @var bool - */ - private $morePrecision; - - /** - * @var string - */ - private $id; - - /** - * @var Section[] - */ - private $children = []; - - /** - * @param float|null $origin Set the origin of the events in this section, use null to set their origin to their start time - * @param bool $morePrecision If true, time is stored as float to keep the original microsecond precision - */ - public function __construct(float $origin = null, bool $morePrecision = false) - { - $this->origin = $origin; - $this->morePrecision = $morePrecision; - } - - /** - * Returns the child section. - * - * @return self|null The child section or null when none found - */ - public function get(string $id) - { - foreach ($this->children as $child) { - if ($id === $child->getId()) { - return $child; - } - } - - return null; - } - - /** - * Creates or re-opens a child section. - * - * @param string|null $id Null to create a new section, the identifier to re-open an existing one - * - * @return self - */ - public function open(?string $id) - { - if (null === $id || null === $session = $this->get($id)) { - $session = $this->children[] = new self(microtime(true) * 1000, $this->morePrecision); - } - - return $session; - } - - /** - * @return string The identifier of the section - */ - public function getId() - { - return $this->id; - } - - /** - * Sets the session identifier. - * - * @return $this - */ - public function setId(string $id) - { - $this->id = $id; - - return $this; - } - - /** - * Starts an event. - * - * @return StopwatchEvent The event - */ - public function startEvent(string $name, ?string $category) - { - if (!isset($this->events[$name])) { - $this->events[$name] = new StopwatchEvent($this->origin ?: microtime(true) * 1000, $category, $this->morePrecision, $name); - } - - return $this->events[$name]->start(); - } - - /** - * Checks if the event was started. - * - * @return bool - */ - public function isEventStarted(string $name) - { - return isset($this->events[$name]) && $this->events[$name]->isStarted(); - } - - /** - * Stops an event. - * - * @return StopwatchEvent The event - * - * @throws \LogicException When the event has not been started - */ - public function stopEvent(string $name) - { - if (!isset($this->events[$name])) { - throw new \LogicException(sprintf('Event "%s" is not started.', $name)); - } - - return $this->events[$name]->stop(); - } - - /** - * Stops then restarts an event. - * - * @return StopwatchEvent The event - * - * @throws \LogicException When the event has not been started - */ - public function lap(string $name) - { - return $this->stopEvent($name)->start(); - } - - /** - * Returns a specific event by name. - * - * @return StopwatchEvent The event - * - * @throws \LogicException When the event is not known - */ - public function getEvent(string $name) - { - if (!isset($this->events[$name])) { - throw new \LogicException(sprintf('Event "%s" is not known.', $name)); - } - - return $this->events[$name]; - } - - /** - * Returns the events from this section. - * - * @return StopwatchEvent[] An array of StopwatchEvent instances - */ - public function getEvents() - { - return $this->events; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/stopwatch/Stopwatch.php b/tools/php-cs-fixer/vendor/symfony/stopwatch/Stopwatch.php deleted file mode 100644 index 8fea588..0000000 --- a/tools/php-cs-fixer/vendor/symfony/stopwatch/Stopwatch.php +++ /dev/null @@ -1,166 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Stopwatch; - -use Symfony\Contracts\Service\ResetInterface; - -// Help opcache.preload discover always-needed symbols -class_exists(Section::class); - -/** - * Stopwatch provides a way to profile code. - * - * @author Fabien Potencier - */ -class Stopwatch implements ResetInterface -{ - /** - * @var bool - */ - private $morePrecision; - - /** - * @var Section[] - */ - private $sections; - - /** - * @var Section[] - */ - private $activeSections; - - /** - * @param bool $morePrecision If true, time is stored as float to keep the original microsecond precision - */ - public function __construct(bool $morePrecision = false) - { - $this->morePrecision = $morePrecision; - $this->reset(); - } - - /** - * @return Section[] - */ - public function getSections() - { - return $this->sections; - } - - /** - * Creates a new section or re-opens an existing section. - * - * @param string|null $id The id of the session to re-open, null to create a new one - * - * @throws \LogicException When the section to re-open is not reachable - */ - public function openSection(string $id = null) - { - $current = end($this->activeSections); - - if (null !== $id && null === $current->get($id)) { - throw new \LogicException(sprintf('The section "%s" has been started at an other level and can not be opened.', $id)); - } - - $this->start('__section__.child', 'section'); - $this->activeSections[] = $current->open($id); - $this->start('__section__'); - } - - /** - * Stops the last started section. - * - * The id parameter is used to retrieve the events from this section. - * - * @see getSectionEvents() - * - * @throws \LogicException When there's no started section to be stopped - */ - public function stopSection(string $id) - { - $this->stop('__section__'); - - if (1 == \count($this->activeSections)) { - throw new \LogicException('There is no started section to stop.'); - } - - $this->sections[$id] = array_pop($this->activeSections)->setId($id); - $this->stop('__section__.child'); - } - - /** - * Starts an event. - * - * @return StopwatchEvent - */ - public function start(string $name, string $category = null) - { - return end($this->activeSections)->startEvent($name, $category); - } - - /** - * Checks if the event was started. - * - * @return bool - */ - public function isStarted(string $name) - { - return end($this->activeSections)->isEventStarted($name); - } - - /** - * Stops an event. - * - * @return StopwatchEvent - */ - public function stop(string $name) - { - return end($this->activeSections)->stopEvent($name); - } - - /** - * Stops then restarts an event. - * - * @return StopwatchEvent - */ - public function lap(string $name) - { - return end($this->activeSections)->stopEvent($name)->start(); - } - - /** - * Returns a specific event by name. - * - * @return StopwatchEvent - */ - public function getEvent(string $name) - { - return end($this->activeSections)->getEvent($name); - } - - /** - * Gets all events for a given section. - * - * @return StopwatchEvent[] - */ - public function getSectionEvents(string $id) - { - return isset($this->sections[$id]) ? $this->sections[$id]->getEvents() : []; - } - - /** - * Resets the stopwatch to its original state. - */ - public function reset() - { - $this->sections = $this->activeSections = ['__root__' => new Section(null, $this->morePrecision)]; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/stopwatch/StopwatchEvent.php b/tools/php-cs-fixer/vendor/symfony/stopwatch/StopwatchEvent.php deleted file mode 100644 index 5b6942c..0000000 --- a/tools/php-cs-fixer/vendor/symfony/stopwatch/StopwatchEvent.php +++ /dev/null @@ -1,258 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Stopwatch; - -/** - * Represents an Event managed by Stopwatch. - * - * @author Fabien Potencier - */ -class StopwatchEvent -{ - /** - * @var StopwatchPeriod[] - */ - private $periods = []; - - /** - * @var float - */ - private $origin; - - /** - * @var string - */ - private $category; - - /** - * @var bool - */ - private $morePrecision; - - /** - * @var float[] - */ - private $started = []; - - /** - * @var string - */ - private $name; - - /** - * @param float $origin The origin time in milliseconds - * @param string|null $category The event category or null to use the default - * @param bool $morePrecision If true, time is stored as float to keep the original microsecond precision - * @param string|null $name The event name or null to define the name as default - * - * @throws \InvalidArgumentException When the raw time is not valid - */ - public function __construct(float $origin, string $category = null, bool $morePrecision = false, string $name = null) - { - $this->origin = $this->formatTime($origin); - $this->category = \is_string($category) ? $category : 'default'; - $this->morePrecision = $morePrecision; - $this->name = $name ?? 'default'; - } - - /** - * Gets the category. - * - * @return string The category - */ - public function getCategory() - { - return $this->category; - } - - /** - * Gets the origin. - * - * @return float The origin in milliseconds - */ - public function getOrigin() - { - return $this->origin; - } - - /** - * Starts a new event period. - * - * @return $this - */ - public function start() - { - $this->started[] = $this->getNow(); - - return $this; - } - - /** - * Stops the last started event period. - * - * @return $this - * - * @throws \LogicException When stop() is called without a matching call to start() - */ - public function stop() - { - if (!\count($this->started)) { - throw new \LogicException('stop() called but start() has not been called before.'); - } - - $this->periods[] = new StopwatchPeriod(array_pop($this->started), $this->getNow(), $this->morePrecision); - - return $this; - } - - /** - * Checks if the event was started. - * - * @return bool - */ - public function isStarted() - { - return !empty($this->started); - } - - /** - * Stops the current period and then starts a new one. - * - * @return $this - */ - public function lap() - { - return $this->stop()->start(); - } - - /** - * Stops all non already stopped periods. - */ - public function ensureStopped() - { - while (\count($this->started)) { - $this->stop(); - } - } - - /** - * Gets all event periods. - * - * @return StopwatchPeriod[] An array of StopwatchPeriod instances - */ - public function getPeriods() - { - return $this->periods; - } - - /** - * Gets the relative time of the start of the first period. - * - * @return int|float The time (in milliseconds) - */ - public function getStartTime() - { - if (isset($this->periods[0])) { - return $this->periods[0]->getStartTime(); - } - - if ($this->started) { - return $this->started[0]; - } - - return 0; - } - - /** - * Gets the relative time of the end of the last period. - * - * @return int|float The time (in milliseconds) - */ - public function getEndTime() - { - $count = \count($this->periods); - - return $count ? $this->periods[$count - 1]->getEndTime() : 0; - } - - /** - * Gets the duration of the events (including all periods). - * - * @return int|float The duration (in milliseconds) - */ - public function getDuration() - { - $periods = $this->periods; - $left = \count($this->started); - - for ($i = $left - 1; $i >= 0; --$i) { - $periods[] = new StopwatchPeriod($this->started[$i], $this->getNow(), $this->morePrecision); - } - - $total = 0; - foreach ($periods as $period) { - $total += $period->getDuration(); - } - - return $total; - } - - /** - * Gets the max memory usage of all periods. - * - * @return int The memory usage (in bytes) - */ - public function getMemory() - { - $memory = 0; - foreach ($this->periods as $period) { - if ($period->getMemory() > $memory) { - $memory = $period->getMemory(); - } - } - - return $memory; - } - - /** - * Return the current time relative to origin. - * - * @return float Time in ms - */ - protected function getNow() - { - return $this->formatTime(microtime(true) * 1000 - $this->origin); - } - - /** - * Formats a time. - * - * @throws \InvalidArgumentException When the raw time is not valid - */ - private function formatTime(float $time): float - { - return round($time, 1); - } - - /** - * Gets the event name. - */ - public function getName(): string - { - return $this->name; - } - - public function __toString(): string - { - return sprintf('%s/%s: %.2F MiB - %d ms', $this->getCategory(), $this->getName(), $this->getMemory() / 1024 / 1024, $this->getDuration()); - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/stopwatch/StopwatchPeriod.php b/tools/php-cs-fixer/vendor/symfony/stopwatch/StopwatchPeriod.php deleted file mode 100644 index b820d5e..0000000 --- a/tools/php-cs-fixer/vendor/symfony/stopwatch/StopwatchPeriod.php +++ /dev/null @@ -1,81 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Stopwatch; - -/** - * Represents an Period for an Event. - * - * @author Fabien Potencier - */ -class StopwatchPeriod -{ - private $start; - private $end; - private $memory; - - /** - * @param int|float $start The relative time of the start of the period (in milliseconds) - * @param int|float $end The relative time of the end of the period (in milliseconds) - * @param bool $morePrecision If true, time is stored as float to keep the original microsecond precision - */ - public function __construct($start, $end, bool $morePrecision = false) - { - $this->start = $morePrecision ? (float) $start : (int) $start; - $this->end = $morePrecision ? (float) $end : (int) $end; - $this->memory = memory_get_usage(true); - } - - /** - * Gets the relative time of the start of the period. - * - * @return int|float The time (in milliseconds) - */ - public function getStartTime() - { - return $this->start; - } - - /** - * Gets the relative time of the end of the period. - * - * @return int|float The time (in milliseconds) - */ - public function getEndTime() - { - return $this->end; - } - - /** - * Gets the time spent in this period. - * - * @return int|float The period duration (in milliseconds) - */ - public function getDuration() - { - return $this->end - $this->start; - } - - /** - * Gets the memory usage. - * - * @return int The memory usage (in bytes) - */ - public function getMemory() - { - return $this->memory; - } - - public function __toString(): string - { - return sprintf('%.2F MiB - %d ms', $this->getMemory() / 1024 / 1024, $this->getDuration()); - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/stopwatch/composer.json b/tools/php-cs-fixer/vendor/symfony/stopwatch/composer.json deleted file mode 100644 index 2722494..0000000 --- a/tools/php-cs-fixer/vendor/symfony/stopwatch/composer.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "symfony/stopwatch", - "type": "library", - "description": "Provides a way to profile code", - "keywords": [], - "homepage": "https://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "require": { - "php": ">=7.2.5", - "symfony/service-contracts": "^1.0|^2" - }, - "autoload": { - "psr-4": { "Symfony\\Component\\Stopwatch\\": "" }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "minimum-stability": "dev" -} diff --git a/tools/php-cs-fixer/vendor/symfony/string/AbstractString.php b/tools/php-cs-fixer/vendor/symfony/string/AbstractString.php deleted file mode 100644 index d3d95d4..0000000 --- a/tools/php-cs-fixer/vendor/symfony/string/AbstractString.php +++ /dev/null @@ -1,727 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\String; - -use Symfony\Component\String\Exception\ExceptionInterface; -use Symfony\Component\String\Exception\InvalidArgumentException; -use Symfony\Component\String\Exception\RuntimeException; - -/** - * Represents a string of abstract characters. - * - * Unicode defines 3 types of "characters" (bytes, code points and grapheme clusters). - * This class is the abstract type to use as a type-hint when the logic you want to - * implement doesn't care about the exact variant it deals with. - * - * @author Nicolas Grekas - * @author Hugo Hamon - * - * @throws ExceptionInterface - */ -abstract class AbstractString implements \Stringable, \JsonSerializable -{ - public const PREG_PATTERN_ORDER = \PREG_PATTERN_ORDER; - public const PREG_SET_ORDER = \PREG_SET_ORDER; - public const PREG_OFFSET_CAPTURE = \PREG_OFFSET_CAPTURE; - public const PREG_UNMATCHED_AS_NULL = \PREG_UNMATCHED_AS_NULL; - - public const PREG_SPLIT = 0; - public const PREG_SPLIT_NO_EMPTY = \PREG_SPLIT_NO_EMPTY; - public const PREG_SPLIT_DELIM_CAPTURE = \PREG_SPLIT_DELIM_CAPTURE; - public const PREG_SPLIT_OFFSET_CAPTURE = \PREG_SPLIT_OFFSET_CAPTURE; - - protected $string = ''; - protected $ignoreCase = false; - - abstract public function __construct(string $string = ''); - - /** - * Unwraps instances of AbstractString back to strings. - * - * @return string[]|array - */ - public static function unwrap(array $values): array - { - foreach ($values as $k => $v) { - if ($v instanceof self) { - $values[$k] = $v->__toString(); - } elseif (\is_array($v) && $values[$k] !== $v = static::unwrap($v)) { - $values[$k] = $v; - } - } - - return $values; - } - - /** - * Wraps (and normalizes) strings in instances of AbstractString. - * - * @return static[]|array - */ - public static function wrap(array $values): array - { - $i = 0; - $keys = null; - - foreach ($values as $k => $v) { - if (\is_string($k) && '' !== $k && $k !== $j = (string) new static($k)) { - $keys = $keys ?? array_keys($values); - $keys[$i] = $j; - } - - if (\is_string($v)) { - $values[$k] = new static($v); - } elseif (\is_array($v) && $values[$k] !== $v = static::wrap($v)) { - $values[$k] = $v; - } - - ++$i; - } - - return null !== $keys ? array_combine($keys, $values) : $values; - } - - /** - * @param string|string[] $needle - * - * @return static - */ - public function after($needle, bool $includeNeedle = false, int $offset = 0): self - { - $str = clone $this; - $i = \PHP_INT_MAX; - - foreach ((array) $needle as $n) { - $n = (string) $n; - $j = $this->indexOf($n, $offset); - - if (null !== $j && $j < $i) { - $i = $j; - $str->string = $n; - } - } - - if (\PHP_INT_MAX === $i) { - return $str; - } - - if (!$includeNeedle) { - $i += $str->length(); - } - - return $this->slice($i); - } - - /** - * @param string|string[] $needle - * - * @return static - */ - public function afterLast($needle, bool $includeNeedle = false, int $offset = 0): self - { - $str = clone $this; - $i = null; - - foreach ((array) $needle as $n) { - $n = (string) $n; - $j = $this->indexOfLast($n, $offset); - - if (null !== $j && $j >= $i) { - $i = $offset = $j; - $str->string = $n; - } - } - - if (null === $i) { - return $str; - } - - if (!$includeNeedle) { - $i += $str->length(); - } - - return $this->slice($i); - } - - /** - * @return static - */ - abstract public function append(string ...$suffix): self; - - /** - * @param string|string[] $needle - * - * @return static - */ - public function before($needle, bool $includeNeedle = false, int $offset = 0): self - { - $str = clone $this; - $i = \PHP_INT_MAX; - - foreach ((array) $needle as $n) { - $n = (string) $n; - $j = $this->indexOf($n, $offset); - - if (null !== $j && $j < $i) { - $i = $j; - $str->string = $n; - } - } - - if (\PHP_INT_MAX === $i) { - return $str; - } - - if ($includeNeedle) { - $i += $str->length(); - } - - return $this->slice(0, $i); - } - - /** - * @param string|string[] $needle - * - * @return static - */ - public function beforeLast($needle, bool $includeNeedle = false, int $offset = 0): self - { - $str = clone $this; - $i = null; - - foreach ((array) $needle as $n) { - $n = (string) $n; - $j = $this->indexOfLast($n, $offset); - - if (null !== $j && $j >= $i) { - $i = $offset = $j; - $str->string = $n; - } - } - - if (null === $i) { - return $str; - } - - if ($includeNeedle) { - $i += $str->length(); - } - - return $this->slice(0, $i); - } - - /** - * @return int[] - */ - public function bytesAt(int $offset): array - { - $str = $this->slice($offset, 1); - - return '' === $str->string ? [] : array_values(unpack('C*', $str->string)); - } - - /** - * @return static - */ - abstract public function camel(): self; - - /** - * @return static[] - */ - abstract public function chunk(int $length = 1): array; - - /** - * @return static - */ - public function collapseWhitespace(): self - { - $str = clone $this; - $str->string = trim(preg_replace('/(?:\s{2,}+|[^\S ])/', ' ', $str->string)); - - return $str; - } - - /** - * @param string|string[] $needle - */ - public function containsAny($needle): bool - { - return null !== $this->indexOf($needle); - } - - /** - * @param string|string[] $suffix - */ - public function endsWith($suffix): bool - { - if (!\is_array($suffix) && !$suffix instanceof \Traversable) { - throw new \TypeError(sprintf('Method "%s()" must be overridden by class "%s" to deal with non-iterable values.', __FUNCTION__, static::class)); - } - - foreach ($suffix as $s) { - if ($this->endsWith((string) $s)) { - return true; - } - } - - return false; - } - - /** - * @return static - */ - public function ensureEnd(string $suffix): self - { - if (!$this->endsWith($suffix)) { - return $this->append($suffix); - } - - $suffix = preg_quote($suffix); - $regex = '{('.$suffix.')(?:'.$suffix.')++$}D'; - - return $this->replaceMatches($regex.($this->ignoreCase ? 'i' : ''), '$1'); - } - - /** - * @return static - */ - public function ensureStart(string $prefix): self - { - $prefix = new static($prefix); - - if (!$this->startsWith($prefix)) { - return $this->prepend($prefix); - } - - $str = clone $this; - $i = $prefixLen = $prefix->length(); - - while ($this->indexOf($prefix, $i) === $i) { - $str = $str->slice($prefixLen); - $i += $prefixLen; - } - - return $str; - } - - /** - * @param string|string[] $string - */ - public function equalsTo($string): bool - { - if (!\is_array($string) && !$string instanceof \Traversable) { - throw new \TypeError(sprintf('Method "%s()" must be overridden by class "%s" to deal with non-iterable values.', __FUNCTION__, static::class)); - } - - foreach ($string as $s) { - if ($this->equalsTo((string) $s)) { - return true; - } - } - - return false; - } - - /** - * @return static - */ - abstract public function folded(): self; - - /** - * @return static - */ - public function ignoreCase(): self - { - $str = clone $this; - $str->ignoreCase = true; - - return $str; - } - - /** - * @param string|string[] $needle - */ - public function indexOf($needle, int $offset = 0): ?int - { - if (!\is_array($needle) && !$needle instanceof \Traversable) { - throw new \TypeError(sprintf('Method "%s()" must be overridden by class "%s" to deal with non-iterable values.', __FUNCTION__, static::class)); - } - - $i = \PHP_INT_MAX; - - foreach ($needle as $n) { - $j = $this->indexOf((string) $n, $offset); - - if (null !== $j && $j < $i) { - $i = $j; - } - } - - return \PHP_INT_MAX === $i ? null : $i; - } - - /** - * @param string|string[] $needle - */ - public function indexOfLast($needle, int $offset = 0): ?int - { - if (!\is_array($needle) && !$needle instanceof \Traversable) { - throw new \TypeError(sprintf('Method "%s()" must be overridden by class "%s" to deal with non-iterable values.', __FUNCTION__, static::class)); - } - - $i = null; - - foreach ($needle as $n) { - $j = $this->indexOfLast((string) $n, $offset); - - if (null !== $j && $j >= $i) { - $i = $offset = $j; - } - } - - return $i; - } - - public function isEmpty(): bool - { - return '' === $this->string; - } - - /** - * @return static - */ - abstract public function join(array $strings, string $lastGlue = null): self; - - public function jsonSerialize(): string - { - return $this->string; - } - - abstract public function length(): int; - - /** - * @return static - */ - abstract public function lower(): self; - - /** - * Matches the string using a regular expression. - * - * Pass PREG_PATTERN_ORDER or PREG_SET_ORDER as $flags to get all occurrences matching the regular expression. - * - * @return array All matches in a multi-dimensional array ordered according to flags - */ - abstract public function match(string $regexp, int $flags = 0, int $offset = 0): array; - - /** - * @return static - */ - abstract public function padBoth(int $length, string $padStr = ' '): self; - - /** - * @return static - */ - abstract public function padEnd(int $length, string $padStr = ' '): self; - - /** - * @return static - */ - abstract public function padStart(int $length, string $padStr = ' '): self; - - /** - * @return static - */ - abstract public function prepend(string ...$prefix): self; - - /** - * @return static - */ - public function repeat(int $multiplier): self - { - if (0 > $multiplier) { - throw new InvalidArgumentException(sprintf('Multiplier must be positive, %d given.', $multiplier)); - } - - $str = clone $this; - $str->string = str_repeat($str->string, $multiplier); - - return $str; - } - - /** - * @return static - */ - abstract public function replace(string $from, string $to): self; - - /** - * @param string|callable $to - * - * @return static - */ - abstract public function replaceMatches(string $fromRegexp, $to): self; - - /** - * @return static - */ - abstract public function reverse(): self; - - /** - * @return static - */ - abstract public function slice(int $start = 0, int $length = null): self; - - /** - * @return static - */ - abstract public function snake(): self; - - /** - * @return static - */ - abstract public function splice(string $replacement, int $start = 0, int $length = null): self; - - /** - * @return static[] - */ - public function split(string $delimiter, int $limit = null, int $flags = null): array - { - if (null === $flags) { - throw new \TypeError('Split behavior when $flags is null must be implemented by child classes.'); - } - - if ($this->ignoreCase) { - $delimiter .= 'i'; - } - - set_error_handler(static function ($t, $m) { throw new InvalidArgumentException($m); }); - - try { - if (false === $chunks = preg_split($delimiter, $this->string, $limit, $flags)) { - $lastError = preg_last_error(); - - foreach (get_defined_constants(true)['pcre'] as $k => $v) { - if ($lastError === $v && '_ERROR' === substr($k, -6)) { - throw new RuntimeException('Splitting failed with '.$k.'.'); - } - } - - throw new RuntimeException('Splitting failed with unknown error code.'); - } - } finally { - restore_error_handler(); - } - - $str = clone $this; - - if (self::PREG_SPLIT_OFFSET_CAPTURE & $flags) { - foreach ($chunks as &$chunk) { - $str->string = $chunk[0]; - $chunk[0] = clone $str; - } - } else { - foreach ($chunks as &$chunk) { - $str->string = $chunk; - $chunk = clone $str; - } - } - - return $chunks; - } - - /** - * @param string|string[] $prefix - */ - public function startsWith($prefix): bool - { - if (!\is_array($prefix) && !$prefix instanceof \Traversable) { - throw new \TypeError(sprintf('Method "%s()" must be overridden by class "%s" to deal with non-iterable values.', __FUNCTION__, static::class)); - } - - foreach ($prefix as $prefix) { - if ($this->startsWith((string) $prefix)) { - return true; - } - } - - return false; - } - - /** - * @return static - */ - abstract public function title(bool $allWords = false): self; - - public function toByteString(string $toEncoding = null): ByteString - { - $b = new ByteString(); - - $toEncoding = \in_array($toEncoding, ['utf8', 'utf-8', 'UTF8'], true) ? 'UTF-8' : $toEncoding; - - if (null === $toEncoding || $toEncoding === $fromEncoding = $this instanceof AbstractUnicodeString || preg_match('//u', $b->string) ? 'UTF-8' : 'Windows-1252') { - $b->string = $this->string; - - return $b; - } - - set_error_handler(static function ($t, $m) { throw new InvalidArgumentException($m); }); - - try { - try { - $b->string = mb_convert_encoding($this->string, $toEncoding, 'UTF-8'); - } catch (InvalidArgumentException $e) { - if (!\function_exists('iconv')) { - throw $e; - } - - $b->string = iconv('UTF-8', $toEncoding, $this->string); - } - } finally { - restore_error_handler(); - } - - return $b; - } - - public function toCodePointString(): CodePointString - { - return new CodePointString($this->string); - } - - public function toString(): string - { - return $this->string; - } - - public function toUnicodeString(): UnicodeString - { - return new UnicodeString($this->string); - } - - /** - * @return static - */ - abstract public function trim(string $chars = " \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}"): self; - - /** - * @return static - */ - abstract public function trimEnd(string $chars = " \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}"): self; - - /** - * @return static - */ - abstract public function trimStart(string $chars = " \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}"): self; - - /** - * @return static - */ - public function truncate(int $length, string $ellipsis = '', bool $cut = true): self - { - $stringLength = $this->length(); - - if ($stringLength <= $length) { - return clone $this; - } - - $ellipsisLength = '' !== $ellipsis ? (new static($ellipsis))->length() : 0; - - if ($length < $ellipsisLength) { - $ellipsisLength = 0; - } - - if (!$cut) { - if (null === $length = $this->indexOf([' ', "\r", "\n", "\t"], ($length ?: 1) - 1)) { - return clone $this; - } - - $length += $ellipsisLength; - } - - $str = $this->slice(0, $length - $ellipsisLength); - - return $ellipsisLength ? $str->trimEnd()->append($ellipsis) : $str; - } - - /** - * @return static - */ - abstract public function upper(): self; - - /** - * Returns the printable length on a terminal. - */ - abstract public function width(bool $ignoreAnsiDecoration = true): int; - - /** - * @return static - */ - public function wordwrap(int $width = 75, string $break = "\n", bool $cut = false): self - { - $lines = '' !== $break ? $this->split($break) : [clone $this]; - $chars = []; - $mask = ''; - - if (1 === \count($lines) && '' === $lines[0]->string) { - return $lines[0]; - } - - foreach ($lines as $i => $line) { - if ($i) { - $chars[] = $break; - $mask .= '#'; - } - - foreach ($line->chunk() as $char) { - $chars[] = $char->string; - $mask .= ' ' === $char->string ? ' ' : '?'; - } - } - - $string = ''; - $j = 0; - $b = $i = -1; - $mask = wordwrap($mask, $width, '#', $cut); - - while (false !== $b = strpos($mask, '#', $b + 1)) { - for (++$i; $i < $b; ++$i) { - $string .= $chars[$j]; - unset($chars[$j++]); - } - - if ($break === $chars[$j] || ' ' === $chars[$j]) { - unset($chars[$j++]); - } - - $string .= $break; - } - - $str = clone $this; - $str->string = $string.implode('', $chars); - - return $str; - } - - public function __sleep(): array - { - return ['string']; - } - - public function __clone() - { - $this->ignoreCase = false; - } - - public function __toString(): string - { - return $this->string; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/string/AbstractUnicodeString.php b/tools/php-cs-fixer/vendor/symfony/string/AbstractUnicodeString.php deleted file mode 100644 index 8af75a1..0000000 --- a/tools/php-cs-fixer/vendor/symfony/string/AbstractUnicodeString.php +++ /dev/null @@ -1,580 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\String; - -use Symfony\Component\String\Exception\ExceptionInterface; -use Symfony\Component\String\Exception\InvalidArgumentException; -use Symfony\Component\String\Exception\RuntimeException; - -/** - * Represents a string of abstract Unicode characters. - * - * Unicode defines 3 types of "characters" (bytes, code points and grapheme clusters). - * This class is the abstract type to use as a type-hint when the logic you want to - * implement is Unicode-aware but doesn't care about code points vs grapheme clusters. - * - * @author Nicolas Grekas - * - * @throws ExceptionInterface - */ -abstract class AbstractUnicodeString extends AbstractString -{ - public const NFC = \Normalizer::NFC; - public const NFD = \Normalizer::NFD; - public const NFKC = \Normalizer::NFKC; - public const NFKD = \Normalizer::NFKD; - - // all ASCII letters sorted by typical frequency of occurrence - private const ASCII = "\x20\x65\x69\x61\x73\x6E\x74\x72\x6F\x6C\x75\x64\x5D\x5B\x63\x6D\x70\x27\x0A\x67\x7C\x68\x76\x2E\x66\x62\x2C\x3A\x3D\x2D\x71\x31\x30\x43\x32\x2A\x79\x78\x29\x28\x4C\x39\x41\x53\x2F\x50\x22\x45\x6A\x4D\x49\x6B\x33\x3E\x35\x54\x3C\x44\x34\x7D\x42\x7B\x38\x46\x77\x52\x36\x37\x55\x47\x4E\x3B\x4A\x7A\x56\x23\x48\x4F\x57\x5F\x26\x21\x4B\x3F\x58\x51\x25\x59\x5C\x09\x5A\x2B\x7E\x5E\x24\x40\x60\x7F\x00\x01\x02\x03\x04\x05\x06\x07\x08\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F"; - - // the subset of folded case mappings that is not in lower case mappings - private const FOLD_FROM = ['İ', 'µ', 'ſ', "\xCD\x85", 'ς', 'ϐ', 'ϑ', 'ϕ', 'ϖ', 'ϰ', 'ϱ', 'ϵ', 'ẛ', "\xE1\xBE\xBE", 'ß', 'İ', 'ʼn', 'ǰ', 'ΐ', 'ΰ', 'և', 'ẖ', 'ẗ', 'ẘ', 'ẙ', 'ẚ', 'ẞ', 'ὐ', 'ὒ', 'ὔ', 'ὖ', 'ᾀ', 'ᾁ', 'ᾂ', 'ᾃ', 'ᾄ', 'ᾅ', 'ᾆ', 'ᾇ', 'ᾈ', 'ᾉ', 'ᾊ', 'ᾋ', 'ᾌ', 'ᾍ', 'ᾎ', 'ᾏ', 'ᾐ', 'ᾑ', 'ᾒ', 'ᾓ', 'ᾔ', 'ᾕ', 'ᾖ', 'ᾗ', 'ᾘ', 'ᾙ', 'ᾚ', 'ᾛ', 'ᾜ', 'ᾝ', 'ᾞ', 'ᾟ', 'ᾠ', 'ᾡ', 'ᾢ', 'ᾣ', 'ᾤ', 'ᾥ', 'ᾦ', 'ᾧ', 'ᾨ', 'ᾩ', 'ᾪ', 'ᾫ', 'ᾬ', 'ᾭ', 'ᾮ', 'ᾯ', 'ᾲ', 'ᾳ', 'ᾴ', 'ᾶ', 'ᾷ', 'ᾼ', 'ῂ', 'ῃ', 'ῄ', 'ῆ', 'ῇ', 'ῌ', 'ῒ', 'ΐ', 'ῖ', 'ῗ', 'ῢ', 'ΰ', 'ῤ', 'ῦ', 'ῧ', 'ῲ', 'ῳ', 'ῴ', 'ῶ', 'ῷ', 'ῼ', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'ſt', 'st', 'ﬓ', 'ﬔ', 'ﬕ', 'ﬖ', 'ﬗ']; - private const FOLD_TO = ['i̇', 'μ', 's', 'ι', 'σ', 'β', 'θ', 'φ', 'π', 'κ', 'ρ', 'ε', 'ṡ', 'ι', 'ss', 'i̇', 'ʼn', 'ǰ', 'ΐ', 'ΰ', 'եւ', 'ẖ', 'ẗ', 'ẘ', 'ẙ', 'aʾ', 'ss', 'ὐ', 'ὒ', 'ὔ', 'ὖ', 'ἀι', 'ἁι', 'ἂι', 'ἃι', 'ἄι', 'ἅι', 'ἆι', 'ἇι', 'ἀι', 'ἁι', 'ἂι', 'ἃι', 'ἄι', 'ἅι', 'ἆι', 'ἇι', 'ἠι', 'ἡι', 'ἢι', 'ἣι', 'ἤι', 'ἥι', 'ἦι', 'ἧι', 'ἠι', 'ἡι', 'ἢι', 'ἣι', 'ἤι', 'ἥι', 'ἦι', 'ἧι', 'ὠι', 'ὡι', 'ὢι', 'ὣι', 'ὤι', 'ὥι', 'ὦι', 'ὧι', 'ὠι', 'ὡι', 'ὢι', 'ὣι', 'ὤι', 'ὥι', 'ὦι', 'ὧι', 'ὰι', 'αι', 'άι', 'ᾶ', 'ᾶι', 'αι', 'ὴι', 'ηι', 'ήι', 'ῆ', 'ῆι', 'ηι', 'ῒ', 'ΐ', 'ῖ', 'ῗ', 'ῢ', 'ΰ', 'ῤ', 'ῦ', 'ῧ', 'ὼι', 'ωι', 'ώι', 'ῶ', 'ῶι', 'ωι', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'st', 'st', 'մն', 'մե', 'մի', 'վն', 'մխ']; - - // the subset of upper case mappings that map one code point to many code points - private const UPPER_FROM = ['ß', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'ſt', 'st', 'և', 'ﬓ', 'ﬔ', 'ﬕ', 'ﬖ', 'ﬗ', 'ʼn', 'ΐ', 'ΰ', 'ǰ', 'ẖ', 'ẗ', 'ẘ', 'ẙ', 'ẚ', 'ὐ', 'ὒ', 'ὔ', 'ὖ', 'ᾶ', 'ῆ', 'ῒ', 'ΐ', 'ῖ', 'ῗ', 'ῢ', 'ΰ', 'ῤ', 'ῦ', 'ῧ', 'ῶ']; - private const UPPER_TO = ['SS', 'FF', 'FI', 'FL', 'FFI', 'FFL', 'ST', 'ST', 'ԵՒ', 'ՄՆ', 'ՄԵ', 'ՄԻ', 'ՎՆ', 'ՄԽ', 'ʼN', 'Ϊ́', 'Ϋ́', 'J̌', 'H̱', 'T̈', 'W̊', 'Y̊', 'Aʾ', 'Υ̓', 'Υ̓̀', 'Υ̓́', 'Υ̓͂', 'Α͂', 'Η͂', 'Ϊ̀', 'Ϊ́', 'Ι͂', 'Ϊ͂', 'Ϋ̀', 'Ϋ́', 'Ρ̓', 'Υ͂', 'Ϋ͂', 'Ω͂']; - - // the subset of https://github.com/unicode-org/cldr/blob/master/common/transforms/Latin-ASCII.xml that is not in NFKD - private const TRANSLIT_FROM = ['Æ', 'Ð', 'Ø', 'Þ', 'ß', 'æ', 'ð', 'ø', 'þ', 'Đ', 'đ', 'Ħ', 'ħ', 'ı', 'ĸ', 'Ŀ', 'ŀ', 'Ł', 'ł', 'ʼn', 'Ŋ', 'ŋ', 'Œ', 'œ', 'Ŧ', 'ŧ', 'ƀ', 'Ɓ', 'Ƃ', 'ƃ', 'Ƈ', 'ƈ', 'Ɖ', 'Ɗ', 'Ƌ', 'ƌ', 'Ɛ', 'Ƒ', 'ƒ', 'Ɠ', 'ƕ', 'Ɩ', 'Ɨ', 'Ƙ', 'ƙ', 'ƚ', 'Ɲ', 'ƞ', 'Ƣ', 'ƣ', 'Ƥ', 'ƥ', 'ƫ', 'Ƭ', 'ƭ', 'Ʈ', 'Ʋ', 'Ƴ', 'ƴ', 'Ƶ', 'ƶ', 'DŽ', 'Dž', 'dž', 'Ǥ', 'ǥ', 'ȡ', 'Ȥ', 'ȥ', 'ȴ', 'ȵ', 'ȶ', 'ȷ', 'ȸ', 'ȹ', 'Ⱥ', 'Ȼ', 'ȼ', 'Ƚ', 'Ⱦ', 'ȿ', 'ɀ', 'Ƀ', 'Ʉ', 'Ɇ', 'ɇ', 'Ɉ', 'ɉ', 'Ɍ', 'ɍ', 'Ɏ', 'ɏ', 'ɓ', 'ɕ', 'ɖ', 'ɗ', 'ɛ', 'ɟ', 'ɠ', 'ɡ', 'ɢ', 'ɦ', 'ɧ', 'ɨ', 'ɪ', 'ɫ', 'ɬ', 'ɭ', 'ɱ', 'ɲ', 'ɳ', 'ɴ', 'ɶ', 'ɼ', 'ɽ', 'ɾ', 'ʀ', 'ʂ', 'ʈ', 'ʉ', 'ʋ', 'ʏ', 'ʐ', 'ʑ', 'ʙ', 'ʛ', 'ʜ', 'ʝ', 'ʟ', 'ʠ', 'ʣ', 'ʥ', 'ʦ', 'ʪ', 'ʫ', 'ᴀ', 'ᴁ', 'ᴃ', 'ᴄ', 'ᴅ', 'ᴆ', 'ᴇ', 'ᴊ', 'ᴋ', 'ᴌ', 'ᴍ', 'ᴏ', 'ᴘ', 'ᴛ', 'ᴜ', 'ᴠ', 'ᴡ', 'ᴢ', 'ᵫ', 'ᵬ', 'ᵭ', 'ᵮ', 'ᵯ', 'ᵰ', 'ᵱ', 'ᵲ', 'ᵳ', 'ᵴ', 'ᵵ', 'ᵶ', 'ᵺ', 'ᵻ', 'ᵽ', 'ᵾ', 'ᶀ', 'ᶁ', 'ᶂ', 'ᶃ', 'ᶄ', 'ᶅ', 'ᶆ', 'ᶇ', 'ᶈ', 'ᶉ', 'ᶊ', 'ᶌ', 'ᶍ', 'ᶎ', 'ᶏ', 'ᶑ', 'ᶒ', 'ᶓ', 'ᶖ', 'ᶙ', 'ẚ', 'ẜ', 'ẝ', 'ẞ', 'Ỻ', 'ỻ', 'Ỽ', 'ỽ', 'Ỿ', 'ỿ', '©', '®', '₠', '₢', '₣', '₤', '₧', '₺', '₹', 'ℌ', '℞', '㎧', '㎮', '㏆', '㏗', '㏞', '㏟', '¼', '½', '¾', '⅓', '⅔', '⅕', '⅖', '⅗', '⅘', '⅙', '⅚', '⅛', '⅜', '⅝', '⅞', '⅟', '〇', '‘', '’', '‚', '‛', '“', '”', '„', '‟', '′', '″', '〝', '〞', '«', '»', '‹', '›', '‐', '‑', '‒', '–', '—', '―', '︱', '︲', '﹘', '‖', '⁄', '⁅', '⁆', '⁎', '、', '。', '〈', '〉', '《', '》', '〔', '〕', '〘', '〙', '〚', '〛', '︑', '︒', '︹', '︺', '︽', '︾', '︿', '﹀', '﹑', '﹝', '﹞', '⦅', '⦆', '。', '、', '×', '÷', '−', '∕', '∖', '∣', '∥', '≪', '≫', '⦅', '⦆']; - private const TRANSLIT_TO = ['AE', 'D', 'O', 'TH', 'ss', 'ae', 'd', 'o', 'th', 'D', 'd', 'H', 'h', 'i', 'q', 'L', 'l', 'L', 'l', '\'n', 'N', 'n', 'OE', 'oe', 'T', 't', 'b', 'B', 'B', 'b', 'C', 'c', 'D', 'D', 'D', 'd', 'E', 'F', 'f', 'G', 'hv', 'I', 'I', 'K', 'k', 'l', 'N', 'n', 'OI', 'oi', 'P', 'p', 't', 'T', 't', 'T', 'V', 'Y', 'y', 'Z', 'z', 'DZ', 'Dz', 'dz', 'G', 'g', 'd', 'Z', 'z', 'l', 'n', 't', 'j', 'db', 'qp', 'A', 'C', 'c', 'L', 'T', 's', 'z', 'B', 'U', 'E', 'e', 'J', 'j', 'R', 'r', 'Y', 'y', 'b', 'c', 'd', 'd', 'e', 'j', 'g', 'g', 'G', 'h', 'h', 'i', 'I', 'l', 'l', 'l', 'm', 'n', 'n', 'N', 'OE', 'r', 'r', 'r', 'R', 's', 't', 'u', 'v', 'Y', 'z', 'z', 'B', 'G', 'H', 'j', 'L', 'q', 'dz', 'dz', 'ts', 'ls', 'lz', 'A', 'AE', 'B', 'C', 'D', 'D', 'E', 'J', 'K', 'L', 'M', 'O', 'P', 'T', 'U', 'V', 'W', 'Z', 'ue', 'b', 'd', 'f', 'm', 'n', 'p', 'r', 'r', 's', 't', 'z', 'th', 'I', 'p', 'U', 'b', 'd', 'f', 'g', 'k', 'l', 'm', 'n', 'p', 'r', 's', 'v', 'x', 'z', 'a', 'd', 'e', 'e', 'i', 'u', 'a', 's', 's', 'SS', 'LL', 'll', 'V', 'v', 'Y', 'y', '(C)', '(R)', 'CE', 'Cr', 'Fr.', 'L.', 'Pts', 'TL', 'Rs', 'x', 'Rx', 'm/s', 'rad/s', 'C/kg', 'pH', 'V/m', 'A/m', ' 1/4', ' 1/2', ' 3/4', ' 1/3', ' 2/3', ' 1/5', ' 2/5', ' 3/5', ' 4/5', ' 1/6', ' 5/6', ' 1/8', ' 3/8', ' 5/8', ' 7/8', ' 1/', '0', '\'', '\'', ',', '\'', '"', '"', ',,', '"', '\'', '"', '"', '"', '<<', '>>', '<', '>', '-', '-', '-', '-', '-', '-', '-', '-', '-', '||', '/', '[', ']', '*', ',', '.', '<', '>', '<<', '>>', '[', ']', '[', ']', '[', ']', ',', '.', '[', ']', '<<', '>>', '<', '>', ',', '[', ']', '((', '))', '.', ',', '*', '/', '-', '/', '\\', '|', '||', '<<', '>>', '((', '))']; - - private static $transliterators = []; - - /** - * @return static - */ - public static function fromCodePoints(int ...$codes): self - { - $string = ''; - - foreach ($codes as $code) { - if (0x80 > $code %= 0x200000) { - $string .= \chr($code); - } elseif (0x800 > $code) { - $string .= \chr(0xC0 | $code >> 6).\chr(0x80 | $code & 0x3F); - } elseif (0x10000 > $code) { - $string .= \chr(0xE0 | $code >> 12).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F); - } else { - $string .= \chr(0xF0 | $code >> 18).\chr(0x80 | $code >> 12 & 0x3F).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F); - } - } - - return new static($string); - } - - /** - * Generic UTF-8 to ASCII transliteration. - * - * Install the intl extension for best results. - * - * @param string[]|\Transliterator[]|\Closure[] $rules See "*-Latin" rules from Transliterator::listIDs() - */ - public function ascii(array $rules = []): self - { - $str = clone $this; - $s = $str->string; - $str->string = ''; - - array_unshift($rules, 'nfd'); - $rules[] = 'latin-ascii'; - - if (\function_exists('transliterator_transliterate')) { - $rules[] = 'any-latin/bgn'; - } - - $rules[] = 'nfkd'; - $rules[] = '[:nonspacing mark:] remove'; - - while (\strlen($s) - 1 > $i = strspn($s, self::ASCII)) { - if (0 < --$i) { - $str->string .= substr($s, 0, $i); - $s = substr($s, $i); - } - - if (!$rule = array_shift($rules)) { - $rules = []; // An empty rule interrupts the next ones - } - - if ($rule instanceof \Transliterator) { - $s = $rule->transliterate($s); - } elseif ($rule instanceof \Closure) { - $s = $rule($s); - } elseif ($rule) { - if ('nfd' === $rule = strtolower($rule)) { - normalizer_is_normalized($s, self::NFD) ?: $s = normalizer_normalize($s, self::NFD); - } elseif ('nfkd' === $rule) { - normalizer_is_normalized($s, self::NFKD) ?: $s = normalizer_normalize($s, self::NFKD); - } elseif ('[:nonspacing mark:] remove' === $rule) { - $s = preg_replace('/\p{Mn}++/u', '', $s); - } elseif ('latin-ascii' === $rule) { - $s = str_replace(self::TRANSLIT_FROM, self::TRANSLIT_TO, $s); - } elseif ('de-ascii' === $rule) { - $s = preg_replace("/([AUO])\u{0308}(?=\p{Ll})/u", '$1e', $s); - $s = str_replace(["a\u{0308}", "o\u{0308}", "u\u{0308}", "A\u{0308}", "O\u{0308}", "U\u{0308}"], ['ae', 'oe', 'ue', 'AE', 'OE', 'UE'], $s); - } elseif (\function_exists('transliterator_transliterate')) { - if (null === $transliterator = self::$transliterators[$rule] ?? self::$transliterators[$rule] = \Transliterator::create($rule)) { - if ('any-latin/bgn' === $rule) { - $rule = 'any-latin'; - $transliterator = self::$transliterators[$rule] ?? self::$transliterators[$rule] = \Transliterator::create($rule); - } - - if (null === $transliterator) { - throw new InvalidArgumentException(sprintf('Unknown transliteration rule "%s".', $rule)); - } - - self::$transliterators['any-latin/bgn'] = $transliterator; - } - - $s = $transliterator->transliterate($s); - } - } elseif (!\function_exists('iconv')) { - $s = preg_replace('/[^\x00-\x7F]/u', '?', $s); - } else { - $s = @preg_replace_callback('/[^\x00-\x7F]/u', static function ($c) { - $c = (string) iconv('UTF-8', 'ASCII//TRANSLIT', $c[0]); - - if ('' === $c && '' === iconv('UTF-8', 'ASCII//TRANSLIT', '²')) { - throw new \LogicException(sprintf('"%s" requires a translit-able iconv implementation, try installing "gnu-libiconv" if you\'re using Alpine Linux.', static::class)); - } - - return 1 < \strlen($c) ? ltrim($c, '\'`"^~') : ('' !== $c ? $c : '?'); - }, $s); - } - } - - $str->string .= $s; - - return $str; - } - - public function camel(): parent - { - $str = clone $this; - $str->string = str_replace(' ', '', preg_replace_callback('/\b./u', static function ($m) use (&$i) { - return 1 === ++$i ? ('İ' === $m[0] ? 'i̇' : mb_strtolower($m[0], 'UTF-8')) : mb_convert_case($m[0], \MB_CASE_TITLE, 'UTF-8'); - }, preg_replace('/[^\pL0-9]++/u', ' ', $this->string))); - - return $str; - } - - /** - * @return int[] - */ - public function codePointsAt(int $offset): array - { - $str = $this->slice($offset, 1); - - if ('' === $str->string) { - return []; - } - - $codePoints = []; - - foreach (preg_split('//u', $str->string, -1, \PREG_SPLIT_NO_EMPTY) as $c) { - $codePoints[] = mb_ord($c, 'UTF-8'); - } - - return $codePoints; - } - - public function folded(bool $compat = true): parent - { - $str = clone $this; - - if (!$compat || \PHP_VERSION_ID < 70300 || !\defined('Normalizer::NFKC_CF')) { - $str->string = normalizer_normalize($str->string, $compat ? \Normalizer::NFKC : \Normalizer::NFC); - $str->string = mb_strtolower(str_replace(self::FOLD_FROM, self::FOLD_TO, $this->string), 'UTF-8'); - } else { - $str->string = normalizer_normalize($str->string, \Normalizer::NFKC_CF); - } - - return $str; - } - - public function join(array $strings, string $lastGlue = null): parent - { - $str = clone $this; - - $tail = null !== $lastGlue && 1 < \count($strings) ? $lastGlue.array_pop($strings) : ''; - $str->string = implode($this->string, $strings).$tail; - - if (!preg_match('//u', $str->string)) { - throw new InvalidArgumentException('Invalid UTF-8 string.'); - } - - return $str; - } - - public function lower(): parent - { - $str = clone $this; - $str->string = mb_strtolower(str_replace('İ', 'i̇', $str->string), 'UTF-8'); - - return $str; - } - - public function match(string $regexp, int $flags = 0, int $offset = 0): array - { - $match = ((\PREG_PATTERN_ORDER | \PREG_SET_ORDER) & $flags) ? 'preg_match_all' : 'preg_match'; - - if ($this->ignoreCase) { - $regexp .= 'i'; - } - - set_error_handler(static function ($t, $m) { throw new InvalidArgumentException($m); }); - - try { - if (false === $match($regexp.'u', $this->string, $matches, $flags | \PREG_UNMATCHED_AS_NULL, $offset)) { - $lastError = preg_last_error(); - - foreach (get_defined_constants(true)['pcre'] as $k => $v) { - if ($lastError === $v && '_ERROR' === substr($k, -6)) { - throw new RuntimeException('Matching failed with '.$k.'.'); - } - } - - throw new RuntimeException('Matching failed with unknown error code.'); - } - } finally { - restore_error_handler(); - } - - return $matches; - } - - /** - * @return static - */ - public function normalize(int $form = self::NFC): self - { - if (!\in_array($form, [self::NFC, self::NFD, self::NFKC, self::NFKD])) { - throw new InvalidArgumentException('Unsupported normalization form.'); - } - - $str = clone $this; - normalizer_is_normalized($str->string, $form) ?: $str->string = normalizer_normalize($str->string, $form); - - return $str; - } - - public function padBoth(int $length, string $padStr = ' '): parent - { - if ('' === $padStr || !preg_match('//u', $padStr)) { - throw new InvalidArgumentException('Invalid UTF-8 string.'); - } - - $pad = clone $this; - $pad->string = $padStr; - - return $this->pad($length, $pad, \STR_PAD_BOTH); - } - - public function padEnd(int $length, string $padStr = ' '): parent - { - if ('' === $padStr || !preg_match('//u', $padStr)) { - throw new InvalidArgumentException('Invalid UTF-8 string.'); - } - - $pad = clone $this; - $pad->string = $padStr; - - return $this->pad($length, $pad, \STR_PAD_RIGHT); - } - - public function padStart(int $length, string $padStr = ' '): parent - { - if ('' === $padStr || !preg_match('//u', $padStr)) { - throw new InvalidArgumentException('Invalid UTF-8 string.'); - } - - $pad = clone $this; - $pad->string = $padStr; - - return $this->pad($length, $pad, \STR_PAD_LEFT); - } - - public function replaceMatches(string $fromRegexp, $to): parent - { - if ($this->ignoreCase) { - $fromRegexp .= 'i'; - } - - if (\is_array($to) || $to instanceof \Closure) { - if (!\is_callable($to)) { - throw new \TypeError(sprintf('Argument 2 passed to "%s::replaceMatches()" must be callable, array given.', static::class)); - } - - $replace = 'preg_replace_callback'; - $to = static function (array $m) use ($to): string { - $to = $to($m); - - if ('' !== $to && (!\is_string($to) || !preg_match('//u', $to))) { - throw new InvalidArgumentException('Replace callback must return a valid UTF-8 string.'); - } - - return $to; - }; - } elseif ('' !== $to && !preg_match('//u', $to)) { - throw new InvalidArgumentException('Invalid UTF-8 string.'); - } else { - $replace = 'preg_replace'; - } - - set_error_handler(static function ($t, $m) { throw new InvalidArgumentException($m); }); - - try { - if (null === $string = $replace($fromRegexp.'u', $to, $this->string)) { - $lastError = preg_last_error(); - - foreach (get_defined_constants(true)['pcre'] as $k => $v) { - if ($lastError === $v && '_ERROR' === substr($k, -6)) { - throw new RuntimeException('Matching failed with '.$k.'.'); - } - } - - throw new RuntimeException('Matching failed with unknown error code.'); - } - } finally { - restore_error_handler(); - } - - $str = clone $this; - $str->string = $string; - - return $str; - } - - public function reverse(): parent - { - $str = clone $this; - $str->string = implode('', array_reverse(preg_split('/(\X)/u', $str->string, -1, \PREG_SPLIT_DELIM_CAPTURE | \PREG_SPLIT_NO_EMPTY))); - - return $str; - } - - public function snake(): parent - { - $str = $this->camel()->title(); - $str->string = mb_strtolower(preg_replace(['/(\p{Lu}+)(\p{Lu}\p{Ll})/u', '/([\p{Ll}0-9])(\p{Lu})/u'], '\1_\2', $str->string), 'UTF-8'); - - return $str; - } - - public function title(bool $allWords = false): parent - { - $str = clone $this; - - $limit = $allWords ? -1 : 1; - - $str->string = preg_replace_callback('/\b./u', static function (array $m): string { - return mb_convert_case($m[0], \MB_CASE_TITLE, 'UTF-8'); - }, $str->string, $limit); - - return $str; - } - - public function trim(string $chars = " \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}"): parent - { - if (" \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}" !== $chars && !preg_match('//u', $chars)) { - throw new InvalidArgumentException('Invalid UTF-8 chars.'); - } - $chars = preg_quote($chars); - - $str = clone $this; - $str->string = preg_replace("{^[$chars]++|[$chars]++$}uD", '', $str->string); - - return $str; - } - - public function trimEnd(string $chars = " \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}"): parent - { - if (" \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}" !== $chars && !preg_match('//u', $chars)) { - throw new InvalidArgumentException('Invalid UTF-8 chars.'); - } - $chars = preg_quote($chars); - - $str = clone $this; - $str->string = preg_replace("{[$chars]++$}uD", '', $str->string); - - return $str; - } - - public function trimStart(string $chars = " \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}"): parent - { - if (" \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}" !== $chars && !preg_match('//u', $chars)) { - throw new InvalidArgumentException('Invalid UTF-8 chars.'); - } - $chars = preg_quote($chars); - - $str = clone $this; - $str->string = preg_replace("{^[$chars]++}uD", '', $str->string); - - return $str; - } - - public function upper(): parent - { - $str = clone $this; - $str->string = mb_strtoupper($str->string, 'UTF-8'); - - if (\PHP_VERSION_ID < 70300) { - $str->string = str_replace(self::UPPER_FROM, self::UPPER_TO, $str->string); - } - - return $str; - } - - public function width(bool $ignoreAnsiDecoration = true): int - { - $width = 0; - $s = str_replace(["\x00", "\x05", "\x07"], '', $this->string); - - if (false !== strpos($s, "\r")) { - $s = str_replace(["\r\n", "\r"], "\n", $s); - } - - if (!$ignoreAnsiDecoration) { - $s = preg_replace('/[\p{Cc}\x7F]++/u', '', $s); - } - - foreach (explode("\n", $s) as $s) { - if ($ignoreAnsiDecoration) { - $s = preg_replace('/(?:\x1B(?: - \[ [\x30-\x3F]*+ [\x20-\x2F]*+ [0x40-\x7E] - | [P\]X^_] .*? \x1B\\\\ - | [\x41-\x7E] - )|[\p{Cc}\x7F]++)/xu', '', $s); - } - - // Non printable characters have been dropped, so wcswidth cannot logically return -1. - $width += $this->wcswidth($s); - } - - return $width; - } - - /** - * @return static - */ - private function pad(int $len, self $pad, int $type): parent - { - $sLen = $this->length(); - - if ($len <= $sLen) { - return clone $this; - } - - $padLen = $pad->length(); - $freeLen = $len - $sLen; - $len = $freeLen % $padLen; - - switch ($type) { - case \STR_PAD_RIGHT: - return $this->append(str_repeat($pad->string, intdiv($freeLen, $padLen)).($len ? $pad->slice(0, $len) : '')); - - case \STR_PAD_LEFT: - return $this->prepend(str_repeat($pad->string, intdiv($freeLen, $padLen)).($len ? $pad->slice(0, $len) : '')); - - case \STR_PAD_BOTH: - $freeLen /= 2; - - $rightLen = ceil($freeLen); - $len = $rightLen % $padLen; - $str = $this->append(str_repeat($pad->string, intdiv($rightLen, $padLen)).($len ? $pad->slice(0, $len) : '')); - - $leftLen = floor($freeLen); - $len = $leftLen % $padLen; - - return $str->prepend(str_repeat($pad->string, intdiv($leftLen, $padLen)).($len ? $pad->slice(0, $len) : '')); - - default: - throw new InvalidArgumentException('Invalid padding type.'); - } - } - - /** - * Based on https://github.com/jquast/wcwidth, a Python implementation of https://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c. - */ - private function wcswidth(string $string): int - { - $width = 0; - - foreach (preg_split('//u', $string, -1, \PREG_SPLIT_NO_EMPTY) as $c) { - $codePoint = mb_ord($c, 'UTF-8'); - - if (0 === $codePoint // NULL - || 0x034F === $codePoint // COMBINING GRAPHEME JOINER - || (0x200B <= $codePoint && 0x200F >= $codePoint) // ZERO WIDTH SPACE to RIGHT-TO-LEFT MARK - || 0x2028 === $codePoint // LINE SEPARATOR - || 0x2029 === $codePoint // PARAGRAPH SEPARATOR - || (0x202A <= $codePoint && 0x202E >= $codePoint) // LEFT-TO-RIGHT EMBEDDING to RIGHT-TO-LEFT OVERRIDE - || (0x2060 <= $codePoint && 0x2063 >= $codePoint) // WORD JOINER to INVISIBLE SEPARATOR - ) { - continue; - } - - // Non printable characters - if (32 > $codePoint // C0 control characters - || (0x07F <= $codePoint && 0x0A0 > $codePoint) // C1 control characters and DEL - ) { - return -1; - } - - static $tableZero; - if (null === $tableZero) { - $tableZero = require __DIR__.'/Resources/data/wcswidth_table_zero.php'; - } - - if ($codePoint >= $tableZero[0][0] && $codePoint <= $tableZero[$ubound = \count($tableZero) - 1][1]) { - $lbound = 0; - while ($ubound >= $lbound) { - $mid = floor(($lbound + $ubound) / 2); - - if ($codePoint > $tableZero[$mid][1]) { - $lbound = $mid + 1; - } elseif ($codePoint < $tableZero[$mid][0]) { - $ubound = $mid - 1; - } else { - continue 2; - } - } - } - - static $tableWide; - if (null === $tableWide) { - $tableWide = require __DIR__.'/Resources/data/wcswidth_table_wide.php'; - } - - if ($codePoint >= $tableWide[0][0] && $codePoint <= $tableWide[$ubound = \count($tableWide) - 1][1]) { - $lbound = 0; - while ($ubound >= $lbound) { - $mid = floor(($lbound + $ubound) / 2); - - if ($codePoint > $tableWide[$mid][1]) { - $lbound = $mid + 1; - } elseif ($codePoint < $tableWide[$mid][0]) { - $ubound = $mid - 1; - } else { - $width += 2; - - continue 2; - } - } - } - - ++$width; - } - - return $width; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/string/ByteString.php b/tools/php-cs-fixer/vendor/symfony/string/ByteString.php deleted file mode 100644 index bbf8614..0000000 --- a/tools/php-cs-fixer/vendor/symfony/string/ByteString.php +++ /dev/null @@ -1,506 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\String; - -use Symfony\Component\String\Exception\ExceptionInterface; -use Symfony\Component\String\Exception\InvalidArgumentException; -use Symfony\Component\String\Exception\RuntimeException; - -/** - * Represents a binary-safe string of bytes. - * - * @author Nicolas Grekas - * @author Hugo Hamon - * - * @throws ExceptionInterface - */ -class ByteString extends AbstractString -{ - private const ALPHABET_ALPHANUMERIC = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'; - - public function __construct(string $string = '') - { - $this->string = $string; - } - - /* - * The following method was derived from code of the Hack Standard Library (v4.40 - 2020-05-03) - * - * https://github.com/hhvm/hsl/blob/80a42c02f036f72a42f0415e80d6b847f4bf62d5/src/random/private.php#L16 - * - * Code subject to the MIT license (https://github.com/hhvm/hsl/blob/master/LICENSE). - * - * Copyright (c) 2004-2020, Facebook, Inc. (https://www.facebook.com/) - */ - - public static function fromRandom(int $length = 16, string $alphabet = null): self - { - if ($length <= 0) { - throw new InvalidArgumentException(sprintf('A strictly positive length is expected, "%d" given.', $length)); - } - - $alphabet = $alphabet ?? self::ALPHABET_ALPHANUMERIC; - $alphabetSize = \strlen($alphabet); - $bits = (int) ceil(log($alphabetSize, 2.0)); - if ($bits <= 0 || $bits > 56) { - throw new InvalidArgumentException('The length of the alphabet must in the [2^1, 2^56] range.'); - } - - $ret = ''; - while ($length > 0) { - $urandomLength = (int) ceil(2 * $length * $bits / 8.0); - $data = random_bytes($urandomLength); - $unpackedData = 0; - $unpackedBits = 0; - for ($i = 0; $i < $urandomLength && $length > 0; ++$i) { - // Unpack 8 bits - $unpackedData = ($unpackedData << 8) | \ord($data[$i]); - $unpackedBits += 8; - - // While we have enough bits to select a character from the alphabet, keep - // consuming the random data - for (; $unpackedBits >= $bits && $length > 0; $unpackedBits -= $bits) { - $index = ($unpackedData & ((1 << $bits) - 1)); - $unpackedData >>= $bits; - // Unfortunately, the alphabet size is not necessarily a power of two. - // Worst case, it is 2^k + 1, which means we need (k+1) bits and we - // have around a 50% chance of missing as k gets larger - if ($index < $alphabetSize) { - $ret .= $alphabet[$index]; - --$length; - } - } - } - } - - return new static($ret); - } - - public function bytesAt(int $offset): array - { - $str = $this->string[$offset] ?? ''; - - return '' === $str ? [] : [\ord($str)]; - } - - public function append(string ...$suffix): parent - { - $str = clone $this; - $str->string .= 1 >= \count($suffix) ? ($suffix[0] ?? '') : implode('', $suffix); - - return $str; - } - - public function camel(): parent - { - $str = clone $this; - $str->string = lcfirst(str_replace(' ', '', ucwords(preg_replace('/[^a-zA-Z0-9\x7f-\xff]++/', ' ', $this->string)))); - - return $str; - } - - public function chunk(int $length = 1): array - { - if (1 > $length) { - throw new InvalidArgumentException('The chunk length must be greater than zero.'); - } - - if ('' === $this->string) { - return []; - } - - $str = clone $this; - $chunks = []; - - foreach (str_split($this->string, $length) as $chunk) { - $str->string = $chunk; - $chunks[] = clone $str; - } - - return $chunks; - } - - public function endsWith($suffix): bool - { - if ($suffix instanceof parent) { - $suffix = $suffix->string; - } elseif (\is_array($suffix) || $suffix instanceof \Traversable) { - return parent::endsWith($suffix); - } else { - $suffix = (string) $suffix; - } - - return '' !== $suffix && \strlen($this->string) >= \strlen($suffix) && 0 === substr_compare($this->string, $suffix, -\strlen($suffix), null, $this->ignoreCase); - } - - public function equalsTo($string): bool - { - if ($string instanceof parent) { - $string = $string->string; - } elseif (\is_array($string) || $string instanceof \Traversable) { - return parent::equalsTo($string); - } else { - $string = (string) $string; - } - - if ('' !== $string && $this->ignoreCase) { - return 0 === strcasecmp($string, $this->string); - } - - return $string === $this->string; - } - - public function folded(): parent - { - $str = clone $this; - $str->string = strtolower($str->string); - - return $str; - } - - public function indexOf($needle, int $offset = 0): ?int - { - if ($needle instanceof parent) { - $needle = $needle->string; - } elseif (\is_array($needle) || $needle instanceof \Traversable) { - return parent::indexOf($needle, $offset); - } else { - $needle = (string) $needle; - } - - if ('' === $needle) { - return null; - } - - $i = $this->ignoreCase ? stripos($this->string, $needle, $offset) : strpos($this->string, $needle, $offset); - - return false === $i ? null : $i; - } - - public function indexOfLast($needle, int $offset = 0): ?int - { - if ($needle instanceof parent) { - $needle = $needle->string; - } elseif (\is_array($needle) || $needle instanceof \Traversable) { - return parent::indexOfLast($needle, $offset); - } else { - $needle = (string) $needle; - } - - if ('' === $needle) { - return null; - } - - $i = $this->ignoreCase ? strripos($this->string, $needle, $offset) : strrpos($this->string, $needle, $offset); - - return false === $i ? null : $i; - } - - public function isUtf8(): bool - { - return '' === $this->string || preg_match('//u', $this->string); - } - - public function join(array $strings, string $lastGlue = null): parent - { - $str = clone $this; - - $tail = null !== $lastGlue && 1 < \count($strings) ? $lastGlue.array_pop($strings) : ''; - $str->string = implode($this->string, $strings).$tail; - - return $str; - } - - public function length(): int - { - return \strlen($this->string); - } - - public function lower(): parent - { - $str = clone $this; - $str->string = strtolower($str->string); - - return $str; - } - - public function match(string $regexp, int $flags = 0, int $offset = 0): array - { - $match = ((\PREG_PATTERN_ORDER | \PREG_SET_ORDER) & $flags) ? 'preg_match_all' : 'preg_match'; - - if ($this->ignoreCase) { - $regexp .= 'i'; - } - - set_error_handler(static function ($t, $m) { throw new InvalidArgumentException($m); }); - - try { - if (false === $match($regexp, $this->string, $matches, $flags | \PREG_UNMATCHED_AS_NULL, $offset)) { - $lastError = preg_last_error(); - - foreach (get_defined_constants(true)['pcre'] as $k => $v) { - if ($lastError === $v && '_ERROR' === substr($k, -6)) { - throw new RuntimeException('Matching failed with '.$k.'.'); - } - } - - throw new RuntimeException('Matching failed with unknown error code.'); - } - } finally { - restore_error_handler(); - } - - return $matches; - } - - public function padBoth(int $length, string $padStr = ' '): parent - { - $str = clone $this; - $str->string = str_pad($this->string, $length, $padStr, \STR_PAD_BOTH); - - return $str; - } - - public function padEnd(int $length, string $padStr = ' '): parent - { - $str = clone $this; - $str->string = str_pad($this->string, $length, $padStr, \STR_PAD_RIGHT); - - return $str; - } - - public function padStart(int $length, string $padStr = ' '): parent - { - $str = clone $this; - $str->string = str_pad($this->string, $length, $padStr, \STR_PAD_LEFT); - - return $str; - } - - public function prepend(string ...$prefix): parent - { - $str = clone $this; - $str->string = (1 >= \count($prefix) ? ($prefix[0] ?? '') : implode('', $prefix)).$str->string; - - return $str; - } - - public function replace(string $from, string $to): parent - { - $str = clone $this; - - if ('' !== $from) { - $str->string = $this->ignoreCase ? str_ireplace($from, $to, $this->string) : str_replace($from, $to, $this->string); - } - - return $str; - } - - public function replaceMatches(string $fromRegexp, $to): parent - { - if ($this->ignoreCase) { - $fromRegexp .= 'i'; - } - - if (\is_array($to)) { - if (!\is_callable($to)) { - throw new \TypeError(sprintf('Argument 2 passed to "%s::replaceMatches()" must be callable, array given.', static::class)); - } - - $replace = 'preg_replace_callback'; - } else { - $replace = $to instanceof \Closure ? 'preg_replace_callback' : 'preg_replace'; - } - - set_error_handler(static function ($t, $m) { throw new InvalidArgumentException($m); }); - - try { - if (null === $string = $replace($fromRegexp, $to, $this->string)) { - $lastError = preg_last_error(); - - foreach (get_defined_constants(true)['pcre'] as $k => $v) { - if ($lastError === $v && '_ERROR' === substr($k, -6)) { - throw new RuntimeException('Matching failed with '.$k.'.'); - } - } - - throw new RuntimeException('Matching failed with unknown error code.'); - } - } finally { - restore_error_handler(); - } - - $str = clone $this; - $str->string = $string; - - return $str; - } - - public function reverse(): parent - { - $str = clone $this; - $str->string = strrev($str->string); - - return $str; - } - - public function slice(int $start = 0, int $length = null): parent - { - $str = clone $this; - $str->string = (string) substr($this->string, $start, $length ?? \PHP_INT_MAX); - - return $str; - } - - public function snake(): parent - { - $str = $this->camel()->title(); - $str->string = strtolower(preg_replace(['/([A-Z]+)([A-Z][a-z])/', '/([a-z\d])([A-Z])/'], '\1_\2', $str->string)); - - return $str; - } - - public function splice(string $replacement, int $start = 0, int $length = null): parent - { - $str = clone $this; - $str->string = substr_replace($this->string, $replacement, $start, $length ?? \PHP_INT_MAX); - - return $str; - } - - public function split(string $delimiter, int $limit = null, int $flags = null): array - { - if (1 > $limit = $limit ?? \PHP_INT_MAX) { - throw new InvalidArgumentException('Split limit must be a positive integer.'); - } - - if ('' === $delimiter) { - throw new InvalidArgumentException('Split delimiter is empty.'); - } - - if (null !== $flags) { - return parent::split($delimiter, $limit, $flags); - } - - $str = clone $this; - $chunks = $this->ignoreCase - ? preg_split('{'.preg_quote($delimiter).'}iD', $this->string, $limit) - : explode($delimiter, $this->string, $limit); - - foreach ($chunks as &$chunk) { - $str->string = $chunk; - $chunk = clone $str; - } - - return $chunks; - } - - public function startsWith($prefix): bool - { - if ($prefix instanceof parent) { - $prefix = $prefix->string; - } elseif (!\is_string($prefix)) { - return parent::startsWith($prefix); - } - - return '' !== $prefix && 0 === ($this->ignoreCase ? strncasecmp($this->string, $prefix, \strlen($prefix)) : strncmp($this->string, $prefix, \strlen($prefix))); - } - - public function title(bool $allWords = false): parent - { - $str = clone $this; - $str->string = $allWords ? ucwords($str->string) : ucfirst($str->string); - - return $str; - } - - public function toUnicodeString(string $fromEncoding = null): UnicodeString - { - return new UnicodeString($this->toCodePointString($fromEncoding)->string); - } - - public function toCodePointString(string $fromEncoding = null): CodePointString - { - $u = new CodePointString(); - - if (\in_array($fromEncoding, [null, 'utf8', 'utf-8', 'UTF8', 'UTF-8'], true) && preg_match('//u', $this->string)) { - $u->string = $this->string; - - return $u; - } - - set_error_handler(static function ($t, $m) { throw new InvalidArgumentException($m); }); - - try { - try { - $validEncoding = false !== mb_detect_encoding($this->string, $fromEncoding ?? 'Windows-1252', true); - } catch (InvalidArgumentException $e) { - if (!\function_exists('iconv')) { - throw $e; - } - - $u->string = iconv($fromEncoding ?? 'Windows-1252', 'UTF-8', $this->string); - - return $u; - } - } finally { - restore_error_handler(); - } - - if (!$validEncoding) { - throw new InvalidArgumentException(sprintf('Invalid "%s" string.', $fromEncoding ?? 'Windows-1252')); - } - - $u->string = mb_convert_encoding($this->string, 'UTF-8', $fromEncoding ?? 'Windows-1252'); - - return $u; - } - - public function trim(string $chars = " \t\n\r\0\x0B\x0C"): parent - { - $str = clone $this; - $str->string = trim($str->string, $chars); - - return $str; - } - - public function trimEnd(string $chars = " \t\n\r\0\x0B\x0C"): parent - { - $str = clone $this; - $str->string = rtrim($str->string, $chars); - - return $str; - } - - public function trimStart(string $chars = " \t\n\r\0\x0B\x0C"): parent - { - $str = clone $this; - $str->string = ltrim($str->string, $chars); - - return $str; - } - - public function upper(): parent - { - $str = clone $this; - $str->string = strtoupper($str->string); - - return $str; - } - - public function width(bool $ignoreAnsiDecoration = true): int - { - $string = preg_match('//u', $this->string) ? $this->string : preg_replace('/[\x80-\xFF]/', '?', $this->string); - - return (new CodePointString($string))->width($ignoreAnsiDecoration); - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/string/CHANGELOG.md b/tools/php-cs-fixer/vendor/symfony/string/CHANGELOG.md deleted file mode 100644 index 700d214..0000000 --- a/tools/php-cs-fixer/vendor/symfony/string/CHANGELOG.md +++ /dev/null @@ -1,30 +0,0 @@ -CHANGELOG -========= - -5.3 ---- - - * Made `AsciiSlugger` fallback to parent locale's symbolsMap - -5.2.0 ------ - - * added a `FrenchInflector` class - -5.1.0 ------ - - * added the `AbstractString::reverse()` method - * made `AbstractString::width()` follow POSIX.1-2001 - * added `LazyString` which provides memoizing stringable objects - * The component is not marked as `@experimental` anymore - * added the `s()` helper method to get either an `UnicodeString` or `ByteString` instance, - depending of the input string UTF-8 compliancy - * added `$cut` parameter to `Symfony\Component\String\AbstractString::truncate()` - * added `AbstractString::containsAny()` - * allow passing a string of custom characters to `ByteString::fromRandom()` - -5.0.0 ------ - - * added the component as experimental diff --git a/tools/php-cs-fixer/vendor/symfony/string/CodePointString.php b/tools/php-cs-fixer/vendor/symfony/string/CodePointString.php deleted file mode 100644 index 8ab9209..0000000 --- a/tools/php-cs-fixer/vendor/symfony/string/CodePointString.php +++ /dev/null @@ -1,270 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\String; - -use Symfony\Component\String\Exception\ExceptionInterface; -use Symfony\Component\String\Exception\InvalidArgumentException; - -/** - * Represents a string of Unicode code points encoded as UTF-8. - * - * @author Nicolas Grekas - * @author Hugo Hamon - * - * @throws ExceptionInterface - */ -class CodePointString extends AbstractUnicodeString -{ - public function __construct(string $string = '') - { - if ('' !== $string && !preg_match('//u', $string)) { - throw new InvalidArgumentException('Invalid UTF-8 string.'); - } - - $this->string = $string; - } - - public function append(string ...$suffix): AbstractString - { - $str = clone $this; - $str->string .= 1 >= \count($suffix) ? ($suffix[0] ?? '') : implode('', $suffix); - - if (!preg_match('//u', $str->string)) { - throw new InvalidArgumentException('Invalid UTF-8 string.'); - } - - return $str; - } - - public function chunk(int $length = 1): array - { - if (1 > $length) { - throw new InvalidArgumentException('The chunk length must be greater than zero.'); - } - - if ('' === $this->string) { - return []; - } - - $rx = '/('; - while (65535 < $length) { - $rx .= '.{65535}'; - $length -= 65535; - } - $rx .= '.{'.$length.'})/us'; - - $str = clone $this; - $chunks = []; - - foreach (preg_split($rx, $this->string, -1, \PREG_SPLIT_DELIM_CAPTURE | \PREG_SPLIT_NO_EMPTY) as $chunk) { - $str->string = $chunk; - $chunks[] = clone $str; - } - - return $chunks; - } - - public function codePointsAt(int $offset): array - { - $str = $offset ? $this->slice($offset, 1) : $this; - - return '' === $str->string ? [] : [mb_ord($str->string, 'UTF-8')]; - } - - public function endsWith($suffix): bool - { - if ($suffix instanceof AbstractString) { - $suffix = $suffix->string; - } elseif (\is_array($suffix) || $suffix instanceof \Traversable) { - return parent::endsWith($suffix); - } else { - $suffix = (string) $suffix; - } - - if ('' === $suffix || !preg_match('//u', $suffix)) { - return false; - } - - if ($this->ignoreCase) { - return preg_match('{'.preg_quote($suffix).'$}iuD', $this->string); - } - - return \strlen($this->string) >= \strlen($suffix) && 0 === substr_compare($this->string, $suffix, -\strlen($suffix)); - } - - public function equalsTo($string): bool - { - if ($string instanceof AbstractString) { - $string = $string->string; - } elseif (\is_array($string) || $string instanceof \Traversable) { - return parent::equalsTo($string); - } else { - $string = (string) $string; - } - - if ('' !== $string && $this->ignoreCase) { - return \strlen($string) === \strlen($this->string) && 0 === mb_stripos($this->string, $string, 0, 'UTF-8'); - } - - return $string === $this->string; - } - - public function indexOf($needle, int $offset = 0): ?int - { - if ($needle instanceof AbstractString) { - $needle = $needle->string; - } elseif (\is_array($needle) || $needle instanceof \Traversable) { - return parent::indexOf($needle, $offset); - } else { - $needle = (string) $needle; - } - - if ('' === $needle) { - return null; - } - - $i = $this->ignoreCase ? mb_stripos($this->string, $needle, $offset, 'UTF-8') : mb_strpos($this->string, $needle, $offset, 'UTF-8'); - - return false === $i ? null : $i; - } - - public function indexOfLast($needle, int $offset = 0): ?int - { - if ($needle instanceof AbstractString) { - $needle = $needle->string; - } elseif (\is_array($needle) || $needle instanceof \Traversable) { - return parent::indexOfLast($needle, $offset); - } else { - $needle = (string) $needle; - } - - if ('' === $needle) { - return null; - } - - $i = $this->ignoreCase ? mb_strripos($this->string, $needle, $offset, 'UTF-8') : mb_strrpos($this->string, $needle, $offset, 'UTF-8'); - - return false === $i ? null : $i; - } - - public function length(): int - { - return mb_strlen($this->string, 'UTF-8'); - } - - public function prepend(string ...$prefix): AbstractString - { - $str = clone $this; - $str->string = (1 >= \count($prefix) ? ($prefix[0] ?? '') : implode('', $prefix)).$this->string; - - if (!preg_match('//u', $str->string)) { - throw new InvalidArgumentException('Invalid UTF-8 string.'); - } - - return $str; - } - - public function replace(string $from, string $to): AbstractString - { - $str = clone $this; - - if ('' === $from || !preg_match('//u', $from)) { - return $str; - } - - if ('' !== $to && !preg_match('//u', $to)) { - throw new InvalidArgumentException('Invalid UTF-8 string.'); - } - - if ($this->ignoreCase) { - $str->string = implode($to, preg_split('{'.preg_quote($from).'}iuD', $this->string)); - } else { - $str->string = str_replace($from, $to, $this->string); - } - - return $str; - } - - public function slice(int $start = 0, int $length = null): AbstractString - { - $str = clone $this; - $str->string = mb_substr($this->string, $start, $length, 'UTF-8'); - - return $str; - } - - public function splice(string $replacement, int $start = 0, int $length = null): AbstractString - { - if (!preg_match('//u', $replacement)) { - throw new InvalidArgumentException('Invalid UTF-8 string.'); - } - - $str = clone $this; - $start = $start ? \strlen(mb_substr($this->string, 0, $start, 'UTF-8')) : 0; - $length = $length ? \strlen(mb_substr($this->string, $start, $length, 'UTF-8')) : $length; - $str->string = substr_replace($this->string, $replacement, $start, $length ?? \PHP_INT_MAX); - - return $str; - } - - public function split(string $delimiter, int $limit = null, int $flags = null): array - { - if (1 > $limit = $limit ?? \PHP_INT_MAX) { - throw new InvalidArgumentException('Split limit must be a positive integer.'); - } - - if ('' === $delimiter) { - throw new InvalidArgumentException('Split delimiter is empty.'); - } - - if (null !== $flags) { - return parent::split($delimiter.'u', $limit, $flags); - } - - if (!preg_match('//u', $delimiter)) { - throw new InvalidArgumentException('Split delimiter is not a valid UTF-8 string.'); - } - - $str = clone $this; - $chunks = $this->ignoreCase - ? preg_split('{'.preg_quote($delimiter).'}iuD', $this->string, $limit) - : explode($delimiter, $this->string, $limit); - - foreach ($chunks as &$chunk) { - $str->string = $chunk; - $chunk = clone $str; - } - - return $chunks; - } - - public function startsWith($prefix): bool - { - if ($prefix instanceof AbstractString) { - $prefix = $prefix->string; - } elseif (\is_array($prefix) || $prefix instanceof \Traversable) { - return parent::startsWith($prefix); - } else { - $prefix = (string) $prefix; - } - - if ('' === $prefix || !preg_match('//u', $prefix)) { - return false; - } - - if ($this->ignoreCase) { - return 0 === mb_stripos($this->string, $prefix, 0, 'UTF-8'); - } - - return 0 === strncmp($this->string, $prefix, \strlen($prefix)); - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/string/Exception/ExceptionInterface.php b/tools/php-cs-fixer/vendor/symfony/string/Exception/ExceptionInterface.php deleted file mode 100644 index 3619786..0000000 --- a/tools/php-cs-fixer/vendor/symfony/string/Exception/ExceptionInterface.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\String\Exception; - -interface ExceptionInterface extends \Throwable -{ -} diff --git a/tools/php-cs-fixer/vendor/symfony/string/Exception/InvalidArgumentException.php b/tools/php-cs-fixer/vendor/symfony/string/Exception/InvalidArgumentException.php deleted file mode 100644 index 6aa586b..0000000 --- a/tools/php-cs-fixer/vendor/symfony/string/Exception/InvalidArgumentException.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\String\Exception; - -class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface -{ -} diff --git a/tools/php-cs-fixer/vendor/symfony/string/Exception/RuntimeException.php b/tools/php-cs-fixer/vendor/symfony/string/Exception/RuntimeException.php deleted file mode 100644 index 77cb091..0000000 --- a/tools/php-cs-fixer/vendor/symfony/string/Exception/RuntimeException.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\String\Exception; - -class RuntimeException extends \RuntimeException implements ExceptionInterface -{ -} diff --git a/tools/php-cs-fixer/vendor/symfony/string/Inflector/EnglishInflector.php b/tools/php-cs-fixer/vendor/symfony/string/Inflector/EnglishInflector.php deleted file mode 100644 index 39b8e9a..0000000 --- a/tools/php-cs-fixer/vendor/symfony/string/Inflector/EnglishInflector.php +++ /dev/null @@ -1,508 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\String\Inflector; - -final class EnglishInflector implements InflectorInterface -{ - /** - * Map English plural to singular suffixes. - * - * @see http://english-zone.com/spelling/plurals.html - */ - private const PLURAL_MAP = [ - // First entry: plural suffix, reversed - // Second entry: length of plural suffix - // Third entry: Whether the suffix may succeed a vocal - // Fourth entry: Whether the suffix may succeed a consonant - // Fifth entry: singular suffix, normal - - // bacteria (bacterium), criteria (criterion), phenomena (phenomenon) - ['a', 1, true, true, ['on', 'um']], - - // nebulae (nebula) - ['ea', 2, true, true, 'a'], - - // services (service) - ['secivres', 8, true, true, 'service'], - - // mice (mouse), lice (louse) - ['eci', 3, false, true, 'ouse'], - - // geese (goose) - ['esee', 4, false, true, 'oose'], - - // fungi (fungus), alumni (alumnus), syllabi (syllabus), radii (radius) - ['i', 1, true, true, 'us'], - - // men (man), women (woman) - ['nem', 3, true, true, 'man'], - - // children (child) - ['nerdlihc', 8, true, true, 'child'], - - // oxen (ox) - ['nexo', 4, false, false, 'ox'], - - // indices (index), appendices (appendix), prices (price) - ['seci', 4, false, true, ['ex', 'ix', 'ice']], - - // selfies (selfie) - ['seifles', 7, true, true, 'selfie'], - - // movies (movie) - ['seivom', 6, true, true, 'movie'], - - // conspectuses (conspectus), prospectuses (prospectus) - ['sesutcep', 8, true, true, 'pectus'], - - // feet (foot) - ['teef', 4, true, true, 'foot'], - - // geese (goose) - ['eseeg', 5, true, true, 'goose'], - - // teeth (tooth) - ['hteet', 5, true, true, 'tooth'], - - // news (news) - ['swen', 4, true, true, 'news'], - - // series (series) - ['seires', 6, true, true, 'series'], - - // babies (baby) - ['sei', 3, false, true, 'y'], - - // accesses (access), addresses (address), kisses (kiss) - ['sess', 4, true, false, 'ss'], - - // analyses (analysis), ellipses (ellipsis), fungi (fungus), - // neuroses (neurosis), theses (thesis), emphases (emphasis), - // oases (oasis), crises (crisis), houses (house), bases (base), - // atlases (atlas) - ['ses', 3, true, true, ['s', 'se', 'sis']], - - // objectives (objective), alternative (alternatives) - ['sevit', 5, true, true, 'tive'], - - // drives (drive) - ['sevird', 6, false, true, 'drive'], - - // lives (life), wives (wife) - ['sevi', 4, false, true, 'ife'], - - // moves (move) - ['sevom', 5, true, true, 'move'], - - // hooves (hoof), dwarves (dwarf), elves (elf), leaves (leaf), caves (cave), staves (staff) - ['sev', 3, true, true, ['f', 've', 'ff']], - - // axes (axis), axes (ax), axes (axe) - ['sexa', 4, false, false, ['ax', 'axe', 'axis']], - - // indexes (index), matrixes (matrix) - ['sex', 3, true, false, 'x'], - - // quizzes (quiz) - ['sezz', 4, true, false, 'z'], - - // bureaus (bureau) - ['suae', 4, false, true, 'eau'], - - // fees (fee), trees (tree), employees (employee) - ['see', 3, true, true, 'ee'], - - // edges (edge) - ['segd', 4, true, true, 'dge'], - - // roses (rose), garages (garage), cassettes (cassette), - // waltzes (waltz), heroes (hero), bushes (bush), arches (arch), - // shoes (shoe) - ['se', 2, true, true, ['', 'e']], - - // tags (tag) - ['s', 1, true, true, ''], - - // chateaux (chateau) - ['xuae', 4, false, true, 'eau'], - - // people (person) - ['elpoep', 6, true, true, 'person'], - ]; - - /** - * Map English singular to plural suffixes. - * - * @see http://english-zone.com/spelling/plurals.html - */ - private const SINGULAR_MAP = [ - // First entry: singular suffix, reversed - // Second entry: length of singular suffix - // Third entry: Whether the suffix may succeed a vocal - // Fourth entry: Whether the suffix may succeed a consonant - // Fifth entry: plural suffix, normal - - // criterion (criteria) - ['airetirc', 8, false, false, 'criterion'], - - // nebulae (nebula) - ['aluben', 6, false, false, 'nebulae'], - - // children (child) - ['dlihc', 5, true, true, 'children'], - - // prices (price) - ['eci', 3, false, true, 'ices'], - - // services (service) - ['ecivres', 7, true, true, 'services'], - - // lives (life), wives (wife) - ['efi', 3, false, true, 'ives'], - - // selfies (selfie) - ['eifles', 6, true, true, 'selfies'], - - // movies (movie) - ['eivom', 5, true, true, 'movies'], - - // lice (louse) - ['esuol', 5, false, true, 'lice'], - - // mice (mouse) - ['esuom', 5, false, true, 'mice'], - - // geese (goose) - ['esoo', 4, false, true, 'eese'], - - // houses (house), bases (base) - ['es', 2, true, true, 'ses'], - - // geese (goose) - ['esoog', 5, true, true, 'geese'], - - // caves (cave) - ['ev', 2, true, true, 'ves'], - - // drives (drive) - ['evird', 5, false, true, 'drives'], - - // objectives (objective), alternative (alternatives) - ['evit', 4, true, true, 'tives'], - - // moves (move) - ['evom', 4, true, true, 'moves'], - - // staves (staff) - ['ffats', 5, true, true, 'staves'], - - // hooves (hoof), dwarves (dwarf), elves (elf), leaves (leaf) - ['ff', 2, true, true, 'ffs'], - - // hooves (hoof), dwarves (dwarf), elves (elf), leaves (leaf) - ['f', 1, true, true, ['fs', 'ves']], - - // arches (arch) - ['hc', 2, true, true, 'ches'], - - // bushes (bush) - ['hs', 2, true, true, 'shes'], - - // teeth (tooth) - ['htoot', 5, true, true, 'teeth'], - - // bacteria (bacterium), criteria (criterion), phenomena (phenomenon) - ['mu', 2, true, true, 'a'], - - // men (man), women (woman) - ['nam', 3, true, true, 'men'], - - // people (person) - ['nosrep', 6, true, true, ['persons', 'people']], - - // bacteria (bacterium), criteria (criterion), phenomena (phenomenon) - ['noi', 3, true, true, 'ions'], - - // coupon (coupons) - ['nop', 3, true, true, 'pons'], - - // seasons (season), treasons (treason), poisons (poison), lessons (lesson) - ['nos', 3, true, true, 'sons'], - - // bacteria (bacterium), criteria (criterion), phenomena (phenomenon) - ['no', 2, true, true, 'a'], - - // echoes (echo) - ['ohce', 4, true, true, 'echoes'], - - // heroes (hero) - ['oreh', 4, true, true, 'heroes'], - - // atlases (atlas) - ['salta', 5, true, true, 'atlases'], - - // irises (iris) - ['siri', 4, true, true, 'irises'], - - // analyses (analysis), ellipses (ellipsis), neuroses (neurosis) - // theses (thesis), emphases (emphasis), oases (oasis), - // crises (crisis) - ['sis', 3, true, true, 'ses'], - - // accesses (access), addresses (address), kisses (kiss) - ['ss', 2, true, false, 'sses'], - - // syllabi (syllabus) - ['suballys', 8, true, true, 'syllabi'], - - // buses (bus) - ['sub', 3, true, true, 'buses'], - - // circuses (circus) - ['suc', 3, true, true, 'cuses'], - - // conspectuses (conspectus), prospectuses (prospectus) - ['sutcep', 6, true, true, 'pectuses'], - - // fungi (fungus), alumni (alumnus), syllabi (syllabus), radii (radius) - ['su', 2, true, true, 'i'], - - // news (news) - ['swen', 4, true, true, 'news'], - - // feet (foot) - ['toof', 4, true, true, 'feet'], - - // chateaux (chateau), bureaus (bureau) - ['uae', 3, false, true, ['eaus', 'eaux']], - - // oxen (ox) - ['xo', 2, false, false, 'oxen'], - - // hoaxes (hoax) - ['xaoh', 4, true, false, 'hoaxes'], - - // indices (index) - ['xedni', 5, false, true, ['indicies', 'indexes']], - - // boxes (box) - ['xo', 2, false, true, 'oxes'], - - // indexes (index), matrixes (matrix) - ['x', 1, true, false, ['cies', 'xes']], - - // appendices (appendix) - ['xi', 2, false, true, 'ices'], - - // babies (baby) - ['y', 1, false, true, 'ies'], - - // quizzes (quiz) - ['ziuq', 4, true, false, 'quizzes'], - - // waltzes (waltz) - ['z', 1, true, true, 'zes'], - ]; - - /** - * A list of words which should not be inflected, reversed. - */ - private const UNINFLECTED = [ - '', - - // data - 'atad', - - // deer - 'reed', - - // feedback - 'kcabdeef', - - // fish - 'hsif', - - // info - 'ofni', - - // moose - 'esoom', - - // series - 'seires', - - // sheep - 'peehs', - - // species - 'seiceps', - ]; - - /** - * {@inheritdoc} - */ - public function singularize(string $plural): array - { - $pluralRev = strrev($plural); - $lowerPluralRev = strtolower($pluralRev); - $pluralLength = \strlen($lowerPluralRev); - - // Check if the word is one which is not inflected, return early if so - if (\in_array($lowerPluralRev, self::UNINFLECTED, true)) { - return [$plural]; - } - - // The outer loop iterates over the entries of the plural table - // The inner loop $j iterates over the characters of the plural suffix - // in the plural table to compare them with the characters of the actual - // given plural suffix - foreach (self::PLURAL_MAP as $map) { - $suffix = $map[0]; - $suffixLength = $map[1]; - $j = 0; - - // Compare characters in the plural table and of the suffix of the - // given plural one by one - while ($suffix[$j] === $lowerPluralRev[$j]) { - // Let $j point to the next character - ++$j; - - // Successfully compared the last character - // Add an entry with the singular suffix to the singular array - if ($j === $suffixLength) { - // Is there any character preceding the suffix in the plural string? - if ($j < $pluralLength) { - $nextIsVocal = false !== strpos('aeiou', $lowerPluralRev[$j]); - - if (!$map[2] && $nextIsVocal) { - // suffix may not succeed a vocal but next char is one - break; - } - - if (!$map[3] && !$nextIsVocal) { - // suffix may not succeed a consonant but next char is one - break; - } - } - - $newBase = substr($plural, 0, $pluralLength - $suffixLength); - $newSuffix = $map[4]; - - // Check whether the first character in the plural suffix - // is uppercased. If yes, uppercase the first character in - // the singular suffix too - $firstUpper = ctype_upper($pluralRev[$j - 1]); - - if (\is_array($newSuffix)) { - $singulars = []; - - foreach ($newSuffix as $newSuffixEntry) { - $singulars[] = $newBase.($firstUpper ? ucfirst($newSuffixEntry) : $newSuffixEntry); - } - - return $singulars; - } - - return [$newBase.($firstUpper ? ucfirst($newSuffix) : $newSuffix)]; - } - - // Suffix is longer than word - if ($j === $pluralLength) { - break; - } - } - } - - // Assume that plural and singular is identical - return [$plural]; - } - - /** - * {@inheritdoc} - */ - public function pluralize(string $singular): array - { - $singularRev = strrev($singular); - $lowerSingularRev = strtolower($singularRev); - $singularLength = \strlen($lowerSingularRev); - - // Check if the word is one which is not inflected, return early if so - if (\in_array($lowerSingularRev, self::UNINFLECTED, true)) { - return [$singular]; - } - - // The outer loop iterates over the entries of the singular table - // The inner loop $j iterates over the characters of the singular suffix - // in the singular table to compare them with the characters of the actual - // given singular suffix - foreach (self::SINGULAR_MAP as $map) { - $suffix = $map[0]; - $suffixLength = $map[1]; - $j = 0; - - // Compare characters in the singular table and of the suffix of the - // given plural one by one - - while ($suffix[$j] === $lowerSingularRev[$j]) { - // Let $j point to the next character - ++$j; - - // Successfully compared the last character - // Add an entry with the plural suffix to the plural array - if ($j === $suffixLength) { - // Is there any character preceding the suffix in the plural string? - if ($j < $singularLength) { - $nextIsVocal = false !== strpos('aeiou', $lowerSingularRev[$j]); - - if (!$map[2] && $nextIsVocal) { - // suffix may not succeed a vocal but next char is one - break; - } - - if (!$map[3] && !$nextIsVocal) { - // suffix may not succeed a consonant but next char is one - break; - } - } - - $newBase = substr($singular, 0, $singularLength - $suffixLength); - $newSuffix = $map[4]; - - // Check whether the first character in the singular suffix - // is uppercased. If yes, uppercase the first character in - // the singular suffix too - $firstUpper = ctype_upper($singularRev[$j - 1]); - - if (\is_array($newSuffix)) { - $plurals = []; - - foreach ($newSuffix as $newSuffixEntry) { - $plurals[] = $newBase.($firstUpper ? ucfirst($newSuffixEntry) : $newSuffixEntry); - } - - return $plurals; - } - - return [$newBase.($firstUpper ? ucfirst($newSuffix) : $newSuffix)]; - } - - // Suffix is longer than word - if ($j === $singularLength) { - break; - } - } - } - - // Assume that plural is singular with a trailing `s` - return [$singular.'s']; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/string/Inflector/FrenchInflector.php b/tools/php-cs-fixer/vendor/symfony/string/Inflector/FrenchInflector.php deleted file mode 100644 index 42f6125..0000000 --- a/tools/php-cs-fixer/vendor/symfony/string/Inflector/FrenchInflector.php +++ /dev/null @@ -1,157 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\String\Inflector; - -/** - * French inflector. - * - * This class does only inflect nouns; not adjectives nor composed words like "soixante-dix". - */ -final class FrenchInflector implements InflectorInterface -{ - /** - * A list of all rules for pluralise. - * - * @see https://la-conjugaison.nouvelobs.com/regles/grammaire/le-pluriel-des-noms-121.php - */ - private const PLURALIZE_REGEXP = [ - // First entry: regexp - // Second entry: replacement - - // Words finishing with "s", "x" or "z" are invariables - // Les mots finissant par "s", "x" ou "z" sont invariables - ['/(s|x|z)$/i', '\1'], - - // Words finishing with "eau" are pluralized with a "x" - // Les mots finissant par "eau" prennent tous un "x" au pluriel - ['/(eau)$/i', '\1x'], - - // Words finishing with "au" are pluralized with a "x" excepted "landau" - // Les mots finissant par "au" prennent un "x" au pluriel sauf "landau" - ['/^(landau)$/i', '\1s'], - ['/(au)$/i', '\1x'], - - // Words finishing with "eu" are pluralized with a "x" excepted "pneu", "bleu", "émeu" - // Les mots finissant en "eu" prennent un "x" au pluriel sauf "pneu", "bleu", "émeu" - ['/^(pneu|bleu|émeu)$/i', '\1s'], - ['/(eu)$/i', '\1x'], - - // Words finishing with "al" are pluralized with a "aux" excepted - // Les mots finissant en "al" se terminent en "aux" sauf - ['/^(bal|carnaval|caracal|chacal|choral|corral|étal|festival|récital|val)$/i', '\1s'], - ['/al$/i', '\1aux'], - - // Aspirail, bail, corail, émail, fermail, soupirail, travail, vantail et vitrail font leur pluriel en -aux - ['/^(aspir|b|cor|ém|ferm|soupir|trav|vant|vitr)ail$/i', '\1aux'], - - // Bijou, caillou, chou, genou, hibou, joujou et pou qui prennent un x au pluriel - ['/^(bij|caill|ch|gen|hib|jouj|p)ou$/i', '\1oux'], - - // Invariable words - ['/^(cinquante|soixante|mille)$/i', '\1'], - - // French titles - ['/^(mon|ma)(sieur|dame|demoiselle|seigneur)$/', 'mes\2s'], - ['/^(Mon|Ma)(sieur|dame|demoiselle|seigneur)$/', 'Mes\2s'], - ]; - - /** - * A list of all rules for singularize. - */ - private const SINGULARIZE_REGEXP = [ - // First entry: regexp - // Second entry: replacement - - // Aspirail, bail, corail, émail, fermail, soupirail, travail, vantail et vitrail font leur pluriel en -aux - ['/((aspir|b|cor|ém|ferm|soupir|trav|vant|vitr))aux$/i', '\1ail'], - - // Words finishing with "eau" are pluralized with a "x" - // Les mots finissant par "eau" prennent tous un "x" au pluriel - ['/(eau)x$/i', '\1'], - - // Words finishing with "al" are pluralized with a "aux" expected - // Les mots finissant en "al" se terminent en "aux" sauf - ['/(amir|anim|arsen|boc|can|capit|capor|chev|crist|génér|hopit|hôpit|idé|journ|littor|loc|m|mét|minér|princip|radic|termin)aux$/i', '\1al'], - - // Words finishing with "au" are pluralized with a "x" excepted "landau" - // Les mots finissant par "au" prennent un "x" au pluriel sauf "landau" - ['/(au)x$/i', '\1'], - - // Words finishing with "eu" are pluralized with a "x" excepted "pneu", "bleu", "émeu" - // Les mots finissant en "eu" prennent un "x" au pluriel sauf "pneu", "bleu", "émeu" - ['/(eu)x$/i', '\1'], - - // Words finishing with "ou" are pluralized with a "s" excepted bijou, caillou, chou, genou, hibou, joujou, pou - // Les mots finissant par "ou" prennent un "s" sauf bijou, caillou, chou, genou, hibou, joujou, pou - ['/(bij|caill|ch|gen|hib|jouj|p)oux$/i', '\1ou'], - - // French titles - ['/^mes(dame|demoiselle)s$/', 'ma\1'], - ['/^Mes(dame|demoiselle)s$/', 'Ma\1'], - ['/^mes(sieur|seigneur)s$/', 'mon\1'], - ['/^Mes(sieur|seigneur)s$/', 'Mon\1'], - - //Default rule - ['/s$/i', ''], - ]; - - /** - * A list of words which should not be inflected. - * This list is only used by singularize. - */ - private const UNINFLECTED = '/^(abcès|accès|abus|albatros|anchois|anglais|autobus|bois|brebis|carquois|cas|chas|colis|concours|corps|cours|cyprès|décès|devis|discours|dos|embarras|engrais|entrelacs|excès|fils|fois|gâchis|gars|glas|héros|intrus|jars|jus|kermès|lacis|legs|lilas|marais|mars|matelas|mépris|mets|mois|mors|obus|os|palais|paradis|parcours|pardessus|pays|plusieurs|poids|pois|pouls|printemps|processus|progrès|puits|pus|rabais|radis|recors|recours|refus|relais|remords|remous|rictus|rhinocéros|repas|rubis|sas|secours|sens|souris|succès|talus|tapis|tas|taudis|temps|tiers|univers|velours|verglas|vernis|virus)$/i'; - - /** - * {@inheritdoc} - */ - public function singularize(string $plural): array - { - if ($this->isInflectedWord($plural)) { - return [$plural]; - } - - foreach (self::SINGULARIZE_REGEXP as $rule) { - [$regexp, $replace] = $rule; - - if (1 === preg_match($regexp, $plural)) { - return [preg_replace($regexp, $replace, $plural)]; - } - } - - return [$plural]; - } - - /** - * {@inheritdoc} - */ - public function pluralize(string $singular): array - { - if ($this->isInflectedWord($singular)) { - return [$singular]; - } - - foreach (self::PLURALIZE_REGEXP as $rule) { - [$regexp, $replace] = $rule; - - if (1 === preg_match($regexp, $singular)) { - return [preg_replace($regexp, $replace, $singular)]; - } - } - - return [$singular.'s']; - } - - private function isInflectedWord(string $word): bool - { - return 1 === preg_match(self::UNINFLECTED, $word); - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/string/Inflector/InflectorInterface.php b/tools/php-cs-fixer/vendor/symfony/string/Inflector/InflectorInterface.php deleted file mode 100644 index ad78070..0000000 --- a/tools/php-cs-fixer/vendor/symfony/string/Inflector/InflectorInterface.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\String\Inflector; - -interface InflectorInterface -{ - /** - * Returns the singular forms of a string. - * - * If the method can't determine the form with certainty, several possible singulars are returned. - * - * @return string[] An array of possible singular forms - */ - public function singularize(string $plural): array; - - /** - * Returns the plural forms of a string. - * - * If the method can't determine the form with certainty, several possible plurals are returned. - * - * @return string[] An array of possible plural forms - */ - public function pluralize(string $singular): array; -} diff --git a/tools/php-cs-fixer/vendor/symfony/string/LICENSE b/tools/php-cs-fixer/vendor/symfony/string/LICENSE deleted file mode 100644 index 383e7a5..0000000 --- a/tools/php-cs-fixer/vendor/symfony/string/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2019-2021 Fabien Potencier - -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/tools/php-cs-fixer/vendor/symfony/string/LazyString.php b/tools/php-cs-fixer/vendor/symfony/string/LazyString.php deleted file mode 100644 index b3801db..0000000 --- a/tools/php-cs-fixer/vendor/symfony/string/LazyString.php +++ /dev/null @@ -1,164 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\String; - -/** - * A string whose value is computed lazily by a callback. - * - * @author Nicolas Grekas - */ -class LazyString implements \Stringable, \JsonSerializable -{ - private $value; - - /** - * @param callable|array $callback A callable or a [Closure, method] lazy-callable - * - * @return static - */ - public static function fromCallable($callback, ...$arguments): self - { - if (!\is_callable($callback) && !(\is_array($callback) && isset($callback[0]) && $callback[0] instanceof \Closure && 2 >= \count($callback))) { - throw new \TypeError(sprintf('Argument 1 passed to "%s()" must be a callable or a [Closure, method] lazy-callable, "%s" given.', __METHOD__, get_debug_type($callback))); - } - - $lazyString = new static(); - $lazyString->value = static function () use (&$callback, &$arguments, &$value): string { - if (null !== $arguments) { - if (!\is_callable($callback)) { - $callback[0] = $callback[0](); - $callback[1] = $callback[1] ?? '__invoke'; - } - $value = $callback(...$arguments); - $callback = self::getPrettyName($callback); - $arguments = null; - } - - return $value ?? ''; - }; - - return $lazyString; - } - - /** - * @param string|int|float|bool|\Stringable $value - * - * @return static - */ - public static function fromStringable($value): self - { - if (!self::isStringable($value)) { - throw new \TypeError(sprintf('Argument 1 passed to "%s()" must be a scalar or a stringable object, "%s" given.', __METHOD__, get_debug_type($value))); - } - - if (\is_object($value)) { - return static::fromCallable([$value, '__toString']); - } - - $lazyString = new static(); - $lazyString->value = (string) $value; - - return $lazyString; - } - - /** - * Tells whether the provided value can be cast to string. - */ - final public static function isStringable($value): bool - { - return \is_string($value) || $value instanceof self || (\is_object($value) ? method_exists($value, '__toString') : is_scalar($value)); - } - - /** - * Casts scalars and stringable objects to strings. - * - * @param object|string|int|float|bool $value - * - * @throws \TypeError When the provided value is not stringable - */ - final public static function resolve($value): string - { - return $value; - } - - /** - * @return string - */ - public function __toString() - { - if (\is_string($this->value)) { - return $this->value; - } - - try { - return $this->value = ($this->value)(); - } catch (\Throwable $e) { - if (\TypeError::class === \get_class($e) && __FILE__ === $e->getFile()) { - $type = explode(', ', $e->getMessage()); - $type = substr(array_pop($type), 0, -\strlen(' returned')); - $r = new \ReflectionFunction($this->value); - $callback = $r->getStaticVariables()['callback']; - - $e = new \TypeError(sprintf('Return value of %s() passed to %s::fromCallable() must be of the type string, %s returned.', $callback, static::class, $type)); - } - - if (\PHP_VERSION_ID < 70400) { - // leverage the ErrorHandler component with graceful fallback when it's not available - return trigger_error($e, \E_USER_ERROR); - } - - throw $e; - } - } - - public function __sleep(): array - { - $this->__toString(); - - return ['value']; - } - - public function jsonSerialize(): string - { - return $this->__toString(); - } - - private function __construct() - { - } - - private static function getPrettyName(callable $callback): string - { - if (\is_string($callback)) { - return $callback; - } - - if (\is_array($callback)) { - $class = \is_object($callback[0]) ? get_debug_type($callback[0]) : $callback[0]; - $method = $callback[1]; - } elseif ($callback instanceof \Closure) { - $r = new \ReflectionFunction($callback); - - if (false !== strpos($r->name, '{closure}') || !$class = $r->getClosureScopeClass()) { - return $r->name; - } - - $class = $class->name; - $method = $r->name; - } else { - $class = get_debug_type($callback); - $method = '__invoke'; - } - - return $class.'::'.$method; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/string/README.md b/tools/php-cs-fixer/vendor/symfony/string/README.md deleted file mode 100644 index 9c7e1e1..0000000 --- a/tools/php-cs-fixer/vendor/symfony/string/README.md +++ /dev/null @@ -1,14 +0,0 @@ -String Component -================ - -The String component provides an object-oriented API to strings and deals -with bytes, UTF-8 code points and grapheme clusters in a unified way. - -Resources ---------- - - * [Documentation](https://symfony.com/doc/current/components/string.html) - * [Contributing](https://symfony.com/doc/current/contributing/index.html) - * [Report issues](https://github.com/symfony/symfony/issues) and - [send Pull Requests](https://github.com/symfony/symfony/pulls) - in the [main Symfony repository](https://github.com/symfony/symfony) diff --git a/tools/php-cs-fixer/vendor/symfony/string/Resources/data/wcswidth_table_wide.php b/tools/php-cs-fixer/vendor/symfony/string/Resources/data/wcswidth_table_wide.php deleted file mode 100644 index e3a41cd..0000000 --- a/tools/php-cs-fixer/vendor/symfony/string/Resources/data/wcswidth_table_wide.php +++ /dev/null @@ -1,1119 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\String; - -if (!\function_exists(u::class)) { - function u(?string $string = ''): UnicodeString - { - return new UnicodeString($string ?? ''); - } -} - -if (!\function_exists(b::class)) { - function b(?string $string = ''): ByteString - { - return new ByteString($string ?? ''); - } -} - -if (!\function_exists(s::class)) { - /** - * @return UnicodeString|ByteString - */ - function s(?string $string = ''): AbstractString - { - $string = $string ?? ''; - - return preg_match('//u', $string) ? new UnicodeString($string) : new ByteString($string); - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/string/Slugger/AsciiSlugger.php b/tools/php-cs-fixer/vendor/symfony/string/Slugger/AsciiSlugger.php deleted file mode 100644 index 5aecfeb..0000000 --- a/tools/php-cs-fixer/vendor/symfony/string/Slugger/AsciiSlugger.php +++ /dev/null @@ -1,183 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\String\Slugger; - -use Symfony\Component\String\AbstractUnicodeString; -use Symfony\Component\String\UnicodeString; -use Symfony\Contracts\Translation\LocaleAwareInterface; - -if (!interface_exists(LocaleAwareInterface::class)) { - throw new \LogicException('You cannot use the "Symfony\Component\String\Slugger\AsciiSlugger" as the "symfony/translation-contracts" package is not installed. Try running "composer require symfony/translation-contracts".'); -} - -/** - * @author Titouan Galopin - */ -class AsciiSlugger implements SluggerInterface, LocaleAwareInterface -{ - private const LOCALE_TO_TRANSLITERATOR_ID = [ - 'am' => 'Amharic-Latin', - 'ar' => 'Arabic-Latin', - 'az' => 'Azerbaijani-Latin', - 'be' => 'Belarusian-Latin', - 'bg' => 'Bulgarian-Latin', - 'bn' => 'Bengali-Latin', - 'de' => 'de-ASCII', - 'el' => 'Greek-Latin', - 'fa' => 'Persian-Latin', - 'he' => 'Hebrew-Latin', - 'hy' => 'Armenian-Latin', - 'ka' => 'Georgian-Latin', - 'kk' => 'Kazakh-Latin', - 'ky' => 'Kirghiz-Latin', - 'ko' => 'Korean-Latin', - 'mk' => 'Macedonian-Latin', - 'mn' => 'Mongolian-Latin', - 'or' => 'Oriya-Latin', - 'ps' => 'Pashto-Latin', - 'ru' => 'Russian-Latin', - 'sr' => 'Serbian-Latin', - 'sr_Cyrl' => 'Serbian-Latin', - 'th' => 'Thai-Latin', - 'tk' => 'Turkmen-Latin', - 'uk' => 'Ukrainian-Latin', - 'uz' => 'Uzbek-Latin', - 'zh' => 'Han-Latin', - ]; - - private $defaultLocale; - private $symbolsMap = [ - 'en' => ['@' => 'at', '&' => 'and'], - ]; - - /** - * Cache of transliterators per locale. - * - * @var \Transliterator[] - */ - private $transliterators = []; - - /** - * @param array|\Closure|null $symbolsMap - */ - public function __construct(string $defaultLocale = null, $symbolsMap = null) - { - if (null !== $symbolsMap && !\is_array($symbolsMap) && !$symbolsMap instanceof \Closure) { - throw new \TypeError(sprintf('Argument 2 passed to "%s()" must be array, Closure or null, "%s" given.', __METHOD__, \gettype($symbolsMap))); - } - - $this->defaultLocale = $defaultLocale; - $this->symbolsMap = $symbolsMap ?? $this->symbolsMap; - } - - /** - * {@inheritdoc} - */ - public function setLocale($locale) - { - $this->defaultLocale = $locale; - } - - /** - * {@inheritdoc} - */ - public function getLocale() - { - return $this->defaultLocale; - } - - /** - * {@inheritdoc} - */ - public function slug(string $string, string $separator = '-', string $locale = null): AbstractUnicodeString - { - $locale = $locale ?? $this->defaultLocale; - - $transliterator = []; - if ($locale && ('de' === $locale || 0 === strpos($locale, 'de_'))) { - // Use the shortcut for German in UnicodeString::ascii() if possible (faster and no requirement on intl) - $transliterator = ['de-ASCII']; - } elseif (\function_exists('transliterator_transliterate') && $locale) { - $transliterator = (array) $this->createTransliterator($locale); - } - - if ($this->symbolsMap instanceof \Closure) { - // If the symbols map is passed as a closure, there is no need to fallback to the parent locale - // as the closure can just provide substitutions for all locales of interest. - $symbolsMap = $this->symbolsMap; - array_unshift($transliterator, static function ($s) use ($symbolsMap, $locale) { - return $symbolsMap($s, $locale); - }); - } - - $unicodeString = (new UnicodeString($string))->ascii($transliterator); - - if (\is_array($this->symbolsMap)) { - $map = null; - if (isset($this->symbolsMap[$locale])) { - $map = $this->symbolsMap[$locale]; - } else { - $parent = self::getParentLocale($locale); - if ($parent && isset($this->symbolsMap[$parent])) { - $map = $this->symbolsMap[$parent]; - } - } - if ($map) { - foreach ($map as $char => $replace) { - $unicodeString = $unicodeString->replace($char, ' '.$replace.' '); - } - } - } - - return $unicodeString - ->replaceMatches('/[^A-Za-z0-9]++/', $separator) - ->trim($separator) - ; - } - - private function createTransliterator(string $locale): ?\Transliterator - { - if (\array_key_exists($locale, $this->transliterators)) { - return $this->transliterators[$locale]; - } - - // Exact locale supported, cache and return - if ($id = self::LOCALE_TO_TRANSLITERATOR_ID[$locale] ?? null) { - return $this->transliterators[$locale] = \Transliterator::create($id.'/BGN') ?? \Transliterator::create($id); - } - - // Locale not supported and no parent, fallback to any-latin - if (!$parent = self::getParentLocale($locale)) { - return $this->transliterators[$locale] = null; - } - - // Try to use the parent locale (ie. try "de" for "de_AT") and cache both locales - if ($id = self::LOCALE_TO_TRANSLITERATOR_ID[$parent] ?? null) { - $transliterator = \Transliterator::create($id.'/BGN') ?? \Transliterator::create($id); - } - - return $this->transliterators[$locale] = $this->transliterators[$parent] = $transliterator ?? null; - } - - private static function getParentLocale(?string $locale): ?string - { - if (!$locale) { - return null; - } - if (false === $str = strrchr($locale, '_')) { - // no parent locale - return null; - } - - return substr($locale, 0, -\strlen($str)); - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/string/Slugger/SluggerInterface.php b/tools/php-cs-fixer/vendor/symfony/string/Slugger/SluggerInterface.php deleted file mode 100644 index c679ed9..0000000 --- a/tools/php-cs-fixer/vendor/symfony/string/Slugger/SluggerInterface.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\String\Slugger; - -use Symfony\Component\String\AbstractUnicodeString; - -/** - * Creates a URL-friendly slug from a given string. - * - * @author Titouan Galopin - */ -interface SluggerInterface -{ - /** - * Creates a slug for the given string and locale, using appropriate transliteration when needed. - */ - public function slug(string $string, string $separator = '-', string $locale = null): AbstractUnicodeString; -} diff --git a/tools/php-cs-fixer/vendor/symfony/string/UnicodeString.php b/tools/php-cs-fixer/vendor/symfony/string/UnicodeString.php deleted file mode 100644 index 9b906c6..0000000 --- a/tools/php-cs-fixer/vendor/symfony/string/UnicodeString.php +++ /dev/null @@ -1,377 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\String; - -use Symfony\Component\String\Exception\ExceptionInterface; -use Symfony\Component\String\Exception\InvalidArgumentException; - -/** - * Represents a string of Unicode grapheme clusters encoded as UTF-8. - * - * A letter followed by combining characters (accents typically) form what Unicode defines - * as a grapheme cluster: a character as humans mean it in written texts. This class knows - * about the concept and won't split a letter apart from its combining accents. It also - * ensures all string comparisons happen on their canonically-composed representation, - * ignoring e.g. the order in which accents are listed when a letter has many of them. - * - * @see https://unicode.org/reports/tr15/ - * - * @author Nicolas Grekas - * @author Hugo Hamon - * - * @throws ExceptionInterface - */ -class UnicodeString extends AbstractUnicodeString -{ - public function __construct(string $string = '') - { - $this->string = normalizer_is_normalized($string) ? $string : normalizer_normalize($string); - - if (false === $this->string) { - throw new InvalidArgumentException('Invalid UTF-8 string.'); - } - } - - public function append(string ...$suffix): AbstractString - { - $str = clone $this; - $str->string = $this->string.(1 >= \count($suffix) ? ($suffix[0] ?? '') : implode('', $suffix)); - normalizer_is_normalized($str->string) ?: $str->string = normalizer_normalize($str->string); - - if (false === $str->string) { - throw new InvalidArgumentException('Invalid UTF-8 string.'); - } - - return $str; - } - - public function chunk(int $length = 1): array - { - if (1 > $length) { - throw new InvalidArgumentException('The chunk length must be greater than zero.'); - } - - if ('' === $this->string) { - return []; - } - - $rx = '/('; - while (65535 < $length) { - $rx .= '\X{65535}'; - $length -= 65535; - } - $rx .= '\X{'.$length.'})/u'; - - $str = clone $this; - $chunks = []; - - foreach (preg_split($rx, $this->string, -1, \PREG_SPLIT_DELIM_CAPTURE | \PREG_SPLIT_NO_EMPTY) as $chunk) { - $str->string = $chunk; - $chunks[] = clone $str; - } - - return $chunks; - } - - public function endsWith($suffix): bool - { - if ($suffix instanceof AbstractString) { - $suffix = $suffix->string; - } elseif (\is_array($suffix) || $suffix instanceof \Traversable) { - return parent::endsWith($suffix); - } else { - $suffix = (string) $suffix; - } - - $form = null === $this->ignoreCase ? \Normalizer::NFD : \Normalizer::NFC; - normalizer_is_normalized($suffix, $form) ?: $suffix = normalizer_normalize($suffix, $form); - - if ('' === $suffix || false === $suffix) { - return false; - } - - if ($this->ignoreCase) { - return 0 === mb_stripos(grapheme_extract($this->string, \strlen($suffix), \GRAPHEME_EXTR_MAXBYTES, \strlen($this->string) - \strlen($suffix)), $suffix, 0, 'UTF-8'); - } - - return $suffix === grapheme_extract($this->string, \strlen($suffix), \GRAPHEME_EXTR_MAXBYTES, \strlen($this->string) - \strlen($suffix)); - } - - public function equalsTo($string): bool - { - if ($string instanceof AbstractString) { - $string = $string->string; - } elseif (\is_array($string) || $string instanceof \Traversable) { - return parent::equalsTo($string); - } else { - $string = (string) $string; - } - - $form = null === $this->ignoreCase ? \Normalizer::NFD : \Normalizer::NFC; - normalizer_is_normalized($string, $form) ?: $string = normalizer_normalize($string, $form); - - if ('' !== $string && false !== $string && $this->ignoreCase) { - return \strlen($string) === \strlen($this->string) && 0 === mb_stripos($this->string, $string, 0, 'UTF-8'); - } - - return $string === $this->string; - } - - public function indexOf($needle, int $offset = 0): ?int - { - if ($needle instanceof AbstractString) { - $needle = $needle->string; - } elseif (\is_array($needle) || $needle instanceof \Traversable) { - return parent::indexOf($needle, $offset); - } else { - $needle = (string) $needle; - } - - $form = null === $this->ignoreCase ? \Normalizer::NFD : \Normalizer::NFC; - normalizer_is_normalized($needle, $form) ?: $needle = normalizer_normalize($needle, $form); - - if ('' === $needle || false === $needle) { - return null; - } - - try { - $i = $this->ignoreCase ? grapheme_stripos($this->string, $needle, $offset) : grapheme_strpos($this->string, $needle, $offset); - } catch (\ValueError $e) { - return null; - } - - return false === $i ? null : $i; - } - - public function indexOfLast($needle, int $offset = 0): ?int - { - if ($needle instanceof AbstractString) { - $needle = $needle->string; - } elseif (\is_array($needle) || $needle instanceof \Traversable) { - return parent::indexOfLast($needle, $offset); - } else { - $needle = (string) $needle; - } - - $form = null === $this->ignoreCase ? \Normalizer::NFD : \Normalizer::NFC; - normalizer_is_normalized($needle, $form) ?: $needle = normalizer_normalize($needle, $form); - - if ('' === $needle || false === $needle) { - return null; - } - - $string = $this->string; - - if (0 > $offset) { - // workaround https://bugs.php.net/74264 - if (0 > $offset += grapheme_strlen($needle)) { - $string = grapheme_substr($string, 0, $offset); - } - $offset = 0; - } - - $i = $this->ignoreCase ? grapheme_strripos($string, $needle, $offset) : grapheme_strrpos($string, $needle, $offset); - - return false === $i ? null : $i; - } - - public function join(array $strings, string $lastGlue = null): AbstractString - { - $str = parent::join($strings, $lastGlue); - normalizer_is_normalized($str->string) ?: $str->string = normalizer_normalize($str->string); - - return $str; - } - - public function length(): int - { - return grapheme_strlen($this->string); - } - - /** - * @return static - */ - public function normalize(int $form = self::NFC): parent - { - $str = clone $this; - - if (\in_array($form, [self::NFC, self::NFKC], true)) { - normalizer_is_normalized($str->string, $form) ?: $str->string = normalizer_normalize($str->string, $form); - } elseif (!\in_array($form, [self::NFD, self::NFKD], true)) { - throw new InvalidArgumentException('Unsupported normalization form.'); - } elseif (!normalizer_is_normalized($str->string, $form)) { - $str->string = normalizer_normalize($str->string, $form); - $str->ignoreCase = null; - } - - return $str; - } - - public function prepend(string ...$prefix): AbstractString - { - $str = clone $this; - $str->string = (1 >= \count($prefix) ? ($prefix[0] ?? '') : implode('', $prefix)).$this->string; - normalizer_is_normalized($str->string) ?: $str->string = normalizer_normalize($str->string); - - if (false === $str->string) { - throw new InvalidArgumentException('Invalid UTF-8 string.'); - } - - return $str; - } - - public function replace(string $from, string $to): AbstractString - { - $str = clone $this; - normalizer_is_normalized($from) ?: $from = normalizer_normalize($from); - - if ('' !== $from && false !== $from) { - $tail = $str->string; - $result = ''; - $indexOf = $this->ignoreCase ? 'grapheme_stripos' : 'grapheme_strpos'; - - while ('' !== $tail && false !== $i = $indexOf($tail, $from)) { - $slice = grapheme_substr($tail, 0, $i); - $result .= $slice.$to; - $tail = substr($tail, \strlen($slice) + \strlen($from)); - } - - $str->string = $result.$tail; - normalizer_is_normalized($str->string) ?: $str->string = normalizer_normalize($str->string); - - if (false === $str->string) { - throw new InvalidArgumentException('Invalid UTF-8 string.'); - } - } - - return $str; - } - - public function replaceMatches(string $fromRegexp, $to): AbstractString - { - $str = parent::replaceMatches($fromRegexp, $to); - normalizer_is_normalized($str->string) ?: $str->string = normalizer_normalize($str->string); - - return $str; - } - - public function slice(int $start = 0, int $length = null): AbstractString - { - $str = clone $this; - - if (\PHP_VERSION_ID < 80000 && 0 > $start && grapheme_strlen($this->string) < -$start) { - $start = 0; - } - $str->string = (string) grapheme_substr($this->string, $start, $length ?? 2147483647); - - return $str; - } - - public function splice(string $replacement, int $start = 0, int $length = null): AbstractString - { - $str = clone $this; - - if (\PHP_VERSION_ID < 80000 && 0 > $start && grapheme_strlen($this->string) < -$start) { - $start = 0; - } - $start = $start ? \strlen(grapheme_substr($this->string, 0, $start)) : 0; - $length = $length ? \strlen(grapheme_substr($this->string, $start, $length ?? 2147483647)) : $length; - $str->string = substr_replace($this->string, $replacement, $start, $length ?? 2147483647); - normalizer_is_normalized($str->string) ?: $str->string = normalizer_normalize($str->string); - - if (false === $str->string) { - throw new InvalidArgumentException('Invalid UTF-8 string.'); - } - - return $str; - } - - public function split(string $delimiter, int $limit = null, int $flags = null): array - { - if (1 > $limit = $limit ?? 2147483647) { - throw new InvalidArgumentException('Split limit must be a positive integer.'); - } - - if ('' === $delimiter) { - throw new InvalidArgumentException('Split delimiter is empty.'); - } - - if (null !== $flags) { - return parent::split($delimiter.'u', $limit, $flags); - } - - normalizer_is_normalized($delimiter) ?: $delimiter = normalizer_normalize($delimiter); - - if (false === $delimiter) { - throw new InvalidArgumentException('Split delimiter is not a valid UTF-8 string.'); - } - - $str = clone $this; - $tail = $this->string; - $chunks = []; - $indexOf = $this->ignoreCase ? 'grapheme_stripos' : 'grapheme_strpos'; - - while (1 < $limit && false !== $i = $indexOf($tail, $delimiter)) { - $str->string = grapheme_substr($tail, 0, $i); - $chunks[] = clone $str; - $tail = substr($tail, \strlen($str->string) + \strlen($delimiter)); - --$limit; - } - - $str->string = $tail; - $chunks[] = clone $str; - - return $chunks; - } - - public function startsWith($prefix): bool - { - if ($prefix instanceof AbstractString) { - $prefix = $prefix->string; - } elseif (\is_array($prefix) || $prefix instanceof \Traversable) { - return parent::startsWith($prefix); - } else { - $prefix = (string) $prefix; - } - - $form = null === $this->ignoreCase ? \Normalizer::NFD : \Normalizer::NFC; - normalizer_is_normalized($prefix, $form) ?: $prefix = normalizer_normalize($prefix, $form); - - if ('' === $prefix || false === $prefix) { - return false; - } - - if ($this->ignoreCase) { - return 0 === mb_stripos(grapheme_extract($this->string, \strlen($prefix), \GRAPHEME_EXTR_MAXBYTES), $prefix, 0, 'UTF-8'); - } - - return $prefix === grapheme_extract($this->string, \strlen($prefix), \GRAPHEME_EXTR_MAXBYTES); - } - - public function __wakeup() - { - if (!\is_string($this->string)) { - throw new \BadMethodCallException('Cannot unserialize '.__CLASS__); - } - - normalizer_is_normalized($this->string) ?: $this->string = normalizer_normalize($this->string); - } - - public function __clone() - { - if (null === $this->ignoreCase) { - normalizer_is_normalized($this->string) ?: $this->string = normalizer_normalize($this->string); - } - - $this->ignoreCase = false; - } -} diff --git a/tools/php-cs-fixer/vendor/symfony/string/composer.json b/tools/php-cs-fixer/vendor/symfony/string/composer.json deleted file mode 100644 index bfb03cd..0000000 --- a/tools/php-cs-fixer/vendor/symfony/string/composer.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "symfony/string", - "type": "library", - "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", - "keywords": ["string", "utf8", "utf-8", "grapheme", "i18n", "unicode"], - "homepage": "https://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.0", - "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "~1.15" - }, - "require-dev": { - "symfony/error-handler": "^4.4|^5.0", - "symfony/http-client": "^4.4|^5.0", - "symfony/translation-contracts": "^1.1|^2", - "symfony/var-exporter": "^4.4|^5.0" - }, - "autoload": { - "psr-4": { "Symfony\\Component\\String\\": "" }, - "files": [ "Resources/functions.php" ], - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "minimum-stability": "dev" -}