From 3d6b461b209a0716488c166e76dd4e0893fc8c74 Mon Sep 17 00:00:00 2001 From: Clemens Schwaighofer Date: Wed, 31 May 2023 16:17:14 +0900 Subject: [PATCH] composer update, composer corelibs update, admin pages update --- composer.lock | 245 +++-- vendor/composer/autoload_psr4.php | 2 + vendor/composer/autoload_static.php | 10 + vendor/composer/installed.json | 273 ++++-- vendor/composer/installed.php | 82 +- vendor/doctrine/deprecations/LICENSE | 19 + vendor/doctrine/deprecations/README.md | 157 +++ vendor/doctrine/deprecations/composer.json | 32 + .../lib/Doctrine/Deprecations/Deprecation.php | 294 ++++++ .../PHPUnit/VerifyDeprecations.php | 66 ++ vendor/doctrine/deprecations/phpcs.xml | 22 + .../jsonmapper/.github/workflows/test.yml | 46 + .../netresearch/jsonmapper/src/JsonMapper.php | 70 +- .../lib/PhpParser/Builder/Param.php | 48 +- .../type-resolver/.yamllint.yaml | 65 -- .../composer-require-checker.json | 16 - .../phpdocumentor/type-resolver/composer.json | 7 +- vendor/phpdocumentor/type-resolver/rector.php | 26 - .../src/PseudoTypes/ArrayShape.php | 44 + .../src/PseudoTypes/ArrayShapeItem.php | 62 ++ .../src/PseudoTypes/ConstExpression.php | 53 ++ .../src/PseudoTypes/FloatValue.php | 44 + .../src/PseudoTypes/IntegerValue.php | 44 + .../src/PseudoTypes/NonEmptyList.php | 50 + .../src/PseudoTypes/StringValue.php | 46 + .../type-resolver/src/TypeResolver.php | 691 ++++++-------- .../src/Types/AggregatedType.php | 2 +- .../src/Types/CallableParameter.php | 72 ++ .../type-resolver/src/Types/Callable_.php | 24 + vendor/phpstan/phpdoc-parser/LICENSE | 21 + vendor/phpstan/phpdoc-parser/README.md | 119 +++ vendor/phpstan/phpdoc-parser/composer.json | 43 + .../phpdoc-parser/phpstan-baseline.neon | 31 + .../src/Ast/AbstractNodeVisitor.php | 34 + .../phpdoc-parser/src/Ast/Attribute.php | 16 + .../Ast/ConstExpr/ConstExprArrayItemNode.php | 36 + .../src/Ast/ConstExpr/ConstExprArrayNode.php | 30 + .../src/Ast/ConstExpr/ConstExprFalseNode.php | 17 + .../src/Ast/ConstExpr/ConstExprFloatNode.php | 26 + .../Ast/ConstExpr/ConstExprIntegerNode.php | 26 + .../src/Ast/ConstExpr/ConstExprNode.php | 10 + .../src/Ast/ConstExpr/ConstExprNullNode.php | 17 + .../src/Ast/ConstExpr/ConstExprStringNode.php | 26 + .../src/Ast/ConstExpr/ConstExprTrueNode.php | 17 + .../src/Ast/ConstExpr/ConstFetchNode.php | 35 + .../QuoteAwareConstExprStringNode.php | 78 ++ vendor/phpstan/phpdoc-parser/src/Ast/Node.php | 22 + .../phpdoc-parser/src/Ast/NodeAttributes.php | 38 + .../phpdoc-parser/src/Ast/NodeTraverser.php | 312 ++++++ .../phpdoc-parser/src/Ast/NodeVisitor.php | 87 ++ .../src/Ast/NodeVisitor/CloningVisitor.php | 20 + .../Ast/PhpDoc/AssertTagMethodValueNode.php | 50 + .../Ast/PhpDoc/AssertTagPropertyValueNode.php | 50 + .../src/Ast/PhpDoc/AssertTagValueNode.php | 46 + .../src/Ast/PhpDoc/DeprecatedTagValueNode.php | 27 + .../src/Ast/PhpDoc/ExtendsTagValueNode.php | 32 + .../src/Ast/PhpDoc/GenericTagValueNode.php | 26 + .../src/Ast/PhpDoc/ImplementsTagValueNode.php | 32 + .../src/Ast/PhpDoc/InvalidTagValueNode.php | 53 ++ .../src/Ast/PhpDoc/MethodTagValueNode.php | 58 ++ .../PhpDoc/MethodTagValueParameterNode.php | 49 + .../src/Ast/PhpDoc/MixinTagValueNode.php | 32 + .../src/Ast/PhpDoc/ParamOutTagValueNode.php | 35 + .../src/Ast/PhpDoc/ParamTagValueNode.php | 46 + .../src/Ast/PhpDoc/PhpDocChildNode.php | 10 + .../src/Ast/PhpDoc/PhpDocNode.php | 371 ++++++++ .../src/Ast/PhpDoc/PhpDocTagNode.php | 31 + .../src/Ast/PhpDoc/PhpDocTagValueNode.php | 10 + .../src/Ast/PhpDoc/PhpDocTextNode.php | 26 + .../src/Ast/PhpDoc/PropertyTagValueNode.php | 36 + .../src/Ast/PhpDoc/ReturnTagValueNode.php | 32 + .../src/Ast/PhpDoc/SelfOutTagValueNode.php | 32 + .../src/Ast/PhpDoc/TemplateTagValueNode.php | 42 + .../src/Ast/PhpDoc/ThrowsTagValueNode.php | 32 + .../PhpDoc/TypeAliasImportTagValueNode.php | 38 + .../src/Ast/PhpDoc/TypeAliasTagValueNode.php | 32 + .../Ast/PhpDoc/TypelessParamTagValueNode.php | 41 + .../src/Ast/PhpDoc/UsesTagValueNode.php | 32 + .../src/Ast/PhpDoc/VarTagValueNode.php | 36 + .../src/Ast/Type/ArrayShapeItemNode.php | 49 + .../src/Ast/Type/ArrayShapeNode.php | 48 + .../src/Ast/Type/ArrayTypeNode.php | 34 + .../src/Ast/Type/CallableTypeNode.php | 43 + .../Ast/Type/CallableTypeParameterNode.php | 48 + .../Type/ConditionalTypeForParameterNode.php | 49 + .../src/Ast/Type/ConditionalTypeNode.php | 49 + .../src/Ast/Type/ConstTypeNode.php | 26 + .../src/Ast/Type/GenericTypeNode.php | 58 ++ .../src/Ast/Type/IdentifierTypeNode.php | 26 + .../src/Ast/Type/IntersectionTypeNode.php | 37 + .../src/Ast/Type/InvalidTypeNode.php | 38 + .../src/Ast/Type/NullableTypeNode.php | 26 + .../src/Ast/Type/ObjectShapeItemNode.php | 48 + .../src/Ast/Type/ObjectShapeNode.php | 31 + .../src/Ast/Type/OffsetAccessTypeNode.php | 37 + .../src/Ast/Type/ThisTypeNode.php | 17 + .../phpdoc-parser/src/Ast/Type/TypeNode.php | 10 + .../src/Ast/Type/UnionTypeNode.php | 37 + .../phpstan/phpdoc-parser/src/Lexer/Lexer.php | 181 ++++ .../src/Parser/ConstExprParser.php | 269 ++++++ .../src/Parser/ParserException.php | 106 +++ .../phpdoc-parser/src/Parser/PhpDocParser.php | 724 ++++++++++++++ .../src/Parser/StringUnescaper.php | 96 ++ .../src/Parser/TokenIterator.php | 331 +++++++ .../phpdoc-parser/src/Parser/TypeParser.php | 900 ++++++++++++++++++ .../phpdoc-parser/src/Printer/DiffElem.php | 44 + .../phpdoc-parser/src/Printer/Differ.php | 196 ++++ .../phpdoc-parser/src/Printer/Printer.php | 803 ++++++++++++++++ vendor/phpstan/phpstan/bootstrap.php | 1 - vendor/phpstan/phpstan/composer.json | 7 + vendor/phpstan/phpstan/phpstan.phar | Bin 21593302 -> 21742779 bytes vendor/phpstan/phpstan/phpstan.phar.asc | 26 +- vendor/phpunit/phpunit/ChangeLog-8.5.md | 304 ------ vendor/phpunit/phpunit/ChangeLog-9.6.md | 21 + vendor/phpunit/phpunit/composer.json | 3 +- vendor/phpunit/phpunit/phpunit | 21 +- .../phpunit/phpunit/src/Framework/Assert.php | 4 +- .../src/Framework/MockObject/Generator.php | 3 - .../phpunit/src/Framework/TestResult.php | 1 + vendor/phpunit/phpunit/src/Runner/Version.php | 2 +- .../src/TextUI/CliArguments/Builder.php | 1 - vendor/phpunit/phpunit/src/TextUI/Command.php | 25 +- .../src/TextUI/DefaultResultPrinter.php | 24 +- vendor/phpunit/phpunit/src/TextUI/Help.php | 3 +- .../phpunit/phpunit/src/TextUI/TestRunner.php | 6 +- .../phpunit/src/Util/Annotation/DocBlock.php | 15 +- .../phpunit/phpunit/src/Util/GlobalState.php | 84 ++ .../src/Util/TestDox/CliTestDoxPrinter.php | 1 - vendor/sebastian/diff/ChangeLog.md | 8 + ...ientLongestCommonSubsequenceCalculator.php | 7 +- ...ientLongestCommonSubsequenceCalculator.php | 24 +- vendor/symfony/console/Application.php | 105 +- vendor/symfony/console/CHANGELOG.md | 7 + vendor/symfony/console/Command/Command.php | 18 +- .../console/Command/CompleteCommand.php | 12 +- .../console/Command/DumpCompletionCommand.php | 31 +- .../symfony/console/Command/HelpCommand.php | 14 +- .../symfony/console/Command/ListCommand.php | 11 +- .../symfony/console/Command/LockableTrait.php | 4 +- .../Command/SignalableCommandInterface.php | 6 +- .../console/Completion/CompletionInput.php | 2 +- .../AddConsoleCommandPass.php | 3 + .../Descriptor/ApplicationDescription.php | 2 +- .../symfony/console/Descriptor/Descriptor.php | 22 +- .../Descriptor/DescriptorInterface.php | 3 + .../console/Descriptor/JsonDescriptor.php | 12 +- .../console/Descriptor/MarkdownDescriptor.php | 38 +- .../Descriptor/ReStructuredTextDescriptor.php | 272 ++++++ .../console/Descriptor/TextDescriptor.php | 20 +- .../console/Descriptor/XmlDescriptor.php | 14 +- .../console/Event/ConsoleSignalEvent.php | 23 +- .../console/EventListener/ErrorListener.php | 6 + .../console/Formatter/OutputFormatter.php | 9 + .../Formatter/OutputFormatterInterface.php | 4 + .../Formatter/OutputFormatterStyle.php | 18 +- .../OutputFormatterStyleInterface.php | 10 + .../Formatter/OutputFormatterStyleStack.php | 4 + .../console/Helper/DescriptorHelper.php | 4 + vendor/symfony/console/Helper/Dumper.php | 14 +- vendor/symfony/console/Helper/Helper.php | 14 +- .../console/Helper/HelperInterface.php | 2 + vendor/symfony/console/Helper/HelperSet.php | 3 + .../console/Helper/InputAwareHelper.php | 3 + vendor/symfony/console/Helper/ProgressBar.php | 79 +- .../console/Helper/ProgressIndicator.php | 30 +- .../symfony/console/Helper/QuestionHelper.php | 33 +- .../console/Helper/SymfonyQuestionHelper.php | 6 + vendor/symfony/console/Helper/Table.php | 18 +- .../symfony/console/Helper/TableCellStyle.php | 4 +- vendor/symfony/console/Input/ArgvInput.php | 18 +- vendor/symfony/console/Input/ArrayInput.php | 9 +- vendor/symfony/console/Input/Input.php | 29 +- .../symfony/console/Input/InputArgument.php | 4 +- .../console/Input/InputAwareInterface.php | 2 + .../symfony/console/Input/InputDefinition.php | 14 + .../symfony/console/Input/InputInterface.php | 10 + vendor/symfony/console/Input/InputOption.php | 3 + .../Input/StreamableInputInterface.php | 2 + .../symfony/console/Output/AnsiColorMode.php | 22 +- .../symfony/console/Output/BufferedOutput.php | 3 + .../symfony/console/Output/ConsoleOutput.php | 12 + .../console/Output/ConsoleOutputInterface.php | 3 + .../console/Output/ConsoleSectionOutput.php | 9 +- vendor/symfony/console/Output/NullOutput.php | 15 + vendor/symfony/console/Output/Output.php | 17 + .../console/Output/OutputInterface.php | 11 + .../symfony/console/Output/StreamOutput.php | 3 + .../console/Output/TrimmedBufferOutput.php | 3 + vendor/symfony/console/Question/Question.php | 12 +- vendor/symfony/console/README.md | 16 + .../symfony/console/Resources/completion.bash | 10 + .../symfony/console/Resources/completion.zsh | 2 + vendor/symfony/console/Style/OutputStyle.php | 21 + .../symfony/console/Style/StyleInterface.php | 28 + vendor/symfony/console/Style/SymfonyStyle.php | 64 +- vendor/symfony/console/Terminal.php | 21 +- vendor/symfony/console/Tester/TesterTrait.php | 2 +- vendor/symfony/console/composer.json | 12 +- .../deprecation-contracts/composer.json | 2 +- .../Test/ServiceLocatorTest.php | 81 +- .../Test/ServiceLocatorTestCase.php | 92 ++ .../symfony/service-contracts/composer.json | 5 +- .../symfony/string/AbstractUnicodeString.php | 12 +- .../string/Inflector/EnglishInflector.php | 6 + vendor/symfony/string/LazyString.php | 4 +- .../symfony/string/Slugger/AsciiSlugger.php | 7 +- vendor/symfony/string/composer.json | 4 +- www/admin/class_test.hash.php | 9 +- www/admin/class_test.image.php | 2 +- www/admin/class_test.logging.php | 24 +- www/admin/class_test.uids.php | 7 +- 211 files changed, 10013 insertions(+), 1461 deletions(-) create mode 100644 vendor/doctrine/deprecations/LICENSE create mode 100644 vendor/doctrine/deprecations/README.md create mode 100644 vendor/doctrine/deprecations/composer.json create mode 100644 vendor/doctrine/deprecations/lib/Doctrine/Deprecations/Deprecation.php create mode 100644 vendor/doctrine/deprecations/lib/Doctrine/Deprecations/PHPUnit/VerifyDeprecations.php create mode 100644 vendor/doctrine/deprecations/phpcs.xml create mode 100644 vendor/netresearch/jsonmapper/.github/workflows/test.yml delete mode 100644 vendor/phpdocumentor/type-resolver/.yamllint.yaml delete mode 100644 vendor/phpdocumentor/type-resolver/composer-require-checker.json delete mode 100644 vendor/phpdocumentor/type-resolver/rector.php create mode 100644 vendor/phpdocumentor/type-resolver/src/PseudoTypes/ArrayShape.php create mode 100644 vendor/phpdocumentor/type-resolver/src/PseudoTypes/ArrayShapeItem.php create mode 100644 vendor/phpdocumentor/type-resolver/src/PseudoTypes/ConstExpression.php create mode 100644 vendor/phpdocumentor/type-resolver/src/PseudoTypes/FloatValue.php create mode 100644 vendor/phpdocumentor/type-resolver/src/PseudoTypes/IntegerValue.php create mode 100644 vendor/phpdocumentor/type-resolver/src/PseudoTypes/NonEmptyList.php create mode 100644 vendor/phpdocumentor/type-resolver/src/PseudoTypes/StringValue.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/CallableParameter.php create mode 100644 vendor/phpstan/phpdoc-parser/LICENSE create mode 100644 vendor/phpstan/phpdoc-parser/README.md create mode 100644 vendor/phpstan/phpdoc-parser/composer.json create mode 100644 vendor/phpstan/phpdoc-parser/phpstan-baseline.neon create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/AbstractNodeVisitor.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/Attribute.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprArrayItemNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprArrayNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprFalseNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprFloatNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprIntegerNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprNullNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprStringNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprTrueNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstFetchNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/QuoteAwareConstExprStringNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/Node.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/NodeAttributes.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/NodeTraverser.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/NodeVisitor.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/NodeVisitor/CloningVisitor.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagMethodValueNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagPropertyValueNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagValueNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/DeprecatedTagValueNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ExtendsTagValueNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/GenericTagValueNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ImplementsTagValueNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/InvalidTagValueNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueParameterNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/MixinTagValueNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamOutTagValueNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamTagValueNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocChildNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTagNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTagValueNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTextNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PropertyTagValueNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ReturnTagValueNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/SelfOutTagValueNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/TemplateTagValueNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ThrowsTagValueNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypeAliasImportTagValueNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypeAliasTagValueNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypelessParamTagValueNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/UsesTagValueNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/VarTagValueNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeItemNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayTypeNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeParameterNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/Type/ConditionalTypeForParameterNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/Type/ConditionalTypeNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/Type/ConstTypeNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/Type/GenericTypeNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/Type/IdentifierTypeNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/Type/IntersectionTypeNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/Type/InvalidTypeNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/Type/NullableTypeNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/Type/ObjectShapeItemNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/Type/ObjectShapeNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/Type/OffsetAccessTypeNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/Type/ThisTypeNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/Type/TypeNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/Type/UnionTypeNode.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Lexer/Lexer.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Parser/ConstExprParser.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Parser/ParserException.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Parser/PhpDocParser.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Parser/StringUnescaper.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Parser/TokenIterator.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Parser/TypeParser.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Printer/DiffElem.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Printer/Differ.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Printer/Printer.php delete mode 100644 vendor/phpunit/phpunit/ChangeLog-8.5.md create mode 100644 vendor/symfony/console/Descriptor/ReStructuredTextDescriptor.php create mode 100644 vendor/symfony/service-contracts/Test/ServiceLocatorTestCase.php diff --git a/composer.lock b/composer.lock index 2a912448..128b755a 100644 --- a/composer.lock +++ b/composer.lock @@ -225,6 +225,49 @@ ], "time": "2022-02-25T21:32:43+00:00" }, + { + "name": "doctrine/deprecations", + "version": "v1.1.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "8cffffb2218e01f3b370bf763e00e81697725259" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/8cffffb2218e01f3b370bf763e00e81697725259", + "reference": "8cffffb2218e01f3b370bf763e00e81697725259", + "shasum": "" + }, + "require": { + "php": "^7.1|^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9", + "phpunit/phpunit": "^7.5|^8.5|^9.5", + "psr/log": "^1|^2|^3" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/v1.1.0" + }, + "time": "2023-05-29T18:55:17+00:00" + }, { "name": "doctrine/instantiator", "version": "2.0.0", @@ -446,16 +489,16 @@ }, { "name": "netresearch/jsonmapper", - "version": "v4.1.0", + "version": "v4.2.0", "source": { "type": "git", "url": "https://github.com/cweiske/jsonmapper.git", - "reference": "cfa81ea1d35294d64adb9c68aa4cb9e92400e53f" + "reference": "f60565f8c0566a31acf06884cdaa591867ecc956" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/cfa81ea1d35294d64adb9c68aa4cb9e92400e53f", - "reference": "cfa81ea1d35294d64adb9c68aa4cb9e92400e53f", + "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/f60565f8c0566a31acf06884cdaa591867ecc956", + "reference": "f60565f8c0566a31acf06884cdaa591867ecc956", "shasum": "" }, "require": { @@ -491,22 +534,22 @@ "support": { "email": "cweiske@cweiske.de", "issues": "https://github.com/cweiske/jsonmapper/issues", - "source": "https://github.com/cweiske/jsonmapper/tree/v4.1.0" + "source": "https://github.com/cweiske/jsonmapper/tree/v4.2.0" }, - "time": "2022-12-08T20:46:14+00:00" + "time": "2023-04-09T17:37:40+00:00" }, { "name": "nikic/php-parser", - "version": "v4.15.4", + "version": "v4.15.5", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "6bb5176bc4af8bcb7d926f88718db9b96a2d4290" + "reference": "11e2663a5bc9db5d714eedb4277ee300403b4a9e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/6bb5176bc4af8bcb7d926f88718db9b96a2d4290", - "reference": "6bb5176bc4af8bcb7d926f88718db9b96a2d4290", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/11e2663a5bc9db5d714eedb4277ee300403b4a9e", + "reference": "11e2663a5bc9db5d714eedb4277ee300403b4a9e", "shasum": "" }, "require": { @@ -547,9 +590,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.4" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.5" }, - "time": "2023-03-05T19:49:14+00:00" + "time": "2023-05-19T20:20:00+00:00" }, { "name": "phan/phan", @@ -853,24 +896,27 @@ }, { "name": "phpdocumentor/type-resolver", - "version": "1.6.2", + "version": "1.7.2", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "48f445a408c131e38cab1c235aa6d2bb7a0bb20d" + "reference": "b2fe4d22a5426f38e014855322200b97b5362c0d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/48f445a408c131e38cab1c235aa6d2bb7a0bb20d", - "reference": "48f445a408c131e38cab1c235aa6d2bb7a0bb20d", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/b2fe4d22a5426f38e014855322200b97b5362c0d", + "reference": "b2fe4d22a5426f38e014855322200b97b5362c0d", "shasum": "" }, "require": { + "doctrine/deprecations": "^1.0", "php": "^7.4 || ^8.0", - "phpdocumentor/reflection-common": "^2.0" + "phpdocumentor/reflection-common": "^2.0", + "phpstan/phpdoc-parser": "^1.13" }, "require-dev": { "ext-tokenizer": "*", + "phpbench/phpbench": "^1.2", "phpstan/extension-installer": "^1.1", "phpstan/phpstan": "^1.8", "phpstan/phpstan-phpunit": "^1.1", @@ -902,22 +948,68 @@ "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", "support": { "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.2" + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.7.2" }, - "time": "2022-10-14T12:47:21+00:00" + "time": "2023-05-30T18:13:47+00:00" }, { - "name": "phpstan/phpstan", - "version": "1.10.6", + "name": "phpstan/phpdoc-parser", + "version": "1.21.3", "source": { "type": "git", - "url": "https://github.com/phpstan/phpstan.git", - "reference": "50d089a3e0904b0fe7e2cf2d4fd37d427d64235a" + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "b0c366dd2cea79407d635839d25423ba07c55dd6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/50d089a3e0904b0fe7e2cf2d4fd37d427d64235a", - "reference": "50d089a3e0904b0fe7e2cf2d4fd37d427d64235a", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/b0c366dd2cea79407d635839d25423ba07c55dd6", + "reference": "b0c366dd2cea79407d635839d25423ba07c55dd6", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "nikic/php-parser": "^4.15", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.5", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.0", + "phpunit/phpunit": "^9.5", + "symfony/process": "^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "PHPStan\\PhpDocParser\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPDoc parser with support for nullable, intersection and generic types", + "support": { + "issues": "https://github.com/phpstan/phpdoc-parser/issues", + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.21.3" + }, + "time": "2023-05-29T19:31:28+00:00" + }, + { + "name": "phpstan/phpstan", + "version": "1.10.15", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan.git", + "reference": "762c4dac4da6f8756eebb80e528c3a47855da9bd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/762c4dac4da6f8756eebb80e528c3a47855da9bd", + "reference": "762c4dac4da6f8756eebb80e528c3a47855da9bd", "shasum": "" }, "require": { @@ -946,8 +1038,11 @@ "static analysis" ], "support": { + "docs": "https://phpstan.org/user-guide/getting-started", + "forum": "https://github.com/phpstan/phpstan/discussions", "issues": "https://github.com/phpstan/phpstan/issues", - "source": "https://github.com/phpstan/phpstan/tree/1.10.6" + "security": "https://github.com/phpstan/phpstan/security/policy", + "source": "https://github.com/phpstan/phpstan-src" }, "funding": [ { @@ -963,7 +1058,7 @@ "type": "tidelift" } ], - "time": "2023-03-09T16:55:12+00:00" + "time": "2023-05-09T15:28:01+00:00" }, { "name": "phpunit/php-code-coverage", @@ -1285,16 +1380,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.6.5", + "version": "9.6.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "86e761949019ae83f49240b2f2123fb5ab3b2fc5" + "reference": "17d621b3aff84d0c8b62539e269e87d8d5baa76e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/86e761949019ae83f49240b2f2123fb5ab3b2fc5", - "reference": "86e761949019ae83f49240b2f2123fb5ab3b2fc5", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/17d621b3aff84d0c8b62539e269e87d8d5baa76e", + "reference": "17d621b3aff84d0c8b62539e269e87d8d5baa76e", "shasum": "" }, "require": { @@ -1367,7 +1462,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.5" + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.8" }, "funding": [ { @@ -1383,7 +1479,7 @@ "type": "tidelift" } ], - "time": "2023-03-09T06:34:10+00:00" + "time": "2023-05-11T05:14:45+00:00" }, { "name": "psr/container", @@ -1854,16 +1950,16 @@ }, { "name": "sebastian/diff", - "version": "4.0.4", + "version": "4.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" + "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/74be17022044ebaaecfdf0c5cd504fc9cd5a7131", + "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131", "shasum": "" }, "require": { @@ -1908,7 +2004,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.5" }, "funding": [ { @@ -1916,7 +2012,7 @@ "type": "github" } ], - "time": "2020-10-26T13:10:38+00:00" + "time": "2023-05-07T05:35:17+00:00" }, { "name": "sebastian/environment", @@ -2520,23 +2616,23 @@ }, { "name": "symfony/console", - "version": "v6.2.7", + "version": "v6.3.0", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "cbad09eb8925b6ad4fb721c7a179344dc4a19d45" + "reference": "8788808b07cf0bdd6e4b7fdd23d8ddb1470c83b7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/cbad09eb8925b6ad4fb721c7a179344dc4a19d45", - "reference": "cbad09eb8925b6ad4fb721c7a179344dc4a19d45", + "url": "https://api.github.com/repos/symfony/console/zipball/8788808b07cf0bdd6e4b7fdd23d8ddb1470c83b7", + "reference": "8788808b07cf0bdd6e4b7fdd23d8ddb1470c83b7", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/deprecation-contracts": "^2.1|^3", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", - "symfony/service-contracts": "^1.1|^2|^3", + "symfony/service-contracts": "^2.5|^3", "symfony/string": "^5.4|^6.0" }, "conflict": { @@ -2558,12 +2654,6 @@ "symfony/process": "^5.4|^6.0", "symfony/var-dumper": "^5.4|^6.0" }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" - }, "type": "library", "autoload": { "psr-4": { @@ -2591,12 +2681,12 @@ "homepage": "https://symfony.com", "keywords": [ "cli", - "command line", + "command-line", "console", "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.2.7" + "source": "https://github.com/symfony/console/tree/v6.3.0" }, "funding": [ { @@ -2612,20 +2702,20 @@ "type": "tidelift" } ], - "time": "2023-02-25T17:00:03+00:00" + "time": "2023-05-29T12:49:39+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v3.2.1", + "version": "v3.3.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "e2d1534420bd723d0ef5aec58a22c5fe60ce6f5e" + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e2d1534420bd723d0ef5aec58a22c5fe60ce6f5e", - "reference": "e2d1534420bd723d0ef5aec58a22c5fe60ce6f5e", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf", + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf", "shasum": "" }, "require": { @@ -2634,7 +2724,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.3-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -2663,7 +2753,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.2.1" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.3.0" }, "funding": [ { @@ -2679,7 +2769,7 @@ "type": "tidelift" } ], - "time": "2023-03-01T10:25:55+00:00" + "time": "2023-05-23T14:45:45+00:00" }, { "name": "symfony/polyfill-ctype", @@ -3096,16 +3186,16 @@ }, { "name": "symfony/service-contracts", - "version": "v3.2.1", + "version": "v3.3.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "a8c9cedf55f314f3a186041d19537303766df09a" + "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/a8c9cedf55f314f3a186041d19537303766df09a", - "reference": "a8c9cedf55f314f3a186041d19537303766df09a", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", + "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", "shasum": "" }, "require": { @@ -3115,13 +3205,10 @@ "conflict": { "ext-psr": "<1.1|>=2" }, - "suggest": { - "symfony/service-implementation": "" - }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.3-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -3161,7 +3248,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.2.1" + "source": "https://github.com/symfony/service-contracts/tree/v3.3.0" }, "funding": [ { @@ -3177,20 +3264,20 @@ "type": "tidelift" } ], - "time": "2023-03-01T10:32:47+00:00" + "time": "2023-05-23T14:45:45+00:00" }, { "name": "symfony/string", - "version": "v6.2.7", + "version": "v6.3.0", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "67b8c1eec78296b85dc1c7d9743830160218993d" + "reference": "f2e190ee75ff0f5eced645ec0be5c66fac81f51f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/67b8c1eec78296b85dc1c7d9743830160218993d", - "reference": "67b8c1eec78296b85dc1c7d9743830160218993d", + "url": "https://api.github.com/repos/symfony/string/zipball/f2e190ee75ff0f5eced645ec0be5c66fac81f51f", + "reference": "f2e190ee75ff0f5eced645ec0be5c66fac81f51f", "shasum": "" }, "require": { @@ -3201,13 +3288,13 @@ "symfony/polyfill-mbstring": "~1.0" }, "conflict": { - "symfony/translation-contracts": "<2.0" + "symfony/translation-contracts": "<2.5" }, "require-dev": { "symfony/error-handler": "^5.4|^6.0", "symfony/http-client": "^5.4|^6.0", "symfony/intl": "^6.2", - "symfony/translation-contracts": "^2.0|^3.0", + "symfony/translation-contracts": "^2.5|^3.0", "symfony/var-exporter": "^5.4|^6.0" }, "type": "library", @@ -3247,7 +3334,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.2.7" + "source": "https://github.com/symfony/string/tree/v6.3.0" }, "funding": [ { @@ -3263,7 +3350,7 @@ "type": "tidelift" } ], - "time": "2023-02-24T10:42:00+00:00" + "time": "2023-03-21T21:06:29+00:00" }, { "name": "theseer/tokenizer", diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php index fe203ab7..bfaccdaa 100644 --- a/vendor/composer/autoload_psr4.php +++ b/vendor/composer/autoload_psr4.php @@ -22,8 +22,10 @@ return array( 'Psr\\Container\\' => array($vendorDir . '/psr/container/src'), 'PhpParser\\' => array($vendorDir . '/nikic/php-parser/lib/PhpParser'), 'Phan\\' => array($vendorDir . '/phan/phan/src/Phan'), + 'PHPStan\\PhpDocParser\\' => array($vendorDir . '/phpstan/phpdoc-parser/src'), 'Microsoft\\PhpParser\\' => array($vendorDir . '/microsoft/tolerant-php-parser/src'), 'Doctrine\\Instantiator\\' => array($vendorDir . '/doctrine/instantiator/src/Doctrine/Instantiator'), + 'Doctrine\\Deprecations\\' => array($vendorDir . '/doctrine/deprecations/lib/Doctrine/Deprecations'), 'DeepCopy\\' => array($vendorDir . '/myclabs/deep-copy/src/DeepCopy'), 'Composer\\XdebugHandler\\' => array($vendorDir . '/composer/xdebug-handler/src'), 'Composer\\Semver\\' => array($vendorDir . '/composer/semver/src'), diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php index 41f35c5d..6ae435f2 100644 --- a/vendor/composer/autoload_static.php +++ b/vendor/composer/autoload_static.php @@ -54,6 +54,7 @@ class ComposerStaticInitdd705c6e8ab22e0d642372dec7767718 'Psr\\Container\\' => 14, 'PhpParser\\' => 10, 'Phan\\' => 5, + 'PHPStan\\PhpDocParser\\' => 21, ), 'M' => array ( @@ -62,6 +63,7 @@ class ComposerStaticInitdd705c6e8ab22e0d642372dec7767718 'D' => array ( 'Doctrine\\Instantiator\\' => 22, + 'Doctrine\\Deprecations\\' => 22, 'DeepCopy\\' => 9, ), 'C' => @@ -143,6 +145,10 @@ class ComposerStaticInitdd705c6e8ab22e0d642372dec7767718 array ( 0 => __DIR__ . '/..' . '/phan/phan/src/Phan', ), + 'PHPStan\\PhpDocParser\\' => + array ( + 0 => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src', + ), 'Microsoft\\PhpParser\\' => array ( 0 => __DIR__ . '/..' . '/microsoft/tolerant-php-parser/src', @@ -151,6 +157,10 @@ class ComposerStaticInitdd705c6e8ab22e0d642372dec7767718 array ( 0 => __DIR__ . '/..' . '/doctrine/instantiator/src/Doctrine/Instantiator', ), + 'Doctrine\\Deprecations\\' => + array ( + 0 => __DIR__ . '/..' . '/doctrine/deprecations/lib/Doctrine/Deprecations', + ), 'DeepCopy\\' => array ( 0 => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy', diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json index 7c46a5f6..3608fa66 100644 --- a/vendor/composer/installed.json +++ b/vendor/composer/installed.json @@ -227,6 +227,52 @@ ], "install-path": "./xdebug-handler" }, + { + "name": "doctrine/deprecations", + "version": "v1.1.0", + "version_normalized": "1.1.0.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "8cffffb2218e01f3b370bf763e00e81697725259" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/8cffffb2218e01f3b370bf763e00e81697725259", + "reference": "8cffffb2218e01f3b370bf763e00e81697725259", + "shasum": "" + }, + "require": { + "php": "^7.1|^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9", + "phpunit/phpunit": "^7.5|^8.5|^9.5", + "psr/log": "^1|^2|^3" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "time": "2023-05-29T18:55:17+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/v1.1.0" + }, + "install-path": "../doctrine/deprecations" + }, { "name": "doctrine/instantiator", "version": "2.0.0", @@ -460,17 +506,17 @@ }, { "name": "netresearch/jsonmapper", - "version": "v4.1.0", - "version_normalized": "4.1.0.0", + "version": "v4.2.0", + "version_normalized": "4.2.0.0", "source": { "type": "git", "url": "https://github.com/cweiske/jsonmapper.git", - "reference": "cfa81ea1d35294d64adb9c68aa4cb9e92400e53f" + "reference": "f60565f8c0566a31acf06884cdaa591867ecc956" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/cfa81ea1d35294d64adb9c68aa4cb9e92400e53f", - "reference": "cfa81ea1d35294d64adb9c68aa4cb9e92400e53f", + "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/f60565f8c0566a31acf06884cdaa591867ecc956", + "reference": "f60565f8c0566a31acf06884cdaa591867ecc956", "shasum": "" }, "require": { @@ -484,7 +530,7 @@ "phpunit/phpunit": "~7.5 || ~8.0 || ~9.0", "squizlabs/php_codesniffer": "~3.5" }, - "time": "2022-12-08T20:46:14+00:00", + "time": "2023-04-09T17:37:40+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -508,23 +554,23 @@ "support": { "email": "cweiske@cweiske.de", "issues": "https://github.com/cweiske/jsonmapper/issues", - "source": "https://github.com/cweiske/jsonmapper/tree/v4.1.0" + "source": "https://github.com/cweiske/jsonmapper/tree/v4.2.0" }, "install-path": "../netresearch/jsonmapper" }, { "name": "nikic/php-parser", - "version": "v4.15.4", - "version_normalized": "4.15.4.0", + "version": "v4.15.5", + "version_normalized": "4.15.5.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "6bb5176bc4af8bcb7d926f88718db9b96a2d4290" + "reference": "11e2663a5bc9db5d714eedb4277ee300403b4a9e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/6bb5176bc4af8bcb7d926f88718db9b96a2d4290", - "reference": "6bb5176bc4af8bcb7d926f88718db9b96a2d4290", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/11e2663a5bc9db5d714eedb4277ee300403b4a9e", + "reference": "11e2663a5bc9db5d714eedb4277ee300403b4a9e", "shasum": "" }, "require": { @@ -535,7 +581,7 @@ "ircmaxell/php-yacc": "^0.0.7", "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" }, - "time": "2023-03-05T19:49:14+00:00", + "time": "2023-05-19T20:20:00+00:00", "bin": [ "bin/php-parse" ], @@ -567,7 +613,7 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.4" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.5" }, "install-path": "../nikic/php-parser" }, @@ -888,25 +934,28 @@ }, { "name": "phpdocumentor/type-resolver", - "version": "1.6.2", - "version_normalized": "1.6.2.0", + "version": "1.7.2", + "version_normalized": "1.7.2.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "48f445a408c131e38cab1c235aa6d2bb7a0bb20d" + "reference": "b2fe4d22a5426f38e014855322200b97b5362c0d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/48f445a408c131e38cab1c235aa6d2bb7a0bb20d", - "reference": "48f445a408c131e38cab1c235aa6d2bb7a0bb20d", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/b2fe4d22a5426f38e014855322200b97b5362c0d", + "reference": "b2fe4d22a5426f38e014855322200b97b5362c0d", "shasum": "" }, "require": { + "doctrine/deprecations": "^1.0", "php": "^7.4 || ^8.0", - "phpdocumentor/reflection-common": "^2.0" + "phpdocumentor/reflection-common": "^2.0", + "phpstan/phpdoc-parser": "^1.13" }, "require-dev": { "ext-tokenizer": "*", + "phpbench/phpbench": "^1.2", "phpstan/extension-installer": "^1.1", "phpstan/phpstan": "^1.8", "phpstan/phpstan-phpunit": "^1.1", @@ -914,7 +963,7 @@ "rector/rector": "^0.13.9", "vimeo/psalm": "^4.25" }, - "time": "2022-10-14T12:47:21+00:00", + "time": "2023-05-30T18:13:47+00:00", "type": "library", "extra": { "branch-alias": { @@ -940,23 +989,72 @@ "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", "support": { "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.2" + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.7.2" }, "install-path": "../phpdocumentor/type-resolver" }, { - "name": "phpstan/phpstan", - "version": "1.10.6", - "version_normalized": "1.10.6.0", + "name": "phpstan/phpdoc-parser", + "version": "1.21.3", + "version_normalized": "1.21.3.0", "source": { "type": "git", - "url": "https://github.com/phpstan/phpstan.git", - "reference": "50d089a3e0904b0fe7e2cf2d4fd37d427d64235a" + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "b0c366dd2cea79407d635839d25423ba07c55dd6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/50d089a3e0904b0fe7e2cf2d4fd37d427d64235a", - "reference": "50d089a3e0904b0fe7e2cf2d4fd37d427d64235a", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/b0c366dd2cea79407d635839d25423ba07c55dd6", + "reference": "b0c366dd2cea79407d635839d25423ba07c55dd6", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "nikic/php-parser": "^4.15", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.5", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.0", + "phpunit/phpunit": "^9.5", + "symfony/process": "^5.2" + }, + "time": "2023-05-29T19:31:28+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "PHPStan\\PhpDocParser\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPDoc parser with support for nullable, intersection and generic types", + "support": { + "issues": "https://github.com/phpstan/phpdoc-parser/issues", + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.21.3" + }, + "install-path": "../phpstan/phpdoc-parser" + }, + { + "name": "phpstan/phpstan", + "version": "1.10.15", + "version_normalized": "1.10.15.0", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan.git", + "reference": "762c4dac4da6f8756eebb80e528c3a47855da9bd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/762c4dac4da6f8756eebb80e528c3a47855da9bd", + "reference": "762c4dac4da6f8756eebb80e528c3a47855da9bd", "shasum": "" }, "require": { @@ -965,7 +1063,7 @@ "conflict": { "phpstan/phpstan-shim": "*" }, - "time": "2023-03-09T16:55:12+00:00", + "time": "2023-05-09T15:28:01+00:00", "bin": [ "phpstan", "phpstan.phar" @@ -987,8 +1085,11 @@ "static analysis" ], "support": { + "docs": "https://phpstan.org/user-guide/getting-started", + "forum": "https://github.com/phpstan/phpstan/discussions", "issues": "https://github.com/phpstan/phpstan/issues", - "source": "https://github.com/phpstan/phpstan/tree/1.10.6" + "security": "https://github.com/phpstan/phpstan/security/policy", + "source": "https://github.com/phpstan/phpstan-src" }, "funding": [ { @@ -1341,17 +1442,17 @@ }, { "name": "phpunit/phpunit", - "version": "9.6.5", - "version_normalized": "9.6.5.0", + "version": "9.6.8", + "version_normalized": "9.6.8.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "86e761949019ae83f49240b2f2123fb5ab3b2fc5" + "reference": "17d621b3aff84d0c8b62539e269e87d8d5baa76e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/86e761949019ae83f49240b2f2123fb5ab3b2fc5", - "reference": "86e761949019ae83f49240b2f2123fb5ab3b2fc5", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/17d621b3aff84d0c8b62539e269e87d8d5baa76e", + "reference": "17d621b3aff84d0c8b62539e269e87d8d5baa76e", "shasum": "" }, "require": { @@ -1387,7 +1488,7 @@ "ext-soap": "To be able to generate mocks based on WSDL files", "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" }, - "time": "2023-03-09T06:34:10+00:00", + "time": "2023-05-11T05:14:45+00:00", "bin": [ "phpunit" ], @@ -1426,7 +1527,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.5" + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.8" }, "funding": [ { @@ -1937,17 +2039,17 @@ }, { "name": "sebastian/diff", - "version": "4.0.4", - "version_normalized": "4.0.4.0", + "version": "4.0.5", + "version_normalized": "4.0.5.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" + "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/74be17022044ebaaecfdf0c5cd504fc9cd5a7131", + "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131", "shasum": "" }, "require": { @@ -1957,7 +2059,7 @@ "phpunit/phpunit": "^9.3", "symfony/process": "^4.2 || ^5" }, - "time": "2020-10-26T13:10:38+00:00", + "time": "2023-05-07T05:35:17+00:00", "type": "library", "extra": { "branch-alias": { @@ -1994,7 +2096,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.5" }, "funding": [ { @@ -2636,24 +2738,24 @@ }, { "name": "symfony/console", - "version": "v6.2.7", - "version_normalized": "6.2.7.0", + "version": "v6.3.0", + "version_normalized": "6.3.0.0", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "cbad09eb8925b6ad4fb721c7a179344dc4a19d45" + "reference": "8788808b07cf0bdd6e4b7fdd23d8ddb1470c83b7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/cbad09eb8925b6ad4fb721c7a179344dc4a19d45", - "reference": "cbad09eb8925b6ad4fb721c7a179344dc4a19d45", + "url": "https://api.github.com/repos/symfony/console/zipball/8788808b07cf0bdd6e4b7fdd23d8ddb1470c83b7", + "reference": "8788808b07cf0bdd6e4b7fdd23d8ddb1470c83b7", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/deprecation-contracts": "^2.1|^3", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", - "symfony/service-contracts": "^1.1|^2|^3", + "symfony/service-contracts": "^2.5|^3", "symfony/string": "^5.4|^6.0" }, "conflict": { @@ -2675,13 +2777,7 @@ "symfony/process": "^5.4|^6.0", "symfony/var-dumper": "^5.4|^6.0" }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" - }, - "time": "2023-02-25T17:00:03+00:00", + "time": "2023-05-29T12:49:39+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -2710,12 +2806,12 @@ "homepage": "https://symfony.com", "keywords": [ "cli", - "command line", + "command-line", "console", "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.2.7" + "source": "https://github.com/symfony/console/tree/v6.3.0" }, "funding": [ { @@ -2735,27 +2831,27 @@ }, { "name": "symfony/deprecation-contracts", - "version": "v3.2.1", - "version_normalized": "3.2.1.0", + "version": "v3.3.0", + "version_normalized": "3.3.0.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "e2d1534420bd723d0ef5aec58a22c5fe60ce6f5e" + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e2d1534420bd723d0ef5aec58a22c5fe60ce6f5e", - "reference": "e2d1534420bd723d0ef5aec58a22c5fe60ce6f5e", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf", + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf", "shasum": "" }, "require": { "php": ">=8.1" }, - "time": "2023-03-01T10:25:55+00:00", + "time": "2023-05-23T14:45:45+00:00", "type": "library", "extra": { "branch-alias": { - "dev-main": "3.3-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -2785,7 +2881,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.2.1" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.3.0" }, "funding": [ { @@ -3233,17 +3329,17 @@ }, { "name": "symfony/service-contracts", - "version": "v3.2.1", - "version_normalized": "3.2.1.0", + "version": "v3.3.0", + "version_normalized": "3.3.0.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "a8c9cedf55f314f3a186041d19537303766df09a" + "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/a8c9cedf55f314f3a186041d19537303766df09a", - "reference": "a8c9cedf55f314f3a186041d19537303766df09a", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", + "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", "shasum": "" }, "require": { @@ -3253,14 +3349,11 @@ "conflict": { "ext-psr": "<1.1|>=2" }, - "suggest": { - "symfony/service-implementation": "" - }, - "time": "2023-03-01T10:32:47+00:00", + "time": "2023-05-23T14:45:45+00:00", "type": "library", "extra": { "branch-alias": { - "dev-main": "3.3-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -3301,7 +3394,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.2.1" + "source": "https://github.com/symfony/service-contracts/tree/v3.3.0" }, "funding": [ { @@ -3321,17 +3414,17 @@ }, { "name": "symfony/string", - "version": "v6.2.7", - "version_normalized": "6.2.7.0", + "version": "v6.3.0", + "version_normalized": "6.3.0.0", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "67b8c1eec78296b85dc1c7d9743830160218993d" + "reference": "f2e190ee75ff0f5eced645ec0be5c66fac81f51f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/67b8c1eec78296b85dc1c7d9743830160218993d", - "reference": "67b8c1eec78296b85dc1c7d9743830160218993d", + "url": "https://api.github.com/repos/symfony/string/zipball/f2e190ee75ff0f5eced645ec0be5c66fac81f51f", + "reference": "f2e190ee75ff0f5eced645ec0be5c66fac81f51f", "shasum": "" }, "require": { @@ -3342,16 +3435,16 @@ "symfony/polyfill-mbstring": "~1.0" }, "conflict": { - "symfony/translation-contracts": "<2.0" + "symfony/translation-contracts": "<2.5" }, "require-dev": { "symfony/error-handler": "^5.4|^6.0", "symfony/http-client": "^5.4|^6.0", "symfony/intl": "^6.2", - "symfony/translation-contracts": "^2.0|^3.0", + "symfony/translation-contracts": "^2.5|^3.0", "symfony/var-exporter": "^5.4|^6.0" }, - "time": "2023-02-24T10:42:00+00:00", + "time": "2023-03-21T21:06:29+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -3390,7 +3483,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.2.7" + "source": "https://github.com/symfony/string/tree/v6.3.0" }, "funding": [ { @@ -3593,6 +3686,7 @@ "composer/pcre", "composer/semver", "composer/xdebug-handler", + "doctrine/deprecations", "doctrine/instantiator", "felixfbecker/advanced-json-rpc", "microsoft/tolerant-php-parser", @@ -3605,6 +3699,7 @@ "phpdocumentor/reflection-common", "phpdocumentor/reflection-docblock", "phpdocumentor/type-resolver", + "phpstan/phpdoc-parser", "phpstan/phpstan", "phpunit/php-code-coverage", "phpunit/php-file-iterator", diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php index 51d778c6..118a15df 100644 --- a/vendor/composer/installed.php +++ b/vendor/composer/installed.php @@ -3,7 +3,7 @@ 'name' => '__root__', 'pretty_version' => 'dev-master', 'version' => 'dev-master', - 'reference' => '1cbe4e5c06aec83ca037690cb9621e39312b9247', + 'reference' => '513b115d5729d1001743baf12d8991cc385b20d9', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -13,7 +13,7 @@ '__root__' => array( 'pretty_version' => 'dev-master', 'version' => 'dev-master', - 'reference' => '1cbe4e5c06aec83ca037690cb9621e39312b9247', + 'reference' => '513b115d5729d1001743baf12d8991cc385b20d9', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -46,6 +46,15 @@ 'aliases' => array(), 'dev_requirement' => true, ), + 'doctrine/deprecations' => array( + 'pretty_version' => 'v1.1.0', + 'version' => '1.1.0.0', + 'reference' => '8cffffb2218e01f3b370bf763e00e81697725259', + 'type' => 'library', + 'install_path' => __DIR__ . '/../doctrine/deprecations', + 'aliases' => array(), + 'dev_requirement' => true, + ), 'doctrine/instantiator' => array( 'pretty_version' => '2.0.0', 'version' => '2.0.0.0', @@ -83,18 +92,18 @@ 'dev_requirement' => true, ), 'netresearch/jsonmapper' => array( - 'pretty_version' => 'v4.1.0', - 'version' => '4.1.0.0', - 'reference' => 'cfa81ea1d35294d64adb9c68aa4cb9e92400e53f', + 'pretty_version' => 'v4.2.0', + 'version' => '4.2.0.0', + 'reference' => 'f60565f8c0566a31acf06884cdaa591867ecc956', 'type' => 'library', 'install_path' => __DIR__ . '/../netresearch/jsonmapper', 'aliases' => array(), 'dev_requirement' => true, ), 'nikic/php-parser' => array( - 'pretty_version' => 'v4.15.4', - 'version' => '4.15.4.0', - 'reference' => '6bb5176bc4af8bcb7d926f88718db9b96a2d4290', + 'pretty_version' => 'v4.15.5', + 'version' => '4.15.5.0', + 'reference' => '11e2663a5bc9db5d714eedb4277ee300403b4a9e', 'type' => 'library', 'install_path' => __DIR__ . '/../nikic/php-parser', 'aliases' => array(), @@ -146,18 +155,27 @@ 'dev_requirement' => true, ), 'phpdocumentor/type-resolver' => array( - 'pretty_version' => '1.6.2', - 'version' => '1.6.2.0', - 'reference' => '48f445a408c131e38cab1c235aa6d2bb7a0bb20d', + 'pretty_version' => '1.7.2', + 'version' => '1.7.2.0', + 'reference' => 'b2fe4d22a5426f38e014855322200b97b5362c0d', 'type' => 'library', 'install_path' => __DIR__ . '/../phpdocumentor/type-resolver', 'aliases' => array(), 'dev_requirement' => true, ), + 'phpstan/phpdoc-parser' => array( + 'pretty_version' => '1.21.3', + 'version' => '1.21.3.0', + 'reference' => 'b0c366dd2cea79407d635839d25423ba07c55dd6', + 'type' => 'library', + 'install_path' => __DIR__ . '/../phpstan/phpdoc-parser', + 'aliases' => array(), + 'dev_requirement' => true, + ), 'phpstan/phpstan' => array( - 'pretty_version' => '1.10.6', - 'version' => '1.10.6.0', - 'reference' => '50d089a3e0904b0fe7e2cf2d4fd37d427d64235a', + 'pretty_version' => '1.10.15', + 'version' => '1.10.15.0', + 'reference' => '762c4dac4da6f8756eebb80e528c3a47855da9bd', 'type' => 'library', 'install_path' => __DIR__ . '/../phpstan/phpstan', 'aliases' => array(), @@ -209,9 +227,9 @@ 'dev_requirement' => true, ), 'phpunit/phpunit' => array( - 'pretty_version' => '9.6.5', - 'version' => '9.6.5.0', - 'reference' => '86e761949019ae83f49240b2f2123fb5ab3b2fc5', + 'pretty_version' => '9.6.8', + 'version' => '9.6.8.0', + 'reference' => '17d621b3aff84d0c8b62539e269e87d8d5baa76e', 'type' => 'library', 'install_path' => __DIR__ . '/../phpunit/phpunit', 'aliases' => array(), @@ -296,9 +314,9 @@ 'dev_requirement' => true, ), 'sebastian/diff' => array( - 'pretty_version' => '4.0.4', - 'version' => '4.0.4.0', - 'reference' => '3461e3fccc7cfdfc2720be910d3bd73c69be590d', + 'pretty_version' => '4.0.5', + 'version' => '4.0.5.0', + 'reference' => '74be17022044ebaaecfdf0c5cd504fc9cd5a7131', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/diff', 'aliases' => array(), @@ -395,18 +413,18 @@ 'dev_requirement' => true, ), 'symfony/console' => array( - 'pretty_version' => 'v6.2.7', - 'version' => '6.2.7.0', - 'reference' => 'cbad09eb8925b6ad4fb721c7a179344dc4a19d45', + 'pretty_version' => 'v6.3.0', + 'version' => '6.3.0.0', + 'reference' => '8788808b07cf0bdd6e4b7fdd23d8ddb1470c83b7', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/console', 'aliases' => array(), 'dev_requirement' => true, ), 'symfony/deprecation-contracts' => array( - 'pretty_version' => 'v3.2.1', - 'version' => '3.2.1.0', - 'reference' => 'e2d1534420bd723d0ef5aec58a22c5fe60ce6f5e', + 'pretty_version' => 'v3.3.0', + 'version' => '3.3.0.0', + 'reference' => '7c3aff79d10325257a001fcf92d991f24fc967cf', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/deprecation-contracts', 'aliases' => array(), @@ -458,18 +476,18 @@ 'dev_requirement' => true, ), 'symfony/service-contracts' => array( - 'pretty_version' => 'v3.2.1', - 'version' => '3.2.1.0', - 'reference' => 'a8c9cedf55f314f3a186041d19537303766df09a', + 'pretty_version' => 'v3.3.0', + 'version' => '3.3.0.0', + 'reference' => '40da9cc13ec349d9e4966ce18b5fbcd724ab10a4', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/service-contracts', 'aliases' => array(), 'dev_requirement' => true, ), 'symfony/string' => array( - 'pretty_version' => 'v6.2.7', - 'version' => '6.2.7.0', - 'reference' => '67b8c1eec78296b85dc1c7d9743830160218993d', + 'pretty_version' => 'v6.3.0', + 'version' => '6.3.0.0', + 'reference' => 'f2e190ee75ff0f5eced645ec0be5c66fac81f51f', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/string', 'aliases' => array(), diff --git a/vendor/doctrine/deprecations/LICENSE b/vendor/doctrine/deprecations/LICENSE new file mode 100644 index 00000000..156905cd --- /dev/null +++ b/vendor/doctrine/deprecations/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2020-2021 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/vendor/doctrine/deprecations/README.md b/vendor/doctrine/deprecations/README.md new file mode 100644 index 00000000..93caf83f --- /dev/null +++ b/vendor/doctrine/deprecations/README.md @@ -0,0 +1,157 @@ +# Doctrine Deprecations + +A small (side-effect free by default) layer on top of +`trigger_error(E_USER_DEPRECATED)` or PSR-3 logging. + +- no side-effects by default, making it a perfect fit for libraries that don't know how the error handler works they operate under +- options to avoid having to rely on error handlers global state by using PSR-3 logging +- deduplicate deprecation messages to avoid excessive triggering and reduce overhead + +We recommend to collect Deprecations using a PSR logger instead of relying on +the global error handler. + +## Usage from consumer perspective: + +Enable Doctrine deprecations to be sent to a PSR3 logger: + +```php +\Doctrine\Deprecations\Deprecation::enableWithPsrLogger($logger); +``` + +Enable Doctrine deprecations to be sent as `@trigger_error($message, E_USER_DEPRECATED)` +messages by setting the `DOCTRINE_DEPRECATIONS` environment variable to `trigger`. +Alternatively, call: + +```php +\Doctrine\Deprecations\Deprecation::enableWithTriggerError(); +``` + +If you only want to enable deprecation tracking, without logging or calling `trigger_error` +then set the `DOCTRINE_DEPRECATIONS` environment variable to `track`. +Alternatively, call: + +```php +\Doctrine\Deprecations\Deprecation::enableTrackingDeprecations(); +``` + +Tracking is enabled with all three modes and provides access to all triggered +deprecations and their individual count: + +```php +$deprecations = \Doctrine\Deprecations\Deprecation::getTriggeredDeprecations(); + +foreach ($deprecations as $identifier => $count) { + echo $identifier . " was triggered " . $count . " times\n"; +} +``` + +### Suppressing Specific Deprecations + +Disable triggering about specific deprecations: + +```php +\Doctrine\Deprecations\Deprecation::ignoreDeprecations("https://link/to/deprecations-description-identifier"); +``` + +Disable all deprecations from a package + +```php +\Doctrine\Deprecations\Deprecation::ignorePackage("doctrine/orm"); +``` + +### Other Operations + +When used within PHPUnit or other tools that could collect multiple instances of the same deprecations +the deduplication can be disabled: + +```php +\Doctrine\Deprecations\Deprecation::withoutDeduplication(); +``` + +Disable deprecation tracking again: + +```php +\Doctrine\Deprecations\Deprecation::disable(); +``` + +## Usage from a library/producer perspective: + +When you want to unconditionally trigger a deprecation even when called +from the library itself then the `trigger` method is the way to go: + +```php +\Doctrine\Deprecations\Deprecation::trigger( + "doctrine/orm", + "https://link/to/deprecations-description", + "message" +); +``` + +If variable arguments are provided at the end, they are used with `sprintf` on +the message. + +```php +\Doctrine\Deprecations\Deprecation::trigger( + "doctrine/orm", + "https://github.com/doctrine/orm/issue/1234", + "message %s %d", + "foo", + 1234 +); +``` + +When you want to trigger a deprecation only when it is called by a function +outside of the current package, but not trigger when the package itself is the cause, +then use: + +```php +\Doctrine\Deprecations\Deprecation::triggerIfCalledFromOutside( + "doctrine/orm", + "https://link/to/deprecations-description", + "message" +); +``` + +Based on the issue link each deprecation message is only triggered once per +request. + +A limited stacktrace is included in the deprecation message to find the +offending location. + +Note: A producer/library should never call `Deprecation::enableWith` methods +and leave the decision how to handle deprecations to application and +frameworks. + +## Usage in PHPUnit tests + +There is a `VerifyDeprecations` trait that you can use to make assertions on +the occurrence of deprecations within a test. + +```php +use Doctrine\Deprecations\PHPUnit\VerifyDeprecations; + +class MyTest extends TestCase +{ + use VerifyDeprecations; + + public function testSomethingDeprecation() + { + $this->expectDeprecationWithIdentifier('https://github.com/doctrine/orm/issue/1234'); + + triggerTheCodeWithDeprecation(); + } + + public function testSomethingDeprecationFixed() + { + $this->expectNoDeprecationWithIdentifier('https://github.com/doctrine/orm/issue/1234'); + + triggerTheCodeWithoutDeprecation(); + } +} +``` + +## What is a deprecation identifier? + +An identifier for deprecations is just a link to any resource, most often a +Github Issue or Pull Request explaining the deprecation and potentially its +alternative. diff --git a/vendor/doctrine/deprecations/composer.json b/vendor/doctrine/deprecations/composer.json new file mode 100644 index 00000000..c79e38cd --- /dev/null +++ b/vendor/doctrine/deprecations/composer.json @@ -0,0 +1,32 @@ +{ + "name": "doctrine/deprecations", + "type": "library", + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "license": "MIT", + "require": { + "php": "^7.1|^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^7.5|^8.5|^9.5", + "psr/log": "^1|^2|^3", + "doctrine/coding-standard": "^9" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "autoload": { + "psr-4": {"Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations"} + }, + "autoload-dev": { + "psr-4": { + "DeprecationTests\\": "test_fixtures/src", + "Doctrine\\Foo\\": "test_fixtures/vendor/doctrine/foo" + } + }, + "config": { + "allow-plugins": { + "dealerdirect/phpcodesniffer-composer-installer": true + } + } +} diff --git a/vendor/doctrine/deprecations/lib/Doctrine/Deprecations/Deprecation.php b/vendor/doctrine/deprecations/lib/Doctrine/Deprecations/Deprecation.php new file mode 100644 index 00000000..6c76d984 --- /dev/null +++ b/vendor/doctrine/deprecations/lib/Doctrine/Deprecations/Deprecation.php @@ -0,0 +1,294 @@ + */ + private static $ignoredPackages = []; + + /** @var array */ + private static $ignoredLinks = []; + + /** @var bool */ + private static $deduplication = true; + + /** + * Trigger a deprecation for the given package and identfier. + * + * The link should point to a Github issue or Wiki entry detailing the + * deprecation. It is additionally used to de-duplicate the trigger of the + * same deprecation during a request. + * + * @param mixed $args + */ + public static function trigger(string $package, string $link, string $message, ...$args): void + { + $type = self::$type ?? self::getTypeFromEnv(); + + if ($type === self::TYPE_NONE) { + return; + } + + if (array_key_exists($link, self::$ignoredLinks)) { + self::$ignoredLinks[$link]++; + } else { + self::$ignoredLinks[$link] = 1; + } + + if (self::$deduplication === true && self::$ignoredLinks[$link] > 1) { + return; + } + + if (isset(self::$ignoredPackages[$package])) { + return; + } + + $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2); + + $message = sprintf($message, ...$args); + + self::delegateTriggerToBackend($message, $backtrace, $link, $package); + } + + /** + * Trigger a deprecation for the given package and identifier when called from outside. + * + * "Outside" means we assume that $package is currently installed as a + * dependency and the caller is not a file in that package. When $package + * is installed as a root package then deprecations triggered from the + * tests folder are also considered "outside". + * + * This deprecation method assumes that you are using Composer to install + * the dependency and are using the default /vendor/ folder and not a + * Composer plugin to change the install location. The assumption is also + * that $package is the exact composer packge name. + * + * Compared to {@link trigger()} this method causes some overhead when + * deprecation tracking is enabled even during deduplication, because it + * needs to call {@link debug_backtrace()} + * + * @param mixed $args + */ + public static function triggerIfCalledFromOutside(string $package, string $link, string $message, ...$args): void + { + $type = self::$type ?? self::getTypeFromEnv(); + + if ($type === self::TYPE_NONE) { + return; + } + + $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2); + + // first check that the caller is not from a tests folder, in which case we always let deprecations pass + if (strpos($backtrace[1]['file'], DIRECTORY_SEPARATOR . 'tests' . DIRECTORY_SEPARATOR) === false) { + $path = DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . $package . DIRECTORY_SEPARATOR; + + if (strpos($backtrace[0]['file'], $path) === false) { + return; + } + + if (strpos($backtrace[1]['file'], $path) !== false) { + return; + } + } + + if (array_key_exists($link, self::$ignoredLinks)) { + self::$ignoredLinks[$link]++; + } else { + self::$ignoredLinks[$link] = 1; + } + + if (self::$deduplication === true && self::$ignoredLinks[$link] > 1) { + return; + } + + if (isset(self::$ignoredPackages[$package])) { + return; + } + + $message = sprintf($message, ...$args); + + self::delegateTriggerToBackend($message, $backtrace, $link, $package); + } + + /** + * @param array $backtrace + */ + private static function delegateTriggerToBackend(string $message, array $backtrace, string $link, string $package): void + { + $type = self::$type ?? self::getTypeFromEnv(); + + if (($type & self::TYPE_PSR_LOGGER) > 0) { + $context = [ + 'file' => $backtrace[0]['file'], + 'line' => $backtrace[0]['line'], + 'package' => $package, + 'link' => $link, + ]; + + self::$logger->notice($message, $context); + } + + if (! (($type & self::TYPE_TRIGGER_ERROR) > 0)) { + return; + } + + $message .= sprintf( + ' (%s:%d called by %s:%d, %s, package %s)', + self::basename($backtrace[0]['file']), + $backtrace[0]['line'], + self::basename($backtrace[1]['file']), + $backtrace[1]['line'], + $link, + $package + ); + + @trigger_error($message, E_USER_DEPRECATED); + } + + /** + * A non-local-aware version of PHPs basename function. + */ + private static function basename(string $filename): string + { + $pos = strrpos($filename, DIRECTORY_SEPARATOR); + + if ($pos === false) { + return $filename; + } + + return substr($filename, $pos + 1); + } + + public static function enableTrackingDeprecations(): void + { + self::$type |= self::TYPE_TRACK_DEPRECATIONS; + } + + public static function enableWithTriggerError(): void + { + self::$type |= self::TYPE_TRIGGER_ERROR; + } + + public static function enableWithPsrLogger(LoggerInterface $logger): void + { + self::$type |= self::TYPE_PSR_LOGGER; + self::$logger = $logger; + } + + public static function withoutDeduplication(): void + { + self::$deduplication = false; + } + + public static function disable(): void + { + self::$type = self::TYPE_NONE; + self::$logger = null; + self::$deduplication = true; + + foreach (self::$ignoredLinks as $link => $count) { + self::$ignoredLinks[$link] = 0; + } + } + + public static function ignorePackage(string $packageName): void + { + self::$ignoredPackages[$packageName] = true; + } + + public static function ignoreDeprecations(string ...$links): void + { + foreach ($links as $link) { + self::$ignoredLinks[$link] = 0; + } + } + + public static function getUniqueTriggeredDeprecationsCount(): int + { + return array_reduce(self::$ignoredLinks, static function (int $carry, int $count) { + return $carry + $count; + }, 0); + } + + /** + * Returns each triggered deprecation link identifier and the amount of occurrences. + * + * @return array + */ + public static function getTriggeredDeprecations(): array + { + return self::$ignoredLinks; + } + + /** + * @return self::TYPE_* + */ + private static function getTypeFromEnv(): int + { + switch ($_SERVER['DOCTRINE_DEPRECATIONS'] ?? $_ENV['DOCTRINE_DEPRECATIONS'] ?? null) { + case 'trigger': + self::$type = self::TYPE_TRIGGER_ERROR; + break; + + case 'track': + self::$type = self::TYPE_TRACK_DEPRECATIONS; + break; + + default: + self::$type = self::TYPE_NONE; + break; + } + + return self::$type; + } +} diff --git a/vendor/doctrine/deprecations/lib/Doctrine/Deprecations/PHPUnit/VerifyDeprecations.php b/vendor/doctrine/deprecations/lib/Doctrine/Deprecations/PHPUnit/VerifyDeprecations.php new file mode 100644 index 00000000..4c3366a9 --- /dev/null +++ b/vendor/doctrine/deprecations/lib/Doctrine/Deprecations/PHPUnit/VerifyDeprecations.php @@ -0,0 +1,66 @@ + */ + private $doctrineDeprecationsExpectations = []; + + /** @var array */ + private $doctrineNoDeprecationsExpectations = []; + + public function expectDeprecationWithIdentifier(string $identifier): void + { + $this->doctrineDeprecationsExpectations[$identifier] = Deprecation::getTriggeredDeprecations()[$identifier] ?? 0; + } + + public function expectNoDeprecationWithIdentifier(string $identifier): void + { + $this->doctrineNoDeprecationsExpectations[$identifier] = Deprecation::getTriggeredDeprecations()[$identifier] ?? 0; + } + + /** + * @before + */ + public function enableDeprecationTracking(): void + { + Deprecation::enableTrackingDeprecations(); + } + + /** + * @after + */ + public function verifyDeprecationsAreTriggered(): void + { + foreach ($this->doctrineDeprecationsExpectations as $identifier => $expectation) { + $actualCount = Deprecation::getTriggeredDeprecations()[$identifier] ?? 0; + + $this->assertTrue( + $actualCount > $expectation, + sprintf( + "Expected deprecation with identifier '%s' was not triggered by code executed in test.", + $identifier + ) + ); + } + + foreach ($this->doctrineNoDeprecationsExpectations as $identifier => $expectation) { + $actualCount = Deprecation::getTriggeredDeprecations()[$identifier] ?? 0; + + $this->assertTrue( + $actualCount === $expectation, + sprintf( + "Expected deprecation with identifier '%s' was triggered by code executed in test, but expected not to.", + $identifier + ) + ); + } + } +} diff --git a/vendor/doctrine/deprecations/phpcs.xml b/vendor/doctrine/deprecations/phpcs.xml new file mode 100644 index 00000000..f115e43d --- /dev/null +++ b/vendor/doctrine/deprecations/phpcs.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + lib + tests + + + + + + diff --git a/vendor/netresearch/jsonmapper/.github/workflows/test.yml b/vendor/netresearch/jsonmapper/.github/workflows/test.yml new file mode 100644 index 00000000..76a8d654 --- /dev/null +++ b/vendor/netresearch/jsonmapper/.github/workflows/test.yml @@ -0,0 +1,46 @@ +name: JsonMapper tests +on: [push, workflow_dispatch] +jobs: + test: + runs-on: ubuntu-latest + strategy: + matrix: + php-versions: + - '7.1' + - '7.2' + - '7.3' + - '7.4' + - '8.0' + - '8.1' + - '8.2' + name: PHP ${{ matrix.php-versions }} + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Install PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php-versions }} + tools: composer + coverage: xdebug + + - name: Get composer cache directory + id: composer-cache + run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT + + - name: Cache dependencies + uses: actions/cache@v3 + with: + path: ${{ steps.composer-cache.outputs.dir }} + key: ${{ runner.os }}-composer-${{ matrix.php-versions }}-${{ hashFiles('**/composer.lock') }} + restore-keys: ${{ runner.os }}-composer-${{ matrix.php-versions }}- + + - name: Install dependencies + run: composer install --no-interaction --prefer-dist + + - name: Run unit tests + run: XDEBUG_MODE=coverage ./vendor/bin/phpunit --coverage-text + + - name: Check codestyle + run: ./vendor/bin/phpcs --standard=PEAR src/ diff --git a/vendor/netresearch/jsonmapper/src/JsonMapper.php b/vendor/netresearch/jsonmapper/src/JsonMapper.php index fdb984f0..5ae3895b 100644 --- a/vendor/netresearch/jsonmapper/src/JsonMapper.php +++ b/vendor/netresearch/jsonmapper/src/JsonMapper.php @@ -75,7 +75,7 @@ class JsonMapper public $bStrictNullTypes = true; /** - * Allow mapping of private and proteted properties. + * Allow mapping of private and protected properties. * * @var boolean */ @@ -131,8 +131,8 @@ class JsonMapper /** * Map data all data in $json into the given $object instance. * - * @param object|array $json JSON object structure from json_decode() - * @param object $object Object to map $json data into + * @param object|array $json JSON object structure from json_decode() + * @param object|class-string $object Object to map $json data into * * @return mixed Mapped object is returned. * @see mapArray() @@ -145,13 +145,18 @@ class JsonMapper . ', ' . gettype($json) . ' given.' ); } - if (!is_object($object)) { + if (!is_object($object) && (!is_string($object) || !class_exists($object))) { throw new InvalidArgumentException( - 'JsonMapper::map() requires second argument to be an object' + 'JsonMapper::map() requires second argument to ' + . 'be an object or existing class name' . ', ' . gettype($object) . ' given.' ); } + if (is_string($object)) { + $object = $this->createInstance($object); + } + $strClassName = get_class($object); $rc = new ReflectionClass($object); $strNs = $rc->getNamespaceName(); @@ -177,10 +182,15 @@ class JsonMapper . ' in object of type ' . $strClassName ); } else if ($this->undefinedPropertyHandler !== null) { - call_user_func( + $undefinedPropertyKey = call_user_func( $this->undefinedPropertyHandler, $object, $key, $jvalue ); + + if (is_string($undefinedPropertyKey)) { + list($hasProperty, $accessor, $type, $isNullable) + = $this->inspectProperty($rc, $undefinedPropertyKey); + } } else { $this->log( 'info', @@ -188,7 +198,10 @@ class JsonMapper array('property' => $key, 'class' => $strClassName) ); } - continue; + + if (!$hasProperty) { + continue; + } } if ($accessor === null) { @@ -229,7 +242,9 @@ class JsonMapper } else if ($this->isObjectOfSameType($type, $jvalue)) { $this->setProperty($object, $accessor, $jvalue); continue; - } else if ($this->isSimpleType($type)) { + } else if ($this->isSimpleType($type) + && !(is_array($jvalue) && $this->hasVariadicArrayType($accessor)) + ) { if ($type === 'string' && is_object($jvalue)) { throw new JsonMapper_Exception( 'JSON property "' . $key . '" in class "' @@ -268,8 +283,11 @@ class JsonMapper } else { $array = $this->createInstance($proptype, false, $jvalue); } + } else if (is_array($jvalue) && $this->hasVariadicArrayType($accessor)) { + $array = array(); + $subtype = $type; } else { - if (is_a($type, 'ArrayObject', true)) { + if (is_a($type, 'ArrayAccess', true)) { $array = $this->createInstance($type, false, $jvalue); } } @@ -625,6 +643,8 @@ class JsonMapper } if ($accessor instanceof ReflectionProperty) { $accessor->setValue($object, $value); + } else if (is_array($value) && $this->hasVariadicArrayType($accessor)) { + $accessor->invoke($object, ...$value); } else { //setter method $accessor->invoke($object, $value); @@ -647,6 +667,12 @@ class JsonMapper $class, $useParameter = false, $jvalue = null ) { if ($useParameter) { + if (PHP_VERSION_ID >= 80100 + && is_subclass_of($class, \BackedEnum::class) + ) { + return $class::from($jvalue); + } + return new $class($jvalue); } else { $reflectClass = new ReflectionClass($class); @@ -758,6 +784,32 @@ class JsonMapper return substr($strType, -2) === '[]'; } + /** + * Returns true if accessor is a method and has only one parameter + * which is variadic. + * + * @param ReflectionMethod|ReflectionProperty|null $accessor accessor + * to set value + * + * @return bool + */ + protected function hasVariadicArrayType($accessor) + { + if (!$accessor instanceof ReflectionMethod) { + return false; + } + + $parameters = $accessor->getParameters(); + + if (count($parameters) !== 1) { + return false; + } + + $parameter = $parameters[0]; + + return $parameter->isVariadic(); + } + /** * Checks if the given type is nullable * diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/Param.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/Param.php index de9aae7e..69f35332 100644 --- a/vendor/nikic/php-parser/lib/PhpParser/Builder/Param.php +++ b/vendor/nikic/php-parser/lib/PhpParser/Builder/Param.php @@ -19,6 +19,8 @@ class Param implements PhpParser\Builder protected $variadic = false; + protected $flags = 0; + /** @var Node\AttributeGroup[] */ protected $attributeGroups = []; @@ -95,6 +97,50 @@ class Param implements PhpParser\Builder return $this; } + /** + * Makes the (promoted) parameter public. + * + * @return $this The builder instance (for fluid interface) + */ + public function makePublic() { + $this->flags = BuilderHelpers::addModifier($this->flags, Node\Stmt\Class_::MODIFIER_PUBLIC); + + return $this; + } + + /** + * Makes the (promoted) parameter protected. + * + * @return $this The builder instance (for fluid interface) + */ + public function makeProtected() { + $this->flags = BuilderHelpers::addModifier($this->flags, Node\Stmt\Class_::MODIFIER_PROTECTED); + + return $this; + } + + /** + * Makes the (promoted) parameter private. + * + * @return $this The builder instance (for fluid interface) + */ + public function makePrivate() { + $this->flags = BuilderHelpers::addModifier($this->flags, Node\Stmt\Class_::MODIFIER_PRIVATE); + + return $this; + } + + /** + * Makes the (promoted) parameter readonly. + * + * @return $this The builder instance (for fluid interface) + */ + public function makeReadonly() { + $this->flags = BuilderHelpers::addModifier($this->flags, Node\Stmt\Class_::MODIFIER_READONLY); + + return $this; + } + /** * Adds an attribute group. * @@ -116,7 +162,7 @@ class Param implements PhpParser\Builder public function getNode() : Node { return new Node\Param( new Node\Expr\Variable($this->name), - $this->default, $this->type, $this->byRef, $this->variadic, [], 0, $this->attributeGroups + $this->default, $this->type, $this->byRef, $this->variadic, [], $this->flags, $this->attributeGroups ); } } diff --git a/vendor/phpdocumentor/type-resolver/.yamllint.yaml b/vendor/phpdocumentor/type-resolver/.yamllint.yaml deleted file mode 100644 index 55695cd5..00000000 --- a/vendor/phpdocumentor/type-resolver/.yamllint.yaml +++ /dev/null @@ -1,65 +0,0 @@ -extends: "default" - -ignore: | - .build/ - .notes/ - vendor/ -rules: - braces: - max-spaces-inside-empty: 0 - max-spaces-inside: 1 - min-spaces-inside-empty: 0 - min-spaces-inside: 1 - brackets: - max-spaces-inside-empty: 0 - max-spaces-inside: 0 - min-spaces-inside-empty: 0 - min-spaces-inside: 0 - colons: - max-spaces-after: 1 - max-spaces-before: 0 - commas: - max-spaces-after: 1 - max-spaces-before: 0 - min-spaces-after: 1 - comments: - ignore-shebangs: true - min-spaces-from-content: 1 - require-starting-space: true - comments-indentation: "enable" - document-end: - present: false - document-start: - present: false - indentation: - check-multi-line-strings: false - indent-sequences: true - spaces: 2 - empty-lines: - max-end: 0 - max-start: 0 - max: 1 - empty-values: - forbid-in-block-mappings: true - forbid-in-flow-mappings: true - hyphens: - max-spaces-after: 2 - key-duplicates: "enable" - key-ordering: "disable" - line-length: "disable" - new-line-at-end-of-file: "enable" - new-lines: - type: "unix" - octal-values: - forbid-implicit-octal: true - quoted-strings: - quote-type: "double" - trailing-spaces: "enable" - truthy: - allowed-values: - - "false" - - "true" - -yaml-files: - - "*.yaml" - - "*.yml" diff --git a/vendor/phpdocumentor/type-resolver/composer-require-checker.json b/vendor/phpdocumentor/type-resolver/composer-require-checker.json deleted file mode 100644 index 137522df..00000000 --- a/vendor/phpdocumentor/type-resolver/composer-require-checker.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "symbol-whitelist" : [ - "null", "true", "false", - "static", "self", "parent", - "array", "string", "int", "float", "bool", "iterable", "callable", "void", "object", "XSLTProcessor", - "T_NAME_QUALIFIED", "T_NAME_FULLY_QUALIFIED" - ], - "php-core-extensions" : [ - "Core", - "pcre", - "Reflection", - "tokenizer", - "SPL", - "standard" - ] -} diff --git a/vendor/phpdocumentor/type-resolver/composer.json b/vendor/phpdocumentor/type-resolver/composer.json index a7ae10f6..3138b4cc 100644 --- a/vendor/phpdocumentor/type-resolver/composer.json +++ b/vendor/phpdocumentor/type-resolver/composer.json @@ -11,7 +11,9 @@ ], "require": { "php": "^7.4 || ^8.0", - "phpdocumentor/reflection-common": "^2.0" + "phpdocumentor/reflection-common": "^2.0", + "phpstan/phpdoc-parser": "^1.13", + "doctrine/deprecations": "^1.0" }, "require-dev": { "ext-tokenizer": "*", @@ -20,7 +22,8 @@ "phpstan/phpstan-phpunit": "^1.1", "phpstan/extension-installer": "^1.1", "vimeo/psalm": "^4.25", - "rector/rector": "^0.13.9" + "rector/rector": "^0.13.9", + "phpbench/phpbench": "^1.2" }, "autoload": { "psr-4": { diff --git a/vendor/phpdocumentor/type-resolver/rector.php b/vendor/phpdocumentor/type-resolver/rector.php deleted file mode 100644 index b285d6cf..00000000 --- a/vendor/phpdocumentor/type-resolver/rector.php +++ /dev/null @@ -1,26 +0,0 @@ -paths([ - __DIR__ . '/src', - __DIR__ . '/tests/unit' - ]); - - // register a single rule - $rectorConfig->rule(InlineConstructorDefaultToPropertyRector::class); - $rectorConfig->rule(Rector\CodeQuality\Rector\Class_\CompleteDynamicPropertiesRector::class); - $rectorConfig->rule(Rector\TypeDeclaration\Rector\Closure\AddClosureReturnTypeRector::class); - $rectorConfig->rule(Rector\PHPUnit\Rector\Class_\AddProphecyTraitRector::class); - $rectorConfig->importNames(); - - // define sets of rules - $rectorConfig->sets([ - LevelSetList::UP_TO_PHP_74 - ]); -}; diff --git a/vendor/phpdocumentor/type-resolver/src/PseudoTypes/ArrayShape.php b/vendor/phpdocumentor/type-resolver/src/PseudoTypes/ArrayShape.php new file mode 100644 index 00000000..48e66f01 --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/PseudoTypes/ArrayShape.php @@ -0,0 +1,44 @@ +items = $items; + } + + public function underlyingType(): Type + { + return new Array_(new Mixed_(), new ArrayKey()); + } + + public function __toString(): string + { + return 'array{' . implode(', ', $this->items) . '}'; + } +} diff --git a/vendor/phpdocumentor/type-resolver/src/PseudoTypes/ArrayShapeItem.php b/vendor/phpdocumentor/type-resolver/src/PseudoTypes/ArrayShapeItem.php new file mode 100644 index 00000000..56ab5dce --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/PseudoTypes/ArrayShapeItem.php @@ -0,0 +1,62 @@ +key = $key; + $this->value = $value ?? new Mixed_(); + $this->optional = $optional; + } + + public function getKey(): ?string + { + return $this->key; + } + + public function getValue(): Type + { + return $this->value; + } + + public function isOptional(): bool + { + return $this->optional; + } + + public function __toString(): string + { + if ($this->key !== null) { + return sprintf( + '%s%s: %s', + $this->key, + $this->optional ? '?' : '', + (string) $this->value + ); + } + + return (string) $this->value; + } +} diff --git a/vendor/phpdocumentor/type-resolver/src/PseudoTypes/ConstExpression.php b/vendor/phpdocumentor/type-resolver/src/PseudoTypes/ConstExpression.php new file mode 100644 index 00000000..930dfdcf --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/PseudoTypes/ConstExpression.php @@ -0,0 +1,53 @@ +owner = $owner; + $this->expression = $expression; + } + + public function getOwner(): Type + { + return $this->owner; + } + + public function getExpression(): string + { + return $this->expression; + } + + public function underlyingType(): Type + { + return new Mixed_(); + } + + public function __toString(): string + { + return sprintf('%s::%s', (string) $this->owner, $this->expression); + } +} diff --git a/vendor/phpdocumentor/type-resolver/src/PseudoTypes/FloatValue.php b/vendor/phpdocumentor/type-resolver/src/PseudoTypes/FloatValue.php new file mode 100644 index 00000000..778374fe --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/PseudoTypes/FloatValue.php @@ -0,0 +1,44 @@ +value = $value; + } + + public function getValue(): float + { + return $this->value; + } + + public function underlyingType(): Type + { + return new Float_(); + } + + public function __toString(): string + { + return (string) $this->value; + } +} diff --git a/vendor/phpdocumentor/type-resolver/src/PseudoTypes/IntegerValue.php b/vendor/phpdocumentor/type-resolver/src/PseudoTypes/IntegerValue.php new file mode 100644 index 00000000..e2f34633 --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/PseudoTypes/IntegerValue.php @@ -0,0 +1,44 @@ +value = $value; + } + + public function getValue(): int + { + return $this->value; + } + + public function underlyingType(): Type + { + return new Integer(); + } + + public function __toString(): string + { + return (string) $this->value; + } +} diff --git a/vendor/phpdocumentor/type-resolver/src/PseudoTypes/NonEmptyList.php b/vendor/phpdocumentor/type-resolver/src/PseudoTypes/NonEmptyList.php new file mode 100644 index 00000000..dd6a6531 --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/PseudoTypes/NonEmptyList.php @@ -0,0 +1,50 @@ +valueType instanceof Mixed_) { + return 'non-empty-list'; + } + + return 'non-empty-list<' . $this->valueType . '>'; + } +} diff --git a/vendor/phpdocumentor/type-resolver/src/PseudoTypes/StringValue.php b/vendor/phpdocumentor/type-resolver/src/PseudoTypes/StringValue.php new file mode 100644 index 00000000..10b1f516 --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/PseudoTypes/StringValue.php @@ -0,0 +1,46 @@ +value = $value; + } + + public function getValue(): string + { + return $this->value; + } + + public function underlyingType(): Type + { + return new String_(); + } + + public function __toString(): string + { + return sprintf('"%s"', $this->value); + } +} diff --git a/vendor/phpdocumentor/type-resolver/src/TypeResolver.php b/vendor/phpdocumentor/type-resolver/src/TypeResolver.php index e5695b8e..58af0ace 100644 --- a/vendor/phpdocumentor/type-resolver/src/TypeResolver.php +++ b/vendor/phpdocumentor/type-resolver/src/TypeResolver.php @@ -13,27 +13,36 @@ declare(strict_types=1); namespace phpDocumentor\Reflection; -use ArrayIterator; +use Doctrine\Deprecations\Deprecation; use InvalidArgumentException; +use phpDocumentor\Reflection\PseudoTypes\ArrayShape; +use phpDocumentor\Reflection\PseudoTypes\ArrayShapeItem; use phpDocumentor\Reflection\PseudoTypes\CallableString; +use phpDocumentor\Reflection\PseudoTypes\ConstExpression; use phpDocumentor\Reflection\PseudoTypes\False_; +use phpDocumentor\Reflection\PseudoTypes\FloatValue; use phpDocumentor\Reflection\PseudoTypes\HtmlEscapedString; use phpDocumentor\Reflection\PseudoTypes\IntegerRange; +use phpDocumentor\Reflection\PseudoTypes\IntegerValue; use phpDocumentor\Reflection\PseudoTypes\List_; use phpDocumentor\Reflection\PseudoTypes\LiteralString; use phpDocumentor\Reflection\PseudoTypes\LowercaseString; use phpDocumentor\Reflection\PseudoTypes\NegativeInteger; +use phpDocumentor\Reflection\PseudoTypes\NonEmptyList; use phpDocumentor\Reflection\PseudoTypes\NonEmptyLowercaseString; use phpDocumentor\Reflection\PseudoTypes\NonEmptyString; use phpDocumentor\Reflection\PseudoTypes\Numeric_; use phpDocumentor\Reflection\PseudoTypes\NumericString; use phpDocumentor\Reflection\PseudoTypes\PositiveInteger; +use phpDocumentor\Reflection\PseudoTypes\StringValue; use phpDocumentor\Reflection\PseudoTypes\TraitString; use phpDocumentor\Reflection\PseudoTypes\True_; +use phpDocumentor\Reflection\Types\AggregatedType; use phpDocumentor\Reflection\Types\Array_; use phpDocumentor\Reflection\Types\ArrayKey; use phpDocumentor\Reflection\Types\Boolean; use phpDocumentor\Reflection\Types\Callable_; +use phpDocumentor\Reflection\Types\CallableParameter; use phpDocumentor\Reflection\Types\ClassString; use phpDocumentor\Reflection\Types\Collection; use phpDocumentor\Reflection\Types\Compound; @@ -57,46 +66,51 @@ use phpDocumentor\Reflection\Types\Static_; use phpDocumentor\Reflection\Types\String_; use phpDocumentor\Reflection\Types\This; use phpDocumentor\Reflection\Types\Void_; +use PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprFloatNode; +use PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprIntegerNode; +use PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprStringNode; +use PHPStan\PhpDocParser\Ast\ConstExpr\ConstFetchNode; +use PHPStan\PhpDocParser\Ast\Type\ArrayShapeItemNode; +use PHPStan\PhpDocParser\Ast\Type\ArrayShapeNode; +use PHPStan\PhpDocParser\Ast\Type\ArrayTypeNode; +use PHPStan\PhpDocParser\Ast\Type\CallableTypeNode; +use PHPStan\PhpDocParser\Ast\Type\CallableTypeParameterNode; +use PHPStan\PhpDocParser\Ast\Type\ConditionalTypeForParameterNode; +use PHPStan\PhpDocParser\Ast\Type\ConditionalTypeNode; +use PHPStan\PhpDocParser\Ast\Type\ConstTypeNode; +use PHPStan\PhpDocParser\Ast\Type\GenericTypeNode; +use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; +use PHPStan\PhpDocParser\Ast\Type\IntersectionTypeNode; +use PHPStan\PhpDocParser\Ast\Type\NullableTypeNode; +use PHPStan\PhpDocParser\Ast\Type\OffsetAccessTypeNode; +use PHPStan\PhpDocParser\Ast\Type\ThisTypeNode; +use PHPStan\PhpDocParser\Ast\Type\TypeNode; +use PHPStan\PhpDocParser\Ast\Type\UnionTypeNode; +use PHPStan\PhpDocParser\Lexer\Lexer; +use PHPStan\PhpDocParser\Parser\ConstExprParser; +use PHPStan\PhpDocParser\Parser\ParserException; +use PHPStan\PhpDocParser\Parser\TokenIterator; +use PHPStan\PhpDocParser\Parser\TypeParser; use RuntimeException; +use function array_filter; use function array_key_exists; -use function array_key_last; -use function array_pop; -use function array_values; +use function array_map; +use function array_reverse; use function class_exists; use function class_implements; -use function count; -use function current; +use function get_class; use function in_array; -use function is_numeric; -use function preg_split; +use function sprintf; use function strpos; use function strtolower; use function trim; -use const PREG_SPLIT_DELIM_CAPTURE; -use const PREG_SPLIT_NO_EMPTY; - final class TypeResolver { - /** @var string Definition of the ARRAY operator for types */ - private const OPERATOR_ARRAY = '[]'; - /** @var string Definition of the NAMESPACE operator in PHP */ private const OPERATOR_NAMESPACE = '\\'; - /** @var int the iterator parser is inside a compound context */ - private const PARSER_IN_COMPOUND = 0; - - /** @var int the iterator parser is inside a nullable expression context */ - private const PARSER_IN_NULLABLE = 1; - - /** @var int the iterator parser is inside an array expression context */ - private const PARSER_IN_ARRAY_EXPRESSION = 2; - - /** @var int the iterator parser is inside a collection expression context */ - private const PARSER_IN_COLLECTION_EXPRESSION = 3; - /** * @var array List of recognized keywords and unto which Value Object they map * @psalm-var array> @@ -142,10 +156,15 @@ final class TypeResolver 'iterable' => Iterable_::class, 'never' => Never_::class, 'list' => List_::class, + 'non-empty-list' => NonEmptyList::class, ]; /** @psalm-readonly */ private FqsenResolver $fqsenResolver; + /** @psalm-readonly */ + private TypeParser $typeParser; + /** @psalm-readonly */ + private Lexer $lexer; /** * Initializes this TypeResolver with the means to create and resolve Fqsen objects. @@ -153,6 +172,8 @@ final class TypeResolver public function __construct(?FqsenResolver $fqsenResolver = null) { $this->fqsenResolver = $fqsenResolver ?: new FqsenResolver(); + $this->typeParser = new TypeParser(new ConstExprParser()); + $this->lexer = new Lexer(); } /** @@ -165,9 +186,9 @@ final class TypeResolver * This method only works as expected if the namespace and aliases are set; * no dynamic reflection is being performed here. * + * @uses Context::getNamespace() to determine with what to prefix the type name. * @uses Context::getNamespaceAliases() to check whether the first part of the relative type name should not be * replaced with another namespace. - * @uses Context::getNamespace() to determine with what to prefix the type name. * * @param string $type The relative or absolute type. */ @@ -182,178 +203,219 @@ final class TypeResolver $context = new Context(''); } - // split the type string into tokens `|`, `?`, `<`, `>`, `,`, `(`, `)`, `[]`, '<', '>' and type names - $tokens = preg_split( - '/(\\||\\?|<|>|&|, ?|\\(|\\)|\\[\\]+)/', - $type, - -1, - PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE - ); + $tokens = $this->lexer->tokenize($type); + $tokenIterator = new TokenIterator($tokens); - if ($tokens === false) { - throw new InvalidArgumentException('Unable to split the type string "' . $type . '" into tokens'); - } + $ast = $this->parse($tokenIterator); + $type = $this->createType($ast, $context); - /** @var ArrayIterator $tokenIterator */ - $tokenIterator = new ArrayIterator($tokens); - - return $this->parseTypes($tokenIterator, $context, self::PARSER_IN_COMPOUND); + return $this->tryParseRemainingCompoundTypes($tokenIterator, $context, $type); } - /** - * Analyse each tokens and creates types - * - * @param ArrayIterator $tokens the iterator on tokens - * @param int $parserContext on of self::PARSER_* constants, indicating - * the context where we are in the parsing - */ - private function parseTypes(ArrayIterator $tokens, Context $context, int $parserContext): Type + public function createType(?TypeNode $type, Context $context): Type { - $types = []; - $token = ''; - $compoundToken = '|'; - while ($tokens->valid()) { - $token = $tokens->current(); - if ($token === null) { - throw new RuntimeException( - 'Unexpected nullable character' - ); - } + if ($type === null) { + return new Mixed_(); + } - if ($token === '|' || $token === '&') { - if (count($types) === 0) { + switch (get_class($type)) { + case ArrayTypeNode::class: + return new Array_( + $this->createType($type->type, $context) + ); + + case ArrayShapeNode::class: + return new ArrayShape( + ...array_map( + fn (ArrayShapeItemNode $item) => new ArrayShapeItem( + (string) $item->keyName, + $this->createType($item->valueType, $context), + $item->optional + ), + $type->items + ) + ); + + case CallableTypeNode::class: + return $this->createFromCallable($type, $context); + + case ConstTypeNode::class: + return $this->createFromConst($type, $context); + + case GenericTypeNode::class: + return $this->createFromGeneric($type, $context); + + case IdentifierTypeNode::class: + return $this->resolveSingleType($type->name, $context); + + case IntersectionTypeNode::class: + return new Intersection( + array_filter( + array_map( + function (TypeNode $nestedType) use ($context) { + $type = $this->createType($nestedType, $context); + if ($type instanceof AggregatedType) { + return new Expression($type); + } + + return $type; + }, + $type->types + ) + ) + ); + + case NullableTypeNode::class: + $nestedType = $this->createType($type->type, $context); + + return new Nullable($nestedType); + + case UnionTypeNode::class: + return new Compound( + array_filter( + array_map( + function (TypeNode $nestedType) use ($context) { + $type = $this->createType($nestedType, $context); + if ($type instanceof AggregatedType) { + return new Expression($type); + } + + return $type; + }, + $type->types + ) + ) + ); + + case ThisTypeNode::class: + return new This(); + + case ConditionalTypeNode::class: + case ConditionalTypeForParameterNode::class: + case OffsetAccessTypeNode::class: + default: + return new Mixed_(); + } + } + + private function createFromGeneric(GenericTypeNode $type, Context $context): Type + { + switch (strtolower($type->type->name)) { + case 'array': + return $this->createArray($type->genericTypes, $context); + + case 'class-string': + $subType = $this->createType($type->genericTypes[0], $context); + if (!$subType instanceof Object_ || $subType->getFqsen() === null) { throw new RuntimeException( - 'A type is missing before a type separator' + $subType . ' is not a class string' ); } - if ( - !in_array($parserContext, [ - self::PARSER_IN_COMPOUND, - self::PARSER_IN_ARRAY_EXPRESSION, - self::PARSER_IN_COLLECTION_EXPRESSION, - self::PARSER_IN_NULLABLE, - ], true) - ) { + return new ClassString( + $subType->getFqsen() + ); + + case 'interface-string': + $subType = $this->createType($type->genericTypes[0], $context); + if (!$subType instanceof Object_ || $subType->getFqsen() === null) { throw new RuntimeException( - 'Unexpected type separator' + $subType . ' is not a class string' ); } - $compoundToken = $token; - $tokens->next(); - } elseif ($token === '?') { - if ( - !in_array($parserContext, [ - self::PARSER_IN_COMPOUND, - self::PARSER_IN_ARRAY_EXPRESSION, - self::PARSER_IN_COLLECTION_EXPRESSION, - self::PARSER_IN_NULLABLE, - ], true) - ) { - throw new RuntimeException( - 'Unexpected nullable character' + return new InterfaceString( + $subType->getFqsen() + ); + + case 'list': + return new List_( + $this->createType($type->genericTypes[0], $context) + ); + + case 'non-empty-list': + return new NonEmptyList( + $this->createType($type->genericTypes[0], $context) + ); + + case 'int': + if (isset($type->genericTypes[1]) === false) { + throw new RuntimeException('int has not the correct format'); + } + + return new IntegerRange( + (string) $type->genericTypes[0], + (string) $type->genericTypes[1], + ); + + case 'iterable': + return new Iterable_( + ...array_reverse( + array_map( + fn (TypeNode $genericType) => $this->createType($genericType, $context), + $type->genericTypes + ) + ) + ); + + default: + $collectionType = $this->createType($type->type, $context); + if ($collectionType instanceof Object_ === false) { + throw new RuntimeException(sprintf('%s is not a collection', (string) $collectionType)); + } + + return new Collection( + $collectionType->getFqsen(), + ...array_reverse( + array_map( + fn (TypeNode $genericType) => $this->createType($genericType, $context), + $type->genericTypes + ) + ) + ); + } + } + + private function createFromCallable(CallableTypeNode $type, Context $context): Callable_ + { + return new Callable_( + array_map( + function (CallableTypeParameterNode $param) use ($context) { + return new CallableParameter( + $this->createType($param->type, $context), + $param->parameterName !== '' ? trim($param->parameterName, '$') : null, + $param->isReference, + $param->isVariadic, + $param->isOptional ); - } + }, + $type->parameters + ), + $this->createType($type->returnType, $context), + ); + } - $tokens->next(); - $type = $this->parseTypes($tokens, $context, self::PARSER_IN_NULLABLE); - $types[] = new Nullable($type); - } elseif ($token === '(') { - $tokens->next(); - $type = $this->parseTypes($tokens, $context, self::PARSER_IN_ARRAY_EXPRESSION); + private function createFromConst(ConstTypeNode $type, Context $context): Type + { + switch (true) { + case $type->constExpr instanceof ConstExprIntegerNode: + return new IntegerValue((int) $type->constExpr->value); - $token = $tokens->current(); - if ($token === null) { // Someone did not properly close their array expression .. - break; - } + case $type->constExpr instanceof ConstExprFloatNode: + return new FloatValue((float) $type->constExpr->value); - $tokens->next(); + case $type->constExpr instanceof ConstExprStringNode: + return new StringValue($type->constExpr->value); - $resolvedType = new Expression($type); - - $types[] = $resolvedType; - } elseif ($parserContext === self::PARSER_IN_ARRAY_EXPRESSION && isset($token[0]) && $token[0] === ')') { - break; - } elseif ($token === '<') { - if (count($types) === 0) { - throw new RuntimeException( - 'Unexpected collection operator "<", class name is missing' - ); - } - - $classType = array_pop($types); - if ($classType !== null) { - if ((string) $classType === 'class-string') { - $types[] = $this->resolveClassString($tokens, $context); - } elseif ((string) $classType === 'int') { - $types[] = $this->resolveIntRange($tokens); - } elseif ((string) $classType === 'interface-string') { - $types[] = $this->resolveInterfaceString($tokens, $context); - } else { - $types[] = $this->resolveCollection($tokens, $classType, $context); - } - } - - $tokens->next(); - } elseif ( - $parserContext === self::PARSER_IN_COLLECTION_EXPRESSION - && ($token === '>' || trim($token) === ',') - ) { - break; - } elseif ($token === self::OPERATOR_ARRAY) { - $last = array_key_last($types); - if ($last === null) { - throw new InvalidArgumentException('Unexpected array operator'); - } - - $lastItem = $types[$last]; - if ($lastItem instanceof Expression) { - $lastItem = $lastItem->getValueType(); - } - - $types[$last] = new Array_($lastItem); - - $tokens->next(); - } else { - $types[] = $this->resolveSingleType($token, $context); - $tokens->next(); - } - } - - if ($token === '|' || $token === '&') { - throw new RuntimeException( - 'A type is missing after a type separator' - ); - } - - if (count($types) === 0) { - if ($parserContext === self::PARSER_IN_NULLABLE) { - throw new RuntimeException( - 'A type is missing after a nullable character' + case $type->constExpr instanceof ConstFetchNode: + return new ConstExpression( + $this->resolve($type->constExpr->className, $context), + $type->constExpr->name ); - } - if ($parserContext === self::PARSER_IN_ARRAY_EXPRESSION) { - throw new RuntimeException( - 'A type is missing in an array expression' - ); - } - - if ($parserContext === self::PARSER_IN_COLLECTION_EXPRESSION) { - throw new RuntimeException( - 'A type is missing in a collection expression' - ); - } - } elseif (count($types) === 1) { - return current($types); + default: + throw new RuntimeException(sprintf('Unsupported constant type %s', get_class($type))); } - - if ($compoundToken === '|') { - return new Compound(array_values($types)); - } - - return new Intersection(array_values($types)); } /** @@ -475,244 +537,87 @@ final class TypeResolver return new Object_($this->fqsenResolver->resolve($type, $context)); } - /** - * Resolves class string - * - * @param ArrayIterator $tokens - */ - private function resolveClassString(ArrayIterator $tokens, Context $context): Type + /** @param TypeNode[] $typeNodes */ + private function createArray(array $typeNodes, Context $context): Array_ { - $tokens->next(); + $types = array_reverse( + array_map( + fn (TypeNode $node) => $this->createType($node, $context), + $typeNodes + ) + ); - $classType = $this->parseTypes($tokens, $context, self::PARSER_IN_COLLECTION_EXPRESSION); - - if (!$classType instanceof Object_ || $classType->getFqsen() === null) { - throw new RuntimeException( - $classType . ' is not a class string' - ); + if (isset($types[1]) === false) { + return new Array_(...$types); } - $token = $tokens->current(); - if ($token !== '>') { - if (empty($token)) { - throw new RuntimeException( - 'class-string: ">" is missing' - ); + if ($this->validArrayKeyType($types[1]) || $types[1] instanceof ArrayKey) { + return new Array_(...$types); + } + + if ($types[1] instanceof Compound && $types[1]->getIterator()->count() === 2) { + if ($this->validArrayKeyType($types[1]->get(0)) && $this->validArrayKeyType($types[1]->get(1))) { + return new Array_(...$types); } - - throw new RuntimeException( - 'Unexpected character "' . $token . '", ">" is missing' - ); } - return new ClassString($classType->getFqsen()); + throw new RuntimeException('An array can have only integers or strings as keys'); + } + + private function validArrayKeyType(?Type $type): bool + { + return $type instanceof String_ || $type instanceof Integer; + } + + private function parse(TokenIterator $tokenIterator): TypeNode + { + try { + $ast = $this->typeParser->parse($tokenIterator); + } catch (ParserException $e) { + throw new RuntimeException($e->getMessage(), 0, $e); + } + + return $ast; } /** - * Resolves integer ranges + * Will try to parse unsupported type notations by phpstan * - * @param ArrayIterator $tokens + * The phpstan parser doesn't support the illegal nullable combinations like this library does. + * This method will warn the user about those notations but for bc purposes we will still have it here. */ - private function resolveIntRange(ArrayIterator $tokens): Type + private function tryParseRemainingCompoundTypes(TokenIterator $tokenIterator, Context $context, Type $type): Type { - $tokens->next(); - - $token = ''; - $minValue = null; - $maxValue = null; - $commaFound = false; - $tokenCounter = 0; - while ($tokens->valid()) { - $tokenCounter++; - $token = $tokens->current(); - if ($token === null) { - throw new RuntimeException( - 'Unexpected nullable character' - ); - } - - $token = trim($token); - - if ($token === '>') { - break; - } - - if ($token === ',') { - $commaFound = true; - } - - if ($commaFound === false && $minValue === null) { - if (is_numeric($token) || $token === 'max' || $token === 'min') { - $minValue = $token; - } - } - - if ($commaFound === true && $maxValue === null) { - if (is_numeric($token) || $token === 'max' || $token === 'min') { - $maxValue = $token; - } - } - - $tokens->next(); - } - - if ($token !== '>') { - if (empty($token)) { - throw new RuntimeException( - 'interface-string: ">" is missing' - ); - } - - throw new RuntimeException( - 'Unexpected character "' . $token . '", ">" is missing' - ); - } - - if ($minValue === null || $maxValue === null || $tokenCounter > 4) { - throw new RuntimeException( - 'int has not the correct format' - ); - } - - return new IntegerRange($minValue, $maxValue); - } - - /** - * Resolves class string - * - * @param ArrayIterator $tokens - */ - private function resolveInterfaceString(ArrayIterator $tokens, Context $context): Type - { - $tokens->next(); - - $classType = $this->parseTypes($tokens, $context, self::PARSER_IN_COLLECTION_EXPRESSION); - - if (!$classType instanceof Object_ || $classType->getFqsen() === null) { - throw new RuntimeException( - $classType . ' is not a interface string' - ); - } - - $token = $tokens->current(); - if ($token !== '>') { - if (empty($token)) { - throw new RuntimeException( - 'interface-string: ">" is missing' - ); - } - - throw new RuntimeException( - 'Unexpected character "' . $token . '", ">" is missing' - ); - } - - return new InterfaceString($classType->getFqsen()); - } - - /** - * Resolves the collection values and keys - * - * @param ArrayIterator $tokens - * - * @return Array_|Iterable_|Collection - */ - private function resolveCollection(ArrayIterator $tokens, Type $classType, Context $context): Type - { - $isArray = ((string) $classType === 'array'); - $isIterable = ((string) $classType === 'iterable'); - $isList = ((string) $classType === 'list'); - - // allow only "array", "iterable" or class name before "<" if ( - !$isArray && !$isIterable && !$isList - && (!$classType instanceof Object_ || $classType->getFqsen() === null) + $tokenIterator->isCurrentTokenType(Lexer::TOKEN_UNION) || + $tokenIterator->isCurrentTokenType(Lexer::TOKEN_INTERSECTION) ) { - throw new RuntimeException( - $classType . ' is not a collection' + Deprecation::trigger( + 'phpdocumentor/type-resolver', + 'https://github.com/phpDocumentor/TypeResolver/issues/184', + 'Legacy nullable type detected, please update your code as + you are using nullable types in a docblock. support will be removed in v2.0.0', ); } - $tokens->next(); - - $valueType = $this->parseTypes($tokens, $context, self::PARSER_IN_COLLECTION_EXPRESSION); - $keyType = null; - - $token = $tokens->current(); - if ($token !== null && trim($token) === ',' && !$isList) { - // if we have a comma, then we just parsed the key type, not the value type - $keyType = $valueType; - if ($isArray) { - // check the key type for an "array" collection. We allow only - // strings or integers. - if ( - !$keyType instanceof ArrayKey && - !$keyType instanceof String_ && - !$keyType instanceof Integer && - !$keyType instanceof Compound - ) { - throw new RuntimeException( - 'An array can have only integers or strings as keys' - ); - } - - if ($keyType instanceof Compound) { - foreach ($keyType->getIterator() as $item) { - if ( - !$item instanceof ArrayKey && - !$item instanceof String_ && - !$item instanceof Integer - ) { - throw new RuntimeException( - 'An array can have only integers or strings as keys' - ); - } - } - } + $continue = true; + while ($continue) { + $continue = false; + while ($tokenIterator->tryConsumeTokenType(Lexer::TOKEN_UNION)) { + $ast = $this->parse($tokenIterator); + $type2 = $this->createType($ast, $context); + $type = new Compound([$type, $type2]); + $continue = true; } - $tokens->next(); - // now let's parse the value type - $valueType = $this->parseTypes($tokens, $context, self::PARSER_IN_COLLECTION_EXPRESSION); - } - - $token = $tokens->current(); - if ($token !== '>') { - if (empty($token)) { - throw new RuntimeException( - 'Collection: ">" is missing' - ); + while ($tokenIterator->tryConsumeTokenType(Lexer::TOKEN_INTERSECTION)) { + $ast = $this->typeParser->parse($tokenIterator); + $type2 = $this->createType($ast, $context); + $type = new Intersection([$type, $type2]); + $continue = true; } - - throw new RuntimeException( - 'Unexpected character "' . $token . '", ">" is missing' - ); } - if ($isArray) { - return new Array_($valueType, $keyType); - } - - if ($isIterable) { - return new Iterable_($valueType, $keyType); - } - - if ($isList) { - return new List_($valueType); - } - - if ($classType instanceof Object_) { - return $this->makeCollectionFromObject($classType, $valueType, $keyType); - } - - throw new RuntimeException('Invalid $classType provided'); - } - - /** - * @psalm-pure - */ - private function makeCollectionFromObject(Object_ $object, Type $valueType, ?Type $keyType = null): Collection - { - return new Collection($object->getFqsen(), $valueType, $keyType); + return $type; } } diff --git a/vendor/phpdocumentor/type-resolver/src/Types/AggregatedType.php b/vendor/phpdocumentor/type-resolver/src/Types/AggregatedType.php index 257ed516..6f9e8795 100644 --- a/vendor/phpdocumentor/type-resolver/src/Types/AggregatedType.php +++ b/vendor/phpdocumentor/type-resolver/src/Types/AggregatedType.php @@ -106,7 +106,7 @@ abstract class AggregatedType implements Type, IteratorAggregate */ private function add(Type $type): void { - if ($type instanceof self) { + if ($type instanceof static) { foreach ($type->getIterator() as $subType) { $this->add($subType); } diff --git a/vendor/phpdocumentor/type-resolver/src/Types/CallableParameter.php b/vendor/phpdocumentor/type-resolver/src/Types/CallableParameter.php new file mode 100644 index 00000000..1a36d239 --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/Types/CallableParameter.php @@ -0,0 +1,72 @@ +type = $type; + $this->isReference = $isReference; + $this->isVariadic = $isVariadic; + $this->isOptional = $isOptional; + $this->name = $name; + } + + public function getName(): ?string + { + return $this->name; + } + + public function getType(): Type + { + return $this->type; + } + + public function isReference(): bool + { + return $this->isReference; + } + + public function isVariadic(): bool + { + return $this->isVariadic; + } + + public function isOptional(): bool + { + return $this->isOptional; + } +} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Callable_.php b/vendor/phpdocumentor/type-resolver/src/Types/Callable_.php index 4e67aa4a..20c57267 100644 --- a/vendor/phpdocumentor/type-resolver/src/Types/Callable_.php +++ b/vendor/phpdocumentor/type-resolver/src/Types/Callable_.php @@ -22,6 +22,30 @@ use phpDocumentor\Reflection\Type; */ final class Callable_ implements Type { + private ?Type $returnType; + /** @var CallableParameter[] */ + private array $parameters; + + /** + * @param CallableParameter[] $parameters + */ + public function __construct(array $parameters = [], ?Type $returnType = null) + { + $this->parameters = $parameters; + $this->returnType = $returnType; + } + + /** @return CallableParameter[] */ + public function getParameters(): array + { + return $this->parameters; + } + + public function getReturnType(): ?Type + { + return $this->returnType; + } + /** * Returns a rendered output of the Type as it would be used in a DocBlock. */ diff --git a/vendor/phpstan/phpdoc-parser/LICENSE b/vendor/phpstan/phpdoc-parser/LICENSE new file mode 100644 index 00000000..98a854e4 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2016 Ondřej Mirtes + +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. \ No newline at end of file diff --git a/vendor/phpstan/phpdoc-parser/README.md b/vendor/phpstan/phpdoc-parser/README.md new file mode 100644 index 00000000..67312fd9 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/README.md @@ -0,0 +1,119 @@ +

PHPDoc Parser for PHPStan

+ +

+ Build Status + Latest Stable Version + License + PHPStan Enabled +

+ +This library `phpstan/phpdoc-parser` represents PHPDocs with an AST (Abstract Syntax Tree). It supports parsing and modifying PHPDocs. + +For the complete list of supported PHPDoc features check out PHPStan documentation. PHPStan is the main (but not the only) user of this library. + +* [PHPDoc Basics](https://phpstan.org/writing-php-code/phpdocs-basics) (list of PHPDoc tags) +* [PHPDoc Types](https://phpstan.org/writing-php-code/phpdoc-types) (list of PHPDoc types) +* [phpdoc-parser API Reference](https://phpstan.github.io/phpdoc-parser/namespace-PHPStan.PhpDocParser.html) with all the AST node types etc. + +## Installation + +``` +composer require phpstan/phpdoc-parser +``` + +## Basic usage + +```php +tokenize('/** @param Lorem $a */')); +$phpDocNode = $phpDocParser->parse($tokens); // PhpDocNode +$paramTags = $phpDocNode->getParamTagValues(); // ParamTagValueNode[] +echo $paramTags[0]->parameterName; // '$a' +echo $paramTags[0]->type; // IdentifierTypeNode - 'Lorem' +``` + +### Format-preserving printer + +This component can be used to modify the AST +and print it again as close as possible to the original. + +It's heavily inspired by format-preserving printer component in [nikic/PHP-Parser](https://github.com/nikic/PHP-Parser). + +```php + true, 'indexes' => true]; + +$lexer = new Lexer(); +$constExprParser = new ConstExprParser(true, true, $usedAttributes); +$typeParser = new TypeParser($constExprParser, true, $usedAttributes); +$phpDocParser = new PhpDocParser($typeParser, $constExprParser, true, true, $usedAttributes); + +$tokens = new TokenIterator($lexer->tokenize('/** @param Lorem $a */')); +$phpDocNode = $phpDocParser->parse($tokens); // PhpDocNode + +$cloningTraverser = new NodeTraverser([new CloningVisitor()]); + +/** @var PhpDocNode $newPhpDocNode */ +[$newPhpDocNode] = $cloningTraverser->traverse([$phpDocNode]); + +// change something in $newPhpDocNode +$newPhpDocNode->getParamTagValues()[0]->type = new IdentifierTypeNode('Ipsum'); + +// print changed PHPDoc +$printer = new Printer(); +$newPhpDoc = $printer->printFormatPreserving($newPhpDocNode, $phpDocNode, $tokens); +echo $newPhpDoc; // '/** @param Ipsum $a */' +``` + +## Code of Conduct + +This project adheres to a [Contributor Code of Conduct](CODE_OF_CONDUCT.md). By participating in this project and its community, you are expected to uphold this code. + +## Building + +Initially you need to run `composer install`, or `composer update` in case you aren't working in a folder which was built before. + +Afterwards you can either run the whole build including linting and coding standards using + + make + +or run only tests using + + make tests diff --git a/vendor/phpstan/phpdoc-parser/composer.json b/vendor/phpstan/phpdoc-parser/composer.json new file mode 100644 index 00000000..30b879b7 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/composer.json @@ -0,0 +1,43 @@ +{ + "name": "phpstan/phpdoc-parser", + "description": "PHPDoc parser with support for nullable, intersection and generic types", + "license": "MIT", + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "nikic/php-parser": "^4.15", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.5", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.0", + "phpunit/phpunit": "^9.5", + "symfony/process": "^5.2" + }, + "config": { + "platform": { + "php": "7.4.6" + }, + "sort-packages": true, + "allow-plugins": { + "phpstan/extension-installer": true + } + }, + "autoload": { + "psr-4": { + "PHPStan\\PhpDocParser\\": [ + "src/" + ] + } + }, + "autoload-dev": { + "psr-4": { + "PHPStan\\PhpDocParser\\": [ + "tests/PHPStan" + ] + } + }, + "minimum-stability": "dev", + "prefer-stable": true +} diff --git a/vendor/phpstan/phpdoc-parser/phpstan-baseline.neon b/vendor/phpstan/phpdoc-parser/phpstan-baseline.neon new file mode 100644 index 00000000..04100fcd --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/phpstan-baseline.neon @@ -0,0 +1,31 @@ +parameters: + ignoreErrors: + - + message: "#^Method PHPStan\\\\PhpDocParser\\\\Ast\\\\ConstExpr\\\\QuoteAwareConstExprStringNode\\:\\:escapeDoubleQuotedString\\(\\) should return string but returns string\\|null\\.$#" + count: 1 + path: src/Ast/ConstExpr/QuoteAwareConstExprStringNode.php + + - + message: "#^Cannot use array destructuring on array\\\\|int\\|string\\>\\|null\\.$#" + count: 1 + path: src/Ast/NodeTraverser.php + + - + message: "#^Strict comparison using \\=\\=\\= between 2 and 2 will always evaluate to true\\.$#" + count: 2 + path: src/Ast/NodeTraverser.php + + - + message: "#^Variable property access on PHPStan\\\\PhpDocParser\\\\Ast\\\\Node\\.$#" + count: 1 + path: src/Ast/NodeTraverser.php + + - + message: "#^Method PHPStan\\\\PhpDocParser\\\\Parser\\\\StringUnescaper\\:\\:parseEscapeSequences\\(\\) should return string but returns string\\|null\\.$#" + count: 1 + path: src/Parser/StringUnescaper.php + + - + message: "#^Variable property access on PHPStan\\\\PhpDocParser\\\\Ast\\\\Node\\.$#" + count: 2 + path: src/Printer/Printer.php diff --git a/vendor/phpstan/phpdoc-parser/src/Ast/AbstractNodeVisitor.php b/vendor/phpstan/phpdoc-parser/src/Ast/AbstractNodeVisitor.php new file mode 100644 index 00000000..2b9c10ec --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/AbstractNodeVisitor.php @@ -0,0 +1,34 @@ +key = $key; + $this->value = $value; + } + + + public function __toString(): string + { + if ($this->key !== null) { + return sprintf('%s => %s', $this->key, $this->value); + + } + + return (string) $this->value; + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprArrayNode.php b/vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprArrayNode.php new file mode 100644 index 00000000..1f9def37 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprArrayNode.php @@ -0,0 +1,30 @@ +items = $items; + } + + + public function __toString(): string + { + return '[' . implode(', ', $this->items) . ']'; + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprFalseNode.php b/vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprFalseNode.php new file mode 100644 index 00000000..e6811277 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprFalseNode.php @@ -0,0 +1,17 @@ +value = $value; + } + + + public function __toString(): string + { + return $this->value; + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprIntegerNode.php b/vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprIntegerNode.php new file mode 100644 index 00000000..5339bb5a --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprIntegerNode.php @@ -0,0 +1,26 @@ +value = $value; + } + + + public function __toString(): string + { + return $this->value; + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprNode.php b/vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprNode.php new file mode 100644 index 00000000..1859f03e --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprNode.php @@ -0,0 +1,10 @@ +value = $value; + } + + + public function __toString(): string + { + return $this->value; + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprTrueNode.php b/vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprTrueNode.php new file mode 100644 index 00000000..ec980320 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprTrueNode.php @@ -0,0 +1,17 @@ +className = $className; + $this->name = $name; + } + + + public function __toString(): string + { + if ($this->className === '') { + return $this->name; + + } + + return "{$this->className}::{$this->name}"; + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/QuoteAwareConstExprStringNode.php b/vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/QuoteAwareConstExprStringNode.php new file mode 100644 index 00000000..f2792b1b --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/QuoteAwareConstExprStringNode.php @@ -0,0 +1,78 @@ +quoteType = $quoteType; + } + + + public function __toString(): string + { + if ($this->quoteType === self::SINGLE_QUOTED) { + // from https://github.com/nikic/PHP-Parser/blob/0ffddce52d816f72d0efc4d9b02e276d3309ef01/lib/PhpParser/PrettyPrinter/Standard.php#L1007 + return sprintf("'%s'", addcslashes($this->value, '\'\\')); + } + + // from https://github.com/nikic/PHP-Parser/blob/0ffddce52d816f72d0efc4d9b02e276d3309ef01/lib/PhpParser/PrettyPrinter/Standard.php#L1010-L1040 + return sprintf('"%s"', $this->escapeDoubleQuotedString()); + } + + private function escapeDoubleQuotedString(): string + { + $quote = '"'; + $escaped = addcslashes($this->value, "\n\r\t\f\v$" . $quote . '\\'); + + // Escape control characters and non-UTF-8 characters. + // Regex based on https://stackoverflow.com/a/11709412/385378. + $regex = '/( + [\x00-\x08\x0E-\x1F] # Control characters + | [\xC0-\xC1] # Invalid UTF-8 Bytes + | [\xF5-\xFF] # Invalid UTF-8 Bytes + | \xE0(?=[\x80-\x9F]) # Overlong encoding of prior code point + | \xF0(?=[\x80-\x8F]) # Overlong encoding of prior code point + | [\xC2-\xDF](?![\x80-\xBF]) # Invalid UTF-8 Sequence Start + | [\xE0-\xEF](?![\x80-\xBF]{2}) # Invalid UTF-8 Sequence Start + | [\xF0-\xF4](?![\x80-\xBF]{3}) # Invalid UTF-8 Sequence Start + | (?<=[\x00-\x7F\xF5-\xFF])[\x80-\xBF] # Invalid UTF-8 Sequence Middle + | (? */ + private $attributes = []; + + /** + * @param mixed $value + */ + public function setAttribute(string $key, $value): void + { + $this->attributes[$key] = $value; + } + + public function hasAttribute(string $key): bool + { + return array_key_exists($key, $this->attributes); + } + + /** + * @return mixed + */ + public function getAttribute(string $key) + { + if ($this->hasAttribute($key)) { + return $this->attributes[$key]; + } + + return null; + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Ast/NodeTraverser.php b/vendor/phpstan/phpdoc-parser/src/Ast/NodeTraverser.php new file mode 100644 index 00000000..63b25c37 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/NodeTraverser.php @@ -0,0 +1,312 @@ + Visitors */ + private $visitors = []; + + /** @var bool Whether traversal should be stopped */ + private $stopTraversal; + + /** + * @param list $visitors + */ + public function __construct(array $visitors) + { + $this->visitors = $visitors; + } + + /** + * Traverses an array of nodes using the registered visitors. + * + * @param Node[] $nodes Array of nodes + * + * @return Node[] Traversed array of nodes + */ + public function traverse(array $nodes): array + { + $this->stopTraversal = false; + + foreach ($this->visitors as $visitor) { + $return = $visitor->beforeTraverse($nodes); + if ($return === null) { + continue; + } + + $nodes = $return; + } + + $nodes = $this->traverseArray($nodes); + + foreach ($this->visitors as $visitor) { + $return = $visitor->afterTraverse($nodes); + if ($return === null) { + continue; + } + + $nodes = $return; + } + + return $nodes; + } + + /** + * Recursively traverse a node. + * + * @param Node $node Node to traverse. + * + * @return Node Result of traversal (may be original node or new one) + */ + private function traverseNode(Node $node): Node + { + $subNodeNames = array_keys(get_object_vars($node)); + foreach ($subNodeNames as $name) { + $subNode =& $node->$name; + + if (is_array($subNode)) { + $subNode = $this->traverseArray($subNode); + if ($this->stopTraversal) { + break; + } + } elseif ($subNode instanceof Node) { + $traverseChildren = true; + $breakVisitorIndex = null; + + foreach ($this->visitors as $visitorIndex => $visitor) { + $return = $visitor->enterNode($subNode); + if ($return === null) { + continue; + } + + if ($return instanceof Node) { + $this->ensureReplacementReasonable($subNode, $return); + $subNode = $return; + } elseif ($return === self::DONT_TRAVERSE_CHILDREN) { + $traverseChildren = false; + } elseif ($return === self::DONT_TRAVERSE_CURRENT_AND_CHILDREN) { + $traverseChildren = false; + $breakVisitorIndex = $visitorIndex; + break; + } elseif ($return === self::STOP_TRAVERSAL) { + $this->stopTraversal = true; + break 2; + } else { + throw new LogicException( + 'enterNode() returned invalid value of type ' . gettype($return) + ); + } + } + + if ($traverseChildren) { + $subNode = $this->traverseNode($subNode); + if ($this->stopTraversal) { + break; + } + } + + foreach ($this->visitors as $visitorIndex => $visitor) { + $return = $visitor->leaveNode($subNode); + + if ($return !== null) { + if ($return instanceof Node) { + $this->ensureReplacementReasonable($subNode, $return); + $subNode = $return; + } elseif ($return === self::STOP_TRAVERSAL) { + $this->stopTraversal = true; + break 2; + } elseif (is_array($return)) { + throw new LogicException( + 'leaveNode() may only return an array ' . + 'if the parent structure is an array' + ); + } else { + throw new LogicException( + 'leaveNode() returned invalid value of type ' . gettype($return) + ); + } + } + + if ($breakVisitorIndex === $visitorIndex) { + break; + } + } + } + } + + return $node; + } + + /** + * Recursively traverse array (usually of nodes). + * + * @param mixed[] $nodes Array to traverse + * + * @return mixed[] Result of traversal (may be original array or changed one) + */ + private function traverseArray(array $nodes): array + { + $doNodes = []; + + foreach ($nodes as $i => &$node) { + if ($node instanceof Node) { + $traverseChildren = true; + $breakVisitorIndex = null; + + foreach ($this->visitors as $visitorIndex => $visitor) { + $return = $visitor->enterNode($node); + if ($return === null) { + continue; + } + + if ($return instanceof Node) { + $this->ensureReplacementReasonable($node, $return); + $node = $return; + } elseif (is_array($return)) { + $doNodes[] = [$i, $return]; + continue 2; + } elseif ($return === self::REMOVE_NODE) { + $doNodes[] = [$i, []]; + continue 2; + } elseif ($return === self::DONT_TRAVERSE_CHILDREN) { + $traverseChildren = false; + } elseif ($return === self::DONT_TRAVERSE_CURRENT_AND_CHILDREN) { + $traverseChildren = false; + $breakVisitorIndex = $visitorIndex; + break; + } elseif ($return === self::STOP_TRAVERSAL) { + $this->stopTraversal = true; + break 2; + } else { + throw new LogicException( + 'enterNode() returned invalid value of type ' . gettype($return) + ); + } + } + + if ($traverseChildren) { + $node = $this->traverseNode($node); + if ($this->stopTraversal) { + break; + } + } + + foreach ($this->visitors as $visitorIndex => $visitor) { + $return = $visitor->leaveNode($node); + + if ($return !== null) { + if ($return instanceof Node) { + $this->ensureReplacementReasonable($node, $return); + $node = $return; + } elseif (is_array($return)) { + $doNodes[] = [$i, $return]; + break; + } elseif ($return === self::REMOVE_NODE) { + $doNodes[] = [$i, []]; + break; + } elseif ($return === self::STOP_TRAVERSAL) { + $this->stopTraversal = true; + break 2; + } else { + throw new LogicException( + 'leaveNode() returned invalid value of type ' . gettype($return) + ); + } + } + + if ($breakVisitorIndex === $visitorIndex) { + break; + } + } + } elseif (is_array($node)) { + throw new LogicException('Invalid node structure: Contains nested arrays'); + } + } + + if (count($doNodes) > 0) { + while ([$i, $replace] = array_pop($doNodes)) { + array_splice($nodes, $i, 1, $replace); + } + } + + return $nodes; + } + + private function ensureReplacementReasonable(Node $old, Node $new): void + { + if ($old instanceof TypeNode && !$new instanceof TypeNode) { + throw new LogicException(sprintf('Trying to replace TypeNode with %s', get_class($new))); + } + + if ($old instanceof ConstExprNode && !$new instanceof ConstExprNode) { + throw new LogicException(sprintf('Trying to replace ConstExprNode with %s', get_class($new))); + } + + if ($old instanceof PhpDocChildNode && !$new instanceof PhpDocChildNode) { + throw new LogicException(sprintf('Trying to replace PhpDocChildNode with %s', get_class($new))); + } + + if ($old instanceof PhpDocTagValueNode && !$new instanceof PhpDocTagValueNode) { + throw new LogicException(sprintf('Trying to replace PhpDocTagValueNode with %s', get_class($new))); + } + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Ast/NodeVisitor.php b/vendor/phpstan/phpdoc-parser/src/Ast/NodeVisitor.php new file mode 100644 index 00000000..bf7d784e --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/NodeVisitor.php @@ -0,0 +1,87 @@ + $node stays as-is + * * array (of Nodes) + * => The return value is merged into the parent array (at the position of the $node) + * * NodeTraverser::REMOVE_NODE + * => $node is removed from the parent array + * * NodeTraverser::DONT_TRAVERSE_CHILDREN + * => Children of $node are not traversed. $node stays as-is + * * NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN + * => Further visitors for the current node are skipped, and its children are not + * traversed. $node stays as-is. + * * NodeTraverser::STOP_TRAVERSAL + * => Traversal is aborted. $node stays as-is + * * otherwise + * => $node is set to the return value + * + * @param Node $node Node + * + * @return Node|Node[]|NodeTraverser::*|null Replacement node (or special return value) + */ + public function enterNode(Node $node); + + /** + * Called when leaving a node. + * + * Return value semantics: + * * null + * => $node stays as-is + * * NodeTraverser::REMOVE_NODE + * => $node is removed from the parent array + * * NodeTraverser::STOP_TRAVERSAL + * => Traversal is aborted. $node stays as-is + * * array (of Nodes) + * => The return value is merged into the parent array (at the position of the $node) + * * otherwise + * => $node is set to the return value + * + * @param Node $node Node + * + * @return Node|Node[]|NodeTraverser::REMOVE_NODE|NodeTraverser::STOP_TRAVERSAL|null Replacement node (or special return value) + */ + public function leaveNode(Node $node); + + /** + * Called once after traversal. + * + * Return value semantics: + * * null: $nodes stays as-is + * * otherwise: $nodes is set to the return value + * + * @param Node[] $nodes Array of nodes + * + * @return Node[]|null Array of nodes + */ + public function afterTraverse(array $nodes): ?array; + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Ast/NodeVisitor/CloningVisitor.php b/vendor/phpstan/phpdoc-parser/src/Ast/NodeVisitor/CloningVisitor.php new file mode 100644 index 00000000..7200f3af --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/NodeVisitor/CloningVisitor.php @@ -0,0 +1,20 @@ +setAttribute(Attribute::ORIGINAL_NODE, $originalNode); + + return $node; + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagMethodValueNode.php b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagMethodValueNode.php new file mode 100644 index 00000000..cf4f5563 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagMethodValueNode.php @@ -0,0 +1,50 @@ +type = $type; + $this->parameter = $parameter; + $this->method = $method; + $this->isNegated = $isNegated; + $this->isEquality = $isEquality; + $this->description = $description; + } + + + public function __toString(): string + { + $isNegated = $this->isNegated ? '!' : ''; + $isEquality = $this->isEquality ? '=' : ''; + return trim("{$isNegated}{$isEquality}{$this->type} {$this->parameter}->{$this->method}() {$this->description}"); + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagPropertyValueNode.php b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagPropertyValueNode.php new file mode 100644 index 00000000..4fb31807 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagPropertyValueNode.php @@ -0,0 +1,50 @@ +type = $type; + $this->parameter = $parameter; + $this->property = $property; + $this->isNegated = $isNegated; + $this->isEquality = $isEquality; + $this->description = $description; + } + + + public function __toString(): string + { + $isNegated = $this->isNegated ? '!' : ''; + $isEquality = $this->isEquality ? '=' : ''; + return trim("{$isNegated}{$isEquality}{$this->type} {$this->parameter}->{$this->property} {$this->description}"); + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagValueNode.php b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagValueNode.php new file mode 100644 index 00000000..d6423f50 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagValueNode.php @@ -0,0 +1,46 @@ +type = $type; + $this->parameter = $parameter; + $this->isNegated = $isNegated; + $this->isEquality = $isEquality; + $this->description = $description; + } + + + public function __toString(): string + { + $isNegated = $this->isNegated ? '!' : ''; + $isEquality = $this->isEquality ? '=' : ''; + return trim("{$isNegated}{$isEquality}{$this->type} {$this->parameter} {$this->description}"); + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/DeprecatedTagValueNode.php b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/DeprecatedTagValueNode.php new file mode 100644 index 00000000..abf2f1a6 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/DeprecatedTagValueNode.php @@ -0,0 +1,27 @@ +description = $description; + } + + + public function __toString(): string + { + return trim($this->description); + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ExtendsTagValueNode.php b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ExtendsTagValueNode.php new file mode 100644 index 00000000..3bf53e13 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ExtendsTagValueNode.php @@ -0,0 +1,32 @@ +type = $type; + $this->description = $description; + } + + + public function __toString(): string + { + return trim("{$this->type} {$this->description}"); + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/GenericTagValueNode.php b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/GenericTagValueNode.php new file mode 100644 index 00000000..026aa153 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/GenericTagValueNode.php @@ -0,0 +1,26 @@ +value = $value; + } + + + public function __toString(): string + { + return $this->value; + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ImplementsTagValueNode.php b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ImplementsTagValueNode.php new file mode 100644 index 00000000..99043d91 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ImplementsTagValueNode.php @@ -0,0 +1,32 @@ +type = $type; + $this->description = $description; + } + + + public function __toString(): string + { + return trim("{$this->type} {$this->description}"); + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/InvalidTagValueNode.php b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/InvalidTagValueNode.php new file mode 100644 index 00000000..ca7b4f20 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/InvalidTagValueNode.php @@ -0,0 +1,53 @@ +value = $value; + $this->exceptionArgs = [ + $exception->getCurrentTokenValue(), + $exception->getCurrentTokenType(), + $exception->getCurrentOffset(), + $exception->getExpectedTokenType(), + $exception->getExpectedTokenValue(), + $exception->getCurrentTokenLine(), + ]; + } + + public function __get(string $name): ?ParserException + { + if ($name !== 'exception') { + trigger_error(sprintf('Undefined property: %s::$%s', self::class, $name), E_USER_WARNING); + return null; + } + + return new ParserException(...$this->exceptionArgs); + } + + public function __toString(): string + { + return $this->value; + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueNode.php b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueNode.php new file mode 100644 index 00000000..211510be --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueNode.php @@ -0,0 +1,58 @@ +isStatic = $isStatic; + $this->returnType = $returnType; + $this->methodName = $methodName; + $this->parameters = $parameters; + $this->description = $description; + $this->templateTypes = $templateTypes; + } + + + public function __toString(): string + { + $static = $this->isStatic ? 'static ' : ''; + $returnType = $this->returnType !== null ? "{$this->returnType} " : ''; + $parameters = implode(', ', $this->parameters); + $description = $this->description !== '' ? " {$this->description}" : ''; + $templateTypes = count($this->templateTypes) > 0 ? '<' . implode(', ', $this->templateTypes) . '>' : ''; + return "{$static}{$returnType}{$this->methodName}{$templateTypes}({$parameters}){$description}"; + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueParameterNode.php b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueParameterNode.php new file mode 100644 index 00000000..7c17e44c --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueParameterNode.php @@ -0,0 +1,49 @@ +type = $type; + $this->isReference = $isReference; + $this->isVariadic = $isVariadic; + $this->parameterName = $parameterName; + $this->defaultValue = $defaultValue; + } + + + public function __toString(): string + { + $type = $this->type !== null ? "{$this->type} " : ''; + $isReference = $this->isReference ? '&' : ''; + $isVariadic = $this->isVariadic ? '...' : ''; + $default = $this->defaultValue !== null ? " = {$this->defaultValue}" : ''; + return "{$type}{$isReference}{$isVariadic}{$this->parameterName}{$default}"; + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/MixinTagValueNode.php b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/MixinTagValueNode.php new file mode 100644 index 00000000..d9b7d78a --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/MixinTagValueNode.php @@ -0,0 +1,32 @@ +type = $type; + $this->description = $description; + } + + + public function __toString(): string + { + return trim("{$this->type} {$this->description}"); + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamOutTagValueNode.php b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamOutTagValueNode.php new file mode 100644 index 00000000..9f374bf1 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamOutTagValueNode.php @@ -0,0 +1,35 @@ +type = $type; + $this->parameterName = $parameterName; + $this->description = $description; + } + + public function __toString(): string + { + return trim("{$this->type} {$this->parameterName} {$this->description}"); + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamTagValueNode.php b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamTagValueNode.php new file mode 100644 index 00000000..f93af0ea --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamTagValueNode.php @@ -0,0 +1,46 @@ +type = $type; + $this->isReference = $isReference; + $this->isVariadic = $isVariadic; + $this->parameterName = $parameterName; + $this->description = $description; + } + + + public function __toString(): string + { + $reference = $this->isReference ? '&' : ''; + $variadic = $this->isVariadic ? '...' : ''; + return trim("{$this->type} {$reference}{$variadic}{$this->parameterName} {$this->description}"); + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocChildNode.php b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocChildNode.php new file mode 100644 index 00000000..6162f92d --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocChildNode.php @@ -0,0 +1,10 @@ +children = $children; + } + + + /** + * @return PhpDocTagNode[] + */ + public function getTags(): array + { + return array_filter($this->children, static function (PhpDocChildNode $child): bool { + return $child instanceof PhpDocTagNode; + }); + } + + + /** + * @return PhpDocTagNode[] + */ + public function getTagsByName(string $tagName): array + { + return array_filter($this->getTags(), static function (PhpDocTagNode $tag) use ($tagName): bool { + return $tag->name === $tagName; + }); + } + + + /** + * @return VarTagValueNode[] + */ + public function getVarTagValues(string $tagName = '@var'): array + { + return array_filter( + array_column($this->getTagsByName($tagName), 'value'), + static function (PhpDocTagValueNode $value): bool { + return $value instanceof VarTagValueNode; + } + ); + } + + + /** + * @return ParamTagValueNode[] + */ + public function getParamTagValues(string $tagName = '@param'): array + { + return array_filter( + array_column($this->getTagsByName($tagName), 'value'), + static function (PhpDocTagValueNode $value): bool { + return $value instanceof ParamTagValueNode; + } + ); + } + + + /** + * @return TypelessParamTagValueNode[] + */ + public function getTypelessParamTagValues(string $tagName = '@param'): array + { + return array_filter( + array_column($this->getTagsByName($tagName), 'value'), + static function (PhpDocTagValueNode $value): bool { + return $value instanceof TypelessParamTagValueNode; + } + ); + } + + + /** + * @return TemplateTagValueNode[] + */ + public function getTemplateTagValues(string $tagName = '@template'): array + { + return array_filter( + array_column($this->getTagsByName($tagName), 'value'), + static function (PhpDocTagValueNode $value): bool { + return $value instanceof TemplateTagValueNode; + } + ); + } + + + /** + * @return ExtendsTagValueNode[] + */ + public function getExtendsTagValues(string $tagName = '@extends'): array + { + return array_filter( + array_column($this->getTagsByName($tagName), 'value'), + static function (PhpDocTagValueNode $value): bool { + return $value instanceof ExtendsTagValueNode; + } + ); + } + + + /** + * @return ImplementsTagValueNode[] + */ + public function getImplementsTagValues(string $tagName = '@implements'): array + { + return array_filter( + array_column($this->getTagsByName($tagName), 'value'), + static function (PhpDocTagValueNode $value): bool { + return $value instanceof ImplementsTagValueNode; + } + ); + } + + + /** + * @return UsesTagValueNode[] + */ + public function getUsesTagValues(string $tagName = '@use'): array + { + return array_filter( + array_column($this->getTagsByName($tagName), 'value'), + static function (PhpDocTagValueNode $value): bool { + return $value instanceof UsesTagValueNode; + } + ); + } + + + /** + * @return ReturnTagValueNode[] + */ + public function getReturnTagValues(string $tagName = '@return'): array + { + return array_filter( + array_column($this->getTagsByName($tagName), 'value'), + static function (PhpDocTagValueNode $value): bool { + return $value instanceof ReturnTagValueNode; + } + ); + } + + + /** + * @return ThrowsTagValueNode[] + */ + public function getThrowsTagValues(string $tagName = '@throws'): array + { + return array_filter( + array_column($this->getTagsByName($tagName), 'value'), + static function (PhpDocTagValueNode $value): bool { + return $value instanceof ThrowsTagValueNode; + } + ); + } + + + /** + * @return MixinTagValueNode[] + */ + public function getMixinTagValues(string $tagName = '@mixin'): array + { + return array_filter( + array_column($this->getTagsByName($tagName), 'value'), + static function (PhpDocTagValueNode $value): bool { + return $value instanceof MixinTagValueNode; + } + ); + } + + + /** + * @return DeprecatedTagValueNode[] + */ + public function getDeprecatedTagValues(): array + { + return array_filter( + array_column($this->getTagsByName('@deprecated'), 'value'), + static function (PhpDocTagValueNode $value): bool { + return $value instanceof DeprecatedTagValueNode; + } + ); + } + + + /** + * @return PropertyTagValueNode[] + */ + public function getPropertyTagValues(string $tagName = '@property'): array + { + return array_filter( + array_column($this->getTagsByName($tagName), 'value'), + static function (PhpDocTagValueNode $value): bool { + return $value instanceof PropertyTagValueNode; + } + ); + } + + + /** + * @return PropertyTagValueNode[] + */ + public function getPropertyReadTagValues(string $tagName = '@property-read'): array + { + return array_filter( + array_column($this->getTagsByName($tagName), 'value'), + static function (PhpDocTagValueNode $value): bool { + return $value instanceof PropertyTagValueNode; + } + ); + } + + + /** + * @return PropertyTagValueNode[] + */ + public function getPropertyWriteTagValues(string $tagName = '@property-write'): array + { + return array_filter( + array_column($this->getTagsByName($tagName), 'value'), + static function (PhpDocTagValueNode $value): bool { + return $value instanceof PropertyTagValueNode; + } + ); + } + + + /** + * @return MethodTagValueNode[] + */ + public function getMethodTagValues(string $tagName = '@method'): array + { + return array_filter( + array_column($this->getTagsByName($tagName), 'value'), + static function (PhpDocTagValueNode $value): bool { + return $value instanceof MethodTagValueNode; + } + ); + } + + + /** + * @return TypeAliasTagValueNode[] + */ + public function getTypeAliasTagValues(string $tagName = '@phpstan-type'): array + { + return array_filter( + array_column($this->getTagsByName($tagName), 'value'), + static function (PhpDocTagValueNode $value): bool { + return $value instanceof TypeAliasTagValueNode; + } + ); + } + + + /** + * @return TypeAliasImportTagValueNode[] + */ + public function getTypeAliasImportTagValues(string $tagName = '@phpstan-import-type'): array + { + return array_filter( + array_column($this->getTagsByName($tagName), 'value'), + static function (PhpDocTagValueNode $value): bool { + return $value instanceof TypeAliasImportTagValueNode; + } + ); + } + + + /** + * @return AssertTagValueNode[] + */ + public function getAssertTagValues(string $tagName = '@phpstan-assert'): array + { + return array_filter( + array_column($this->getTagsByName($tagName), 'value'), + static function (PhpDocTagValueNode $value): bool { + return $value instanceof AssertTagValueNode; + } + ); + } + + + /** + * @return AssertTagPropertyValueNode[] + */ + public function getAssertPropertyTagValues(string $tagName = '@phpstan-assert'): array + { + return array_filter( + array_column($this->getTagsByName($tagName), 'value'), + static function (PhpDocTagValueNode $value): bool { + return $value instanceof AssertTagPropertyValueNode; + } + ); + } + + + /** + * @return AssertTagMethodValueNode[] + */ + public function getAssertMethodTagValues(string $tagName = '@phpstan-assert'): array + { + return array_filter( + array_column($this->getTagsByName($tagName), 'value'), + static function (PhpDocTagValueNode $value): bool { + return $value instanceof AssertTagMethodValueNode; + } + ); + } + + + /** + * @return SelfOutTagValueNode[] + */ + public function getSelfOutTypeTagValues(string $tagName = '@phpstan-this-out'): array + { + return array_filter( + array_column($this->getTagsByName($tagName), 'value'), + static function (PhpDocTagValueNode $value): bool { + return $value instanceof SelfOutTagValueNode; + } + ); + } + + + /** + * @return ParamOutTagValueNode[] + */ + public function getParamOutTypeTagValues(string $tagName = '@param-out'): array + { + return array_filter( + array_column($this->getTagsByName($tagName), 'value'), + static function (PhpDocTagValueNode $value): bool { + return $value instanceof ParamOutTagValueNode; + } + ); + } + + + public function __toString(): string + { + $children = array_map( + static function (PhpDocChildNode $child): string { + $s = (string) $child; + return $s === '' ? '' : ' ' . $s; + }, + $this->children + ); + return "/**\n *" . implode("\n *", $children) . "\n */"; + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTagNode.php b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTagNode.php new file mode 100644 index 00000000..856cc3f1 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTagNode.php @@ -0,0 +1,31 @@ +name = $name; + $this->value = $value; + } + + + public function __toString(): string + { + return trim("{$this->name} {$this->value}"); + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTagValueNode.php b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTagValueNode.php new file mode 100644 index 00000000..7723fa0c --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTagValueNode.php @@ -0,0 +1,10 @@ +text = $text; + } + + + public function __toString(): string + { + return $this->text; + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PropertyTagValueNode.php b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PropertyTagValueNode.php new file mode 100644 index 00000000..046003d1 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PropertyTagValueNode.php @@ -0,0 +1,36 @@ +type = $type; + $this->propertyName = $propertyName; + $this->description = $description; + } + + + public function __toString(): string + { + return trim("{$this->type} {$this->propertyName} {$this->description}"); + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ReturnTagValueNode.php b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ReturnTagValueNode.php new file mode 100644 index 00000000..d53c8c75 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ReturnTagValueNode.php @@ -0,0 +1,32 @@ +type = $type; + $this->description = $description; + } + + + public function __toString(): string + { + return trim("{$this->type} {$this->description}"); + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/SelfOutTagValueNode.php b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/SelfOutTagValueNode.php new file mode 100644 index 00000000..83169aff --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/SelfOutTagValueNode.php @@ -0,0 +1,32 @@ +type = $type; + $this->description = $description; + } + + + public function __toString(): string + { + return trim($this->type . ' ' . $this->description); + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/TemplateTagValueNode.php b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/TemplateTagValueNode.php new file mode 100644 index 00000000..1d3c70e4 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/TemplateTagValueNode.php @@ -0,0 +1,42 @@ +name = $name; + $this->bound = $bound; + $this->default = $default; + $this->description = $description; + } + + + public function __toString(): string + { + $bound = $this->bound !== null ? " of {$this->bound}" : ''; + $default = $this->default !== null ? " = {$this->default}" : ''; + return trim("{$this->name}{$bound}{$default} {$this->description}"); + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ThrowsTagValueNode.php b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ThrowsTagValueNode.php new file mode 100644 index 00000000..62d2aed3 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ThrowsTagValueNode.php @@ -0,0 +1,32 @@ +type = $type; + $this->description = $description; + } + + + public function __toString(): string + { + return trim("{$this->type} {$this->description}"); + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypeAliasImportTagValueNode.php b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypeAliasImportTagValueNode.php new file mode 100644 index 00000000..ad6b85a5 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypeAliasImportTagValueNode.php @@ -0,0 +1,38 @@ +importedAlias = $importedAlias; + $this->importedFrom = $importedFrom; + $this->importedAs = $importedAs; + } + + public function __toString(): string + { + return trim( + "{$this->importedAlias} from {$this->importedFrom}" + . ($this->importedAs !== null ? " as {$this->importedAs}" : '') + ); + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypeAliasTagValueNode.php b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypeAliasTagValueNode.php new file mode 100644 index 00000000..4ccaaac4 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypeAliasTagValueNode.php @@ -0,0 +1,32 @@ +alias = $alias; + $this->type = $type; + } + + + public function __toString(): string + { + return trim("{$this->alias} {$this->type}"); + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypelessParamTagValueNode.php b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypelessParamTagValueNode.php new file mode 100644 index 00000000..8b982954 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypelessParamTagValueNode.php @@ -0,0 +1,41 @@ +isReference = $isReference; + $this->isVariadic = $isVariadic; + $this->parameterName = $parameterName; + $this->description = $description; + } + + + public function __toString(): string + { + $reference = $this->isReference ? '&' : ''; + $variadic = $this->isVariadic ? '...' : ''; + return trim("{$reference}{$variadic}{$this->parameterName} {$this->description}"); + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/UsesTagValueNode.php b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/UsesTagValueNode.php new file mode 100644 index 00000000..cd573d97 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/UsesTagValueNode.php @@ -0,0 +1,32 @@ +type = $type; + $this->description = $description; + } + + + public function __toString(): string + { + return trim("{$this->type} {$this->description}"); + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/VarTagValueNode.php b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/VarTagValueNode.php new file mode 100644 index 00000000..afb941a8 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/VarTagValueNode.php @@ -0,0 +1,36 @@ +type = $type; + $this->variableName = $variableName; + $this->description = $description; + } + + + public function __toString(): string + { + return trim("$this->type " . trim("{$this->variableName} {$this->description}")); + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeItemNode.php b/vendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeItemNode.php new file mode 100644 index 00000000..660c6c9d --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeItemNode.php @@ -0,0 +1,49 @@ +keyName = $keyName; + $this->optional = $optional; + $this->valueType = $valueType; + } + + + public function __toString(): string + { + if ($this->keyName !== null) { + return sprintf( + '%s%s: %s', + (string) $this->keyName, + $this->optional ? '?' : '', + (string) $this->valueType + ); + } + + return (string) $this->valueType; + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeNode.php b/vendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeNode.php new file mode 100644 index 00000000..806783f9 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeNode.php @@ -0,0 +1,48 @@ +items = $items; + $this->sealed = $sealed; + $this->kind = $kind; + } + + + public function __toString(): string + { + $items = $this->items; + + if (! $this->sealed) { + $items[] = '...'; + } + + return $this->kind . '{' . implode(', ', $items) . '}'; + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayTypeNode.php b/vendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayTypeNode.php new file mode 100644 index 00000000..d2031032 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayTypeNode.php @@ -0,0 +1,34 @@ +type = $type; + } + + + public function __toString(): string + { + if ( + $this->type instanceof CallableTypeNode + || $this->type instanceof ConstTypeNode + || $this->type instanceof NullableTypeNode + ) { + return '(' . $this->type . ')[]'; + } + + return $this->type . '[]'; + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeNode.php b/vendor/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeNode.php new file mode 100644 index 00000000..e57e5f82 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeNode.php @@ -0,0 +1,43 @@ +identifier = $identifier; + $this->parameters = $parameters; + $this->returnType = $returnType; + } + + + public function __toString(): string + { + $returnType = $this->returnType; + if ($returnType instanceof self) { + $returnType = "({$returnType})"; + } + $parameters = implode(', ', $this->parameters); + return "{$this->identifier}({$parameters}): {$returnType}"; + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeParameterNode.php b/vendor/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeParameterNode.php new file mode 100644 index 00000000..c78d4c7b --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeParameterNode.php @@ -0,0 +1,48 @@ +type = $type; + $this->isReference = $isReference; + $this->isVariadic = $isVariadic; + $this->parameterName = $parameterName; + $this->isOptional = $isOptional; + } + + + public function __toString(): string + { + $type = "{$this->type} "; + $isReference = $this->isReference ? '&' : ''; + $isVariadic = $this->isVariadic ? '...' : ''; + $isOptional = $this->isOptional ? '=' : ''; + return trim("{$type}{$isReference}{$isVariadic}{$this->parameterName}") . $isOptional; + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Ast/Type/ConditionalTypeForParameterNode.php b/vendor/phpstan/phpdoc-parser/src/Ast/Type/ConditionalTypeForParameterNode.php new file mode 100644 index 00000000..fbfcae95 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/Type/ConditionalTypeForParameterNode.php @@ -0,0 +1,49 @@ +parameterName = $parameterName; + $this->targetType = $targetType; + $this->if = $if; + $this->else = $else; + $this->negated = $negated; + } + + public function __toString(): string + { + return sprintf( + '(%s %s %s ? %s : %s)', + $this->parameterName, + $this->negated ? 'is not' : 'is', + $this->targetType, + $this->if, + $this->else + ); + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Ast/Type/ConditionalTypeNode.php b/vendor/phpstan/phpdoc-parser/src/Ast/Type/ConditionalTypeNode.php new file mode 100644 index 00000000..bfdb0db1 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/Type/ConditionalTypeNode.php @@ -0,0 +1,49 @@ +subjectType = $subjectType; + $this->targetType = $targetType; + $this->if = $if; + $this->else = $else; + $this->negated = $negated; + } + + public function __toString(): string + { + return sprintf( + '(%s %s %s ? %s : %s)', + $this->subjectType, + $this->negated ? 'is not' : 'is', + $this->targetType, + $this->if, + $this->else + ); + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Ast/Type/ConstTypeNode.php b/vendor/phpstan/phpdoc-parser/src/Ast/Type/ConstTypeNode.php new file mode 100644 index 00000000..0096055b --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/Type/ConstTypeNode.php @@ -0,0 +1,26 @@ +constExpr = $constExpr; + } + + public function __toString(): string + { + return $this->constExpr->__toString(); + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Ast/Type/GenericTypeNode.php b/vendor/phpstan/phpdoc-parser/src/Ast/Type/GenericTypeNode.php new file mode 100644 index 00000000..44e1d16d --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/Type/GenericTypeNode.php @@ -0,0 +1,58 @@ +type = $type; + $this->genericTypes = $genericTypes; + $this->variances = $variances; + } + + + public function __toString(): string + { + $genericTypes = []; + + foreach ($this->genericTypes as $index => $type) { + $variance = $this->variances[$index] ?? self::VARIANCE_INVARIANT; + if ($variance === self::VARIANCE_INVARIANT) { + $genericTypes[] = (string) $type; + } elseif ($variance === self::VARIANCE_BIVARIANT) { + $genericTypes[] = '*'; + } else { + $genericTypes[] = sprintf('%s %s', $variance, $type); + } + } + + return $this->type . '<' . implode(', ', $genericTypes) . '>'; + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Ast/Type/IdentifierTypeNode.php b/vendor/phpstan/phpdoc-parser/src/Ast/Type/IdentifierTypeNode.php new file mode 100644 index 00000000..29bac308 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/Type/IdentifierTypeNode.php @@ -0,0 +1,26 @@ +name = $name; + } + + + public function __toString(): string + { + return $this->name; + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Ast/Type/IntersectionTypeNode.php b/vendor/phpstan/phpdoc-parser/src/Ast/Type/IntersectionTypeNode.php new file mode 100644 index 00000000..fd761cf7 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/Type/IntersectionTypeNode.php @@ -0,0 +1,37 @@ +types = $types; + } + + + public function __toString(): string + { + return '(' . implode(' & ', array_map(static function (TypeNode $type): string { + if ($type instanceof NullableTypeNode) { + return '(' . $type . ')'; + } + + return (string) $type; + }, $this->types)) . ')'; + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Ast/Type/InvalidTypeNode.php b/vendor/phpstan/phpdoc-parser/src/Ast/Type/InvalidTypeNode.php new file mode 100644 index 00000000..1ec47cf6 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/Type/InvalidTypeNode.php @@ -0,0 +1,38 @@ +exceptionArgs = [ + $exception->getCurrentTokenValue(), + $exception->getCurrentTokenType(), + $exception->getCurrentOffset(), + $exception->getExpectedTokenType(), + $exception->getExpectedTokenValue(), + $exception->getCurrentTokenLine(), + ]; + } + + public function getException(): ParserException + { + return new ParserException(...$this->exceptionArgs); + } + + public function __toString(): string + { + return '*Invalid type*'; + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Ast/Type/NullableTypeNode.php b/vendor/phpstan/phpdoc-parser/src/Ast/Type/NullableTypeNode.php new file mode 100644 index 00000000..73f438cd --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/Type/NullableTypeNode.php @@ -0,0 +1,26 @@ +type = $type; + } + + + public function __toString(): string + { + return '?' . $this->type; + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Ast/Type/ObjectShapeItemNode.php b/vendor/phpstan/phpdoc-parser/src/Ast/Type/ObjectShapeItemNode.php new file mode 100644 index 00000000..2f012406 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/Type/ObjectShapeItemNode.php @@ -0,0 +1,48 @@ +keyName = $keyName; + $this->optional = $optional; + $this->valueType = $valueType; + } + + + public function __toString(): string + { + if ($this->keyName !== null) { + return sprintf( + '%s%s: %s', + (string) $this->keyName, + $this->optional ? '?' : '', + (string) $this->valueType + ); + } + + return (string) $this->valueType; + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Ast/Type/ObjectShapeNode.php b/vendor/phpstan/phpdoc-parser/src/Ast/Type/ObjectShapeNode.php new file mode 100644 index 00000000..f418bc30 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/Type/ObjectShapeNode.php @@ -0,0 +1,31 @@ +items = $items; + } + + public function __toString(): string + { + $items = $this->items; + + return 'object{' . implode(', ', $items) . '}'; + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Ast/Type/OffsetAccessTypeNode.php b/vendor/phpstan/phpdoc-parser/src/Ast/Type/OffsetAccessTypeNode.php new file mode 100644 index 00000000..39e83dfe --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/Type/OffsetAccessTypeNode.php @@ -0,0 +1,37 @@ +type = $type; + $this->offset = $offset; + } + + public function __toString(): string + { + if ( + $this->type instanceof CallableTypeNode + || $this->type instanceof ConstTypeNode + || $this->type instanceof NullableTypeNode + ) { + return '(' . $this->type . ')[' . $this->offset . ']'; + } + + return $this->type . '[' . $this->offset . ']'; + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Ast/Type/ThisTypeNode.php b/vendor/phpstan/phpdoc-parser/src/Ast/Type/ThisTypeNode.php new file mode 100644 index 00000000..d94e6f83 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/Type/ThisTypeNode.php @@ -0,0 +1,17 @@ +types = $types; + } + + + public function __toString(): string + { + return '(' . implode(' | ', array_map(static function (TypeNode $type): string { + if ($type instanceof NullableTypeNode) { + return '(' . $type . ')'; + } + + return (string) $type; + }, $this->types)) . ')'; + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Lexer/Lexer.php b/vendor/phpstan/phpdoc-parser/src/Lexer/Lexer.php new file mode 100644 index 00000000..ccae6bef --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Lexer/Lexer.php @@ -0,0 +1,181 @@ + '\'&\'', + self::TOKEN_UNION => '\'|\'', + self::TOKEN_INTERSECTION => '\'&\'', + self::TOKEN_NULLABLE => '\'?\'', + self::TOKEN_NEGATED => '\'!\'', + self::TOKEN_OPEN_PARENTHESES => '\'(\'', + self::TOKEN_CLOSE_PARENTHESES => '\')\'', + self::TOKEN_OPEN_ANGLE_BRACKET => '\'<\'', + self::TOKEN_CLOSE_ANGLE_BRACKET => '\'>\'', + self::TOKEN_OPEN_SQUARE_BRACKET => '\'[\'', + self::TOKEN_CLOSE_SQUARE_BRACKET => '\']\'', + self::TOKEN_OPEN_CURLY_BRACKET => '\'{\'', + self::TOKEN_CLOSE_CURLY_BRACKET => '\'}\'', + self::TOKEN_COMMA => '\',\'', + self::TOKEN_COLON => '\':\'', + self::TOKEN_VARIADIC => '\'...\'', + self::TOKEN_DOUBLE_COLON => '\'::\'', + self::TOKEN_DOUBLE_ARROW => '\'=>\'', + self::TOKEN_ARROW => '\'->\'', + self::TOKEN_EQUAL => '\'=\'', + self::TOKEN_OPEN_PHPDOC => '\'/**\'', + self::TOKEN_CLOSE_PHPDOC => '\'*/\'', + self::TOKEN_PHPDOC_TAG => 'TOKEN_PHPDOC_TAG', + self::TOKEN_PHPDOC_EOL => 'TOKEN_PHPDOC_EOL', + self::TOKEN_FLOAT => 'TOKEN_FLOAT', + self::TOKEN_INTEGER => 'TOKEN_INTEGER', + self::TOKEN_SINGLE_QUOTED_STRING => 'TOKEN_SINGLE_QUOTED_STRING', + self::TOKEN_DOUBLE_QUOTED_STRING => 'TOKEN_DOUBLE_QUOTED_STRING', + self::TOKEN_IDENTIFIER => 'type', + self::TOKEN_THIS_VARIABLE => '\'$this\'', + self::TOKEN_VARIABLE => 'variable', + self::TOKEN_HORIZONTAL_WS => 'TOKEN_HORIZONTAL_WS', + self::TOKEN_OTHER => 'TOKEN_OTHER', + self::TOKEN_END => 'TOKEN_END', + self::TOKEN_WILDCARD => '*', + ]; + + public const VALUE_OFFSET = 0; + public const TYPE_OFFSET = 1; + public const LINE_OFFSET = 2; + + /** @var string|null */ + private $regexp; + + /** + * @return list + */ + public function tokenize(string $s): array + { + if ($this->regexp === null) { + $this->regexp = $this->generateRegexp(); + } + + preg_match_all($this->regexp, $s, $matches, PREG_SET_ORDER); + + $tokens = []; + $line = 1; + foreach ($matches as $match) { + $type = (int) $match['MARK']; + $tokens[] = [$match[0], $type, $line]; + if ($type !== self::TOKEN_PHPDOC_EOL) { + continue; + } + + $line++; + } + + $tokens[] = ['', self::TOKEN_END, $line]; + + return $tokens; + } + + + private function generateRegexp(): string + { + $patterns = [ + self::TOKEN_HORIZONTAL_WS => '[\\x09\\x20]++', + + self::TOKEN_IDENTIFIER => '(?:[\\\\]?+[a-z_\\x80-\\xFF][0-9a-z_\\x80-\\xFF-]*+)++', + self::TOKEN_THIS_VARIABLE => '\\$this(?![0-9a-z_\\x80-\\xFF])', + self::TOKEN_VARIABLE => '\\$[a-z_\\x80-\\xFF][0-9a-z_\\x80-\\xFF]*+', + + // '&' followed by TOKEN_VARIADIC, TOKEN_VARIABLE, TOKEN_EQUAL, TOKEN_EQUAL or TOKEN_CLOSE_PARENTHESES + self::TOKEN_REFERENCE => '&(?=\\s*+(?:[.,=)]|(?:\\$(?!this(?![0-9a-z_\\x80-\\xFF])))))', + self::TOKEN_UNION => '\\|', + self::TOKEN_INTERSECTION => '&', + self::TOKEN_NULLABLE => '\\?', + self::TOKEN_NEGATED => '!', + + self::TOKEN_OPEN_PARENTHESES => '\\(', + self::TOKEN_CLOSE_PARENTHESES => '\\)', + self::TOKEN_OPEN_ANGLE_BRACKET => '<', + self::TOKEN_CLOSE_ANGLE_BRACKET => '>', + self::TOKEN_OPEN_SQUARE_BRACKET => '\\[', + self::TOKEN_CLOSE_SQUARE_BRACKET => '\\]', + self::TOKEN_OPEN_CURLY_BRACKET => '\\{', + self::TOKEN_CLOSE_CURLY_BRACKET => '\\}', + + self::TOKEN_COMMA => ',', + self::TOKEN_VARIADIC => '\\.\\.\\.', + self::TOKEN_DOUBLE_COLON => '::', + self::TOKEN_DOUBLE_ARROW => '=>', + self::TOKEN_ARROW => '->', + self::TOKEN_EQUAL => '=', + self::TOKEN_COLON => ':', + + self::TOKEN_OPEN_PHPDOC => '/\\*\\*(?=\\s)\\x20?+', + self::TOKEN_CLOSE_PHPDOC => '\\*/', + self::TOKEN_PHPDOC_TAG => '@(?:[a-z][a-z0-9-\\\\]+:)?[a-z][a-z0-9-\\\\]*+', + self::TOKEN_PHPDOC_EOL => '\\r?+\\n[\\x09\\x20]*+(?:\\*(?!/)\\x20?+)?', + + self::TOKEN_FLOAT => '(?:-?[0-9]++(_[0-9]++)*\\.[0-9]*(_[0-9]++)*+(?:e-?[0-9]++(_[0-9]++)*)?)|(?:-?[0-9]*+(_[0-9]++)*\\.[0-9]++(_[0-9]++)*(?:e-?[0-9]++(_[0-9]++)*)?)|(?:-?[0-9]++(_[0-9]++)*e-?[0-9]++(_[0-9]++)*)', + self::TOKEN_INTEGER => '-?(?:(?:0b[0-1]++(_[0-1]++)*)|(?:0o[0-7]++(_[0-7]++)*)|(?:0x[0-9a-f]++(_[0-9a-f]++)*)|(?:[0-9]++(_[0-9]++)*))', + self::TOKEN_SINGLE_QUOTED_STRING => '\'(?:\\\\[^\\r\\n]|[^\'\\r\\n\\\\])*+\'', + self::TOKEN_DOUBLE_QUOTED_STRING => '"(?:\\\\[^\\r\\n]|[^"\\r\\n\\\\])*+"', + + self::TOKEN_WILDCARD => '\\*', + + // anything but TOKEN_CLOSE_PHPDOC or TOKEN_HORIZONTAL_WS or TOKEN_EOL + self::TOKEN_OTHER => '(?:(?!\\*/)[^\\s])++', + ]; + + foreach ($patterns as $type => &$pattern) { + $pattern = '(?:' . $pattern . ')(*MARK:' . $type . ')'; + } + + return '~' . implode('|', $patterns) . '~Asi'; + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Parser/ConstExprParser.php b/vendor/phpstan/phpdoc-parser/src/Parser/ConstExprParser.php new file mode 100644 index 00000000..b6db8a2c --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Parser/ConstExprParser.php @@ -0,0 +1,269 @@ +unescapeStrings = $unescapeStrings; + $this->quoteAwareConstExprString = $quoteAwareConstExprString; + $this->useLinesAttributes = $usedAttributes['lines'] ?? false; + $this->useIndexAttributes = $usedAttributes['indexes'] ?? false; + } + + public function parse(TokenIterator $tokens, bool $trimStrings = false): Ast\ConstExpr\ConstExprNode + { + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); + if ($tokens->isCurrentTokenType(Lexer::TOKEN_FLOAT)) { + $value = $tokens->currentTokenValue(); + $tokens->next(); + + return $this->enrichWithAttributes( + $tokens, + new Ast\ConstExpr\ConstExprFloatNode(str_replace('_', '', $value)), + $startLine, + $startIndex + ); + } + + if ($tokens->isCurrentTokenType(Lexer::TOKEN_INTEGER)) { + $value = $tokens->currentTokenValue(); + $tokens->next(); + + return $this->enrichWithAttributes( + $tokens, + new Ast\ConstExpr\ConstExprIntegerNode(str_replace('_', '', $value)), + $startLine, + $startIndex + ); + } + + if ($tokens->isCurrentTokenType(Lexer::TOKEN_SINGLE_QUOTED_STRING, Lexer::TOKEN_DOUBLE_QUOTED_STRING)) { + $value = $tokens->currentTokenValue(); + $type = $tokens->currentTokenType(); + if ($trimStrings) { + if ($this->unescapeStrings) { + $value = StringUnescaper::unescapeString($value); + } else { + $value = substr($value, 1, -1); + } + } + $tokens->next(); + + if ($this->quoteAwareConstExprString) { + return $this->enrichWithAttributes( + $tokens, + new Ast\ConstExpr\QuoteAwareConstExprStringNode( + $value, + $type === Lexer::TOKEN_SINGLE_QUOTED_STRING + ? Ast\ConstExpr\QuoteAwareConstExprStringNode::SINGLE_QUOTED + : Ast\ConstExpr\QuoteAwareConstExprStringNode::DOUBLE_QUOTED + ), + $startLine, + $startIndex + ); + } + + return $this->enrichWithAttributes( + $tokens, + new Ast\ConstExpr\ConstExprStringNode($value), + $startLine, + $startIndex + ); + + } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_IDENTIFIER)) { + $identifier = $tokens->currentTokenValue(); + $tokens->next(); + + switch (strtolower($identifier)) { + case 'true': + return $this->enrichWithAttributes( + $tokens, + new Ast\ConstExpr\ConstExprTrueNode(), + $startLine, + $startIndex + ); + case 'false': + return $this->enrichWithAttributes( + $tokens, + new Ast\ConstExpr\ConstExprFalseNode(), + $startLine, + $startIndex + ); + case 'null': + return $this->enrichWithAttributes( + $tokens, + new Ast\ConstExpr\ConstExprNullNode(), + $startLine, + $startIndex + ); + case 'array': + $tokens->consumeTokenType(Lexer::TOKEN_OPEN_PARENTHESES); + return $this->parseArray($tokens, Lexer::TOKEN_CLOSE_PARENTHESES, $startIndex); + } + + if ($tokens->tryConsumeTokenType(Lexer::TOKEN_DOUBLE_COLON)) { + $classConstantName = ''; + $lastType = null; + while (true) { + if ($lastType !== Lexer::TOKEN_IDENTIFIER && $tokens->currentTokenType() === Lexer::TOKEN_IDENTIFIER) { + $classConstantName .= $tokens->currentTokenValue(); + $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); + $lastType = Lexer::TOKEN_IDENTIFIER; + + continue; + } + + if ($lastType !== Lexer::TOKEN_WILDCARD && $tokens->tryConsumeTokenType(Lexer::TOKEN_WILDCARD)) { + $classConstantName .= '*'; + $lastType = Lexer::TOKEN_WILDCARD; + + if ($tokens->getSkippedHorizontalWhiteSpaceIfAny() !== '') { + break; + } + + continue; + } + + if ($lastType === null) { + // trigger parse error if nothing valid was consumed + $tokens->consumeTokenType(Lexer::TOKEN_WILDCARD); + } + + break; + } + + return $this->enrichWithAttributes( + $tokens, + new Ast\ConstExpr\ConstFetchNode($identifier, $classConstantName), + $startLine, + $startIndex + ); + + } + + return $this->enrichWithAttributes( + $tokens, + new Ast\ConstExpr\ConstFetchNode('', $identifier), + $startLine, + $startIndex + ); + + } elseif ($tokens->tryConsumeTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { + return $this->parseArray($tokens, Lexer::TOKEN_CLOSE_SQUARE_BRACKET, $startIndex); + } + + throw new ParserException( + $tokens->currentTokenValue(), + $tokens->currentTokenType(), + $tokens->currentTokenOffset(), + Lexer::TOKEN_IDENTIFIER, + null, + $tokens->currentTokenLine() + ); + } + + + private function parseArray(TokenIterator $tokens, int $endToken, int $startIndex): Ast\ConstExpr\ConstExprArrayNode + { + $items = []; + + $startLine = $tokens->currentTokenLine(); + + if (!$tokens->tryConsumeTokenType($endToken)) { + do { + $items[] = $this->parseArrayItem($tokens); + } while ($tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA) && !$tokens->isCurrentTokenType($endToken)); + $tokens->consumeTokenType($endToken); + } + + return $this->enrichWithAttributes( + $tokens, + new Ast\ConstExpr\ConstExprArrayNode($items), + $startLine, + $startIndex + ); + } + + + private function parseArrayItem(TokenIterator $tokens): Ast\ConstExpr\ConstExprArrayItemNode + { + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); + + $expr = $this->parse($tokens); + + if ($tokens->tryConsumeTokenType(Lexer::TOKEN_DOUBLE_ARROW)) { + $key = $expr; + $value = $this->parse($tokens); + + } else { + $key = null; + $value = $expr; + } + + return $this->enrichWithAttributes( + $tokens, + new Ast\ConstExpr\ConstExprArrayItemNode($key, $value), + $startLine, + $startIndex + ); + } + + /** + * @template T of Ast\ConstExpr\ConstExprNode + * @param T $node + * @return T + */ + private function enrichWithAttributes(TokenIterator $tokens, Ast\ConstExpr\ConstExprNode $node, int $startLine, int $startIndex): Ast\ConstExpr\ConstExprNode + { + $endLine = $tokens->currentTokenLine(); + $endIndex = $tokens->currentTokenIndex(); + if ($this->useLinesAttributes) { + $node->setAttribute(Ast\Attribute::START_LINE, $startLine); + $node->setAttribute(Ast\Attribute::END_LINE, $endLine); + } + + if ($this->useIndexAttributes) { + $tokensArray = $tokens->getTokens(); + $endIndex--; + if ($tokensArray[$endIndex][Lexer::TYPE_OFFSET] === Lexer::TOKEN_HORIZONTAL_WS) { + $endIndex--; + } + + $node->setAttribute(Ast\Attribute::START_INDEX, $startIndex); + $node->setAttribute(Ast\Attribute::END_INDEX, $endIndex); + } + + return $node; + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Parser/ParserException.php b/vendor/phpstan/phpdoc-parser/src/Parser/ParserException.php new file mode 100644 index 00000000..6ab5cc07 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Parser/ParserException.php @@ -0,0 +1,106 @@ +currentTokenValue = $currentTokenValue; + $this->currentTokenType = $currentTokenType; + $this->currentOffset = $currentOffset; + $this->expectedTokenType = $expectedTokenType; + $this->expectedTokenValue = $expectedTokenValue; + $this->currentTokenLine = $currentTokenLine; + + parent::__construct(sprintf( + 'Unexpected token %s, expected %s%s at offset %d%s', + $this->formatValue($currentTokenValue), + Lexer::TOKEN_LABELS[$expectedTokenType], + $expectedTokenValue !== null ? sprintf(' (%s)', $this->formatValue($expectedTokenValue)) : '', + $currentOffset, + $currentTokenLine === null ? '' : sprintf(' on line %d', $currentTokenLine) + )); + } + + + public function getCurrentTokenValue(): string + { + return $this->currentTokenValue; + } + + + public function getCurrentTokenType(): int + { + return $this->currentTokenType; + } + + + public function getCurrentOffset(): int + { + return $this->currentOffset; + } + + + public function getExpectedTokenType(): int + { + return $this->expectedTokenType; + } + + + public function getExpectedTokenValue(): ?string + { + return $this->expectedTokenValue; + } + + + public function getCurrentTokenLine(): ?int + { + return $this->currentTokenLine; + } + + + private function formatValue(string $value): string + { + $json = json_encode($value, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_INVALID_UTF8_SUBSTITUTE); + assert($json !== false); + + return $json; + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Parser/PhpDocParser.php b/vendor/phpstan/phpdoc-parser/src/Parser/PhpDocParser.php new file mode 100644 index 00000000..a6401b65 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Parser/PhpDocParser.php @@ -0,0 +1,724 @@ +typeParser = $typeParser; + $this->constantExprParser = $constantExprParser; + $this->requireWhitespaceBeforeDescription = $requireWhitespaceBeforeDescription; + $this->preserveTypeAliasesWithInvalidTypes = $preserveTypeAliasesWithInvalidTypes; + $this->useLinesAttributes = $usedAttributes['lines'] ?? false; + $this->useIndexAttributes = $usedAttributes['indexes'] ?? false; + } + + + public function parse(TokenIterator $tokens): Ast\PhpDoc\PhpDocNode + { + $tokens->consumeTokenType(Lexer::TOKEN_OPEN_PHPDOC); + $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + + $children = []; + + if (!$tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PHPDOC)) { + $children[] = $this->parseChild($tokens); + while ($tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL) && !$tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PHPDOC)) { + $children[] = $this->parseChild($tokens); + } + } + + try { + $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_PHPDOC); + } catch (ParserException $e) { + $name = ''; + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); + if (count($children) > 0) { + $lastChild = $children[count($children) - 1]; + if ($lastChild instanceof Ast\PhpDoc\PhpDocTagNode) { + $name = $lastChild->name; + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); + } + } + + $tag = new Ast\PhpDoc\PhpDocTagNode( + $name, + $this->enrichWithAttributes( + $tokens, + new Ast\PhpDoc\InvalidTagValueNode($e->getMessage(), $e), + $startLine, + $startIndex + ) + ); + + $tokens->forwardToTheEnd(); + + return $this->enrichWithAttributes($tokens, new Ast\PhpDoc\PhpDocNode([$this->enrichWithAttributes($tokens, $tag, $startLine, $startIndex)]), 1, 0); + } + + return $this->enrichWithAttributes($tokens, new Ast\PhpDoc\PhpDocNode(array_values($children)), 1, 0); + } + + + private function parseChild(TokenIterator $tokens): Ast\PhpDoc\PhpDocChildNode + { + if ($tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_TAG)) { + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); + return $this->enrichWithAttributes($tokens, $this->parseTag($tokens), $startLine, $startIndex); + } + + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); + $text = $this->parseText($tokens); + + return $this->enrichWithAttributes($tokens, $text, $startLine, $startIndex); + } + + /** + * @template T of Ast\Node + * @param T $tag + * @return T + */ + private function enrichWithAttributes(TokenIterator $tokens, Ast\Node $tag, int $startLine, int $startIndex): Ast\Node + { + $endLine = $tokens->currentTokenLine(); + $endIndex = $tokens->currentTokenIndex(); + + if ($this->useLinesAttributes) { + $tag->setAttribute(Ast\Attribute::START_LINE, $startLine); + $tag->setAttribute(Ast\Attribute::END_LINE, $endLine); + } + + if ($this->useIndexAttributes) { + $tokensArray = $tokens->getTokens(); + $endIndex--; + if ($tokensArray[$endIndex][Lexer::TYPE_OFFSET] === Lexer::TOKEN_HORIZONTAL_WS) { + $endIndex--; + } + + $tag->setAttribute(Ast\Attribute::START_INDEX, $startIndex); + $tag->setAttribute(Ast\Attribute::END_INDEX, $endIndex); + } + + return $tag; + } + + + private function parseText(TokenIterator $tokens): Ast\PhpDoc\PhpDocTextNode + { + $text = ''; + + while (!$tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_EOL)) { + $text .= $tokens->getSkippedHorizontalWhiteSpaceIfAny() . $tokens->joinUntil(Lexer::TOKEN_PHPDOC_EOL, Lexer::TOKEN_CLOSE_PHPDOC, Lexer::TOKEN_END); + + if (!$tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_EOL)) { + break; + } + + $tokens->pushSavePoint(); + $tokens->next(); + + if ($tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_TAG, Lexer::TOKEN_PHPDOC_EOL, Lexer::TOKEN_CLOSE_PHPDOC, Lexer::TOKEN_END)) { + $tokens->rollback(); + break; + } + + $tokens->dropSavePoint(); + $text .= "\n"; + } + + return new Ast\PhpDoc\PhpDocTextNode(trim($text, " \t")); + } + + + public function parseTag(TokenIterator $tokens): Ast\PhpDoc\PhpDocTagNode + { + $tag = $tokens->currentTokenValue(); + $tokens->next(); + $value = $this->parseTagValue($tokens, $tag); + + return new Ast\PhpDoc\PhpDocTagNode($tag, $value); + } + + + public function parseTagValue(TokenIterator $tokens, string $tag): Ast\PhpDoc\PhpDocTagValueNode + { + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); + + try { + $tokens->pushSavePoint(); + + switch ($tag) { + case '@param': + case '@phpstan-param': + case '@psalm-param': + $tagValue = $this->parseParamTagValue($tokens); + break; + + case '@var': + case '@phpstan-var': + case '@psalm-var': + $tagValue = $this->parseVarTagValue($tokens); + break; + + case '@return': + case '@phpstan-return': + case '@psalm-return': + $tagValue = $this->parseReturnTagValue($tokens); + break; + + case '@throws': + case '@phpstan-throws': + $tagValue = $this->parseThrowsTagValue($tokens); + break; + + case '@mixin': + $tagValue = $this->parseMixinTagValue($tokens); + break; + + case '@deprecated': + $tagValue = $this->parseDeprecatedTagValue($tokens); + break; + + case '@property': + case '@property-read': + case '@property-write': + case '@phpstan-property': + case '@phpstan-property-read': + case '@phpstan-property-write': + case '@psalm-property': + case '@psalm-property-read': + case '@psalm-property-write': + $tagValue = $this->parsePropertyTagValue($tokens); + break; + + case '@method': + case '@phpstan-method': + case '@psalm-method': + $tagValue = $this->parseMethodTagValue($tokens); + break; + + case '@template': + case '@phpstan-template': + case '@psalm-template': + case '@template-covariant': + case '@phpstan-template-covariant': + case '@psalm-template-covariant': + case '@template-contravariant': + case '@phpstan-template-contravariant': + case '@psalm-template-contravariant': + $tagValue = $this->parseTemplateTagValue($tokens, true); + break; + + case '@extends': + case '@phpstan-extends': + case '@template-extends': + $tagValue = $this->parseExtendsTagValue('@extends', $tokens); + break; + + case '@implements': + case '@phpstan-implements': + case '@template-implements': + $tagValue = $this->parseExtendsTagValue('@implements', $tokens); + break; + + case '@use': + case '@phpstan-use': + case '@template-use': + $tagValue = $this->parseExtendsTagValue('@use', $tokens); + break; + + case '@phpstan-type': + case '@psalm-type': + $tagValue = $this->parseTypeAliasTagValue($tokens); + break; + + case '@phpstan-import-type': + case '@psalm-import-type': + $tagValue = $this->parseTypeAliasImportTagValue($tokens); + break; + + case '@phpstan-assert': + case '@phpstan-assert-if-true': + case '@phpstan-assert-if-false': + case '@psalm-assert': + case '@psalm-assert-if-true': + case '@psalm-assert-if-false': + $tagValue = $this->parseAssertTagValue($tokens); + break; + + case '@phpstan-this-out': + case '@phpstan-self-out': + case '@psalm-this-out': + case '@psalm-self-out': + $tagValue = $this->parseSelfOutTagValue($tokens); + break; + + case '@param-out': + case '@phpstan-param-out': + case '@psalm-param-out': + $tagValue = $this->parseParamOutTagValue($tokens); + break; + + default: + $tagValue = new Ast\PhpDoc\GenericTagValueNode($this->parseOptionalDescription($tokens)); + break; + } + + $tokens->dropSavePoint(); + + } catch (ParserException $e) { + $tokens->rollback(); + $tagValue = new Ast\PhpDoc\InvalidTagValueNode($this->parseOptionalDescription($tokens), $e); + } + + return $this->enrichWithAttributes($tokens, $tagValue, $startLine, $startIndex); + } + + + /** + * @return Ast\PhpDoc\ParamTagValueNode|Ast\PhpDoc\TypelessParamTagValueNode + */ + private function parseParamTagValue(TokenIterator $tokens): Ast\PhpDoc\PhpDocTagValueNode + { + if ( + $tokens->isCurrentTokenType(Lexer::TOKEN_REFERENCE, Lexer::TOKEN_VARIADIC, Lexer::TOKEN_VARIABLE) + ) { + $type = null; + } else { + $type = $this->typeParser->parse($tokens); + } + + $isReference = $tokens->tryConsumeTokenType(Lexer::TOKEN_REFERENCE); + $isVariadic = $tokens->tryConsumeTokenType(Lexer::TOKEN_VARIADIC); + $parameterName = $this->parseRequiredVariableName($tokens); + $description = $this->parseOptionalDescription($tokens); + + if ($type !== null) { + return new Ast\PhpDoc\ParamTagValueNode($type, $isVariadic, $parameterName, $description, $isReference); + } + + return new Ast\PhpDoc\TypelessParamTagValueNode($isVariadic, $parameterName, $description, $isReference); + } + + + private function parseVarTagValue(TokenIterator $tokens): Ast\PhpDoc\VarTagValueNode + { + $type = $this->typeParser->parse($tokens); + $variableName = $this->parseOptionalVariableName($tokens); + $description = $this->parseOptionalDescription($tokens, $variableName === ''); + return new Ast\PhpDoc\VarTagValueNode($type, $variableName, $description); + } + + + private function parseReturnTagValue(TokenIterator $tokens): Ast\PhpDoc\ReturnTagValueNode + { + $type = $this->typeParser->parse($tokens); + $description = $this->parseOptionalDescription($tokens, true); + return new Ast\PhpDoc\ReturnTagValueNode($type, $description); + } + + + private function parseThrowsTagValue(TokenIterator $tokens): Ast\PhpDoc\ThrowsTagValueNode + { + $type = $this->typeParser->parse($tokens); + $description = $this->parseOptionalDescription($tokens, true); + return new Ast\PhpDoc\ThrowsTagValueNode($type, $description); + } + + private function parseMixinTagValue(TokenIterator $tokens): Ast\PhpDoc\MixinTagValueNode + { + $type = $this->typeParser->parse($tokens); + $description = $this->parseOptionalDescription($tokens, true); + return new Ast\PhpDoc\MixinTagValueNode($type, $description); + } + + private function parseDeprecatedTagValue(TokenIterator $tokens): Ast\PhpDoc\DeprecatedTagValueNode + { + $description = $this->parseOptionalDescription($tokens); + return new Ast\PhpDoc\DeprecatedTagValueNode($description); + } + + + private function parsePropertyTagValue(TokenIterator $tokens): Ast\PhpDoc\PropertyTagValueNode + { + $type = $this->typeParser->parse($tokens); + $parameterName = $this->parseRequiredVariableName($tokens); + $description = $this->parseOptionalDescription($tokens); + return new Ast\PhpDoc\PropertyTagValueNode($type, $parameterName, $description); + } + + + private function parseMethodTagValue(TokenIterator $tokens): Ast\PhpDoc\MethodTagValueNode + { + $isStatic = $tokens->tryConsumeTokenValue('static'); + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); + $returnTypeOrMethodName = $this->typeParser->parse($tokens); + + if ($tokens->isCurrentTokenType(Lexer::TOKEN_IDENTIFIER)) { + $returnType = $returnTypeOrMethodName; + $methodName = $tokens->currentTokenValue(); + $tokens->next(); + + } elseif ($returnTypeOrMethodName instanceof Ast\Type\IdentifierTypeNode) { + $returnType = $isStatic + ? $this->typeParser->enrichWithAttributes($tokens, new Ast\Type\IdentifierTypeNode('static'), $startLine, $startIndex) + : null; + $methodName = $returnTypeOrMethodName->name; + $isStatic = false; + + } else { + $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); // will throw exception + exit; + } + + $templateTypes = []; + + if ($tokens->tryConsumeTokenType(Lexer::TOKEN_OPEN_ANGLE_BRACKET)) { + do { + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); + $templateTypes[] = $this->enrichWithAttributes($tokens, $this->parseTemplateTagValue($tokens, false), $startLine, $startIndex); + } while ($tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA)); + $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_ANGLE_BRACKET); + } + + $parameters = []; + $tokens->consumeTokenType(Lexer::TOKEN_OPEN_PARENTHESES); + if (!$tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PARENTHESES)) { + $parameters[] = $this->parseMethodTagValueParameter($tokens); + while ($tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA)) { + $parameters[] = $this->parseMethodTagValueParameter($tokens); + } + } + $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_PARENTHESES); + + $description = $this->parseOptionalDescription($tokens); + return new Ast\PhpDoc\MethodTagValueNode($isStatic, $returnType, $methodName, $parameters, $description, $templateTypes); + } + + private function parseMethodTagValueParameter(TokenIterator $tokens): Ast\PhpDoc\MethodTagValueParameterNode + { + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); + + switch ($tokens->currentTokenType()) { + case Lexer::TOKEN_IDENTIFIER: + case Lexer::TOKEN_OPEN_PARENTHESES: + case Lexer::TOKEN_NULLABLE: + $parameterType = $this->typeParser->parse($tokens); + break; + + default: + $parameterType = null; + } + + $isReference = $tokens->tryConsumeTokenType(Lexer::TOKEN_REFERENCE); + $isVariadic = $tokens->tryConsumeTokenType(Lexer::TOKEN_VARIADIC); + + $parameterName = $tokens->currentTokenValue(); + $tokens->consumeTokenType(Lexer::TOKEN_VARIABLE); + + if ($tokens->tryConsumeTokenType(Lexer::TOKEN_EQUAL)) { + $defaultValue = $this->constantExprParser->parse($tokens); + + } else { + $defaultValue = null; + } + + return $this->enrichWithAttributes( + $tokens, + new Ast\PhpDoc\MethodTagValueParameterNode($parameterType, $isReference, $isVariadic, $parameterName, $defaultValue), + $startLine, + $startIndex + ); + } + + private function parseTemplateTagValue(TokenIterator $tokens, bool $parseDescription): Ast\PhpDoc\TemplateTagValueNode + { + $name = $tokens->currentTokenValue(); + $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); + + if ($tokens->tryConsumeTokenValue('of') || $tokens->tryConsumeTokenValue('as')) { + $bound = $this->typeParser->parse($tokens); + + } else { + $bound = null; + } + + if ($tokens->tryConsumeTokenValue('=')) { + $default = $this->typeParser->parse($tokens); + } else { + $default = null; + } + + if ($parseDescription) { + $description = $this->parseOptionalDescription($tokens); + } else { + $description = ''; + } + + return new Ast\PhpDoc\TemplateTagValueNode($name, $bound, $description, $default); + } + + private function parseExtendsTagValue(string $tagName, TokenIterator $tokens): Ast\PhpDoc\PhpDocTagValueNode + { + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); + $baseType = new IdentifierTypeNode($tokens->currentTokenValue()); + $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); + + $type = $this->typeParser->parseGeneric( + $tokens, + $this->typeParser->enrichWithAttributes($tokens, $baseType, $startLine, $startIndex) + ); + + $description = $this->parseOptionalDescription($tokens); + + switch ($tagName) { + case '@extends': + return new Ast\PhpDoc\ExtendsTagValueNode($type, $description); + case '@implements': + return new Ast\PhpDoc\ImplementsTagValueNode($type, $description); + case '@use': + return new Ast\PhpDoc\UsesTagValueNode($type, $description); + } + + throw new ShouldNotHappenException(); + } + + private function parseTypeAliasTagValue(TokenIterator $tokens): Ast\PhpDoc\TypeAliasTagValueNode + { + $alias = $tokens->currentTokenValue(); + $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); + + // support psalm-type syntax + $tokens->tryConsumeTokenType(Lexer::TOKEN_EQUAL); + + if ($this->preserveTypeAliasesWithInvalidTypes) { + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); + try { + $type = $this->typeParser->parse($tokens); + if (!$tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PHPDOC)) { + if (!$tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_EOL)) { + throw new ParserException( + $tokens->currentTokenValue(), + $tokens->currentTokenType(), + $tokens->currentTokenOffset(), + Lexer::TOKEN_PHPDOC_EOL, + null, + $tokens->currentTokenLine() + ); + } + } + + return new Ast\PhpDoc\TypeAliasTagValueNode($alias, $type); + } catch (ParserException $e) { + $this->parseOptionalDescription($tokens); + return new Ast\PhpDoc\TypeAliasTagValueNode( + $alias, + $this->enrichWithAttributes($tokens, new Ast\Type\InvalidTypeNode($e), $startLine, $startIndex) + ); + } + } + + $type = $this->typeParser->parse($tokens); + + return new Ast\PhpDoc\TypeAliasTagValueNode($alias, $type); + } + + private function parseTypeAliasImportTagValue(TokenIterator $tokens): Ast\PhpDoc\TypeAliasImportTagValueNode + { + $importedAlias = $tokens->currentTokenValue(); + $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); + + $tokens->consumeTokenValue(Lexer::TOKEN_IDENTIFIER, 'from'); + + $identifierStartLine = $tokens->currentTokenLine(); + $identifierStartIndex = $tokens->currentTokenIndex(); + $importedFrom = $tokens->currentTokenValue(); + $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); + $importedFromType = $this->enrichWithAttributes( + $tokens, + new IdentifierTypeNode($importedFrom), + $identifierStartLine, + $identifierStartIndex + ); + + $importedAs = null; + if ($tokens->tryConsumeTokenValue('as')) { + $importedAs = $tokens->currentTokenValue(); + $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); + } + + return new Ast\PhpDoc\TypeAliasImportTagValueNode($importedAlias, $importedFromType, $importedAs); + } + + /** + * @return Ast\PhpDoc\AssertTagValueNode|Ast\PhpDoc\AssertTagPropertyValueNode|Ast\PhpDoc\AssertTagMethodValueNode + */ + private function parseAssertTagValue(TokenIterator $tokens): Ast\PhpDoc\PhpDocTagValueNode + { + $isNegated = $tokens->tryConsumeTokenType(Lexer::TOKEN_NEGATED); + $isEquality = $tokens->tryConsumeTokenType(Lexer::TOKEN_EQUAL); + $type = $this->typeParser->parse($tokens); + $parameter = $this->parseAssertParameter($tokens); + $description = $this->parseOptionalDescription($tokens); + + if (array_key_exists('method', $parameter)) { + return new Ast\PhpDoc\AssertTagMethodValueNode($type, $parameter['parameter'], $parameter['method'], $isNegated, $description, $isEquality); + } elseif (array_key_exists('property', $parameter)) { + return new Ast\PhpDoc\AssertTagPropertyValueNode($type, $parameter['parameter'], $parameter['property'], $isNegated, $description, $isEquality); + } + + return new Ast\PhpDoc\AssertTagValueNode($type, $parameter['parameter'], $isNegated, $description, $isEquality); + } + + /** + * @return array{parameter: string}|array{parameter: string, property: string}|array{parameter: string, method: string} + */ + private function parseAssertParameter(TokenIterator $tokens): array + { + if ($tokens->isCurrentTokenType(Lexer::TOKEN_THIS_VARIABLE)) { + $parameter = '$this'; + $requirePropertyOrMethod = true; + $tokens->next(); + } else { + $parameter = $tokens->currentTokenValue(); + $requirePropertyOrMethod = false; + $tokens->consumeTokenType(Lexer::TOKEN_VARIABLE); + } + + if ($requirePropertyOrMethod || $tokens->isCurrentTokenType(Lexer::TOKEN_ARROW)) { + $tokens->consumeTokenType(Lexer::TOKEN_ARROW); + + $propertyOrMethod = $tokens->currentTokenValue(); + $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); + + if ($tokens->tryConsumeTokenType(Lexer::TOKEN_OPEN_PARENTHESES)) { + $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_PARENTHESES); + + return ['parameter' => $parameter, 'method' => $propertyOrMethod]; + } + + return ['parameter' => $parameter, 'property' => $propertyOrMethod]; + } + + return ['parameter' => $parameter]; + } + + private function parseSelfOutTagValue(TokenIterator $tokens): Ast\PhpDoc\SelfOutTagValueNode + { + $type = $this->typeParser->parse($tokens); + $description = $this->parseOptionalDescription($tokens); + + return new Ast\PhpDoc\SelfOutTagValueNode($type, $description); + } + + private function parseParamOutTagValue(TokenIterator $tokens): Ast\PhpDoc\ParamOutTagValueNode + { + $type = $this->typeParser->parse($tokens); + $parameterName = $this->parseRequiredVariableName($tokens); + $description = $this->parseOptionalDescription($tokens); + + return new Ast\PhpDoc\ParamOutTagValueNode($type, $parameterName, $description); + } + + private function parseOptionalVariableName(TokenIterator $tokens): string + { + if ($tokens->isCurrentTokenType(Lexer::TOKEN_VARIABLE)) { + $parameterName = $tokens->currentTokenValue(); + $tokens->next(); + } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_THIS_VARIABLE)) { + $parameterName = '$this'; + $tokens->next(); + + } else { + $parameterName = ''; + } + + return $parameterName; + } + + + private function parseRequiredVariableName(TokenIterator $tokens): string + { + $parameterName = $tokens->currentTokenValue(); + $tokens->consumeTokenType(Lexer::TOKEN_VARIABLE); + + return $parameterName; + } + + private function parseOptionalDescription(TokenIterator $tokens, bool $limitStartToken = false): string + { + if ($limitStartToken) { + foreach (self::DISALLOWED_DESCRIPTION_START_TOKENS as $disallowedStartToken) { + if (!$tokens->isCurrentTokenType($disallowedStartToken)) { + continue; + } + + $tokens->consumeTokenType(Lexer::TOKEN_OTHER); // will throw exception + } + + if ( + $this->requireWhitespaceBeforeDescription + && !$tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_EOL, Lexer::TOKEN_CLOSE_PHPDOC, Lexer::TOKEN_END) + && !$tokens->isPrecededByHorizontalWhitespace() + ) { + $tokens->consumeTokenType(Lexer::TOKEN_HORIZONTAL_WS); // will throw exception + } + } + + return $this->parseText($tokens)->text; + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Parser/StringUnescaper.php b/vendor/phpstan/phpdoc-parser/src/Parser/StringUnescaper.php new file mode 100644 index 00000000..70524055 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Parser/StringUnescaper.php @@ -0,0 +1,96 @@ + '\\', + 'n' => "\n", + 'r' => "\r", + 't' => "\t", + 'f' => "\f", + 'v' => "\v", + 'e' => "\x1B", + ]; + + public static function unescapeString(string $string): string + { + $quote = $string[0]; + + if ($quote === '\'') { + return str_replace( + ['\\\\', '\\\''], + ['\\', '\''], + substr($string, 1, -1) + ); + } + + return self::parseEscapeSequences(substr($string, 1, -1), '"'); + } + + /** + * Implementation based on https://github.com/nikic/PHP-Parser/blob/b0edd4c41111042d43bb45c6c657b2e0db367d9e/lib/PhpParser/Node/Scalar/String_.php#L90-L130 + */ + private static function parseEscapeSequences(string $str, string $quote): string + { + $str = str_replace('\\' . $quote, $quote, $str); + + return preg_replace_callback( + '~\\\\([\\\\nrtfve]|[xX][0-9a-fA-F]{1,2}|[0-7]{1,3}|u\{([0-9a-fA-F]+)\})~', + static function ($matches) { + $str = $matches[1]; + + if (isset(self::REPLACEMENTS[$str])) { + return self::REPLACEMENTS[$str]; + } + if ($str[0] === 'x' || $str[0] === 'X') { + return chr((int) hexdec(substr($str, 1))); + } + if ($str[0] === 'u') { + return self::codePointToUtf8((int) hexdec($matches[2])); + } + + return chr((int) octdec($str)); + }, + $str + ); + } + + /** + * Implementation based on https://github.com/nikic/PHP-Parser/blob/b0edd4c41111042d43bb45c6c657b2e0db367d9e/lib/PhpParser/Node/Scalar/String_.php#L132-L154 + */ + private static function codePointToUtf8(int $num): string + { + if ($num <= 0x7F) { + return chr($num); + } + if ($num <= 0x7FF) { + return chr(($num >> 6) + 0xC0) + . chr(($num & 0x3F) + 0x80); + } + if ($num <= 0xFFFF) { + return chr(($num >> 12) + 0xE0) + . chr((($num >> 6) & 0x3F) + 0x80) + . chr(($num & 0x3F) + 0x80); + } + if ($num <= 0x1FFFFF) { + return chr(($num >> 18) + 0xF0) + . chr((($num >> 12) & 0x3F) + 0x80) + . chr((($num >> 6) & 0x3F) + 0x80) + . chr(($num & 0x3F) + 0x80); + } + + // Invalid UTF-8 codepoint escape sequence: Codepoint too large + return "\xef\xbf\xbd"; + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Parser/TokenIterator.php b/vendor/phpstan/phpdoc-parser/src/Parser/TokenIterator.php new file mode 100644 index 00000000..4348ab79 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Parser/TokenIterator.php @@ -0,0 +1,331 @@ + */ + private $tokens; + + /** @var int */ + private $index; + + /** @var int[] */ + private $savePoints = []; + + /** + * @param list $tokens + */ + public function __construct(array $tokens, int $index = 0) + { + $this->tokens = $tokens; + $this->index = $index; + + if ($this->tokens[$this->index][Lexer::TYPE_OFFSET] !== Lexer::TOKEN_HORIZONTAL_WS) { + return; + } + + $this->index++; + } + + + /** + * @return list + */ + public function getTokens(): array + { + return $this->tokens; + } + + + public function getContentBetween(int $startPos, int $endPos): string + { + if ($startPos < 0 || $endPos > count($this->tokens)) { + throw new LogicException(); + } + + $content = ''; + for ($i = $startPos; $i < $endPos; $i++) { + $content .= $this->tokens[$i][Lexer::VALUE_OFFSET]; + } + + return $content; + } + + + public function getTokenCount(): int + { + return count($this->tokens); + } + + + public function currentTokenValue(): string + { + return $this->tokens[$this->index][Lexer::VALUE_OFFSET]; + } + + + public function currentTokenType(): int + { + return $this->tokens[$this->index][Lexer::TYPE_OFFSET]; + } + + + public function currentTokenOffset(): int + { + $offset = 0; + for ($i = 0; $i < $this->index; $i++) { + $offset += strlen($this->tokens[$i][Lexer::VALUE_OFFSET]); + } + + return $offset; + } + + + public function currentTokenLine(): int + { + return $this->tokens[$this->index][Lexer::LINE_OFFSET]; + } + + + public function currentTokenIndex(): int + { + return $this->index; + } + + + public function isCurrentTokenValue(string $tokenValue): bool + { + return $this->tokens[$this->index][Lexer::VALUE_OFFSET] === $tokenValue; + } + + + public function isCurrentTokenType(int ...$tokenType): bool + { + return in_array($this->tokens[$this->index][Lexer::TYPE_OFFSET], $tokenType, true); + } + + + public function isPrecededByHorizontalWhitespace(): bool + { + return ($this->tokens[$this->index - 1][Lexer::TYPE_OFFSET] ?? -1) === Lexer::TOKEN_HORIZONTAL_WS; + } + + + /** + * @throws ParserException + */ + public function consumeTokenType(int $tokenType): void + { + if ($this->tokens[$this->index][Lexer::TYPE_OFFSET] !== $tokenType) { + $this->throwError($tokenType); + } + + $this->index++; + + if (($this->tokens[$this->index][Lexer::TYPE_OFFSET] ?? -1) !== Lexer::TOKEN_HORIZONTAL_WS) { + return; + } + + $this->index++; + } + + + /** + * @throws ParserException + */ + public function consumeTokenValue(int $tokenType, string $tokenValue): void + { + if ($this->tokens[$this->index][Lexer::TYPE_OFFSET] !== $tokenType || $this->tokens[$this->index][Lexer::VALUE_OFFSET] !== $tokenValue) { + $this->throwError($tokenType, $tokenValue); + } + + $this->index++; + + if (($this->tokens[$this->index][Lexer::TYPE_OFFSET] ?? -1) !== Lexer::TOKEN_HORIZONTAL_WS) { + return; + } + + $this->index++; + } + + + /** @phpstan-impure */ + public function tryConsumeTokenValue(string $tokenValue): bool + { + if ($this->tokens[$this->index][Lexer::VALUE_OFFSET] !== $tokenValue) { + return false; + } + + $this->index++; + + if ($this->tokens[$this->index][Lexer::TYPE_OFFSET] === Lexer::TOKEN_HORIZONTAL_WS) { + $this->index++; + } + + return true; + } + + + /** @phpstan-impure */ + public function tryConsumeTokenType(int $tokenType): bool + { + if ($this->tokens[$this->index][Lexer::TYPE_OFFSET] !== $tokenType) { + return false; + } + + $this->index++; + + if ($this->tokens[$this->index][Lexer::TYPE_OFFSET] === Lexer::TOKEN_HORIZONTAL_WS) { + $this->index++; + } + + return true; + } + + + public function getSkippedHorizontalWhiteSpaceIfAny(): string + { + if ($this->index > 0 && $this->tokens[$this->index - 1][Lexer::TYPE_OFFSET] === Lexer::TOKEN_HORIZONTAL_WS) { + return $this->tokens[$this->index - 1][Lexer::VALUE_OFFSET]; + } + + return ''; + } + + + /** @phpstan-impure */ + public function joinUntil(int ...$tokenType): string + { + $s = ''; + while (!in_array($this->tokens[$this->index][Lexer::TYPE_OFFSET], $tokenType, true)) { + $s .= $this->tokens[$this->index++][Lexer::VALUE_OFFSET]; + } + return $s; + } + + + public function next(): void + { + $this->index++; + + if ($this->tokens[$this->index][Lexer::TYPE_OFFSET] !== Lexer::TOKEN_HORIZONTAL_WS) { + return; + } + + $this->index++; + } + + /** @phpstan-impure */ + public function forwardToTheEnd(): void + { + $lastToken = count($this->tokens) - 1; + $this->index = $lastToken; + } + + + public function pushSavePoint(): void + { + $this->savePoints[] = $this->index; + } + + + public function dropSavePoint(): void + { + array_pop($this->savePoints); + } + + + public function rollback(): void + { + $index = array_pop($this->savePoints); + assert($index !== null); + $this->index = $index; + } + + + /** + * @throws ParserException + */ + private function throwError(int $expectedTokenType, ?string $expectedTokenValue = null): void + { + throw new ParserException( + $this->currentTokenValue(), + $this->currentTokenType(), + $this->currentTokenOffset(), + $expectedTokenType, + $expectedTokenValue, + $this->currentTokenLine() + ); + } + + /** + * Check whether the position is directly preceded by a certain token type. + * + * During this check TOKEN_HORIZONTAL_WS and TOKEN_PHPDOC_EOL are skipped + */ + public function hasTokenImmediatelyBefore(int $pos, int $expectedTokenType): bool + { + $tokens = $this->tokens; + $pos--; + for (; $pos >= 0; $pos--) { + $token = $tokens[$pos]; + $type = $token[Lexer::TYPE_OFFSET]; + if ($type === $expectedTokenType) { + return true; + } + if (!in_array($type, [ + Lexer::TOKEN_HORIZONTAL_WS, + Lexer::TOKEN_PHPDOC_EOL, + ], true)) { + break; + } + } + return false; + } + + /** + * Check whether the position is directly followed by a certain token type. + * + * During this check TOKEN_HORIZONTAL_WS and TOKEN_PHPDOC_EOL are skipped + */ + public function hasTokenImmediatelyAfter(int $pos, int $expectedTokenType): bool + { + $tokens = $this->tokens; + $pos++; + for ($c = count($tokens); $pos < $c; $pos++) { + $token = $tokens[$pos]; + $type = $token[Lexer::TYPE_OFFSET]; + if ($type === $expectedTokenType) { + return true; + } + if (!in_array($type, [ + Lexer::TOKEN_HORIZONTAL_WS, + Lexer::TOKEN_PHPDOC_EOL, + ], true)) { + break; + } + } + + return false; + } + + /** + * Whether the given position is immediately surrounded by parenthesis. + */ + public function hasParentheses(int $startPos, int $endPos): bool + { + return $this->hasTokenImmediatelyBefore($startPos, Lexer::TOKEN_OPEN_PARENTHESES) + && $this->hasTokenImmediatelyAfter($endPos, Lexer::TOKEN_CLOSE_PARENTHESES); + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Parser/TypeParser.php b/vendor/phpstan/phpdoc-parser/src/Parser/TypeParser.php new file mode 100644 index 00000000..4b429809 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Parser/TypeParser.php @@ -0,0 +1,900 @@ +constExprParser = $constExprParser; + $this->quoteAwareConstExprString = $quoteAwareConstExprString; + $this->useLinesAttributes = $usedAttributes['lines'] ?? false; + $this->useIndexAttributes = $usedAttributes['indexes'] ?? false; + } + + /** @phpstan-impure */ + public function parse(TokenIterator $tokens): Ast\Type\TypeNode + { + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); + if ($tokens->isCurrentTokenType(Lexer::TOKEN_NULLABLE)) { + $type = $this->parseNullable($tokens); + + } else { + $type = $this->parseAtomic($tokens); + + if ($tokens->isCurrentTokenType(Lexer::TOKEN_UNION)) { + $type = $this->parseUnion($tokens, $type); + + } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_INTERSECTION)) { + $type = $this->parseIntersection($tokens, $type); + } + } + + return $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex); + } + + /** + * @internal + * @template T of Ast\Node + * @param T $type + * @return T + */ + public function enrichWithAttributes(TokenIterator $tokens, Ast\Node $type, int $startLine, int $startIndex): Ast\Node + { + $endLine = $tokens->currentTokenLine(); + $endIndex = $tokens->currentTokenIndex(); + + if ($this->useLinesAttributes) { + $type->setAttribute(Ast\Attribute::START_LINE, $startLine); + $type->setAttribute(Ast\Attribute::END_LINE, $endLine); + } + + if ($this->useIndexAttributes) { + $tokensArray = $tokens->getTokens(); + $endIndex--; + if ($tokensArray[$endIndex][Lexer::TYPE_OFFSET] === Lexer::TOKEN_HORIZONTAL_WS) { + $endIndex--; + } + + $type->setAttribute(Ast\Attribute::START_INDEX, $startIndex); + $type->setAttribute(Ast\Attribute::END_INDEX, $endIndex); + } + + return $type; + } + + /** @phpstan-impure */ + private function subParse(TokenIterator $tokens): Ast\Type\TypeNode + { + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); + + if ($tokens->isCurrentTokenType(Lexer::TOKEN_NULLABLE)) { + $type = $this->parseNullable($tokens); + + } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_VARIABLE)) { + $type = $this->parseConditionalForParameter($tokens, $tokens->currentTokenValue()); + + } else { + $type = $this->parseAtomic($tokens); + + if ($tokens->isCurrentTokenValue('is')) { + $type = $this->parseConditional($tokens, $type); + } else { + $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + + if ($tokens->isCurrentTokenType(Lexer::TOKEN_UNION)) { + $type = $this->subParseUnion($tokens, $type); + + } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_INTERSECTION)) { + $type = $this->subParseIntersection($tokens, $type); + } + } + } + + return $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex); + } + + + /** @phpstan-impure */ + private function parseAtomic(TokenIterator $tokens): Ast\Type\TypeNode + { + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); + + if ($tokens->tryConsumeTokenType(Lexer::TOKEN_OPEN_PARENTHESES)) { + $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + $type = $this->subParse($tokens); + $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + + $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_PARENTHESES); + + if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { + $type = $this->tryParseArrayOrOffsetAccess($tokens, $type); + } + + return $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex); + } + + if ($tokens->tryConsumeTokenType(Lexer::TOKEN_THIS_VARIABLE)) { + $type = $this->enrichWithAttributes($tokens, new Ast\Type\ThisTypeNode(), $startLine, $startIndex); + + if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { + $type = $this->tryParseArrayOrOffsetAccess($tokens, $type); + } + + return $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex); + } + + $currentTokenValue = $tokens->currentTokenValue(); + $tokens->pushSavePoint(); // because of ConstFetchNode + if ($tokens->tryConsumeTokenType(Lexer::TOKEN_IDENTIFIER)) { + $type = $this->enrichWithAttributes($tokens, new Ast\Type\IdentifierTypeNode($currentTokenValue), $startLine, $startIndex); + + if (!$tokens->isCurrentTokenType(Lexer::TOKEN_DOUBLE_COLON)) { + $tokens->dropSavePoint(); // because of ConstFetchNode + if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_ANGLE_BRACKET)) { + $tokens->pushSavePoint(); + + $isHtml = $this->isHtml($tokens); + $tokens->rollback(); + if ($isHtml) { + return $type; + } + + $type = $this->parseGeneric($tokens, $type); + + if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { + $type = $this->tryParseArrayOrOffsetAccess($tokens, $type); + } + } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_PARENTHESES)) { + $type = $this->tryParseCallable($tokens, $type); + + } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { + $type = $this->tryParseArrayOrOffsetAccess($tokens, $type); + + } elseif (in_array($type->name, ['array', 'list', 'object'], true) && $tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET) && !$tokens->isPrecededByHorizontalWhitespace()) { + if ($type->name === 'object') { + $type = $this->parseObjectShape($tokens); + } else { + $type = $this->parseArrayShape($tokens, $type, $type->name); + } + + if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { + $type = $this->tryParseArrayOrOffsetAccess( + $tokens, + $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex) + ); + } + } + + return $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex); + } else { + $tokens->rollback(); // because of ConstFetchNode + } + } else { + $tokens->dropSavePoint(); // because of ConstFetchNode + } + + $exception = new ParserException( + $tokens->currentTokenValue(), + $tokens->currentTokenType(), + $tokens->currentTokenOffset(), + Lexer::TOKEN_IDENTIFIER, + null, + $tokens->currentTokenLine() + ); + + if ($this->constExprParser === null) { + throw $exception; + } + + try { + $constExpr = $this->constExprParser->parse($tokens, true); + if ($constExpr instanceof Ast\ConstExpr\ConstExprArrayNode) { + throw $exception; + } + + return $this->enrichWithAttributes($tokens, new Ast\Type\ConstTypeNode($constExpr), $startLine, $startIndex); + } catch (LogicException $e) { + throw $exception; + } + } + + + /** @phpstan-impure */ + private function parseUnion(TokenIterator $tokens, Ast\Type\TypeNode $type): Ast\Type\TypeNode + { + $types = [$type]; + + while ($tokens->tryConsumeTokenType(Lexer::TOKEN_UNION)) { + $types[] = $this->parseAtomic($tokens); + } + + return new Ast\Type\UnionTypeNode($types); + } + + + /** @phpstan-impure */ + private function subParseUnion(TokenIterator $tokens, Ast\Type\TypeNode $type): Ast\Type\TypeNode + { + $types = [$type]; + + while ($tokens->tryConsumeTokenType(Lexer::TOKEN_UNION)) { + $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + $types[] = $this->parseAtomic($tokens); + $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + } + + return new Ast\Type\UnionTypeNode($types); + } + + + /** @phpstan-impure */ + private function parseIntersection(TokenIterator $tokens, Ast\Type\TypeNode $type): Ast\Type\TypeNode + { + $types = [$type]; + + while ($tokens->tryConsumeTokenType(Lexer::TOKEN_INTERSECTION)) { + $types[] = $this->parseAtomic($tokens); + } + + return new Ast\Type\IntersectionTypeNode($types); + } + + + /** @phpstan-impure */ + private function subParseIntersection(TokenIterator $tokens, Ast\Type\TypeNode $type): Ast\Type\TypeNode + { + $types = [$type]; + + while ($tokens->tryConsumeTokenType(Lexer::TOKEN_INTERSECTION)) { + $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + $types[] = $this->parseAtomic($tokens); + $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + } + + return new Ast\Type\IntersectionTypeNode($types); + } + + + /** @phpstan-impure */ + private function parseConditional(TokenIterator $tokens, Ast\Type\TypeNode $subjectType): Ast\Type\TypeNode + { + $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); + + $negated = false; + if ($tokens->isCurrentTokenValue('not')) { + $negated = true; + $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); + } + + $targetType = $this->parse($tokens); + + $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + $tokens->consumeTokenType(Lexer::TOKEN_NULLABLE); + $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + + $ifType = $this->parse($tokens); + + $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + $tokens->consumeTokenType(Lexer::TOKEN_COLON); + $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + + $elseType = $this->subParse($tokens); + + return new Ast\Type\ConditionalTypeNode($subjectType, $targetType, $ifType, $elseType, $negated); + } + + /** @phpstan-impure */ + private function parseConditionalForParameter(TokenIterator $tokens, string $parameterName): Ast\Type\TypeNode + { + $tokens->consumeTokenType(Lexer::TOKEN_VARIABLE); + $tokens->consumeTokenValue(Lexer::TOKEN_IDENTIFIER, 'is'); + + $negated = false; + if ($tokens->isCurrentTokenValue('not')) { + $negated = true; + $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); + } + + $targetType = $this->parse($tokens); + + $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + $tokens->consumeTokenType(Lexer::TOKEN_NULLABLE); + $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + + $ifType = $this->parse($tokens); + + $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + $tokens->consumeTokenType(Lexer::TOKEN_COLON); + $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + + $elseType = $this->subParse($tokens); + + return new Ast\Type\ConditionalTypeForParameterNode($parameterName, $targetType, $ifType, $elseType, $negated); + } + + + /** @phpstan-impure */ + private function parseNullable(TokenIterator $tokens): Ast\Type\TypeNode + { + $tokens->consumeTokenType(Lexer::TOKEN_NULLABLE); + + $type = $this->parseAtomic($tokens); + + return new Ast\Type\NullableTypeNode($type); + } + + /** @phpstan-impure */ + public function isHtml(TokenIterator $tokens): bool + { + $tokens->consumeTokenType(Lexer::TOKEN_OPEN_ANGLE_BRACKET); + + if (!$tokens->isCurrentTokenType(Lexer::TOKEN_IDENTIFIER)) { + return false; + } + + $htmlTagName = $tokens->currentTokenValue(); + + $tokens->next(); + + if (!$tokens->tryConsumeTokenType(Lexer::TOKEN_CLOSE_ANGLE_BRACKET)) { + return false; + } + + while (!$tokens->isCurrentTokenType(Lexer::TOKEN_END)) { + if ( + $tokens->tryConsumeTokenType(Lexer::TOKEN_OPEN_ANGLE_BRACKET) + && strpos($tokens->currentTokenValue(), '/' . $htmlTagName . '>') !== false + ) { + return true; + } + + $tokens->next(); + } + + return false; + } + + /** @phpstan-impure */ + public function parseGeneric(TokenIterator $tokens, Ast\Type\IdentifierTypeNode $baseType): Ast\Type\GenericTypeNode + { + $tokens->consumeTokenType(Lexer::TOKEN_OPEN_ANGLE_BRACKET); + $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + + $genericTypes = []; + $variances = []; + + [$genericTypes[], $variances[]] = $this->parseGenericTypeArgument($tokens); + + $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + + while ($tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA)) { + $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + if ($tokens->tryConsumeTokenType(Lexer::TOKEN_CLOSE_ANGLE_BRACKET)) { + // trailing comma case + $type = new Ast\Type\GenericTypeNode($baseType, $genericTypes, $variances); + $startLine = $baseType->getAttribute(Ast\Attribute::START_LINE); + $startIndex = $baseType->getAttribute(Ast\Attribute::START_INDEX); + if ($startLine !== null && $startIndex !== null) { + $type = $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex); + } + + return $type; + } + [$genericTypes[], $variances[]] = $this->parseGenericTypeArgument($tokens); + $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + } + + $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_ANGLE_BRACKET); + + $type = new Ast\Type\GenericTypeNode($baseType, $genericTypes, $variances); + $startLine = $baseType->getAttribute(Ast\Attribute::START_LINE); + $startIndex = $baseType->getAttribute(Ast\Attribute::START_INDEX); + if ($startLine !== null && $startIndex !== null) { + $type = $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex); + } + + return $type; + } + + + /** + * @phpstan-impure + * @return array{Ast\Type\TypeNode, Ast\Type\GenericTypeNode::VARIANCE_*} + */ + public function parseGenericTypeArgument(TokenIterator $tokens): array + { + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); + if ($tokens->tryConsumeTokenType(Lexer::TOKEN_WILDCARD)) { + return [ + $this->enrichWithAttributes($tokens, new Ast\Type\IdentifierTypeNode('mixed'), $startLine, $startIndex), + Ast\Type\GenericTypeNode::VARIANCE_BIVARIANT, + ]; + } + + if ($tokens->tryConsumeTokenValue('contravariant')) { + $variance = Ast\Type\GenericTypeNode::VARIANCE_CONTRAVARIANT; + } elseif ($tokens->tryConsumeTokenValue('covariant')) { + $variance = Ast\Type\GenericTypeNode::VARIANCE_COVARIANT; + } else { + $variance = Ast\Type\GenericTypeNode::VARIANCE_INVARIANT; + } + + $type = $this->parse($tokens); + return [$type, $variance]; + } + + + /** @phpstan-impure */ + private function parseCallable(TokenIterator $tokens, Ast\Type\IdentifierTypeNode $identifier): Ast\Type\TypeNode + { + $tokens->consumeTokenType(Lexer::TOKEN_OPEN_PARENTHESES); + $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + + $parameters = []; + if (!$tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PARENTHESES)) { + $parameters[] = $this->parseCallableParameter($tokens); + $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + while ($tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA)) { + $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + if ($tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PARENTHESES)) { + break; + } + $parameters[] = $this->parseCallableParameter($tokens); + $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + } + } + + $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_PARENTHESES); + $tokens->consumeTokenType(Lexer::TOKEN_COLON); + + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); + $returnType = $this->enrichWithAttributes($tokens, $this->parseCallableReturnType($tokens), $startLine, $startIndex); + + return new Ast\Type\CallableTypeNode($identifier, $parameters, $returnType); + } + + + /** @phpstan-impure */ + private function parseCallableParameter(TokenIterator $tokens): Ast\Type\CallableTypeParameterNode + { + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); + $type = $this->parse($tokens); + $isReference = $tokens->tryConsumeTokenType(Lexer::TOKEN_REFERENCE); + $isVariadic = $tokens->tryConsumeTokenType(Lexer::TOKEN_VARIADIC); + + if ($tokens->isCurrentTokenType(Lexer::TOKEN_VARIABLE)) { + $parameterName = $tokens->currentTokenValue(); + $tokens->consumeTokenType(Lexer::TOKEN_VARIABLE); + + } else { + $parameterName = ''; + } + + $isOptional = $tokens->tryConsumeTokenType(Lexer::TOKEN_EQUAL); + return $this->enrichWithAttributes( + $tokens, + new Ast\Type\CallableTypeParameterNode($type, $isReference, $isVariadic, $parameterName, $isOptional), + $startLine, + $startIndex + ); + } + + + /** @phpstan-impure */ + private function parseCallableReturnType(TokenIterator $tokens): Ast\Type\TypeNode + { + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); + if ($tokens->isCurrentTokenType(Lexer::TOKEN_NULLABLE)) { + return $this->parseNullable($tokens); + + } elseif ($tokens->tryConsumeTokenType(Lexer::TOKEN_OPEN_PARENTHESES)) { + $type = $this->parse($tokens); + $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_PARENTHESES); + if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { + $type = $this->tryParseArrayOrOffsetAccess($tokens, $type); + } + + return $type; + } elseif ($tokens->tryConsumeTokenType(Lexer::TOKEN_THIS_VARIABLE)) { + $type = new Ast\Type\ThisTypeNode(); + if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { + $type = $this->tryParseArrayOrOffsetAccess($tokens, $this->enrichWithAttributes( + $tokens, + $type, + $startLine, + $startIndex + )); + } + + return $type; + } else { + $currentTokenValue = $tokens->currentTokenValue(); + $tokens->pushSavePoint(); // because of ConstFetchNode + if ($tokens->tryConsumeTokenType(Lexer::TOKEN_IDENTIFIER)) { + $type = new Ast\Type\IdentifierTypeNode($currentTokenValue); + + if (!$tokens->isCurrentTokenType(Lexer::TOKEN_DOUBLE_COLON)) { + if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_ANGLE_BRACKET)) { + $type = $this->parseGeneric( + $tokens, + $this->enrichWithAttributes( + $tokens, + $type, + $startLine, + $startIndex + ) + ); + if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { + $type = $this->tryParseArrayOrOffsetAccess($tokens, $this->enrichWithAttributes( + $tokens, + $type, + $startLine, + $startIndex + )); + } + + } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { + $type = $this->tryParseArrayOrOffsetAccess($tokens, $this->enrichWithAttributes( + $tokens, + $type, + $startLine, + $startIndex + )); + + } elseif (in_array($type->name, ['array', 'list', 'object'], true) && $tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET) && !$tokens->isPrecededByHorizontalWhitespace()) { + if ($type->name === 'object') { + $type = $this->parseObjectShape($tokens); + } else { + $type = $this->parseArrayShape($tokens, $this->enrichWithAttributes( + $tokens, + $type, + $startLine, + $startIndex + ), $type->name); + } + + if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { + $type = $this->tryParseArrayOrOffsetAccess($tokens, $this->enrichWithAttributes( + $tokens, + $type, + $startLine, + $startIndex + )); + } + } + + return $type; + } else { + $tokens->rollback(); // because of ConstFetchNode + } + } else { + $tokens->dropSavePoint(); // because of ConstFetchNode + } + } + + $exception = new ParserException( + $tokens->currentTokenValue(), + $tokens->currentTokenType(), + $tokens->currentTokenOffset(), + Lexer::TOKEN_IDENTIFIER, + null, + $tokens->currentTokenLine() + ); + + if ($this->constExprParser === null) { + throw $exception; + } + + try { + $constExpr = $this->constExprParser->parse($tokens, true); + if ($constExpr instanceof Ast\ConstExpr\ConstExprArrayNode) { + throw $exception; + } + + $type = new Ast\Type\ConstTypeNode($constExpr); + if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { + $type = $this->tryParseArrayOrOffsetAccess($tokens, $this->enrichWithAttributes( + $tokens, + $type, + $startLine, + $startIndex + )); + } + + return $type; + } catch (LogicException $e) { + throw $exception; + } + } + + + /** @phpstan-impure */ + private function tryParseCallable(TokenIterator $tokens, Ast\Type\IdentifierTypeNode $identifier): Ast\Type\TypeNode + { + try { + $tokens->pushSavePoint(); + $type = $this->parseCallable($tokens, $identifier); + $tokens->dropSavePoint(); + + } catch (ParserException $e) { + $tokens->rollback(); + $type = $identifier; + } + + return $type; + } + + + /** @phpstan-impure */ + private function tryParseArrayOrOffsetAccess(TokenIterator $tokens, Ast\Type\TypeNode $type): Ast\Type\TypeNode + { + $startLine = $type->getAttribute(Ast\Attribute::START_LINE); + $startIndex = $type->getAttribute(Ast\Attribute::START_INDEX); + try { + while ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { + $tokens->pushSavePoint(); + + $canBeOffsetAccessType = !$tokens->isPrecededByHorizontalWhitespace(); + $tokens->consumeTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET); + + if ($canBeOffsetAccessType && !$tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_SQUARE_BRACKET)) { + $offset = $this->parse($tokens); + $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_SQUARE_BRACKET); + $tokens->dropSavePoint(); + $type = new Ast\Type\OffsetAccessTypeNode($type, $offset); + + if ($startLine !== null && $startIndex !== null) { + $type = $this->enrichWithAttributes( + $tokens, + $type, + $startLine, + $startIndex + ); + } + } else { + $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_SQUARE_BRACKET); + $tokens->dropSavePoint(); + $type = new Ast\Type\ArrayTypeNode($type); + + if ($startLine !== null && $startIndex !== null) { + $type = $this->enrichWithAttributes( + $tokens, + $type, + $startLine, + $startIndex + ); + } + } + } + + } catch (ParserException $e) { + $tokens->rollback(); + } + + return $type; + } + + + /** + * @phpstan-impure + * @param Ast\Type\ArrayShapeNode::KIND_* $kind + */ + private function parseArrayShape(TokenIterator $tokens, Ast\Type\TypeNode $type, string $kind): Ast\Type\ArrayShapeNode + { + $tokens->consumeTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET); + + $items = []; + $sealed = true; + + do { + $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + + if ($tokens->tryConsumeTokenType(Lexer::TOKEN_CLOSE_CURLY_BRACKET)) { + return new Ast\Type\ArrayShapeNode($items, true, $kind); + } + + if ($tokens->tryConsumeTokenType(Lexer::TOKEN_VARIADIC)) { + $sealed = false; + $tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA); + break; + } + + $items[] = $this->parseArrayShapeItem($tokens); + + $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + } while ($tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA)); + + $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_CURLY_BRACKET); + + return new Ast\Type\ArrayShapeNode($items, $sealed, $kind); + } + + + /** @phpstan-impure */ + private function parseArrayShapeItem(TokenIterator $tokens): Ast\Type\ArrayShapeItemNode + { + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); + try { + $tokens->pushSavePoint(); + $key = $this->parseArrayShapeKey($tokens); + $optional = $tokens->tryConsumeTokenType(Lexer::TOKEN_NULLABLE); + $tokens->consumeTokenType(Lexer::TOKEN_COLON); + $value = $this->parse($tokens); + $tokens->dropSavePoint(); + + return $this->enrichWithAttributes( + $tokens, + new Ast\Type\ArrayShapeItemNode($key, $optional, $value), + $startLine, + $startIndex + ); + } catch (ParserException $e) { + $tokens->rollback(); + $value = $this->parse($tokens); + + return $this->enrichWithAttributes( + $tokens, + new Ast\Type\ArrayShapeItemNode(null, false, $value), + $startLine, + $startIndex + ); + } + } + + /** + * @phpstan-impure + * @return Ast\ConstExpr\ConstExprIntegerNode|Ast\ConstExpr\ConstExprStringNode|Ast\Type\IdentifierTypeNode + */ + private function parseArrayShapeKey(TokenIterator $tokens) + { + $startIndex = $tokens->currentTokenIndex(); + $startLine = $tokens->currentTokenLine(); + + if ($tokens->isCurrentTokenType(Lexer::TOKEN_INTEGER)) { + $key = new Ast\ConstExpr\ConstExprIntegerNode(str_replace('_', '', $tokens->currentTokenValue())); + $tokens->next(); + + } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_SINGLE_QUOTED_STRING)) { + if ($this->quoteAwareConstExprString) { + $key = new Ast\ConstExpr\QuoteAwareConstExprStringNode(StringUnescaper::unescapeString($tokens->currentTokenValue()), Ast\ConstExpr\QuoteAwareConstExprStringNode::SINGLE_QUOTED); + } else { + $key = new Ast\ConstExpr\ConstExprStringNode(trim($tokens->currentTokenValue(), "'")); + } + $tokens->next(); + + } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_DOUBLE_QUOTED_STRING)) { + if ($this->quoteAwareConstExprString) { + $key = new Ast\ConstExpr\QuoteAwareConstExprStringNode(StringUnescaper::unescapeString($tokens->currentTokenValue()), Ast\ConstExpr\QuoteAwareConstExprStringNode::DOUBLE_QUOTED); + } else { + $key = new Ast\ConstExpr\ConstExprStringNode(trim($tokens->currentTokenValue(), '"')); + } + + $tokens->next(); + + } else { + $key = new Ast\Type\IdentifierTypeNode($tokens->currentTokenValue()); + $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); + } + + return $this->enrichWithAttributes( + $tokens, + $key, + $startLine, + $startIndex + ); + } + + /** + * @phpstan-impure + */ + private function parseObjectShape(TokenIterator $tokens): Ast\Type\ObjectShapeNode + { + $tokens->consumeTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET); + + $items = []; + + do { + $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + + if ($tokens->tryConsumeTokenType(Lexer::TOKEN_CLOSE_CURLY_BRACKET)) { + return new Ast\Type\ObjectShapeNode($items); + } + + $items[] = $this->parseObjectShapeItem($tokens); + + $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + } while ($tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA)); + + $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_CURLY_BRACKET); + + return new Ast\Type\ObjectShapeNode($items); + } + + /** @phpstan-impure */ + private function parseObjectShapeItem(TokenIterator $tokens): Ast\Type\ObjectShapeItemNode + { + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); + + $key = $this->parseObjectShapeKey($tokens); + $optional = $tokens->tryConsumeTokenType(Lexer::TOKEN_NULLABLE); + $tokens->consumeTokenType(Lexer::TOKEN_COLON); + $value = $this->parse($tokens); + + return $this->enrichWithAttributes($tokens, new Ast\Type\ObjectShapeItemNode($key, $optional, $value), $startLine, $startIndex); + } + + /** + * @phpstan-impure + * @return Ast\ConstExpr\ConstExprStringNode|Ast\Type\IdentifierTypeNode + */ + private function parseObjectShapeKey(TokenIterator $tokens) + { + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); + + if ($tokens->isCurrentTokenType(Lexer::TOKEN_SINGLE_QUOTED_STRING)) { + if ($this->quoteAwareConstExprString) { + $key = new Ast\ConstExpr\QuoteAwareConstExprStringNode(StringUnescaper::unescapeString($tokens->currentTokenValue()), Ast\ConstExpr\QuoteAwareConstExprStringNode::SINGLE_QUOTED); + } else { + $key = new Ast\ConstExpr\ConstExprStringNode(trim($tokens->currentTokenValue(), "'")); + } + $tokens->next(); + + } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_DOUBLE_QUOTED_STRING)) { + if ($this->quoteAwareConstExprString) { + $key = new Ast\ConstExpr\QuoteAwareConstExprStringNode(StringUnescaper::unescapeString($tokens->currentTokenValue()), Ast\ConstExpr\QuoteAwareConstExprStringNode::DOUBLE_QUOTED); + } else { + $key = new Ast\ConstExpr\ConstExprStringNode(trim($tokens->currentTokenValue(), '"')); + } + $tokens->next(); + + } else { + $key = new Ast\Type\IdentifierTypeNode($tokens->currentTokenValue()); + $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); + } + + return $this->enrichWithAttributes($tokens, $key, $startLine, $startIndex); + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Printer/DiffElem.php b/vendor/phpstan/phpdoc-parser/src/Printer/DiffElem.php new file mode 100644 index 00000000..2684dfc7 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Printer/DiffElem.php @@ -0,0 +1,44 @@ +type = $type; + $this->old = $old; + $this->new = $new; + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Printer/Differ.php b/vendor/phpstan/phpdoc-parser/src/Printer/Differ.php new file mode 100644 index 00000000..ab10be59 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Printer/Differ.php @@ -0,0 +1,196 @@ +isEqual = $isEqual; + } + + /** + * Calculate diff (edit script) from $old to $new. + * + * @param T[] $old Original array + * @param T[] $new New array + * + * @return DiffElem[] Diff (edit script) + */ + public function diff(array $old, array $new): array + { + [$trace, $x, $y] = $this->calculateTrace($old, $new); + return $this->extractDiff($trace, $x, $y, $old, $new); + } + + /** + * Calculate diff, including "replace" operations. + * + * If a sequence of remove operations is followed by the same number of add operations, these + * will be coalesced into replace operations. + * + * @param T[] $old Original array + * @param T[] $new New array + * + * @return DiffElem[] Diff (edit script), including replace operations + */ + public function diffWithReplacements(array $old, array $new): array + { + return $this->coalesceReplacements($this->diff($old, $new)); + } + + /** + * @param T[] $old + * @param T[] $new + * @return array{array>, int, int} + */ + private function calculateTrace(array $old, array $new): array + { + $n = count($old); + $m = count($new); + $max = $n + $m; + $v = [1 => 0]; + $trace = []; + for ($d = 0; $d <= $max; $d++) { + $trace[] = $v; + for ($k = -$d; $k <= $d; $k += 2) { + if ($k === -$d || ($k !== $d && $v[$k - 1] < $v[$k + 1])) { + $x = $v[$k + 1]; + } else { + $x = $v[$k - 1] + 1; + } + + $y = $x - $k; + while ($x < $n && $y < $m && ($this->isEqual)($old[$x], $new[$y])) { + $x++; + $y++; + } + + $v[$k] = $x; + if ($x >= $n && $y >= $m) { + return [$trace, $x, $y]; + } + } + } + throw new Exception('Should not happen'); + } + + /** + * @param array> $trace + * @param T[] $old + * @param T[] $new + * @return DiffElem[] + */ + private function extractDiff(array $trace, int $x, int $y, array $old, array $new): array + { + $result = []; + for ($d = count($trace) - 1; $d >= 0; $d--) { + $v = $trace[$d]; + $k = $x - $y; + + if ($k === -$d || ($k !== $d && $v[$k - 1] < $v[$k + 1])) { + $prevK = $k + 1; + } else { + $prevK = $k - 1; + } + + $prevX = $v[$prevK]; + $prevY = $prevX - $prevK; + + while ($x > $prevX && $y > $prevY) { + $result[] = new DiffElem(DiffElem::TYPE_KEEP, $old[$x - 1], $new[$y - 1]); + $x--; + $y--; + } + + if ($d === 0) { + break; + } + + while ($x > $prevX) { + $result[] = new DiffElem(DiffElem::TYPE_REMOVE, $old[$x - 1], null); + $x--; + } + + while ($y > $prevY) { + $result[] = new DiffElem(DiffElem::TYPE_ADD, null, $new[$y - 1]); + $y--; + } + } + return array_reverse($result); + } + + /** + * Coalesce equal-length sequences of remove+add into a replace operation. + * + * @param DiffElem[] $diff + * @return DiffElem[] + */ + private function coalesceReplacements(array $diff): array + { + $newDiff = []; + $c = count($diff); + for ($i = 0; $i < $c; $i++) { + $diffType = $diff[$i]->type; + if ($diffType !== DiffElem::TYPE_REMOVE) { + $newDiff[] = $diff[$i]; + continue; + } + + $j = $i; + while ($j < $c && $diff[$j]->type === DiffElem::TYPE_REMOVE) { + $j++; + } + + $k = $j; + while ($k < $c && $diff[$k]->type === DiffElem::TYPE_ADD) { + $k++; + } + + if ($j - $i === $k - $j) { + $len = $j - $i; + for ($n = 0; $n < $len; $n++) { + $newDiff[] = new DiffElem( + DiffElem::TYPE_REPLACE, + $diff[$i + $n]->old, + $diff[$j + $n]->new + ); + } + } else { + for (; $i < $k; $i++) { + $newDiff[] = $diff[$i]; + } + } + $i = $k - 1; + } + return $newDiff; + } + +} diff --git a/vendor/phpstan/phpdoc-parser/src/Printer/Printer.php b/vendor/phpstan/phpdoc-parser/src/Printer/Printer.php new file mode 100644 index 00000000..b65d83aa --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Printer/Printer.php @@ -0,0 +1,803 @@ + */ + private $differ; + + /** + * Map From "{$class}->{$subNode}" to string that should be inserted + * between elements of this list subnode + * + * @var array + */ + private $listInsertionMap = [ + PhpDocNode::class . '->children' => "\n * ", + UnionTypeNode::class . '->types' => '|', + IntersectionTypeNode::class . '->types' => '&', + ArrayShapeNode::class . '->items' => ', ', + ObjectShapeNode::class . '->items' => ', ', + CallableTypeNode::class . '->parameters' => ', ', + GenericTypeNode::class . '->genericTypes' => ', ', + ConstExprArrayNode::class . '->items' => ', ', + MethodTagValueNode::class . '->parameters' => ', ', + ]; + + /** + * [$find, $extraLeft, $extraRight] + * + * @var array + */ + private $emptyListInsertionMap = [ + CallableTypeNode::class . '->parameters' => ['(', '', ''], + ArrayShapeNode::class . '->items' => ['{', '', ''], + ObjectShapeNode::class . '->items' => ['{', '', ''], + ]; + + /** @var array>> */ + private $parenthesesMap = [ + CallableTypeNode::class . '->returnType' => [ + CallableTypeNode::class, + UnionTypeNode::class, + IntersectionTypeNode::class, + ], + ArrayTypeNode::class . '->type' => [ + CallableTypeNode::class, + UnionTypeNode::class, + IntersectionTypeNode::class, + ConstTypeNode::class, + NullableTypeNode::class, + ], + OffsetAccessTypeNode::class . '->type' => [ + CallableTypeNode::class, + UnionTypeNode::class, + IntersectionTypeNode::class, + ConstTypeNode::class, + NullableTypeNode::class, + ], + ]; + + /** @var array>> */ + private $parenthesesListMap = [ + IntersectionTypeNode::class . '->types' => [ + IntersectionTypeNode::class, + UnionTypeNode::class, + NullableTypeNode::class, + ], + UnionTypeNode::class . '->types' => [ + IntersectionTypeNode::class, + UnionTypeNode::class, + NullableTypeNode::class, + ], + ]; + + public function printFormatPreserving(PhpDocNode $node, PhpDocNode $originalNode, TokenIterator $originalTokens): string + { + $this->differ = new Differ(static function ($a, $b) { + if ($a instanceof Node && $b instanceof Node) { + return $a === $b->getAttribute(Attribute::ORIGINAL_NODE); + } + + return false; + }); + + $tokenIndex = 0; + $result = $this->printArrayFormatPreserving( + $node->children, + $originalNode->children, + $originalTokens, + $tokenIndex, + PhpDocNode::class, + 'children' + ); + if ($result !== null) { + return $result . $originalTokens->getContentBetween($tokenIndex, $originalTokens->getTokenCount()); + } + + return $this->print($node); + } + + public function print(Node $node): string + { + if ($node instanceof PhpDocNode) { + return "/**\n *" . implode("\n *", array_map( + function (PhpDocChildNode $child): string { + $s = $this->print($child); + return $s === '' ? '' : ' ' . $s; + }, + $node->children + )) . "\n */"; + } + if ($node instanceof PhpDocTextNode) { + return $node->text; + } + if ($node instanceof PhpDocTagNode) { + return trim(sprintf('%s %s', $node->name, $this->print($node->value))); + } + if ($node instanceof PhpDocTagValueNode) { + return $this->printTagValue($node); + } + if ($node instanceof TypeNode) { + return $this->printType($node); + } + if ($node instanceof ConstExprNode) { + return $this->printConstExpr($node); + } + if ($node instanceof MethodTagValueParameterNode) { + $type = $node->type !== null ? $this->print($node->type) . ' ' : ''; + $isReference = $node->isReference ? '&' : ''; + $isVariadic = $node->isVariadic ? '...' : ''; + $default = $node->defaultValue !== null ? ' = ' . $this->print($node->defaultValue) : ''; + return "{$type}{$isReference}{$isVariadic}{$node->parameterName}{$default}"; + } + if ($node instanceof CallableTypeParameterNode) { + $type = $this->print($node->type) . ' '; + $isReference = $node->isReference ? '&' : ''; + $isVariadic = $node->isVariadic ? '...' : ''; + $isOptional = $node->isOptional ? '=' : ''; + return trim("{$type}{$isReference}{$isVariadic}{$node->parameterName}") . $isOptional; + } + + throw new LogicException(sprintf('Unknown node type %s', get_class($node))); + } + + private function printTagValue(PhpDocTagValueNode $node): string + { + // only nodes that contain another node are handled here + // the rest falls back on (string) $node + + if ($node instanceof AssertTagMethodValueNode) { + $isNegated = $node->isNegated ? '!' : ''; + $isEquality = $node->isEquality ? '=' : ''; + $type = $this->printType($node->type); + return trim("{$isNegated}{$isEquality}{$type} {$node->parameter}->{$node->method}() {$node->description}"); + } + if ($node instanceof AssertTagPropertyValueNode) { + $isNegated = $node->isNegated ? '!' : ''; + $isEquality = $node->isEquality ? '=' : ''; + $type = $this->printType($node->type); + return trim("{$isNegated}{$isEquality}{$type} {$node->parameter}->{$node->property} {$node->description}"); + } + if ($node instanceof AssertTagValueNode) { + $isNegated = $node->isNegated ? '!' : ''; + $isEquality = $node->isEquality ? '=' : ''; + $type = $this->printType($node->type); + return trim("{$isNegated}{$isEquality}{$type} {$node->parameter} {$node->description}"); + } + if ($node instanceof ExtendsTagValueNode || $node instanceof ImplementsTagValueNode) { + $type = $this->printType($node->type); + return trim("{$type} {$node->description}"); + } + if ($node instanceof MethodTagValueNode) { + $static = $node->isStatic ? 'static ' : ''; + $returnType = $node->returnType !== null ? $this->printType($node->returnType) . ' ' : ''; + $parameters = implode(', ', array_map(function (MethodTagValueParameterNode $parameter): string { + return $this->print($parameter); + }, $node->parameters)); + $description = $node->description !== '' ? " {$node->description}" : ''; + $templateTypes = count($node->templateTypes) > 0 ? '<' . implode(', ', array_map(function (TemplateTagValueNode $templateTag): string { + return $this->print($templateTag); + }, $node->templateTypes)) . '>' : ''; + return "{$static}{$returnType}{$node->methodName}{$templateTypes}({$parameters}){$description}"; + } + if ($node instanceof MixinTagValueNode) { + $type = $this->printType($node->type); + return trim("{$type} {$node->description}"); + } + if ($node instanceof ParamOutTagValueNode) { + $type = $this->printType($node->type); + return trim("{$type} {$node->parameterName} {$node->description}"); + } + if ($node instanceof ParamTagValueNode) { + $reference = $node->isReference ? '&' : ''; + $variadic = $node->isVariadic ? '...' : ''; + $type = $this->printType($node->type); + return trim("{$type} {$reference}{$variadic}{$node->parameterName} {$node->description}"); + } + if ($node instanceof PropertyTagValueNode) { + $type = $this->printType($node->type); + return trim("{$type} {$node->propertyName} {$node->description}"); + } + if ($node instanceof ReturnTagValueNode) { + $type = $this->printType($node->type); + return trim("{$type} {$node->description}"); + } + if ($node instanceof SelfOutTagValueNode) { + $type = $this->printType($node->type); + return trim($type . ' ' . $node->description); + } + if ($node instanceof TemplateTagValueNode) { + $bound = $node->bound !== null ? ' of ' . $this->printType($node->bound) : ''; + $default = $node->default !== null ? ' = ' . $this->printType($node->default) : ''; + return trim("{$node->name}{$bound}{$default} {$node->description}"); + } + if ($node instanceof ThrowsTagValueNode) { + $type = $this->printType($node->type); + return trim("{$type} {$node->description}"); + } + if ($node instanceof TypeAliasImportTagValueNode) { + return trim( + "{$node->importedAlias} from " . $this->printType($node->importedFrom) + . ($node->importedAs !== null ? " as {$node->importedAs}" : '') + ); + } + if ($node instanceof TypeAliasTagValueNode) { + $type = $this->printType($node->type); + return trim("{$node->alias} {$type}"); + } + if ($node instanceof UsesTagValueNode) { + $type = $this->printType($node->type); + return trim("{$type} {$node->description}"); + } + if ($node instanceof VarTagValueNode) { + $type = $this->printType($node->type); + return trim("{$type} " . trim("{$node->variableName} {$node->description}")); + } + + return (string) $node; + } + + private function printType(TypeNode $node): string + { + if ($node instanceof ArrayShapeNode) { + $items = array_map(function (ArrayShapeItemNode $item): string { + return $this->printType($item); + }, $node->items); + + if (! $node->sealed) { + $items[] = '...'; + } + + return $node->kind . '{' . implode(', ', $items) . '}'; + } + if ($node instanceof ArrayShapeItemNode) { + if ($node->keyName !== null) { + return sprintf( + '%s%s: %s', + $this->print($node->keyName), + $node->optional ? '?' : '', + $this->printType($node->valueType) + ); + } + + return $this->printType($node->valueType); + } + if ($node instanceof ArrayTypeNode) { + return $this->printOffsetAccessType($node->type) . '[]'; + } + if ($node instanceof CallableTypeNode) { + if ($node->returnType instanceof CallableTypeNode || $node->returnType instanceof UnionTypeNode || $node->returnType instanceof IntersectionTypeNode) { + $returnType = $this->wrapInParentheses($node->returnType); + } else { + $returnType = $this->printType($node->returnType); + } + $parameters = implode(', ', array_map(function (CallableTypeParameterNode $parameterNode): string { + return $this->print($parameterNode); + }, $node->parameters)); + return "{$node->identifier}({$parameters}): {$returnType}"; + } + if ($node instanceof ConditionalTypeForParameterNode) { + return sprintf( + '(%s %s %s ? %s : %s)', + $node->parameterName, + $node->negated ? 'is not' : 'is', + $this->printType($node->targetType), + $this->printType($node->if), + $this->printType($node->else) + ); + } + if ($node instanceof ConditionalTypeNode) { + return sprintf( + '(%s %s %s ? %s : %s)', + $this->printType($node->subjectType), + $node->negated ? 'is not' : 'is', + $this->printType($node->targetType), + $this->printType($node->if), + $this->printType($node->else) + ); + } + if ($node instanceof ConstTypeNode) { + return $this->printConstExpr($node->constExpr); + } + if ($node instanceof GenericTypeNode) { + $genericTypes = []; + + foreach ($node->genericTypes as $index => $type) { + $variance = $node->variances[$index] ?? GenericTypeNode::VARIANCE_INVARIANT; + if ($variance === GenericTypeNode::VARIANCE_INVARIANT) { + $genericTypes[] = $this->printType($type); + } elseif ($variance === GenericTypeNode::VARIANCE_BIVARIANT) { + $genericTypes[] = '*'; + } else { + $genericTypes[] = sprintf('%s %s', $variance, $this->print($type)); + } + } + + return $node->type . '<' . implode(', ', $genericTypes) . '>'; + } + if ($node instanceof IdentifierTypeNode) { + return $node->name; + } + if ($node instanceof IntersectionTypeNode || $node instanceof UnionTypeNode) { + $items = []; + foreach ($node->types as $type) { + if ( + $type instanceof IntersectionTypeNode + || $type instanceof UnionTypeNode + || $type instanceof NullableTypeNode + ) { + $items[] = $this->wrapInParentheses($type); + continue; + } + + $items[] = $this->printType($type); + } + + return implode($node instanceof IntersectionTypeNode ? '&' : '|', $items); + } + if ($node instanceof InvalidTypeNode) { + return (string) $node; + } + if ($node instanceof NullableTypeNode) { + if ($node->type instanceof IntersectionTypeNode || $node->type instanceof UnionTypeNode) { + return '?(' . $this->printType($node->type) . ')'; + } + + return '?' . $this->printType($node->type); + } + if ($node instanceof ObjectShapeNode) { + $items = array_map(function (ObjectShapeItemNode $item): string { + return $this->printType($item); + }, $node->items); + + return 'object{' . implode(', ', $items) . '}'; + } + if ($node instanceof ObjectShapeItemNode) { + if ($node->keyName !== null) { + return sprintf( + '%s%s: %s', + $this->print($node->keyName), + $node->optional ? '?' : '', + $this->printType($node->valueType) + ); + } + + return $this->printType($node->valueType); + } + if ($node instanceof OffsetAccessTypeNode) { + return $this->printOffsetAccessType($node->type) . '[' . $this->printType($node->offset) . ']'; + } + if ($node instanceof ThisTypeNode) { + return (string) $node; + } + + throw new LogicException(sprintf('Unknown node type %s', get_class($node))); + } + + private function wrapInParentheses(TypeNode $node): string + { + return '(' . $this->printType($node) . ')'; + } + + private function printOffsetAccessType(TypeNode $type): string + { + if ( + $type instanceof CallableTypeNode + || $type instanceof UnionTypeNode + || $type instanceof IntersectionTypeNode + || $type instanceof ConstTypeNode + || $type instanceof NullableTypeNode + ) { + return $this->wrapInParentheses($type); + } + + return $this->printType($type); + } + + private function printConstExpr(ConstExprNode $node): string + { + // this is fine - ConstExprNode classes do not contain nodes that need smart printer logic + return (string) $node; + } + + /** + * @param Node[] $nodes + * @param Node[] $originalNodes + */ + private function printArrayFormatPreserving(array $nodes, array $originalNodes, TokenIterator $originalTokens, int &$tokenIndex, string $parentNodeClass, string $subNodeName): ?string + { + $diff = $this->differ->diffWithReplacements($originalNodes, $nodes); + $mapKey = $parentNodeClass . '->' . $subNodeName; + $insertStr = $this->listInsertionMap[$mapKey] ?? null; + $result = ''; + $beforeFirstKeepOrReplace = true; + $delayedAdd = []; + + $insertNewline = false; + [$isMultiline, $beforeAsteriskIndent, $afterAsteriskIndent] = $this->isMultiline($tokenIndex, $originalNodes, $originalTokens); + + if ($insertStr === "\n * ") { + $insertStr = sprintf("\n%s*%s", $beforeAsteriskIndent, $afterAsteriskIndent); + } + + foreach ($diff as $i => $diffElem) { + $diffType = $diffElem->type; + $newNode = $diffElem->new; + $originalNode = $diffElem->old; + if ($diffType === DiffElem::TYPE_KEEP || $diffType === DiffElem::TYPE_REPLACE) { + $beforeFirstKeepOrReplace = false; + if (!$newNode instanceof Node || !$originalNode instanceof Node) { + return null; + } + $itemStartPos = $originalNode->getAttribute(Attribute::START_INDEX); + $itemEndPos = $originalNode->getAttribute(Attribute::END_INDEX); + if ($itemStartPos < 0 || $itemEndPos < 0 || $itemStartPos < $tokenIndex) { + throw new LogicException(); + } + + $result .= $originalTokens->getContentBetween($tokenIndex, $itemStartPos); + + if (count($delayedAdd) > 0) { + foreach ($delayedAdd as $delayedAddNode) { + $parenthesesNeeded = isset($this->parenthesesListMap[$mapKey]) + && in_array(get_class($delayedAddNode), $this->parenthesesListMap[$mapKey], true); + if ($parenthesesNeeded) { + $result .= '('; + } + $result .= $this->printNodeFormatPreserving($delayedAddNode, $originalTokens); + if ($parenthesesNeeded) { + $result .= ')'; + } + + if ($insertNewline) { + $result .= $insertStr . sprintf("\n%s*%s", $beforeAsteriskIndent, $afterAsteriskIndent); + } else { + $result .= $insertStr; + } + } + + $delayedAdd = []; + } + + $parenthesesNeeded = isset($this->parenthesesListMap[$mapKey]) + && in_array(get_class($newNode), $this->parenthesesListMap[$mapKey], true) + && !in_array(get_class($originalNode), $this->parenthesesListMap[$mapKey], true); + $addParentheses = $parenthesesNeeded && !$originalTokens->hasParentheses($itemStartPos, $itemEndPos); + if ($addParentheses) { + $result .= '('; + } + + $result .= $this->printNodeFormatPreserving($newNode, $originalTokens); + if ($addParentheses) { + $result .= ')'; + } + $tokenIndex = $itemEndPos + 1; + + } elseif ($diffType === DiffElem::TYPE_ADD) { + if ($insertStr === null) { + return null; + } + if (!$newNode instanceof Node) { + return null; + } + + if ($insertStr === ', ' && $isMultiline) { + $insertStr = ','; + $insertNewline = true; + } + + if ($beforeFirstKeepOrReplace) { + // Will be inserted at the next "replace" or "keep" element + $delayedAdd[] = $newNode; + continue; + } + + $itemEndPos = $tokenIndex - 1; + if ($insertNewline) { + $result .= $insertStr . sprintf("\n%s*%s", $beforeAsteriskIndent, $afterAsteriskIndent); + } else { + $result .= $insertStr; + } + + $parenthesesNeeded = isset($this->parenthesesListMap[$mapKey]) + && in_array(get_class($newNode), $this->parenthesesListMap[$mapKey], true); + if ($parenthesesNeeded) { + $result .= '('; + } + + $result .= $this->printNodeFormatPreserving($newNode, $originalTokens); + if ($parenthesesNeeded) { + $result .= ')'; + } + + $tokenIndex = $itemEndPos + 1; + + } elseif ($diffType === DiffElem::TYPE_REMOVE) { + if (!$originalNode instanceof Node) { + return null; + } + + $itemStartPos = $originalNode->getAttribute(Attribute::START_INDEX); + $itemEndPos = $originalNode->getAttribute(Attribute::END_INDEX); + if ($itemStartPos < 0 || $itemEndPos < 0) { + throw new LogicException(); + } + + if ($i === 0) { + // If we're removing from the start, keep the tokens before the node and drop those after it, + // instead of the other way around. + $originalTokensArray = $originalTokens->getTokens(); + for ($j = $tokenIndex; $j < $itemStartPos; $j++) { + if ($originalTokensArray[$j][Lexer::TYPE_OFFSET] === Lexer::TOKEN_PHPDOC_EOL) { + break; + } + $result .= $originalTokensArray[$j][Lexer::VALUE_OFFSET]; + } + } + + $tokenIndex = $itemEndPos + 1; + } + } + + if (count($delayedAdd) > 0) { + if (!isset($this->emptyListInsertionMap[$mapKey])) { + return null; + } + + [$findToken, $extraLeft, $extraRight] = $this->emptyListInsertionMap[$mapKey]; + if ($findToken !== null) { + $originalTokensArray = $originalTokens->getTokens(); + for (; $tokenIndex < count($originalTokensArray); $tokenIndex++) { + $result .= $originalTokensArray[$tokenIndex][Lexer::VALUE_OFFSET]; + if ($originalTokensArray[$tokenIndex][Lexer::VALUE_OFFSET] !== $findToken) { + continue; + } + + $tokenIndex++; + break; + } + } + $first = true; + $result .= $extraLeft; + foreach ($delayedAdd as $delayedAddNode) { + if (!$first) { + $result .= $insertStr; + if ($insertNewline) { + $result .= sprintf("\n%s*%s", $beforeAsteriskIndent, $afterAsteriskIndent); + } + } + + $result .= $this->printNodeFormatPreserving($delayedAddNode, $originalTokens); + $first = false; + } + $result .= $extraRight; + } + + return $result; + } + + /** + * @param Node[] $nodes + * @return array{bool, string, string} + */ + private function isMultiline(int $initialIndex, array $nodes, TokenIterator $originalTokens): array + { + $isMultiline = count($nodes) > 1; + $pos = $initialIndex; + $allText = ''; + /** @var Node|null $node */ + foreach ($nodes as $node) { + if (!$node instanceof Node) { + continue; + } + + $endPos = $node->getAttribute(Attribute::END_INDEX) + 1; + $text = $originalTokens->getContentBetween($pos, $endPos); + $allText .= $text; + if (strpos($text, "\n") === false) { + // We require that a newline is present between *every* item. If the formatting + // is inconsistent, with only some items having newlines, we don't consider it + // as multiline + $isMultiline = false; + } + $pos = $endPos; + } + + $c = preg_match_all('~\n(?[\\x09\\x20]*)\*(?\\x20*)~', $allText, $matches, PREG_SET_ORDER); + if ($c === 0) { + return [$isMultiline, '', '']; + } + + $before = ''; + $after = ''; + foreach ($matches as $match) { + if (strlen($match['before']) > strlen($before)) { + $before = $match['before']; + } + if (strlen($match['after']) <= strlen($after)) { + continue; + } + + $after = $match['after']; + } + + return [$isMultiline, $before, $after]; + } + + private function printNodeFormatPreserving(Node $node, TokenIterator $originalTokens): string + { + /** @var Node|null $originalNode */ + $originalNode = $node->getAttribute(Attribute::ORIGINAL_NODE); + if ($originalNode === null) { + return $this->print($node); + } + + $class = get_class($node); + if ($class !== get_class($originalNode)) { + throw new LogicException(); + } + + $startPos = $originalNode->getAttribute(Attribute::START_INDEX); + $endPos = $originalNode->getAttribute(Attribute::END_INDEX); + if ($startPos < 0 || $endPos < 0) { + throw new LogicException(); + } + + $result = ''; + $pos = $startPos; + $subNodeNames = array_keys(get_object_vars($node)); + foreach ($subNodeNames as $subNodeName) { + $subNode = $node->$subNodeName; + $origSubNode = $originalNode->$subNodeName; + + if ( + (!$subNode instanceof Node && $subNode !== null) + || (!$origSubNode instanceof Node && $origSubNode !== null) + ) { + if ($subNode === $origSubNode) { + // Unchanged, can reuse old code + continue; + } + + if (is_array($subNode) && is_array($origSubNode)) { + // Array subnode changed, we might be able to reconstruct it + $listResult = $this->printArrayFormatPreserving( + $subNode, + $origSubNode, + $originalTokens, + $pos, + $class, + $subNodeName + ); + + if ($listResult === null) { + return $this->print($node); + } + + $result .= $listResult; + continue; + } + + return $this->print($node); + } + + if ($origSubNode === null) { + if ($subNode === null) { + // Both null, nothing to do + continue; + } + + return $this->print($node); + } + + $subStartPos = $origSubNode->getAttribute(Attribute::START_INDEX); + $subEndPos = $origSubNode->getAttribute(Attribute::END_INDEX); + if ($subStartPos < 0 || $subEndPos < 0) { + throw new LogicException(); + } + + if ($subNode === null) { + return $this->print($node); + } + + $result .= $originalTokens->getContentBetween($pos, $subStartPos); + $mapKey = get_class($node) . '->' . $subNodeName; + $parenthesesNeeded = isset($this->parenthesesMap[$mapKey]) + && in_array(get_class($subNode), $this->parenthesesMap[$mapKey], true); + + if ($subNode->getAttribute(Attribute::ORIGINAL_NODE) !== null) { + $parenthesesNeeded = $parenthesesNeeded + && !in_array(get_class($subNode->getAttribute(Attribute::ORIGINAL_NODE)), $this->parenthesesMap[$mapKey], true); + } + + $addParentheses = $parenthesesNeeded && !$originalTokens->hasParentheses($subStartPos, $subEndPos); + if ($addParentheses) { + $result .= '('; + } + + $result .= $this->printNodeFormatPreserving($subNode, $originalTokens); + if ($addParentheses) { + $result .= ')'; + } + + $pos = $subEndPos + 1; + } + + return $result . $originalTokens->getContentBetween($pos, $endPos + 1); + } + +} diff --git a/vendor/phpstan/phpstan/bootstrap.php b/vendor/phpstan/phpstan/bootstrap.php index 204221a3..1537f3f1 100644 --- a/vendor/phpstan/phpstan/bootstrap.php +++ b/vendor/phpstan/phpstan/bootstrap.php @@ -23,7 +23,6 @@ final class PharAutoloader self::$composerAutoloader = require 'phar://' . __DIR__ . '/phpstan.phar/vendor/autoload.php'; require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/jetbrains/phpstorm-stubs/PhpStormStubsMap.php'; require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/react/async/src/functions_include.php'; - require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/react/promise-stream/src/functions_include.php'; require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/react/promise-timer/src/functions_include.php'; require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/react/promise/src/functions_include.php'; require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/ringcentral/psr7/src/functions_include.php'; diff --git a/vendor/phpstan/phpstan/composer.json b/vendor/phpstan/phpstan/composer.json index 55182f6c..07faa85b 100644 --- a/vendor/phpstan/phpstan/composer.json +++ b/vendor/phpstan/phpstan/composer.json @@ -15,5 +15,12 @@ ], "autoload": { "files": ["bootstrap.php"] + }, + "support": { + "issues": "https://github.com/phpstan/phpstan/issues", + "forum": "https://github.com/phpstan/phpstan/discussions", + "source": "https://github.com/phpstan/phpstan-src", + "docs": "https://phpstan.org/user-guide/getting-started", + "security": "https://github.com/phpstan/phpstan/security/policy" } } diff --git a/vendor/phpstan/phpstan/phpstan.phar b/vendor/phpstan/phpstan/phpstan.phar index 74360dd9de365c3bc8a890391f8dffefae484949..3f043c719c2bf287748aa89742f06c0273027c0e 100755 GIT binary patch delta 418271 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

Ywrc*1cVbH7UvST;p9J@%ovtCt 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�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 YAARBYBP8ji?N6_|?z-#TyV`gCA4OVgF#rGn delta 382485 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

&{=g<94^XKODxysEoUod%a4_}*O$dOb4iUH$- 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

BgOmXg18 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

5W$tgJp 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 S6r4*H{pUab>Di@!m;VDXPUuqr diff --git a/vendor/phpstan/phpstan/phpstan.phar.asc b/vendor/phpstan/phpstan/phpstan.phar.asc index cdc7a12d..3c34229a 100644 --- a/vendor/phpstan/phpstan/phpstan.phar.asc +++ b/vendor/phpstan/phpstan/phpstan.phar.asc @@ -1,16 +1,16 @@ -----BEGIN PGP SIGNATURE----- -iQIzBAABCgAdFiEE0yaA1ZV9xxFr4pwUzxoQjQ565yAFAmQKD1cACgkQzxoQjQ56 -5yDePQ//ZtI/AKKhBlTvj6I6mw69TBuVi/7y+uU0CyrgKodCJlBCvprybXS2GItU -rh2rMrX75IGOx8tEBs/6Ec5BuPF5rIQZdPndsYzT+sH8hBCLCQ/SlgtE/bZ7CIjr -/WBkTjXd+T2lGmIe1e57rxNUiy+tgWlEa/mf963lY5Oy5zfuui6HEVzEofGtdq3c -l9FSx+9pVX4rCHKZzCy1lNuh3xdHEYS52mMCsYuuOo0GZ9e1cqFBj4VwF9WkLlr5 -oEvJanpJx32YcYOkhD1tE5N/3Gxtw1AZMSq4onJvts8YyqGA2q7uTDdRmW2yyiB7 -DgPFrfE2rNGCymU6n04hPhKyMIBk8nJB89qYtInIzbpm7+xPRrt6pKWFGIvAXeNx -qDHM3H+efvDadXl47z3aJLsgXxnefI6VJjXJF28mxEmwtm9Jt6tNvzEz+FHDgM11 -xat1m+oREXArPNA7cDTu5IIQY0BomKKc6H8X/X5OtKoVj0xoXbu/tfLVIJ8XYech -oAc+F0eA1k3vNxd5owM3ZaNqAFsGCA0dAgUWm2sNliZZZcnx0pWDvl/CG/Qetktz -15DvlfokTtCXPihy4tk1rYh/+EZfrwTJAMg4Xn3t9XlBapLUVH09EoRRi/0cVs9J -7x1FBChPFcvMSwrPo+mPzmjTfJ59QCt0BqYk7q/84KtcX85KQlg= -=3/5f +iQIzBAABCgAdFiEEynwsejDI6OEnSoR2UcZzBf/C5cAFAmRaZmcACgkQUcZzBf/C +5cAn/Q//fbWiR/qaSvlHpk73KH7iDfoHwNvRrHSQODZdMa4PGiEbL+SXsKnRxFDo +kEJZwgU5qi3WMflt7Ml3dYDlQDgoDerdaiySYFoBcv1NXDWKoF7+Egy1AHxpfNq+ +FMCkZNR2ulSaYUCofM4GkTNap4yVkPCy289ZU6yUmRnJxF+hh/CFfdVPAPbwh/a6 +UqV3R2ENJZSbtA1pzSTBpUPQGQ9qcsqngKyNyxk1hEd9opdMg2eSFvO1e1ZZm/Tk +Kgh5wCbsbSJuRPGO4vbiybTeO/qXPDlHV6oA5SHnjJ4H24phCsHdyJHHvLQmrUeR +BKHgnH1y/b5J9cgr9OgEQJK9TMHHd6dii9//Qp+0rUZIDZ4Ym2lDSA/Vn/D9GoV3 +zo4QYzW3TvE3QMdnLcX/ZtaLliPdDYIaYUXOiyaYwLFGVxSWZWOC5IN0G0bLJb39 +Ca/z839nkWdMqg68q/oHC2Nk/v/KZnKg1RlRjYhj53T6nr0JDEiaYMyETSOIFsVX +AcCQnLLwMndUAibJAyORDnTk+ipg0SecFoPvvhea1BtlTfhSDIlrT4OPKZ5nExzd +nR/zGbIH8lCvsBc+hq+Kgodtfs5nauwEOwlVUwet26xL1YKOd0jxz+Zp6tgk0wba +cMf5L9fm85j83DQYr7Ukaaj81kmMujRWDo/dRojKhUlJUrNnjXA= +=jTtX -----END PGP SIGNATURE----- diff --git a/vendor/phpunit/phpunit/ChangeLog-8.5.md b/vendor/phpunit/phpunit/ChangeLog-8.5.md deleted file mode 100644 index a65e6a61..00000000 --- a/vendor/phpunit/phpunit/ChangeLog-8.5.md +++ /dev/null @@ -1,304 +0,0 @@ -# Changes in PHPUnit 8.5 - -All notable changes of the PHPUnit 8.5 release series are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles. - -## [8.5.33] - 2023-02-27 - -### Fixed - -* [#5186](https://github.com/sebastianbergmann/phpunit/issues/5186): SBOM does not validate - -## [8.5.32] - 2023-01-26 - -### Fixed - -* [#5120](https://github.com/sebastianbergmann/phpunit/issues/5120): Test Runner incorrectly treats `--testsuite` and `--list-tests` as not combinable options - -## [8.5.31] - 2022-10-28 - -### Fixed - -* [#5076](https://github.com/sebastianbergmann/phpunit/issues/5076): Test Runner does not warn about conflicting options - -## [8.5.30] - 2022-09-25 - -### Changed - -* The configuration generator now asks for a cache directory - -### Fixed - -* [#4913](https://github.com/sebastianbergmann/phpunit/issues/4913): Failed `assert()` should show a backtrace -* [#4966](https://github.com/sebastianbergmann/phpunit/issues/4966): `TestCase::assertSame()` (and related exact comparisons) must compare `float` exactly - -## [8.5.29] - 2022-08-22 - -### Changed - -* [#5033](https://github.com/sebastianbergmann/phpunit/issues/5033): Do not depend on phpspec/prophecy - -## [8.5.28] - 2022-07-29 - -### Fixed - -* [#5015](https://github.com/sebastianbergmann/phpunit/pull/5015): Ukraine banner unreadable on black background -* [#5016](https://github.com/sebastianbergmann/phpunit/issues/5016): PHPUnit 8.5.27 does not work on PHP 7.2.0-7.2.18 and PHP 7.3.0-7.3.5 - -## [8.5.27] - 2022-06-19 - -### Fixed - -* [#4950](https://github.com/sebastianbergmann/phpunit/issues/4950): False error on `atMost()` invocation rule without call -* [#4962](https://github.com/sebastianbergmann/phpunit/issues/4962): Ukraine banner unreadable on white background - -## [8.5.26] - 2022-04-01 - -### Fixed - -* [#4938](https://github.com/sebastianbergmann/phpunit/issues/4938): Test Double code generator does not handle `void` return type declaration on `__clone()` methods - -## [8.5.25] - 2022-03-16 - -### Fixed - -* [#4934](https://github.com/sebastianbergmann/phpunit/issues/4934): Code Coverage does not work with PHPUnit 8.5.24 PHAR on PHP 7 - -## [8.5.24] - 2022-03-05 - #StandWithUkraine - -### Changed - -* [#4874](https://github.com/sebastianbergmann/phpunit/pull/4874): `PHP_FLOAT_EPSILON` is now used instead of hardcoded `0.0000000001` in `PHPUnit\Framework\Constraint\IsIdentical` - -### Fixed - -* When the HTML code coverage report's configured low upper bound is larger than the high lower bound then the default values are used instead - -## [8.5.23] - 2022-01-21 - -### Fixed - -* [#4799](https://github.com/sebastianbergmann/phpunit/pull/4799): Memory leaks in `PHPUnit\Framework\TestSuite` class -* [#4857](https://github.com/sebastianbergmann/phpunit/pull/4857): Result of `debug_backtrace()` is not used correctly - -## [8.5.22] - 2021-12-25 - -### Changed - -* [#4812](https://github.com/sebastianbergmann/phpunit/issues/4812): Do not enforce time limits when a debugging session through DBGp is active -* [#4835](https://github.com/sebastianbergmann/phpunit/issues/4835): Support for `$GLOBALS['_composer_autoload_path']` introduced in Composer 2.2 - -### Fixed - -* [#4840](https://github.com/sebastianbergmann/phpunit/pull/4840): TestDox prettifying for class names does not correctly handle diacritics -* [#4846](https://github.com/sebastianbergmann/phpunit/pull/4846): Composer proxy script is not ignored - -## [8.5.21] - 2021-09-25 - -### Changed - -* PHPUnit no longer converts PHP deprecations to exceptions by default (configure `convertDeprecationsToExceptions="true"` to enable this) -* The PHPUnit XML configuration file generator now configures `convertDeprecationsToExceptions="true"` - -### Fixed - -* [#4772](https://github.com/sebastianbergmann/phpunit/pull/4772): TestDox HTML report not displayed correctly when browser has custom colour settings - -## [8.5.20] - 2021-08-31 - -### Fixed - -* [#4751](https://github.com/sebastianbergmann/phpunit/issues/4751): Configuration validation fails when using brackets in glob pattern - -## [8.5.19] - 2021-07-31 - -### Fixed - -* [#4740](https://github.com/sebastianbergmann/phpunit/issues/4740): `phpunit.phar` does not work with PHP 8.1 - -## [8.5.18] - 2021-07-19 - -### Fixed - -* [#4720](https://github.com/sebastianbergmann/phpunit/issues/4720): PHPUnit does not verify its own PHP extension requirements - -## [8.5.17] - 2021-06-23 - -### Changed - -* PHPUnit now errors out on startup when `PHP_VERSION` contains a value that is not compatible with `version_compare()`, for instance `X.Y.Z-(to be removed in future macOS)` - -## [8.5.16] - 2021-06-05 - -### Changed - -* The test result cache (the storage for which is implemented in `PHPUnit\Runner\DefaultTestResultCache`) no longer uses PHP's `serialize()` and `unserialize()` functions for persistence. It now uses a versioned JSON format instead that is independent of PHP implementation details (see [#3581](https://github.com/sebastianbergmann/phpunit/issues/3581) and [#4662](https://github.com/sebastianbergmann/phpunit/pull/4662) for examples why this is a problem). When PHPUnit tries to load the test result cache from a file that does not exist, or from a file that does not contain data in JSON format, or from a file that contains data in a JSON format version other than the one used by the currently running PHPUnit version, then this is considered to be a "cache miss". An empty `DefaultTestResultCache` object is created in this case. This should also prevent PHPUnit from crashing when trying to load a test result cache file created by a different version of PHPUnit (see [#4580](https://github.com/sebastianbergmann/phpunit/issues/4580) for example). - -### Fixed - -* [#4663](https://github.com/sebastianbergmann/phpunit/issues/4663): `TestCase::expectError()` works on PHP 7.3, but not on PHP >= 7.4 -* [#4678](https://github.com/sebastianbergmann/phpunit/pull/4678): Stubbed methods with `iterable` return types should return empty array by default -* [#4692](https://github.com/sebastianbergmann/phpunit/issues/4692): Annotations in single-line doc-comments are not handled correctly -* [#4694](https://github.com/sebastianbergmann/phpunit/issues/4694): `TestCase::getMockFromWsdl()` does not work with PHP 8.1-dev - -## [8.5.15] - 2021-03-17 - -### Fixed - -* [#4591](https://github.com/sebastianbergmann/phpunit/issues/4591): TeamCity logger logs warnings as test failures - -## [8.5.14] - 2021-01-17 - -### Fixed - -* [#4535](https://github.com/sebastianbergmann/phpunit/issues/4535): `getMockFromWsdl()` does not handle methods that do not have parameters correctly -* [#4572](https://github.com/sebastianbergmann/phpunit/issues/4572): Schema validation does not work with `%xx` sequences in path to `phpunit.xsd` -* [#4575](https://github.com/sebastianbergmann/phpunit/issues/4575): PHPUnit 8.5 incompatibility with PHP 8.1 - -## [8.5.13] - 2020-12-01 - -### Fixed - -* Running tests in isolated processes did not work with PHP 8 on Windows - -## [8.5.12] - 2020-11-30 - -### Changed - -* Changed PHP version constraint in `composer.json` from `^7.2` to `>=7.2` to allow the installation of PHPUnit 8.5 on PHP 8. Please note that the code coverage functionality is not available for PHPUnit 8.5 on PHP 8. - -### Fixed - -* [#4529](https://github.com/sebastianbergmann/phpunit/issues/4529): Debug mode of Xdebug 2 is not disabled for PHPT tests - -## [8.5.11] - 2020-11-27 - -### Changed - -* Bumped required version of `phpunit/php-code-coverage` - -## [8.5.10] - 2020-11-27 - -### Added - -* Support for Xdebug 3 - -### Fixed - -* [#4516](https://github.com/sebastianbergmann/phpunit/issues/4516): `phpunit/phpunit-selenium` does not work with PHPUnit 8.5.9 - -## [8.5.9] - 2020-11-10 - -### Fixed - -* [#3965](https://github.com/sebastianbergmann/phpunit/issues/3965): Process Isolation throws exceptions when PHPDBG is used -* [#4470](https://github.com/sebastianbergmann/phpunit/pull/4470): Infinite recursion when `--static-backup --strict-global-state` is used - -## [8.5.8] - 2020-06-22 - -### Fixed - -* [#4312](https://github.com/sebastianbergmann/phpunit/issues/4312): Fix for [#4299](https://github.com/sebastianbergmann/phpunit/issues/4299) breaks backward compatibility - -## [8.5.7] - 2020-06-21 - -### Fixed - -* [#4299](https://github.com/sebastianbergmann/phpunit/issues/4299): "No tests executed" does not always result in exit code `1` -* [#4306](https://github.com/sebastianbergmann/phpunit/issues/4306): Exceptions during code coverage driver initialization are not handled correctly - -## [8.5.6] - 2020-06-15 - -### Fixed - -* [#4211](https://github.com/sebastianbergmann/phpunit/issues/4211): `phpdbg_*()` functions are scoped to `PHPUnit\phpdbg_*()` - -## [8.5.5] - 2020-05-22 - -### Fixed - -* [#4033](https://github.com/sebastianbergmann/phpunit/issues/4033): Unexpected behaviour when `$GLOBALS` is deleted - -## [8.5.4] - 2020-04-23 - -### Changed - -* Changed how `PHPUnit\TextUI\Command` passes warnings to `PHPUnit\TextUI\TestRunner` - -## [8.5.3] - 2020-03-31 - -### Fixed - -* [#4017](https://github.com/sebastianbergmann/phpunit/issues/4017): Do not suggest refactoring to something that is also deprecated -* [#4133](https://github.com/sebastianbergmann/phpunit/issues/4133): `expectExceptionMessageRegExp()` has been removed in PHPUnit 9 without a deprecation warning being given in PHPUnit 8 -* [#4139](https://github.com/sebastianbergmann/phpunit/issues/4139): Cannot double interfaces that declare a constructor with PHP 8 -* [#4144](https://github.com/sebastianbergmann/phpunit/issues/4144): Empty objects are converted to empty arrays in JSON comparison failure diff - -## [8.5.2] - 2020-01-08 - -### Removed - -* `eval-stdin.php` has been removed, it was not used anymore since PHPUnit 7.2.7 - -## [8.5.1] - 2019-12-25 - -### Changed - -* `eval-stdin.php` can now only be executed with `cli` and `phpdbg` - -### Fixed - -* [#3983](https://github.com/sebastianbergmann/phpunit/issues/3983): Deprecation warning given too eagerly - -## [8.5.0] - 2019-12-06 - -### Added - -* [#3911](https://github.com/sebastianbergmann/phpunit/issues/3911): Support combined use of `addMethods()` and `onlyMethods()` -* [#3949](https://github.com/sebastianbergmann/phpunit/issues/3949): Introduce specialized assertions `assertFileEqualsCanonicalizing()`, `assertFileEqualsIgnoringCase()`, `assertStringEqualsFileCanonicalizing()`, `assertStringEqualsFileIgnoringCase()`, `assertFileNotEqualsCanonicalizing()`, `assertFileNotEqualsIgnoringCase()`, `assertStringNotEqualsFileCanonicalizing()`, and `assertStringNotEqualsFileIgnoringCase()` as alternative to using `assertFileEquals()` etc. with optional parameters - -### Changed - -* [#3860](https://github.com/sebastianbergmann/phpunit/pull/3860): Deprecate invoking PHPUnit commandline test runner with just a class name -* [#3950](https://github.com/sebastianbergmann/phpunit/issues/3950): Deprecate optional parameters of `assertFileEquals()` etc. -* [#3955](https://github.com/sebastianbergmann/phpunit/issues/3955): Deprecate support for doubling multiple interfaces - -### Fixed - -* [#3953](https://github.com/sebastianbergmann/phpunit/issues/3953): Code Coverage for test executed in isolation does not work when the PHAR is used -* [#3967](https://github.com/sebastianbergmann/phpunit/issues/3967): Cannot double interface that extends interface that extends `\Throwable` -* [#3968](https://github.com/sebastianbergmann/phpunit/pull/3968): Test class run in a separate PHP process are passing when `exit` called inside - -[8.5.33]: https://github.com/sebastianbergmann/phpunit/compare/8.5.32...8.5.33 -[8.5.32]: https://github.com/sebastianbergmann/phpunit/compare/8.5.31...8.5.32 -[8.5.31]: https://github.com/sebastianbergmann/phpunit/compare/8.5.30...8.5.31 -[8.5.30]: https://github.com/sebastianbergmann/phpunit/compare/8.5.29...8.5.30 -[8.5.29]: https://github.com/sebastianbergmann/phpunit/compare/8.5.28...8.5.29 -[8.5.28]: https://github.com/sebastianbergmann/phpunit/compare/8.5.27...8.5.28 -[8.5.27]: https://github.com/sebastianbergmann/phpunit/compare/8.5.26...8.5.27 -[8.5.26]: https://github.com/sebastianbergmann/phpunit/compare/8.5.25...8.5.26 -[8.5.25]: https://github.com/sebastianbergmann/phpunit/compare/8.5.24...8.5.25 -[8.5.24]: https://github.com/sebastianbergmann/phpunit/compare/8.5.23...8.5.24 -[8.5.23]: https://github.com/sebastianbergmann/phpunit/compare/8.5.22...8.5.23 -[8.5.22]: https://github.com/sebastianbergmann/phpunit/compare/8.5.21...8.5.22 -[8.5.21]: https://github.com/sebastianbergmann/phpunit/compare/8.5.20...8.5.21 -[8.5.20]: https://github.com/sebastianbergmann/phpunit/compare/8.5.19...8.5.20 -[8.5.19]: https://github.com/sebastianbergmann/phpunit/compare/8.5.18...8.5.19 -[8.5.18]: https://github.com/sebastianbergmann/phpunit/compare/8.5.17...8.5.18 -[8.5.17]: https://github.com/sebastianbergmann/phpunit/compare/8.5.16...8.5.17 -[8.5.16]: https://github.com/sebastianbergmann/phpunit/compare/8.5.15...8.5.16 -[8.5.15]: https://github.com/sebastianbergmann/phpunit/compare/8.5.14...8.5.15 -[8.5.14]: https://github.com/sebastianbergmann/phpunit/compare/8.5.13...8.5.14 -[8.5.13]: https://github.com/sebastianbergmann/phpunit/compare/8.5.12...8.5.13 -[8.5.12]: https://github.com/sebastianbergmann/phpunit/compare/8.5.11...8.5.12 -[8.5.11]: https://github.com/sebastianbergmann/phpunit/compare/8.5.10...8.5.11 -[8.5.10]: https://github.com/sebastianbergmann/phpunit/compare/8.5.9...8.5.10 -[8.5.9]: https://github.com/sebastianbergmann/phpunit/compare/8.5.8...8.5.9 -[8.5.8]: https://github.com/sebastianbergmann/phpunit/compare/8.5.7...8.5.8 -[8.5.7]: https://github.com/sebastianbergmann/phpunit/compare/8.5.6...8.5.7 -[8.5.6]: https://github.com/sebastianbergmann/phpunit/compare/8.5.5...8.5.6 -[8.5.5]: https://github.com/sebastianbergmann/phpunit/compare/8.5.4...8.5.5 -[8.5.4]: https://github.com/sebastianbergmann/phpunit/compare/8.5.3...8.5.4 -[8.5.3]: https://github.com/sebastianbergmann/phpunit/compare/8.5.2...8.5.3 -[8.5.2]: https://github.com/sebastianbergmann/phpunit/compare/8.5.1...8.5.2 -[8.5.1]: https://github.com/sebastianbergmann/phpunit/compare/8.5.0...8.5.1 -[8.5.0]: https://github.com/sebastianbergmann/phpunit/compare/8.4.3...8.5.0 diff --git a/vendor/phpunit/phpunit/ChangeLog-9.6.md b/vendor/phpunit/phpunit/ChangeLog-9.6.md index 30aa32ea..5995d581 100644 --- a/vendor/phpunit/phpunit/ChangeLog-9.6.md +++ b/vendor/phpunit/phpunit/ChangeLog-9.6.md @@ -2,6 +2,24 @@ All notable changes of the PHPUnit 9.6 release series are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles. +## [9.6.8] - 2023-05-11 + +### Fixed + +* [#5345](https://github.com/sebastianbergmann/phpunit/issues/5345): No stack trace shown for previous exceptions during bootstrap + +## [9.6.7] - 2023-04-14 + +### Fixed + +* Tests that have `@doesNotPerformAssertions` do not contribute to code coverage + +## [9.6.6] - 2023-03-27 + +### Fixed + +* [#5270](https://github.com/sebastianbergmann/phpunit/issues/5270): `GlobalState::getIniSettingsAsString()` generates code that triggers warnings + ## [9.6.5] - 2023-03-09 ### Changed @@ -46,6 +64,9 @@ All notable changes of the PHPUnit 9.6 release series are documented in this fil * [#5064](https://github.com/sebastianbergmann/phpunit/issues/5064): Deprecate `PHPUnit\Framework\TestCase::getMockClass()` * [#5132](https://github.com/sebastianbergmann/phpunit/issues/5132): Deprecate `Test` suffix for abstract test case classes +[9.6.8]: https://github.com/sebastianbergmann/phpunit/compare/9.6.7...9.6.8 +[9.6.7]: https://github.com/sebastianbergmann/phpunit/compare/9.6.6...9.6.7 +[9.6.6]: https://github.com/sebastianbergmann/phpunit/compare/9.6.5...9.6.6 [9.6.5]: https://github.com/sebastianbergmann/phpunit/compare/9.6.4...9.6.5 [9.6.4]: https://github.com/sebastianbergmann/phpunit/compare/9.6.3...9.6.4 [9.6.3]: https://github.com/sebastianbergmann/phpunit/compare/9.6.2...9.6.3 diff --git a/vendor/phpunit/phpunit/composer.json b/vendor/phpunit/phpunit/composer.json index c9c8b467..28411d9b 100644 --- a/vendor/phpunit/phpunit/composer.json +++ b/vendor/phpunit/phpunit/composer.json @@ -17,7 +17,8 @@ } ], "support": { - "issues": "https://github.com/sebastianbergmann/phpunit/issues" + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy" }, "prefer-stable": true, "require": { diff --git a/vendor/phpunit/phpunit/phpunit b/vendor/phpunit/phpunit/phpunit index c8029566..b9f5cf29 100755 --- a/vendor/phpunit/phpunit/phpunit +++ b/vendor/phpunit/phpunit/phpunit @@ -38,22 +38,31 @@ if (version_compare('7.3.0', PHP_VERSION, '>')) { die(1); } -foreach (['dom', 'json', 'libxml', 'mbstring', 'tokenizer', 'xml', 'xmlwriter'] as $extension) { - if (extension_loaded($extension)) { - continue; - } +$requiredExtensions = ['dom', 'json', 'libxml', 'mbstring', 'tokenizer', 'xml', 'xmlwriter']; +$unavailableExtensions = array_filter( + $requiredExtensions, + static function ($extension) { + return !extension_loaded($extension); + } +); + +if ([] !== $unavailableExtensions) { fwrite( STDERR, sprintf( - 'PHPUnit requires the "%s" extension.' . PHP_EOL, - $extension + 'PHPUnit requires the "%s" extensions, but the "%s" %s not available.' . PHP_EOL, + implode('", "', $requiredExtensions), + implode('", "', $unavailableExtensions), + count($unavailableExtensions) === 1 ? 'extension is' : 'extensions are' ) ); die(1); } +unset($requiredExtensions, $unavailableExtensions); + if (!ini_get('date.timezone')) { ini_set('date.timezone', 'UTC'); } diff --git a/vendor/phpunit/phpunit/src/Framework/Assert.php b/vendor/phpunit/phpunit/src/Framework/Assert.php index 156220a5..9872b25c 100644 --- a/vendor/phpunit/phpunit/src/Framework/Assert.php +++ b/vendor/phpunit/phpunit/src/Framework/Assert.php @@ -1304,7 +1304,7 @@ abstract class Assert */ public static function assertObjectHasAttribute(string $attributeName, $object, string $message = ''): void { - self::createWarning('assertObjectHasAttribute() is deprecated and will be removed in PHPUnit 10.'); + self::createWarning('assertObjectHasAttribute() is deprecated and will be removed in PHPUnit 10. Refactor your test to use assertObjectHasProperty() (PHPUnit 10.1.0+) instead.'); if (!self::isValidObjectAttributeName($attributeName)) { throw InvalidArgumentException::create(1, 'valid attribute name'); @@ -1334,7 +1334,7 @@ abstract class Assert */ public static function assertObjectNotHasAttribute(string $attributeName, $object, string $message = ''): void { - self::createWarning('assertObjectNotHasAttribute() is deprecated and will be removed in PHPUnit 10.'); + self::createWarning('assertObjectNotHasAttribute() is deprecated and will be removed in PHPUnit 10. Refactor your test to use assertObjectNotHasProperty() (PHPUnit 10.1.0+) instead.'); if (!self::isValidObjectAttributeName($attributeName)) { throw InvalidArgumentException::create(1, 'valid attribute name'); diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Generator.php index 17e3312c..4810ecae 100644 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator.php +++ b/vendor/phpunit/phpunit/src/Framework/MockObject/Generator.php @@ -72,7 +72,6 @@ trait MockedCloneMethodWithVoidReturnType } } EOT; - private const MOCKED_CLONE_METHOD_WITHOUT_RETURN_TYPE_TRAIT = <<<'EOT' namespace PHPUnit\Framework\MockObject; @@ -84,7 +83,6 @@ trait MockedCloneMethodWithoutReturnType } } EOT; - private const UNMOCKED_CLONE_METHOD_WITH_VOID_RETURN_TYPE_TRAIT = <<<'EOT' namespace PHPUnit\Framework\MockObject; @@ -98,7 +96,6 @@ trait UnmockedCloneMethodWithVoidReturnType } } EOT; - private const UNMOCKED_CLONE_METHOD_WITHOUT_RETURN_TYPE_TRAIT = <<<'EOT' namespace PHPUnit\Framework\MockObject; diff --git a/vendor/phpunit/phpunit/src/Framework/TestResult.php b/vendor/phpunit/phpunit/src/Framework/TestResult.php index 4fde29fa..22150a5a 100644 --- a/vendor/phpunit/phpunit/src/Framework/TestResult.php +++ b/vendor/phpunit/phpunit/src/Framework/TestResult.php @@ -804,6 +804,7 @@ final class TestResult implements Countable } if ($this->beStrictAboutTestsThatDoNotTestAnything && + !$test->doesNotPerformAssertions() && $test->getNumAssertions() === 0) { $risky = true; } diff --git a/vendor/phpunit/phpunit/src/Runner/Version.php b/vendor/phpunit/phpunit/src/Runner/Version.php index 5cfff352..268045a4 100644 --- a/vendor/phpunit/phpunit/src/Runner/Version.php +++ b/vendor/phpunit/phpunit/src/Runner/Version.php @@ -41,7 +41,7 @@ final class Version } if (self::$version === '') { - self::$version = (new VersionId('9.6.5', dirname(__DIR__, 2)))->getVersion(); + self::$version = (new VersionId('9.6.8', dirname(__DIR__, 2)))->getVersion(); } return self::$version; diff --git a/vendor/phpunit/phpunit/src/TextUI/CliArguments/Builder.php b/vendor/phpunit/phpunit/src/TextUI/CliArguments/Builder.php index 9030b1db..da488082 100644 --- a/vendor/phpunit/phpunit/src/TextUI/CliArguments/Builder.php +++ b/vendor/phpunit/phpunit/src/TextUI/CliArguments/Builder.php @@ -121,7 +121,6 @@ final class Builder 'whitelist=', 'dump-xdebug-filter=', ]; - private const SHORT_OPTIONS = 'd:c:hv'; public function fromParameters(array $parameters, array $additionalLongOptions): Configuration diff --git a/vendor/phpunit/phpunit/src/TextUI/Command.php b/vendor/phpunit/phpunit/src/TextUI/Command.php index 48243caa..0bebad6a 100644 --- a/vendor/phpunit/phpunit/src/TextUI/Command.php +++ b/vendor/phpunit/phpunit/src/TextUI/Command.php @@ -568,16 +568,29 @@ class Command $this->exitWithErrorMessage($t->getMessage()); } - $this->exitWithErrorMessage( - sprintf( - 'Error in bootstrap script: %s:%s%s%s%s', + $message = sprintf( + 'Error in bootstrap script: %s:%s%s%s%s', + get_class($t), + PHP_EOL, + $t->getMessage(), + PHP_EOL, + $t->getTraceAsString() + ); + + while ($t = $t->getPrevious()) { + $message .= sprintf( + '%s%sPrevious error: %s:%s%s%s%s', + PHP_EOL, + PHP_EOL, get_class($t), PHP_EOL, $t->getMessage(), PHP_EOL, - $t->getTraceAsString() - ) - ); + $t->getTraceAsString(), + ); + } + + $this->exitWithErrorMessage($message); } } diff --git a/vendor/phpunit/phpunit/src/TextUI/DefaultResultPrinter.php b/vendor/phpunit/phpunit/src/TextUI/DefaultResultPrinter.php index 99f0fa9d..408fa133 100644 --- a/vendor/phpunit/phpunit/src/TextUI/DefaultResultPrinter.php +++ b/vendor/phpunit/phpunit/src/TextUI/DefaultResultPrinter.php @@ -47,23 +47,15 @@ use Throwable; */ class DefaultResultPrinter extends Printer implements ResultPrinter { - public const EVENT_TEST_START = 0; - - public const EVENT_TEST_END = 1; - + public const EVENT_TEST_START = 0; + public const EVENT_TEST_END = 1; public const EVENT_TESTSUITE_START = 2; - - public const EVENT_TESTSUITE_END = 3; - - public const COLOR_NEVER = 'never'; - - public const COLOR_AUTO = 'auto'; - - public const COLOR_ALWAYS = 'always'; - - public const COLOR_DEFAULT = self::COLOR_NEVER; - - private const AVAILABLE_COLORS = [self::COLOR_NEVER, self::COLOR_AUTO, self::COLOR_ALWAYS]; + public const EVENT_TESTSUITE_END = 3; + public const COLOR_NEVER = 'never'; + public const COLOR_AUTO = 'auto'; + public const COLOR_ALWAYS = 'always'; + public const COLOR_DEFAULT = self::COLOR_NEVER; + private const AVAILABLE_COLORS = [self::COLOR_NEVER, self::COLOR_AUTO, self::COLOR_ALWAYS]; /** * @var int diff --git a/vendor/phpunit/phpunit/src/TextUI/Help.php b/vendor/phpunit/phpunit/src/TextUI/Help.php index 084f2a21..82f305dd 100644 --- a/vendor/phpunit/phpunit/src/TextUI/Help.php +++ b/vendor/phpunit/phpunit/src/TextUI/Help.php @@ -27,8 +27,7 @@ use SebastianBergmann\Environment\Console; final class Help { private const LEFT_MARGIN = ' '; - - private const HELP_TEXT = [ + private const HELP_TEXT = [ 'Usage' => [ ['text' => 'phpunit [options] UnitTest.php'], ['text' => 'phpunit [options] '], diff --git a/vendor/phpunit/phpunit/src/TextUI/TestRunner.php b/vendor/phpunit/phpunit/src/TextUI/TestRunner.php index c1362f3a..3ba298e8 100644 --- a/vendor/phpunit/phpunit/src/TextUI/TestRunner.php +++ b/vendor/phpunit/phpunit/src/TextUI/TestRunner.php @@ -88,10 +88,8 @@ use SebastianBergmann\Timer\Timer; */ final class TestRunner extends BaseTestRunner { - public const SUCCESS_EXIT = 0; - - public const FAILURE_EXIT = 1; - + public const SUCCESS_EXIT = 0; + public const FAILURE_EXIT = 1; public const EXCEPTION_EXIT = 2; /** diff --git a/vendor/phpunit/phpunit/src/Util/Annotation/DocBlock.php b/vendor/phpunit/phpunit/src/Util/Annotation/DocBlock.php index 648f9edc..5066c4bb 100644 --- a/vendor/phpunit/phpunit/src/Util/Annotation/DocBlock.php +++ b/vendor/phpunit/phpunit/src/Util/Annotation/DocBlock.php @@ -67,17 +67,12 @@ final class DocBlock */ public const REGEX_DATA_PROVIDER = '/@dataProvider\s+([a-zA-Z0-9._:-\\\\x7f-\xff]+)/'; - private const REGEX_REQUIRES_VERSION = '/@requires\s+(?PPHP(?:Unit)?)\s+(?P[<>=!]{0,2})\s*(?P[\d\.-]+(dev|(RC|alpha|beta)[\d\.])?)[ \t]*\r?$/m'; - + private const REGEX_REQUIRES_VERSION = '/@requires\s+(?PPHP(?:Unit)?)\s+(?P[<>=!]{0,2})\s*(?P[\d\.-]+(dev|(RC|alpha|beta)[\d\.])?)[ \t]*\r?$/m'; private const REGEX_REQUIRES_VERSION_CONSTRAINT = '/@requires\s+(?PPHP(?:Unit)?)\s+(?P[\d\t \-.|~^]+)[ \t]*\r?$/m'; - - private const REGEX_REQUIRES_OS = '/@requires\s+(?POS(?:FAMILY)?)\s+(?P.+?)[ \t]*\r?$/m'; - - private const REGEX_REQUIRES_SETTING = '/@requires\s+(?Psetting)\s+(?P([^ ]+?))\s*(?P[\w\.-]+[\w\.]?)?[ \t]*\r?$/m'; - - private const REGEX_REQUIRES = '/@requires\s+(?Pfunction|extension)\s+(?P([^\s<>=!]+))\s*(?P[<>=!]{0,2})\s*(?P[\d\.-]+[\d\.]?)?[ \t]*\r?$/m'; - - private const REGEX_TEST_WITH = '/@testWith\s+/'; + private const REGEX_REQUIRES_OS = '/@requires\s+(?POS(?:FAMILY)?)\s+(?P.+?)[ \t]*\r?$/m'; + private const REGEX_REQUIRES_SETTING = '/@requires\s+(?Psetting)\s+(?P([^ ]+?))\s*(?P[\w\.-]+[\w\.]?)?[ \t]*\r?$/m'; + private const REGEX_REQUIRES = '/@requires\s+(?Pfunction|extension)\s+(?P([^\s<>=!]+))\s*(?P[<>=!]{0,2})\s*(?P[\d\.-]+[\d\.]?)?[ \t]*\r?$/m'; + private const REGEX_TEST_WITH = '/@testWith\s+/'; /** @var string */ private $docComment; diff --git a/vendor/phpunit/phpunit/src/Util/GlobalState.php b/vendor/phpunit/phpunit/src/Util/GlobalState.php index cc5c2228..5cf16bcd 100644 --- a/vendor/phpunit/phpunit/src/Util/GlobalState.php +++ b/vendor/phpunit/phpunit/src/Util/GlobalState.php @@ -9,6 +9,8 @@ */ namespace PHPUnit\Util; +use const PHP_MAJOR_VERSION; +use const PHP_MINOR_VERSION; use function array_keys; use function array_reverse; use function array_shift; @@ -47,6 +49,79 @@ final class GlobalState '_REQUEST', ]; + /** + * @psalm-var array> + */ + private const DEPRECATED_INI_SETTINGS = [ + '7.3' => [ + 'iconv.input_encoding' => true, + 'iconv.output_encoding' => true, + 'iconv.internal_encoding' => true, + 'mbstring.func_overload' => true, + 'mbstring.http_input' => true, + 'mbstring.http_output' => true, + 'mbstring.internal_encoding' => true, + 'string.strip_tags' => true, + ], + + '7.4' => [ + 'iconv.input_encoding' => true, + 'iconv.output_encoding' => true, + 'iconv.internal_encoding' => true, + 'mbstring.func_overload' => true, + 'mbstring.http_input' => true, + 'mbstring.http_output' => true, + 'mbstring.internal_encoding' => true, + 'pdo_odbc.db2_instance_name' => true, + 'string.strip_tags' => true, + ], + + '8.0' => [ + 'iconv.input_encoding' => true, + 'iconv.output_encoding' => true, + 'iconv.internal_encoding' => true, + 'mbstring.http_input' => true, + 'mbstring.http_output' => true, + 'mbstring.internal_encoding' => true, + ], + + '8.1' => [ + 'auto_detect_line_endings' => true, + 'filter.default' => true, + 'iconv.input_encoding' => true, + 'iconv.output_encoding' => true, + 'iconv.internal_encoding' => true, + 'mbstring.http_input' => true, + 'mbstring.http_output' => true, + 'mbstring.internal_encoding' => true, + 'oci8.old_oci_close_semantics' => true, + ], + + '8.2' => [ + 'auto_detect_line_endings' => true, + 'filter.default' => true, + 'iconv.input_encoding' => true, + 'iconv.output_encoding' => true, + 'iconv.internal_encoding' => true, + 'mbstring.http_input' => true, + 'mbstring.http_output' => true, + 'mbstring.internal_encoding' => true, + 'oci8.old_oci_close_semantics' => true, + ], + + '8.3' => [ + 'auto_detect_line_endings' => true, + 'filter.default' => true, + 'iconv.input_encoding' => true, + 'iconv.output_encoding' => true, + 'iconv.internal_encoding' => true, + 'mbstring.http_input' => true, + 'mbstring.http_output' => true, + 'mbstring.internal_encoding' => true, + 'oci8.old_oci_close_semantics' => true, + ], + ]; + /** * @throws Exception */ @@ -106,6 +181,10 @@ final class GlobalState $result = ''; foreach (ini_get_all(null, false) as $key => $value) { + if (self::isIniSettingDeprecated($key)) { + continue; + } + $result .= sprintf( '@ini_set(%s, %s);' . "\n", self::exportVariable($key), @@ -200,4 +279,9 @@ final class GlobalState return $result; } + + private static function isIniSettingDeprecated(string $iniSetting): bool + { + return isset(self::DEPRECATED_INI_SETTINGS[PHP_MAJOR_VERSION . '.' . PHP_MINOR_VERSION][$iniSetting]); + } } diff --git a/vendor/phpunit/phpunit/src/Util/TestDox/CliTestDoxPrinter.php b/vendor/phpunit/phpunit/src/Util/TestDox/CliTestDoxPrinter.php index def16c39..b66eb8b9 100644 --- a/vendor/phpunit/phpunit/src/Util/TestDox/CliTestDoxPrinter.php +++ b/vendor/phpunit/phpunit/src/Util/TestDox/CliTestDoxPrinter.php @@ -66,7 +66,6 @@ class CliTestDoxPrinter extends TestDoxPrinter " \e[36m◑\e[0m running tests", " \e[36m◒\e[0m running tests", ]; - private const STATUS_STYLES = [ BaseTestRunner::STATUS_PASSED => [ 'symbol' => '✔', diff --git a/vendor/sebastian/diff/ChangeLog.md b/vendor/sebastian/diff/ChangeLog.md index 9bdcc5b6..a6ccfad7 100644 --- a/vendor/sebastian/diff/ChangeLog.md +++ b/vendor/sebastian/diff/ChangeLog.md @@ -2,6 +2,13 @@ All notable changes are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. +## [4.0.5] - 2023-05-07 + +### Changed + +* [#118](https://github.com/sebastianbergmann/diff/pull/118): Improve performance of `MemoryEfficientLongestCommonSubsequenceCalculator` +* [#119](https://github.com/sebastianbergmann/diff/pull/119): Improve performance of `TimeEfficientLongestCommonSubsequenceCalculator` + ## [4.0.4] - 2020-10-26 ### Fixed @@ -76,6 +83,7 @@ All notable changes are documented in this file using the [Keep a CHANGELOG](htt * This component is no longer supported on PHP 5.6 +[4.0.5]: https://github.com/sebastianbergmann/diff/compare/4.0.4...4.0.5 [4.0.4]: https://github.com/sebastianbergmann/diff/compare/4.0.3...4.0.4 [4.0.3]: https://github.com/sebastianbergmann/diff/compare/4.0.2...4.0.3 [4.0.2]: https://github.com/sebastianbergmann/diff/compare/4.0.1...4.0.2 diff --git a/vendor/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php b/vendor/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php index 0b626eaf..489113b6 100644 --- a/vendor/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php +++ b/vendor/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php @@ -78,7 +78,12 @@ final class MemoryEfficientLongestCommonSubsequenceCalculator implements Longest if ($from[$i] === $to[$j]) { $current[$j + 1] = $prev[$j] + 1; } else { - $current[$j + 1] = max($current[$j], $prev[$j + 1]); + // don't use max() to avoid function call overhead + if ($current[$j] > $prev[$j + 1]) { + $current[$j + 1] = $current[$j]; + } else { + $current[$j + 1] = $prev[$j + 1]; + } } } } diff --git a/vendor/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php b/vendor/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php index fd19cac7..4e8d951d 100644 --- a/vendor/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php +++ b/vendor/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php @@ -37,12 +37,24 @@ final class TimeEfficientLongestCommonSubsequenceCalculator implements LongestCo 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 - ); + $o = ($j * $width) + $i; + + // don't use max() to avoid function call overhead + $firstOrLast = $from[$i - 1] === $to[$j - 1] ? $matrix[$o - $width - 1] + 1 : 0; + + if ($matrix[$o - 1] > $matrix[$o - $width]) { + if ($firstOrLast > $matrix[$o - 1]) { + $matrix[$o] = $firstOrLast; + } else { + $matrix[$o] = $matrix[$o - 1]; + } + } else { + if ($firstOrLast > $matrix[$o - $width]) { + $matrix[$o] = $firstOrLast; + } else { + $matrix[$o] = $matrix[$o - $width]; + } + } } } diff --git a/vendor/symfony/console/Application.php b/vendor/symfony/console/Application.php index 41548a3e..b7aaa6a2 100644 --- a/vendor/symfony/console/Application.php +++ b/vendor/symfony/console/Application.php @@ -105,11 +105,14 @@ class Application implements ResetInterface /** * @final */ - public function setDispatcher(EventDispatcherInterface $dispatcher) + public function setDispatcher(EventDispatcherInterface $dispatcher): void { $this->dispatcher = $dispatcher; } + /** + * @return void + */ public function setCommandLoader(CommandLoaderInterface $commandLoader) { $this->commandLoader = $commandLoader; @@ -118,12 +121,15 @@ class Application implements ResetInterface 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.'); + 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; } + /** + * @return void + */ public function setSignalsToDispatchEvent(int ...$signalsToDispatchEvent) { $this->signalsToDispatchEvent = $signalsToDispatchEvent; @@ -317,10 +323,16 @@ class Application implements ResetInterface return $exitCode; } + /** + * @return void + */ public function reset() { } + /** + * @return void + */ public function setHelperSet(HelperSet $helperSet) { $this->helperSet = $helperSet; @@ -334,6 +346,9 @@ class Application implements ResetInterface return $this->helperSet ??= $this->getDefaultHelperSet(); } + /** + * @return void + */ public function setDefinition(InputDefinition $definition) { $this->definition = $definition; @@ -404,6 +419,8 @@ class Application implements ResetInterface /** * Sets whether to catch exceptions or not during commands execution. + * + * @return void */ public function setCatchExceptions(bool $boolean) { @@ -420,6 +437,8 @@ class Application implements ResetInterface /** * Sets whether to automatically exit after a command execution or not. + * + * @return void */ public function setAutoExit(bool $boolean) { @@ -436,7 +455,9 @@ class Application implements ResetInterface /** * Sets the application name. - **/ + * + * @return void + */ public function setName(string $name) { $this->name = $name; @@ -452,6 +473,8 @@ class Application implements ResetInterface /** * Sets the application version. + * + * @return void */ public function setVersion(string $version) { @@ -490,6 +513,8 @@ class Application implements ResetInterface * If a Command is not enabled it will not be added. * * @param Command[] $commands An array of commands + * + * @return void */ public function addCommands(array $commands) { @@ -687,9 +712,7 @@ class Application implements ResetInterface if ($alternatives = $this->findAlternatives($name, $allCommands)) { // remove hidden commands - $alternatives = array_filter($alternatives, function ($name) { - return !$this->get($name)->isHidden(); - }); + $alternatives = array_filter($alternatives, fn ($name) => !$this->get($name)->isHidden()); if (1 == \count($alternatives)) { $message .= "\n\nDid you mean this?\n "; @@ -840,9 +863,7 @@ class Application implements ResetInterface } 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); + $message = preg_replace_callback('/[a-zA-Z_\x7f-\xff][\\\\a-zA-Z0-9_\x7f-\xff]*+@anonymous\x00.*?\.php(?:0x?|:[0-9]++\$)[0-9a-fA-F]++/', fn ($m) => class_exists($m[0], false) ? (get_parent_class($m[0]) ?: key(class_implements($m[0])) ?: 'class').'@anonymous' : $m[0], $message); } $width = $this->terminal->getWidth() ? $this->terminal->getWidth() - 1 : \PHP_INT_MAX; @@ -903,6 +924,8 @@ class Application implements ResetInterface /** * Configures the input and output instances based on the user arguments and options. + * + * @return void */ protected function configureIO(InputInterface $input, OutputInterface $output) { @@ -977,44 +1000,62 @@ class Application implements ResetInterface } } - if ($this->signalsToDispatchEvent) { - $commandSignals = $command instanceof SignalableCommandInterface ? $command->getSubscribedSignals() : []; + $commandSignals = $command instanceof SignalableCommandInterface ? $command->getSubscribedSignals() : []; + if ($commandSignals || $this->dispatcher && $this->signalsToDispatchEvent) { + 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 ($commandSignals || null !== $this->dispatcher) { - 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 (Terminal::hasSttyAvailable()) { + $sttyMode = shell_exec('stty -g'); - if (Terminal::hasSttyAvailable()) { - $sttyMode = shell_exec('stty -g'); - - foreach ([\SIGINT, \SIGTERM] as $signal) { - $this->signalRegistry->register($signal, static function () use ($sttyMode) { - shell_exec('stty '.$sttyMode); - }); - } + foreach ([\SIGINT, \SIGTERM] as $signal) { + $this->signalRegistry->register($signal, static fn () => shell_exec('stty '.$sttyMode)); } } - if (null !== $this->dispatcher) { + if ($this->dispatcher) { + // We register application signals, so that we can dispatch the event foreach ($this->signalsToDispatchEvent as $signal) { $event = new ConsoleSignalEvent($command, $input, $output, $signal); - $this->signalRegistry->register($signal, function ($signal, $hasNext) use ($event) { + $this->signalRegistry->register($signal, function ($signal) use ($event, $command, $commandSignals) { $this->dispatcher->dispatch($event, ConsoleEvents::SIGNAL); + $exitCode = $event->getExitCode(); - // No more handlers, we try to simulate PHP default behavior - if (!$hasNext) { - if (!\in_array($signal, [\SIGUSR1, \SIGUSR2], true)) { - exit(0); + // If the command is signalable, we call the handleSignal() method + if (\in_array($signal, $commandSignals, true)) { + $exitCode = $command->handleSignal($signal, $exitCode); + // BC layer for Symfony <= 5 + if (null === $exitCode) { + trigger_deprecation('symfony/console', '6.3', 'Not returning an exit code from "%s::handleSignal()" is deprecated, return "false" to keep the command running or "0" to exit successfully.', get_debug_type($command)); + $exitCode = 0; } } + + if (false !== $exitCode) { + exit($exitCode); + } }); } + + // then we register command signals, but not if already handled after the dispatcher + $commandSignals = array_diff($commandSignals, $this->signalsToDispatchEvent); } foreach ($commandSignals as $signal) { - $this->signalRegistry->register($signal, [$command, 'handleSignal']); + $this->signalRegistry->register($signal, function (int $signal) use ($command): void { + $exitCode = $command->handleSignal($signal); + // BC layer for Symfony <= 5 + if (null === $exitCode) { + trigger_deprecation('symfony/console', '6.3', 'Not returning an exit code from "%s::handleSignal()" is deprecated, return "false" to keep the command running or "0" to exit successfully.', get_debug_type($command)); + $exitCode = 0; + } + + if (false !== $exitCode) { + exit($exitCode); + } + }); } } @@ -1170,7 +1211,7 @@ class Application implements ResetInterface } } - $alternatives = array_filter($alternatives, function ($lev) use ($threshold) { return $lev < 2 * $threshold; }); + $alternatives = array_filter($alternatives, fn ($lev) => $lev < 2 * $threshold); ksort($alternatives, \SORT_NATURAL | \SORT_FLAG_CASE); return array_keys($alternatives); @@ -1261,7 +1302,7 @@ class Application implements ResetInterface return $namespaces; } - private function init() + private function init(): void { if ($this->initialized) { return; diff --git a/vendor/symfony/console/CHANGELOG.md b/vendor/symfony/console/CHANGELOG.md index 61c36b0e..3428a57d 100644 --- a/vendor/symfony/console/CHANGELOG.md +++ b/vendor/symfony/console/CHANGELOG.md @@ -1,6 +1,13 @@ CHANGELOG ========= +6.3 +--- + + * Add support for choosing exit code while handling signal, or to not exit at all + * Add `ProgressBar::setPlaceholderFormatter` to set a placeholder attached to a instance, instead of being global. + * Add `ReStructuredTextDescriptor` + 6.2 --- diff --git a/vendor/symfony/console/Command/Command.php b/vendor/symfony/console/Command/Command.php index 1e3c1a5a..704b112d 100644 --- a/vendor/symfony/console/Command/Command.php +++ b/vendor/symfony/console/Command/Command.php @@ -141,12 +141,17 @@ class Command * Ignores validation errors. * * This is mainly useful for the help command. + * + * @return void */ public function ignoreValidationErrors() { $this->ignoreValidationErrors = true; } + /** + * @return void + */ public function setApplication(Application $application = null) { if (1 > \func_num_args()) { @@ -162,6 +167,9 @@ class Command $this->fullDefinition = null; } + /** + * @return void + */ public function setHelperSet(HelperSet $helperSet) { $this->helperSet = $helperSet; @@ -198,6 +206,8 @@ class Command /** * Configures the current command. + * + * @return void */ protected function configure() { @@ -228,6 +238,8 @@ class Command * 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. + * + * @return void */ protected function interact(InputInterface $input, OutputInterface $output) { @@ -242,6 +254,8 @@ class Command * * @see InputInterface::bind() * @see InputInterface::validate() + * + * @return void */ protected function initialize(InputInterface $input, OutputInterface $output) { @@ -378,7 +392,7 @@ class Command * * @internal */ - public function mergeApplicationDefinition(bool $mergeArgs = true) + public function mergeApplicationDefinition(bool $mergeArgs = true): void { if (null === $this->application) { return; @@ -702,7 +716,7 @@ class Command * * @throws InvalidArgumentException When the name is invalid */ - private function validateName(string $name) + private function validateName(string $name): void { if (!preg_match('/^[^\:]++(\:[^\:]++)*$/', $name)) { throw new InvalidArgumentException(sprintf('Command name "%s" is invalid.', $name)); diff --git a/vendor/symfony/console/Command/CompleteCommand.php b/vendor/symfony/console/Command/CompleteCommand.php index e65b334c..058578d8 100644 --- a/vendor/symfony/console/Command/CompleteCommand.php +++ b/vendor/symfony/console/Command/CompleteCommand.php @@ -74,7 +74,7 @@ final class CompleteCommand extends Command ; } - protected function initialize(InputInterface $input, OutputInterface $output) + protected function initialize(InputInterface $input, OutputInterface $output): void { $this->isDebug = filter_var(getenv('SYMFONY_COMPLETION_DEBUG'), \FILTER_VALIDATE_BOOL); } @@ -134,12 +134,12 @@ final class CompleteCommand extends Command $completionInput->bind($command->getDefinition()); if (CompletionInput::TYPE_OPTION_NAME === $completionInput->getCompletionType()) { - $this->log(' Completing option names for the '.\get_class($command instanceof LazyCommand ? $command->getCommand() : $command).' command.'); + $this->log(' Completing option names for the '.($command instanceof LazyCommand ? $command->getCommand() : $command)::class.' command.'); $suggestions->suggestOptions($command->getDefinition()->getOptions()); } else { $this->log([ - ' Completing using the '.\get_class($command instanceof LazyCommand ? $command->getCommand() : $command).' class.', + ' Completing using the '.($command instanceof LazyCommand ? $command->getCommand() : $command)::class.' class.', ' Completing '.$completionInput->getCompletionType().' for '.$completionInput->getCompletionName().'', ]); if (null !== $compval = $completionInput->getCompletionValue()) { @@ -155,7 +155,7 @@ final class CompleteCommand extends Command $this->log('Suggestions:'); if ($options = $suggestions->getOptionSuggestions()) { - $this->log(' --'.implode(' --', array_map(function ($o) { return $o->getName(); }, $options))); + $this->log(' --'.implode(' --', array_map(fn ($o) => $o->getName(), $options))); } elseif ($values = $suggestions->getValueSuggestions()) { $this->log(' '.implode(' ', $values)); } else { @@ -173,10 +173,10 @@ final class CompleteCommand extends Command throw $e; } - return self::FAILURE; + return 2; } - return self::SUCCESS; + return 0; } private function createCompletionInput(InputInterface $input): CompletionInput diff --git a/vendor/symfony/console/Command/DumpCompletionCommand.php b/vendor/symfony/console/Command/DumpCompletionCommand.php index 1ad1c0e7..51b613a1 100644 --- a/vendor/symfony/console/Command/DumpCompletionCommand.php +++ b/vendor/symfony/console/Command/DumpCompletionCommand.php @@ -39,7 +39,7 @@ final class DumpCompletionCommand extends Command private array $supportedShells; - protected function configure() + protected function configure(): void { $fullCommand = $_SERVER['PHP_SELF']; $commandName = basename($fullCommand); @@ -48,14 +48,16 @@ final class DumpCompletionCommand extends Command $shell = $this->guessShell(); [$rcFile, $completionFile] = match ($shell) { 'fish' => ['~/.config/fish/config.fish', "/etc/fish/completions/$commandName.fish"], - 'zsh' => ['~/.zshrc', '$fpath[1]/'.$commandName], + 'zsh' => ['~/.zshrc', '$fpath[1]/_'.$commandName], default => ['~/.bashrc', "/etc/bash_completion.d/$commandName"], }; + $supportedShells = implode(', ', $this->getSupportedShells()); + $this ->setHelp(<<%command.name% command dumps the shell completion script required -to use shell autocompletion (currently, bash and fish completion is supported). +to use shell autocompletion (currently, {$supportedShells} completion are supported). Static installation ------------------- @@ -94,7 +96,7 @@ EOH if ($input->getOption('debug')) { $this->tailDebugLog($commandName, $output); - return self::SUCCESS; + return 0; } $shell = $input->getArgument('shell') ?? self::guessShell(); @@ -111,12 +113,12 @@ EOH $output->writeln(sprintf('Shell not detected, Symfony shell completion only supports "%s").', implode('", "', $supportedShells))); } - return self::INVALID; + return 2; } $output->write(str_replace(['{{ COMMAND_NAME }}', '{{ VERSION }}'], [$commandName, CompleteCommand::COMPLETION_API_VERSION], file_get_contents($completionFile))); - return self::SUCCESS; + return 0; } private static function guessShell(): string @@ -141,8 +143,19 @@ EOH */ private function getSupportedShells(): array { - return $this->supportedShells ??= array_map(function ($f) { - return pathinfo($f, \PATHINFO_EXTENSION); - }, glob(__DIR__.'/../Resources/completion.*')); + if (isset($this->supportedShells)) { + return $this->supportedShells; + } + + $shells = []; + + foreach (new \DirectoryIterator(__DIR__.'/../Resources/') as $file) { + if (str_starts_with($file->getBasename(), 'completion.') && $file->isFile()) { + $shells[] = $file->getExtension(); + } + } + sort($shells); + + return $this->supportedShells = $shells; } } diff --git a/vendor/symfony/console/Command/HelpCommand.php b/vendor/symfony/console/Command/HelpCommand.php index d4134e17..e6447b05 100644 --- a/vendor/symfony/console/Command/HelpCommand.php +++ b/vendor/symfony/console/Command/HelpCommand.php @@ -27,6 +27,9 @@ class HelpCommand extends Command { private Command $command; + /** + * @return void + */ protected function configure() { $this->ignoreValidationErrors(); @@ -34,12 +37,8 @@ class HelpCommand extends Command $this ->setName('help') ->setDefinition([ - new InputArgument('command_name', InputArgument::OPTIONAL, 'The command name', 'help', function () { - return array_keys((new ApplicationDescription($this->getApplication()))->getCommands()); - }), - new InputOption('format', null, InputOption::VALUE_REQUIRED, 'The output format (txt, xml, json, or md)', 'txt', function () { - return (new DescriptorHelper())->getFormats(); - }), + new InputArgument('command_name', InputArgument::OPTIONAL, 'The command name', 'help', fn () => array_keys((new ApplicationDescription($this->getApplication()))->getCommands())), + new InputOption('format', null, InputOption::VALUE_REQUIRED, 'The output format (txt, xml, json, or md)', 'txt', fn () => (new DescriptorHelper())->getFormats()), new InputOption('raw', null, InputOption::VALUE_NONE, 'To output raw command help'), ]) ->setDescription('Display help for a command') @@ -58,6 +57,9 @@ EOF ; } + /** + * @return void + */ public function setCommand(Command $command) { $this->command = $command; diff --git a/vendor/symfony/console/Command/ListCommand.php b/vendor/symfony/console/Command/ListCommand.php index cab88b43..5850c3d7 100644 --- a/vendor/symfony/console/Command/ListCommand.php +++ b/vendor/symfony/console/Command/ListCommand.php @@ -25,18 +25,17 @@ use Symfony\Component\Console\Output\OutputInterface; */ class ListCommand extends Command { + /** + * @return void + */ protected function configure() { $this ->setName('list') ->setDefinition([ - new InputArgument('namespace', InputArgument::OPTIONAL, 'The namespace name', null, function () { - return array_keys((new ApplicationDescription($this->getApplication()))->getNamespaces()); - }), + new InputArgument('namespace', InputArgument::OPTIONAL, 'The namespace name', null, fn () => array_keys((new ApplicationDescription($this->getApplication()))->getNamespaces())), new InputOption('raw', null, InputOption::VALUE_NONE, 'To output raw command list'), - new InputOption('format', null, InputOption::VALUE_REQUIRED, 'The output format (txt, xml, json, or md)', 'txt', function () { - return (new DescriptorHelper())->getFormats(); - }), + new InputOption('format', null, InputOption::VALUE_REQUIRED, 'The output format (txt, xml, json, or md)', 'txt', fn () => (new DescriptorHelper())->getFormats()), new InputOption('short', null, InputOption::VALUE_NONE, 'To skip describing commands\' arguments'), ]) ->setDescription('List commands') diff --git a/vendor/symfony/console/Command/LockableTrait.php b/vendor/symfony/console/Command/LockableTrait.php index 67923a9e..c1006a65 100644 --- a/vendor/symfony/console/Command/LockableTrait.php +++ b/vendor/symfony/console/Command/LockableTrait.php @@ -32,7 +32,7 @@ trait LockableTrait 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.'); + throw new LogicException('To enable the locking feature you must install the symfony/lock component. Try running "composer require symfony/lock".'); } if (null !== $this->lock) { @@ -58,7 +58,7 @@ trait LockableTrait /** * Releases the command lock if there is one. */ - private function release() + private function release(): void { if ($this->lock) { $this->lock->release(); diff --git a/vendor/symfony/console/Command/SignalableCommandInterface.php b/vendor/symfony/console/Command/SignalableCommandInterface.php index d439728b..4d087600 100644 --- a/vendor/symfony/console/Command/SignalableCommandInterface.php +++ b/vendor/symfony/console/Command/SignalableCommandInterface.php @@ -25,6 +25,10 @@ interface SignalableCommandInterface /** * The method will be called when the application is signaled. + * + * @param int|false $previousExitCode + + * @return int|false The exit code to return or false to continue the normal execution */ - public function handleSignal(int $signal): void; + public function handleSignal(int $signal, /* int|false $previousExitCode = 0 */); } diff --git a/vendor/symfony/console/Completion/CompletionInput.php b/vendor/symfony/console/Completion/CompletionInput.php index 3ef8db5d..800b7235 100644 --- a/vendor/symfony/console/Completion/CompletionInput.php +++ b/vendor/symfony/console/Completion/CompletionInput.php @@ -34,7 +34,7 @@ final class CompletionInput extends ArgvInput private $tokens; private $currentIndex; private $completionType; - private $completionName = null; + private $completionName; private $completionValue = ''; /** diff --git a/vendor/symfony/console/DependencyInjection/AddConsoleCommandPass.php b/vendor/symfony/console/DependencyInjection/AddConsoleCommandPass.php index 62c80c3b..27705ddb 100644 --- a/vendor/symfony/console/DependencyInjection/AddConsoleCommandPass.php +++ b/vendor/symfony/console/DependencyInjection/AddConsoleCommandPass.php @@ -29,6 +29,9 @@ use Symfony\Component\DependencyInjection\TypedReference; */ class AddConsoleCommandPass implements CompilerPassInterface { + /** + * @return void + */ public function process(ContainerBuilder $container) { $commandServices = $container->findTaggedServiceIds('console.command', true); diff --git a/vendor/symfony/console/Descriptor/ApplicationDescription.php b/vendor/symfony/console/Descriptor/ApplicationDescription.php index 2158339e..f8ed1804 100644 --- a/vendor/symfony/console/Descriptor/ApplicationDescription.php +++ b/vendor/symfony/console/Descriptor/ApplicationDescription.php @@ -79,7 +79,7 @@ class ApplicationDescription return $this->commands[$name] ?? $this->aliases[$name]; } - private function inspectApplication() + private function inspectApplication(): void { $this->commands = []; $this->namespaces = []; diff --git a/vendor/symfony/console/Descriptor/Descriptor.php b/vendor/symfony/console/Descriptor/Descriptor.php index 1476f575..7b2509c6 100644 --- a/vendor/symfony/console/Descriptor/Descriptor.php +++ b/vendor/symfony/console/Descriptor/Descriptor.php @@ -26,12 +26,9 @@ use Symfony\Component\Console\Output\OutputInterface; */ abstract class Descriptor implements DescriptorInterface { - /** - * @var OutputInterface - */ - protected $output; + protected OutputInterface $output; - public function describe(OutputInterface $output, object $object, array $options = []) + public function describe(OutputInterface $output, object $object, array $options = []): void { $this->output = $output; @@ -45,10 +42,7 @@ abstract class Descriptor implements DescriptorInterface }; } - /** - * Writes content to output. - */ - protected function write(string $content, bool $decorated = false) + protected function write(string $content, bool $decorated = false): void { $this->output->write($content, false, $decorated ? OutputInterface::OUTPUT_NORMAL : OutputInterface::OUTPUT_RAW); } @@ -56,25 +50,25 @@ abstract class Descriptor implements DescriptorInterface /** * Describes an InputArgument instance. */ - abstract protected function describeInputArgument(InputArgument $argument, array $options = []); + abstract protected function describeInputArgument(InputArgument $argument, array $options = []): void; /** * Describes an InputOption instance. */ - abstract protected function describeInputOption(InputOption $option, array $options = []); + abstract protected function describeInputOption(InputOption $option, array $options = []): void; /** * Describes an InputDefinition instance. */ - abstract protected function describeInputDefinition(InputDefinition $definition, array $options = []); + abstract protected function describeInputDefinition(InputDefinition $definition, array $options = []): void; /** * Describes a Command instance. */ - abstract protected function describeCommand(Command $command, array $options = []); + abstract protected function describeCommand(Command $command, array $options = []): void; /** * Describes an Application instance. */ - abstract protected function describeApplication(Application $application, array $options = []); + abstract protected function describeApplication(Application $application, array $options = []): void; } diff --git a/vendor/symfony/console/Descriptor/DescriptorInterface.php b/vendor/symfony/console/Descriptor/DescriptorInterface.php index ebea3036..ab468a25 100644 --- a/vendor/symfony/console/Descriptor/DescriptorInterface.php +++ b/vendor/symfony/console/Descriptor/DescriptorInterface.php @@ -20,5 +20,8 @@ use Symfony\Component\Console\Output\OutputInterface; */ interface DescriptorInterface { + /** + * @return void + */ public function describe(OutputInterface $output, object $object, array $options = []); } diff --git a/vendor/symfony/console/Descriptor/JsonDescriptor.php b/vendor/symfony/console/Descriptor/JsonDescriptor.php index 6f79a17a..95630370 100644 --- a/vendor/symfony/console/Descriptor/JsonDescriptor.php +++ b/vendor/symfony/console/Descriptor/JsonDescriptor.php @@ -26,12 +26,12 @@ use Symfony\Component\Console\Input\InputOption; */ class JsonDescriptor extends Descriptor { - protected function describeInputArgument(InputArgument $argument, array $options = []) + protected function describeInputArgument(InputArgument $argument, array $options = []): void { $this->writeData($this->getInputArgumentData($argument), $options); } - protected function describeInputOption(InputOption $option, array $options = []) + protected function describeInputOption(InputOption $option, array $options = []): void { $this->writeData($this->getInputOptionData($option), $options); if ($option->isNegatable()) { @@ -39,17 +39,17 @@ class JsonDescriptor extends Descriptor } } - protected function describeInputDefinition(InputDefinition $definition, array $options = []) + protected function describeInputDefinition(InputDefinition $definition, array $options = []): void { $this->writeData($this->getInputDefinitionData($definition), $options); } - protected function describeCommand(Command $command, array $options = []) + protected function describeCommand(Command $command, array $options = []): void { $this->writeData($this->getCommandData($command, $options['short'] ?? false), $options); } - protected function describeApplication(Application $application, array $options = []) + protected function describeApplication(Application $application, array $options = []): void { $describedNamespace = $options['namespace'] ?? null; $description = new ApplicationDescription($application, $describedNamespace, true); @@ -81,7 +81,7 @@ class JsonDescriptor extends Descriptor /** * Writes data as json. */ - private function writeData(array $data, array $options) + private function writeData(array $data, array $options): void { $flags = $options['json_encoding'] ?? 0; diff --git a/vendor/symfony/console/Descriptor/MarkdownDescriptor.php b/vendor/symfony/console/Descriptor/MarkdownDescriptor.php index fbd9c534..b3f16ee9 100644 --- a/vendor/symfony/console/Descriptor/MarkdownDescriptor.php +++ b/vendor/symfony/console/Descriptor/MarkdownDescriptor.php @@ -28,7 +28,7 @@ use Symfony\Component\Console\Output\OutputInterface; */ class MarkdownDescriptor extends Descriptor { - public function describe(OutputInterface $output, object $object, array $options = []) + public function describe(OutputInterface $output, object $object, array $options = []): void { $decorated = $output->isDecorated(); $output->setDecorated(false); @@ -38,12 +38,12 @@ class MarkdownDescriptor extends Descriptor $output->setDecorated($decorated); } - protected function write(string $content, bool $decorated = true) + protected function write(string $content, bool $decorated = true): void { parent::write($content, $decorated); } - protected function describeInputArgument(InputArgument $argument, array $options = []) + protected function describeInputArgument(InputArgument $argument, array $options = []): void { $this->write( '#### `'.($argument->getName() ?: '')."`\n\n" @@ -54,7 +54,7 @@ class MarkdownDescriptor extends Descriptor ); } - protected function describeInputOption(InputOption $option, array $options = []) + protected function describeInputOption(InputOption $option, array $options = []): void { $name = '--'.$option->getName(); if ($option->isNegatable()) { @@ -75,15 +75,13 @@ class MarkdownDescriptor extends Descriptor ); } - protected function describeInputDefinition(InputDefinition $definition, array $options = []) + protected function describeInputDefinition(InputDefinition $definition, array $options = []): void { 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); - } + $this->describeInputArgument($argument); } } @@ -95,14 +93,12 @@ class MarkdownDescriptor extends Descriptor $this->write('### Options'); foreach ($definition->getOptions() as $option) { $this->write("\n\n"); - if (null !== $describeInputOption = $this->describeInputOption($option)) { - $this->write($describeInputOption); - } + $this->describeInputOption($option); } } } - protected function describeCommand(Command $command, array $options = []) + protected function describeCommand(Command $command, array $options = []): void { if ($options['short'] ?? false) { $this->write( @@ -110,9 +106,7 @@ class MarkdownDescriptor extends Descriptor .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"; - }) + .array_reduce($command->getAliases(), fn ($carry, $usage) => $carry.'* `'.$usage.'`'."\n") ); return; @@ -125,9 +119,7 @@ class MarkdownDescriptor extends Descriptor .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"; - }) + .array_reduce(array_merge([$command->getSynopsis()], $command->getAliases(), $command->getUsages()), fn ($carry, $usage) => $carry.'* `'.$usage.'`'."\n") ); if ($help = $command->getProcessedHelp()) { @@ -142,7 +134,7 @@ class MarkdownDescriptor extends Descriptor } } - protected function describeApplication(Application $application, array $options = []) + protected function describeApplication(Application $application, array $options = []): void { $describedNamespace = $options['namespace'] ?? null; $description = new ApplicationDescription($application, $describedNamespace); @@ -157,16 +149,12 @@ class MarkdownDescriptor extends Descriptor } $this->write("\n\n"); - $this->write(implode("\n", array_map(function ($commandName) use ($description) { - return sprintf('* [`%s`](#%s)', $commandName, str_replace(':', '', $description->getCommand($commandName)->getName())); - }, $namespace['commands']))); + $this->write(implode("\n", array_map(fn ($commandName) => sprintf('* [`%s`](#%s)', $commandName, str_replace(':', '', $description->getCommand($commandName)->getName())), $namespace['commands']))); } foreach ($description->getCommands() as $command) { $this->write("\n\n"); - if (null !== $describeCommand = $this->describeCommand($command, $options)) { - $this->write($describeCommand); - } + $this->describeCommand($command, $options); } } diff --git a/vendor/symfony/console/Descriptor/ReStructuredTextDescriptor.php b/vendor/symfony/console/Descriptor/ReStructuredTextDescriptor.php new file mode 100644 index 00000000..d4423fd3 --- /dev/null +++ b/vendor/symfony/console/Descriptor/ReStructuredTextDescriptor.php @@ -0,0 +1,272 @@ + + * + * 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; +use Symfony\Component\String\UnicodeString; + +class ReStructuredTextDescriptor extends Descriptor +{ + //

+ private string $partChar = '='; + //

+ private string $chapterChar = '-'; + //

+ private string $sectionChar = '~'; + //

+ private string $subsectionChar = '.'; + //

+ private string $subsubsectionChar = '^'; + //
+ private string $paragraphsChar = '"'; + + private array $visibleNamespaces = []; + + public function describe(OutputInterface $output, object $object, array $options = []): void + { + $decorated = $output->isDecorated(); + $output->setDecorated(false); + + parent::describe($output, $object, $options); + + $output->setDecorated($decorated); + } + + /** + * Override parent method to set $decorated = true. + */ + protected function write(string $content, bool $decorated = true): void + { + parent::write($content, $decorated); + } + + protected function describeInputArgument(InputArgument $argument, array $options = []): void + { + $this->write( + $argument->getName() ?: ''."\n".str_repeat($this->paragraphsChar, Helper::width($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)).'``' + ); + } + + protected function describeInputOption(InputOption $option, array $options = []): void + { + $name = '\-\-'.$option->getName(); + if ($option->isNegatable()) { + $name .= '|\-\-no-'.$option->getName(); + } + if ($option->getShortcut()) { + $name .= '|-'.str_replace('|', '|-', $option->getShortcut()); + } + + $optionDescription = $option->getDescription() ? preg_replace('/\s*[\r\n]\s*/', "\n\n", $option->getDescription())."\n\n" : ''; + $optionDescription = (new UnicodeString($optionDescription))->ascii(); + $this->write( + $name."\n".str_repeat($this->paragraphsChar, Helper::width($name))."\n\n" + .$optionDescription + .'- **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)).'``'."\n" + ); + } + + protected function describeInputDefinition(InputDefinition $definition, array $options = []): void + { + if ($showArguments = ((bool) $definition->getArguments())) { + $this->write("Arguments\n".str_repeat($this->subsubsectionChar, 9))."\n\n"; + foreach ($definition->getArguments() as $argument) { + $this->write("\n\n"); + $this->describeInputArgument($argument); + } + } + + if ($nonDefaultOptions = $this->getNonDefaultOptions($definition)) { + if ($showArguments) { + $this->write("\n\n"); + } + + $this->write("Options\n".str_repeat($this->subsubsectionChar, 7)."\n\n"); + foreach ($nonDefaultOptions as $option) { + $this->describeInputOption($option); + $this->write("\n"); + } + } + } + + protected function describeCommand(Command $command, array $options = []): void + { + if ($options['short'] ?? false) { + $this->write( + '``'.$command->getName()."``\n" + .str_repeat($this->subsectionChar, Helper::width($command->getName()))."\n\n" + .($command->getDescription() ? $command->getDescription()."\n\n" : '') + ."Usage\n".str_repeat($this->paragraphsChar, 5)."\n\n" + .array_reduce($command->getAliases(), static fn ($carry, $usage) => $carry.'- ``'.$usage.'``'."\n") + ); + + return; + } + + $command->mergeApplicationDefinition(false); + + foreach ($command->getAliases() as $alias) { + $this->write('.. _'.$alias.":\n\n"); + } + $this->write( + $command->getName()."\n" + .str_repeat($this->subsectionChar, Helper::width($command->getName()))."\n\n" + .($command->getDescription() ? $command->getDescription()."\n\n" : '') + ."Usage\n".str_repeat($this->subsubsectionChar, 5)."\n\n" + .array_reduce(array_merge([$command->getSynopsis()], $command->getAliases(), $command->getUsages()), static fn ($carry, $usage) => $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); + } + } + + protected function describeApplication(Application $application, array $options = []): void + { + $description = new ApplicationDescription($application, $options['namespace'] ?? null); + $title = $this->getApplicationTitle($application); + + $this->write($title."\n".str_repeat($this->partChar, Helper::width($title))); + $this->createTableOfContents($description, $application); + $this->describeCommands($application, $options); + } + + private function getApplicationTitle(Application $application): string + { + if ('UNKNOWN' === $application->getName()) { + return 'Console Tool'; + } + if ('UNKNOWN' !== $application->getVersion()) { + return sprintf('%s %s', $application->getName(), $application->getVersion()); + } + + return $application->getName(); + } + + private function describeCommands($application, array $options): void + { + $title = 'Commands'; + $this->write("\n\n$title\n".str_repeat($this->chapterChar, Helper::width($title))."\n\n"); + foreach ($this->visibleNamespaces as $namespace) { + if ('_global' === $namespace) { + $commands = $application->all(''); + $this->write('Global'."\n".str_repeat($this->sectionChar, Helper::width('Global'))."\n\n"); + } else { + $commands = $application->all($namespace); + $this->write($namespace."\n".str_repeat($this->sectionChar, Helper::width($namespace))."\n\n"); + } + + foreach ($this->removeAliasesAndHiddenCommands($commands) as $command) { + $this->describeCommand($command, $options); + $this->write("\n\n"); + } + } + } + + private function createTableOfContents(ApplicationDescription $description, Application $application): void + { + $this->setVisibleNamespaces($description); + $chapterTitle = 'Table of Contents'; + $this->write("\n\n$chapterTitle\n".str_repeat($this->chapterChar, Helper::width($chapterTitle))."\n\n"); + foreach ($this->visibleNamespaces as $namespace) { + if ('_global' === $namespace) { + $commands = $application->all(''); + } else { + $commands = $application->all($namespace); + $this->write("\n\n"); + $this->write($namespace."\n".str_repeat($this->sectionChar, Helper::width($namespace))."\n\n"); + } + $commands = $this->removeAliasesAndHiddenCommands($commands); + + $this->write("\n\n"); + $this->write(implode("\n", array_map(static fn ($commandName) => sprintf('- `%s`_', $commandName), array_keys($commands)))); + } + } + + private function getNonDefaultOptions(InputDefinition $definition): array + { + $globalOptions = [ + 'help', + 'quiet', + 'verbose', + 'version', + 'ansi', + 'no-interaction', + ]; + $nonDefaultOptions = []; + foreach ($definition->getOptions() as $option) { + // Skip global options. + if (!\in_array($option->getName(), $globalOptions)) { + $nonDefaultOptions[] = $option; + } + } + + return $nonDefaultOptions; + } + + private function setVisibleNamespaces(ApplicationDescription $description): void + { + $commands = $description->getCommands(); + foreach ($description->getNamespaces() as $namespace) { + try { + $namespaceCommands = $namespace['commands']; + foreach ($namespaceCommands as $key => $commandName) { + if (!\array_key_exists($commandName, $commands)) { + // If the array key does not exist, then this is an alias. + unset($namespaceCommands[$key]); + } elseif ($commands[$commandName]->isHidden()) { + unset($namespaceCommands[$key]); + } + } + if (!$namespaceCommands) { + // If the namespace contained only aliases or hidden commands, skip the namespace. + continue; + } + } catch (\Exception) { + } + $this->visibleNamespaces[] = $namespace['id']; + } + } + + private function removeAliasesAndHiddenCommands(array $commands): array + { + foreach ($commands as $key => $command) { + if ($command->isHidden() || \in_array($key, $command->getAliases(), true)) { + unset($commands[$key]); + } + } + unset($commands['completion']); + + return $commands; + } +} diff --git a/vendor/symfony/console/Descriptor/TextDescriptor.php b/vendor/symfony/console/Descriptor/TextDescriptor.php index 48a0b42a..d04d1023 100644 --- a/vendor/symfony/console/Descriptor/TextDescriptor.php +++ b/vendor/symfony/console/Descriptor/TextDescriptor.php @@ -28,7 +28,7 @@ use Symfony\Component\Console\Input\InputOption; */ class TextDescriptor extends Descriptor { - protected function describeInputArgument(InputArgument $argument, array $options = []) + protected function describeInputArgument(InputArgument $argument, array $options = []): void { if (null !== $argument->getDefault() && (!\is_array($argument->getDefault()) || \count($argument->getDefault()))) { $default = sprintf(' [default: %s]', $this->formatDefaultValue($argument->getDefault())); @@ -48,7 +48,7 @@ class TextDescriptor extends Descriptor ), $options); } - protected function describeInputOption(InputOption $option, array $options = []) + protected function describeInputOption(InputOption $option, array $options = []): void { if ($option->acceptValue() && null !== $option->getDefault() && (!\is_array($option->getDefault()) || \count($option->getDefault()))) { $default = sprintf(' [default: %s]', $this->formatDefaultValue($option->getDefault())); @@ -83,7 +83,7 @@ class TextDescriptor extends Descriptor ), $options); } - protected function describeInputDefinition(InputDefinition $definition, array $options = []) + protected function describeInputDefinition(InputDefinition $definition, array $options = []): void { $totalWidth = $this->calculateTotalWidthForOptions($definition->getOptions()); foreach ($definition->getArguments() as $argument) { @@ -122,7 +122,7 @@ class TextDescriptor extends Descriptor } } - protected function describeCommand(Command $command, array $options = []) + protected function describeCommand(Command $command, array $options = []): void { $command->mergeApplicationDefinition(false); @@ -157,7 +157,7 @@ class TextDescriptor extends Descriptor } } - protected function describeApplication(Application $application, array $options = []) + protected function describeApplication(Application $application, array $options = []): void { $describedNamespace = $options['namespace'] ?? null; $description = new ApplicationDescription($application, $describedNamespace); @@ -193,9 +193,7 @@ class TextDescriptor extends Descriptor } // calculate max. width based on available commands per namespace - $width = $this->getColumnWidth(array_merge(...array_values(array_map(function ($namespace) use ($commands) { - return array_intersect($namespace['commands'], array_keys($commands)); - }, array_values($namespaces))))); + $width = $this->getColumnWidth(array_merge(...array_values(array_map(fn ($namespace) => array_intersect($namespace['commands'], array_keys($commands)), array_values($namespaces))))); if ($describedNamespace) { $this->writeText(sprintf('Available commands for the "%s" namespace:', $describedNamespace), $options); @@ -204,9 +202,7 @@ class TextDescriptor extends Descriptor } foreach ($namespaces as $namespace) { - $namespace['commands'] = array_filter($namespace['commands'], function ($name) use ($commands) { - return isset($commands[$name]); - }); + $namespace['commands'] = array_filter($namespace['commands'], fn ($name) => isset($commands[$name])); if (!$namespace['commands']) { continue; @@ -230,7 +226,7 @@ class TextDescriptor extends Descriptor } } - private function writeText(string $content, array $options = []) + private function writeText(string $content, array $options = []): void { $this->write( isset($options['raw_text']) && $options['raw_text'] ? strip_tags($content) : $content, diff --git a/vendor/symfony/console/Descriptor/XmlDescriptor.php b/vendor/symfony/console/Descriptor/XmlDescriptor.php index f4643a9a..72580fd9 100644 --- a/vendor/symfony/console/Descriptor/XmlDescriptor.php +++ b/vendor/symfony/console/Descriptor/XmlDescriptor.php @@ -120,27 +120,27 @@ class XmlDescriptor extends Descriptor return $dom; } - protected function describeInputArgument(InputArgument $argument, array $options = []) + protected function describeInputArgument(InputArgument $argument, array $options = []): void { $this->writeDocument($this->getInputArgumentDocument($argument)); } - protected function describeInputOption(InputOption $option, array $options = []) + protected function describeInputOption(InputOption $option, array $options = []): void { $this->writeDocument($this->getInputOptionDocument($option)); } - protected function describeInputDefinition(InputDefinition $definition, array $options = []) + protected function describeInputDefinition(InputDefinition $definition, array $options = []): void { $this->writeDocument($this->getInputDefinitionDocument($definition)); } - protected function describeCommand(Command $command, array $options = []) + protected function describeCommand(Command $command, array $options = []): void { $this->writeDocument($this->getCommandDocument($command, $options['short'] ?? false)); } - protected function describeApplication(Application $application, array $options = []) + protected function describeApplication(Application $application, array $options = []): void { $this->writeDocument($this->getApplicationDocument($application, $options['namespace'] ?? null, $options['short'] ?? false)); } @@ -148,7 +148,7 @@ class XmlDescriptor extends Descriptor /** * Appends document children to parent node. */ - private function appendDocument(\DOMNode $parentNode, \DOMNode $importedParent) + private function appendDocument(\DOMNode $parentNode, \DOMNode $importedParent): void { foreach ($importedParent->childNodes as $childNode) { $parentNode->appendChild($parentNode->ownerDocument->importNode($childNode, true)); @@ -158,7 +158,7 @@ class XmlDescriptor extends Descriptor /** * Writes DOM document. */ - private function writeDocument(\DOMDocument $dom) + private function writeDocument(\DOMDocument $dom): void { $dom->formatOutput = true; $this->write($dom->saveXML()); diff --git a/vendor/symfony/console/Event/ConsoleSignalEvent.php b/vendor/symfony/console/Event/ConsoleSignalEvent.php index 766af691..95af1f91 100644 --- a/vendor/symfony/console/Event/ConsoleSignalEvent.php +++ b/vendor/symfony/console/Event/ConsoleSignalEvent.php @@ -21,15 +21,36 @@ use Symfony\Component\Console\Output\OutputInterface; final class ConsoleSignalEvent extends ConsoleEvent { private int $handlingSignal; + private int|false $exitCode; - public function __construct(Command $command, InputInterface $input, OutputInterface $output, int $handlingSignal) + public function __construct(Command $command, InputInterface $input, OutputInterface $output, int $handlingSignal, int|false $exitCode = 0) { parent::__construct($command, $input, $output); $this->handlingSignal = $handlingSignal; + $this->exitCode = $exitCode; } public function getHandlingSignal(): int { return $this->handlingSignal; } + + public function setExitCode(int $exitCode): void + { + if ($exitCode < 0 || $exitCode > 255) { + throw new \InvalidArgumentException('Exit code must be between 0 and 255.'); + } + + $this->exitCode = $exitCode; + } + + public function abortExit(): void + { + $this->exitCode = false; + } + + public function getExitCode(): int|false + { + return $this->exitCode; + } } diff --git a/vendor/symfony/console/EventListener/ErrorListener.php b/vendor/symfony/console/EventListener/ErrorListener.php index 773a13a1..9925a5f7 100644 --- a/vendor/symfony/console/EventListener/ErrorListener.php +++ b/vendor/symfony/console/EventListener/ErrorListener.php @@ -31,6 +31,9 @@ class ErrorListener implements EventSubscriberInterface $this->logger = $logger; } + /** + * @return void + */ public function onConsoleError(ConsoleErrorEvent $event) { if (null === $this->logger) { @@ -48,6 +51,9 @@ class ErrorListener implements EventSubscriberInterface $this->logger->critical('Error thrown while running command "{command}". Message: "{message}"', ['exception' => $error, 'command' => $inputString, 'message' => $error->getMessage()]); } + /** + * @return void + */ public function onConsoleTerminate(ConsoleTerminateEvent $event) { if (null === $this->logger) { diff --git a/vendor/symfony/console/Formatter/OutputFormatter.php b/vendor/symfony/console/Formatter/OutputFormatter.php index 38e75c31..9cb63104 100644 --- a/vendor/symfony/console/Formatter/OutputFormatter.php +++ b/vendor/symfony/console/Formatter/OutputFormatter.php @@ -81,6 +81,9 @@ class OutputFormatter implements WrappableOutputFormatterInterface $this->styleStack = new OutputFormatterStyleStack(); } + /** + * @return void + */ public function setDecorated(bool $decorated) { $this->decorated = $decorated; @@ -91,6 +94,9 @@ class OutputFormatter implements WrappableOutputFormatterInterface return $this->decorated; } + /** + * @return void + */ public function setStyle(string $name, OutputFormatterStyleInterface $style) { $this->styles[strtolower($name)] = $style; @@ -115,6 +121,9 @@ class OutputFormatter implements WrappableOutputFormatterInterface return $this->formatAndWrap($message, 0); } + /** + * @return string + */ public function formatAndWrap(?string $message, int $width) { if (null === $message) { diff --git a/vendor/symfony/console/Formatter/OutputFormatterInterface.php b/vendor/symfony/console/Formatter/OutputFormatterInterface.php index b94e51de..433cd419 100644 --- a/vendor/symfony/console/Formatter/OutputFormatterInterface.php +++ b/vendor/symfony/console/Formatter/OutputFormatterInterface.php @@ -20,6 +20,8 @@ interface OutputFormatterInterface { /** * Sets the decorated flag. + * + * @return void */ public function setDecorated(bool $decorated); @@ -30,6 +32,8 @@ interface OutputFormatterInterface /** * Sets a new style. + * + * @return void */ public function setStyle(string $name, OutputFormatterStyleInterface $style); diff --git a/vendor/symfony/console/Formatter/OutputFormatterStyle.php b/vendor/symfony/console/Formatter/OutputFormatterStyle.php index 1659986e..346a474c 100644 --- a/vendor/symfony/console/Formatter/OutputFormatterStyle.php +++ b/vendor/symfony/console/Formatter/OutputFormatterStyle.php @@ -38,6 +38,9 @@ class OutputFormatterStyle implements OutputFormatterStyleInterface $this->color = new Color($this->foreground = $foreground ?: '', $this->background = $background ?: '', $this->options = $options); } + /** + * @return void + */ public function setForeground(string $color = null) { if (1 > \func_num_args()) { @@ -46,6 +49,9 @@ class OutputFormatterStyle implements OutputFormatterStyleInterface $this->color = new Color($this->foreground = $color ?: '', $this->background, $this->options); } + /** + * @return void + */ public function setBackground(string $color = null) { if (1 > \func_num_args()) { @@ -59,12 +65,18 @@ class OutputFormatterStyle implements OutputFormatterStyleInterface $this->href = $url; } + /** + * @return void + */ public function setOption(string $option) { $this->options[] = $option; $this->color = new Color($this->foreground, $this->background, $this->options); } + /** + * @return void + */ public function unsetOption(string $option) { $pos = array_search($option, $this->options); @@ -75,6 +87,9 @@ class OutputFormatterStyle implements OutputFormatterStyleInterface $this->color = new Color($this->foreground, $this->background, $this->options); } + /** + * @return void + */ public function setOptions(array $options) { $this->color = new Color($this->foreground, $this->background, $this->options = $options); @@ -83,7 +98,8 @@ class OutputFormatterStyle implements OutputFormatterStyleInterface public function apply(string $text): string { $this->handlesHrefGracefully ??= 'JetBrains-JediTerm' !== getenv('TERMINAL_EMULATOR') - && (!getenv('KONSOLE_VERSION') || (int) getenv('KONSOLE_VERSION') > 201100); + && (!getenv('KONSOLE_VERSION') || (int) getenv('KONSOLE_VERSION') > 201100) + && !isset($_SERVER['IDEA_INITIAL_DIRECTORY']); if (null !== $this->href && $this->handlesHrefGracefully) { $text = "\033]8;;$this->href\033\\$text\033]8;;\033\\"; diff --git a/vendor/symfony/console/Formatter/OutputFormatterStyleInterface.php b/vendor/symfony/console/Formatter/OutputFormatterStyleInterface.php index 7ed67d9a..3b15098c 100644 --- a/vendor/symfony/console/Formatter/OutputFormatterStyleInterface.php +++ b/vendor/symfony/console/Formatter/OutputFormatterStyleInterface.php @@ -20,26 +20,36 @@ interface OutputFormatterStyleInterface { /** * Sets style foreground color. + * + * @return void */ public function setForeground(?string $color); /** * Sets style background color. + * + * @return void */ public function setBackground(?string $color); /** * Sets some specific style option. + * + * @return void */ public function setOption(string $option); /** * Unsets some specific style option. + * + * @return void */ public function unsetOption(string $option); /** * Sets multiple style options at once. + * + * @return void */ public function setOptions(array $options); diff --git a/vendor/symfony/console/Formatter/OutputFormatterStyleStack.php b/vendor/symfony/console/Formatter/OutputFormatterStyleStack.php index 2c5cdf9b..f98c2eff 100644 --- a/vendor/symfony/console/Formatter/OutputFormatterStyleStack.php +++ b/vendor/symfony/console/Formatter/OutputFormatterStyleStack.php @@ -34,6 +34,8 @@ class OutputFormatterStyleStack implements ResetInterface /** * Resets stack (ie. empty internal arrays). + * + * @return void */ public function reset() { @@ -42,6 +44,8 @@ class OutputFormatterStyleStack implements ResetInterface /** * Pushes a style in the stack. + * + * @return void */ public function push(OutputFormatterStyleInterface $style) { diff --git a/vendor/symfony/console/Helper/DescriptorHelper.php b/vendor/symfony/console/Helper/DescriptorHelper.php index 3015ff08..eb32bce8 100644 --- a/vendor/symfony/console/Helper/DescriptorHelper.php +++ b/vendor/symfony/console/Helper/DescriptorHelper.php @@ -14,6 +14,7 @@ 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\ReStructuredTextDescriptor; use Symfony\Component\Console\Descriptor\TextDescriptor; use Symfony\Component\Console\Descriptor\XmlDescriptor; use Symfony\Component\Console\Exception\InvalidArgumentException; @@ -38,6 +39,7 @@ class DescriptorHelper extends Helper ->register('xml', new XmlDescriptor()) ->register('json', new JsonDescriptor()) ->register('md', new MarkdownDescriptor()) + ->register('rst', new ReStructuredTextDescriptor()) ; } @@ -48,6 +50,8 @@ class DescriptorHelper extends Helper * * format: string, the output format name * * raw_text: boolean, sets output type as raw * + * @return void + * * @throws InvalidArgumentException when the given format is not supported */ public function describe(OutputInterface $output, ?object $object, array $options = []) diff --git a/vendor/symfony/console/Helper/Dumper.php b/vendor/symfony/console/Helper/Dumper.php index ac7571ce..8c6a94d5 100644 --- a/vendor/symfony/console/Helper/Dumper.php +++ b/vendor/symfony/console/Helper/Dumper.php @@ -40,14 +40,12 @@ final class Dumper return rtrim($dumper->dump(($this->cloner ??= new VarCloner())->cloneVar($var)->withRefHandles(false), true)); }; } else { - $this->handler = function ($var): string { - return match (true) { - null === $var => 'null', - true === $var => 'true', - false === $var => 'false', - \is_string($var) => '"'.$var.'"', - default => rtrim(print_r($var, true)), - }; + $this->handler = fn ($var): string => match (true) { + null === $var => 'null', + true === $var => 'true', + false === $var => 'false', + \is_string($var) => '"'.$var.'"', + default => rtrim(print_r($var, true)), }; } } diff --git a/vendor/symfony/console/Helper/Helper.php b/vendor/symfony/console/Helper/Helper.php index 920196e0..3631b30f 100644 --- a/vendor/symfony/console/Helper/Helper.php +++ b/vendor/symfony/console/Helper/Helper.php @@ -21,8 +21,11 @@ use Symfony\Component\String\UnicodeString; */ abstract class Helper implements HelperInterface { - protected $helperSet = null; + protected $helperSet; + /** + * @return void + */ public function setHelperSet(HelperSet $helperSet = null) { if (1 > \func_num_args()) { @@ -88,6 +91,9 @@ abstract class Helper implements HelperInterface return mb_substr($string, $from, $length, $encoding); } + /** + * @return string + */ public static function formatTime(int|float $secs) { static $timeFormats = [ @@ -117,6 +123,9 @@ abstract class Helper implements HelperInterface } } + /** + * @return string + */ public static function formatMemory(int $memory) { if ($memory >= 1024 * 1024 * 1024) { @@ -134,6 +143,9 @@ abstract class Helper implements HelperInterface return sprintf('%d B', $memory); } + /** + * @return string + */ public static function removeDecoration(OutputFormatterInterface $formatter, ?string $string) { $isDecorated = $formatter->isDecorated(); diff --git a/vendor/symfony/console/Helper/HelperInterface.php b/vendor/symfony/console/Helper/HelperInterface.php index 2762cdf0..ab626c93 100644 --- a/vendor/symfony/console/Helper/HelperInterface.php +++ b/vendor/symfony/console/Helper/HelperInterface.php @@ -20,6 +20,8 @@ interface HelperInterface { /** * Sets the helper set associated with this helper. + * + * @return void */ public function setHelperSet(?HelperSet $helperSet); diff --git a/vendor/symfony/console/Helper/HelperSet.php b/vendor/symfony/console/Helper/HelperSet.php index cefe62be..dc5d499c 100644 --- a/vendor/symfony/console/Helper/HelperSet.php +++ b/vendor/symfony/console/Helper/HelperSet.php @@ -35,6 +35,9 @@ class HelperSet implements \IteratorAggregate } } + /** + * @return void + */ public function set(HelperInterface $helper, string $alias = null) { $this->helpers[$helper->getName()] = $helper; diff --git a/vendor/symfony/console/Helper/InputAwareHelper.php b/vendor/symfony/console/Helper/InputAwareHelper.php index ba81e377..6f822597 100644 --- a/vendor/symfony/console/Helper/InputAwareHelper.php +++ b/vendor/symfony/console/Helper/InputAwareHelper.php @@ -23,6 +23,9 @@ abstract class InputAwareHelper extends Helper implements InputAwareInterface { protected $input; + /** + * @return void + */ public function setInput(InputInterface $input) { $this->input = $input; diff --git a/vendor/symfony/console/Helper/ProgressBar.php b/vendor/symfony/console/Helper/ProgressBar.php index 0d112609..19faea47 100644 --- a/vendor/symfony/console/Helper/ProgressBar.php +++ b/vendor/symfony/console/Helper/ProgressBar.php @@ -59,6 +59,7 @@ final class ProgressBar private Terminal $terminal; private ?string $previousMessage = null; private Cursor $cursor; + private array $placeholders = []; private static array $formatters; private static array $formats; @@ -94,12 +95,12 @@ final class ProgressBar } /** - * Sets a placeholder formatter for a given name. + * Sets a placeholder formatter for a given name, globally for all instances of ProgressBar. * * 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 + * @param string $name The placeholder name (including the delimiter char like %) + * @param callable(ProgressBar):string $callable A PHP callable */ public static function setPlaceholderFormatterDefinition(string $name, callable $callable): void { @@ -120,6 +121,26 @@ final class ProgressBar return self::$formatters[$name] ?? null; } + /** + * Sets a placeholder formatter for a given name, for this instance only. + * + * @param callable(ProgressBar):string $callable A PHP callable + */ + public function setPlaceholderFormatter(string $name, callable $callable): void + { + $this->placeholders[$name] = $callable; + } + + /** + * Gets the placeholder formatter for a given name. + * + * @param string $name The placeholder name (including the delimiter char like %) + */ + public function getPlaceholderFormatter(string $name): ?callable + { + return $this->placeholders[$name] ?? $this::getPlaceholderFormatterDefinition($name); + } + /** * Sets a format for a given name. * @@ -157,12 +178,12 @@ final class ProgressBar * @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') + public function setMessage(string $message, string $name = 'message'): void { $this->messages[$name] = $message; } - public function getMessage(string $name = 'message') + public function getMessage(string $name = 'message'): string { return $this->messages[$name]; } @@ -215,7 +236,7 @@ final class ProgressBar return round((time() - $this->startTime) / ($this->step - $this->startingStep) * ($this->max - $this->step)); } - public function setBarWidth(int $size) + public function setBarWidth(int $size): void { $this->barWidth = max(1, $size); } @@ -225,7 +246,7 @@ final class ProgressBar return $this->barWidth; } - public function setBarCharacter(string $char) + public function setBarCharacter(string $char): void { $this->barChar = $char; } @@ -235,7 +256,7 @@ final class ProgressBar return $this->barChar ?? ($this->max ? '=' : $this->emptyBarChar); } - public function setEmptyBarCharacter(string $char) + public function setEmptyBarCharacter(string $char): void { $this->emptyBarChar = $char; } @@ -245,7 +266,7 @@ final class ProgressBar return $this->emptyBarChar; } - public function setProgressCharacter(string $char) + public function setProgressCharacter(string $char): void { $this->progressChar = $char; } @@ -255,7 +276,7 @@ final class ProgressBar return $this->progressChar; } - public function setFormat(string $format) + public function setFormat(string $format): void { $this->format = null; $this->internalFormat = $format; @@ -266,7 +287,7 @@ final class ProgressBar * * @param int|null $freq The frequency in steps */ - public function setRedrawFrequency(?int $freq) + public function setRedrawFrequency(?int $freq): void { $this->redrawFreq = null !== $freq ? max(1, $freq) : null; } @@ -325,7 +346,7 @@ final class ProgressBar * * @param int $step Number of steps to advance */ - public function advance(int $step = 1) + public function advance(int $step = 1): void { $this->setProgress($this->step + $step); } @@ -333,12 +354,12 @@ final class ProgressBar /** * Sets whether to overwrite the progressbar, false for new line. */ - public function setOverwrite(bool $overwrite) + public function setOverwrite(bool $overwrite): void { $this->overwrite = $overwrite; } - public function setProgress(int $step) + public function setProgress(int $step): void { if ($this->max && $step > $this->max) { $this->max = $step; @@ -371,7 +392,7 @@ final class ProgressBar } } - public function setMaxSteps(int $max) + public function setMaxSteps(int $max): void { $this->format = null; $this->max = max(0, $max); @@ -431,7 +452,7 @@ final class ProgressBar $this->overwrite(''); } - private function setRealFormat(string $format) + private function setRealFormat(string $format): void { // try to use the _nomax variant if available if (!$this->max && null !== self::getFormatDefinition($format.'_nomax')) { @@ -513,9 +534,7 @@ final class ProgressBar return $display; }, - 'elapsed' => function (self $bar) { - return Helper::formatTime(time() - $bar->getStartTime()); - }, + 'elapsed' => fn (self $bar) => 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.'); @@ -530,18 +549,10 @@ final class ProgressBar 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); - }, + 'memory' => fn (self $bar) => Helper::formatMemory(memory_get_usage(true)), + 'current' => fn (self $bar) => str_pad($bar->getProgress(), $bar->getStepWidth(), ' ', \STR_PAD_LEFT), + 'max' => fn (self $bar) => $bar->getMaxSteps(), + 'percent' => fn (self $bar) => floor($bar->getProgressPercent() * 100), ]; } @@ -568,7 +579,7 @@ final class ProgressBar $regex = "{%([a-z\-_]+)(?:\:([^%]+))?%}i"; $callback = function ($matches) { - if ($formatter = $this::getPlaceholderFormatterDefinition($matches[1])) { + if ($formatter = $this->getPlaceholderFormatter($matches[1])) { $text = $formatter($this, $this->output); } elseif (isset($this->messages[$matches[1]])) { $text = $this->messages[$matches[1]]; @@ -585,9 +596,7 @@ final class ProgressBar $line = preg_replace_callback($regex, $callback, $this->format); // gets string length for each sub line with multiline format - $linesLength = array_map(function ($subLine) { - return Helper::width(Helper::removeDecoration($this->output->getFormatter(), rtrim($subLine, "\r"))); - }, explode("\n", $line)); + $linesLength = array_map(fn ($subLine) => Helper::width(Helper::removeDecoration($this->output->getFormatter(), rtrim($subLine, "\r"))), explode("\n", $line)); $linesWidth = max($linesLength); diff --git a/vendor/symfony/console/Helper/ProgressIndicator.php b/vendor/symfony/console/Helper/ProgressIndicator.php index b5fa24c4..84dbef95 100644 --- a/vendor/symfony/console/Helper/ProgressIndicator.php +++ b/vendor/symfony/console/Helper/ProgressIndicator.php @@ -70,6 +70,8 @@ class ProgressIndicator /** * Sets the current indicator message. + * + * @return void */ public function setMessage(?string $message) { @@ -80,6 +82,8 @@ class ProgressIndicator /** * Starts the indicator output. + * + * @return void */ public function start(string $message) { @@ -98,6 +102,8 @@ class ProgressIndicator /** * Advances the indicator. + * + * @return void */ public function advance() { @@ -123,6 +129,8 @@ class ProgressIndicator /** * Finish the indicator with message. + * + * @return void */ public function finish(string $message) { @@ -148,6 +156,8 @@ class ProgressIndicator * Sets a placeholder formatter for a given name. * * This method also allow you to override an existing placeholder. + * + * @return void */ public static function setPlaceholderFormatterDefinition(string $name, callable $callable) { @@ -166,7 +176,7 @@ class ProgressIndicator return self::$formatters[$name] ?? null; } - private function display() + private function display(): void { if (OutputInterface::VERBOSITY_QUIET === $this->output->getVerbosity()) { return; @@ -195,7 +205,7 @@ class ProgressIndicator /** * Overwrites a previous message to the output. */ - private function overwrite(string $message) + private function overwrite(string $message): void { if ($this->output->isDecorated()) { $this->output->write("\x0D\x1B[2K"); @@ -216,18 +226,10 @@ class ProgressIndicator 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)); - }, + 'indicator' => fn (self $indicator) => $indicator->indicatorValues[$indicator->indicatorCurrent % \count($indicator->indicatorValues)], + 'message' => fn (self $indicator) => $indicator->message, + 'elapsed' => fn (self $indicator) => Helper::formatTime(time() - $indicator->startTime), + 'memory' => fn () => Helper::formatMemory(memory_get_usage(true)), ]; } } diff --git a/vendor/symfony/console/Helper/QuestionHelper.php b/vendor/symfony/console/Helper/QuestionHelper.php index c345b4af..f32813c6 100644 --- a/vendor/symfony/console/Helper/QuestionHelper.php +++ b/vendor/symfony/console/Helper/QuestionHelper.php @@ -68,9 +68,7 @@ class QuestionHelper extends Helper return $this->doAsk($output, $question); } - $interviewer = function () use ($output, $question) { - return $this->doAsk($output, $question); - }; + $interviewer = fn () => $this->doAsk($output, $question); return $this->validateAttempts($interviewer, $output, $question); } catch (MissingInputException $exception) { @@ -91,6 +89,8 @@ class QuestionHelper extends Helper /** * Prevents usage of stty. + * + * @return void */ public static function disableStty() { @@ -123,7 +123,18 @@ class QuestionHelper extends Helper } if (false === $ret) { + $isBlocked = stream_get_meta_data($inputStream)['blocked'] ?? true; + + if (!$isBlocked) { + stream_set_blocking($inputStream, true); + } + $ret = $this->readInput($inputStream, $question); + + if (!$isBlocked) { + stream_set_blocking($inputStream, false); + } + if (false === $ret) { throw new MissingInputException('Aborted.'); } @@ -159,7 +170,7 @@ class QuestionHelper extends Helper } if ($validator = $question->getValidator()) { - return \call_user_func($question->getValidator(), $default); + return \call_user_func($validator, $default); } elseif ($question instanceof ChoiceQuestion) { $choices = $question->getChoices(); @@ -179,6 +190,8 @@ class QuestionHelper extends Helper /** * Outputs the question prompt. + * + * @return void */ protected function writePrompt(OutputInterface $output, Question $question) { @@ -215,6 +228,8 @@ class QuestionHelper extends Helper /** * Outputs an error message. + * + * @return void */ protected function writeError(OutputInterface $output, \Exception $error) { @@ -314,9 +329,7 @@ class QuestionHelper extends Helper $matches = array_filter( $autocomplete($ret), - function ($match) use ($ret) { - return '' === $ret || str_starts_with($match, $ret); - } + fn ($match) => '' === $ret || str_starts_with($match, $ret) ); $numMatches = \count($matches); $ofs = -1; @@ -496,13 +509,11 @@ class QuestionHelper extends Helper return self::$stdinIsInteractive = @posix_isatty(fopen('php://stdin', 'r')); } - if (!\function_exists('exec')) { + if (!\function_exists('shell_exec')) { return self::$stdinIsInteractive = true; } - exec('stty 2> /dev/null', $output, $status); - - return self::$stdinIsInteractive = 1 !== $status; + return self::$stdinIsInteractive = (bool) shell_exec('stty 2> '.('\\' === \DIRECTORY_SEPARATOR ? 'NUL' : '/dev/null')); } /** diff --git a/vendor/symfony/console/Helper/SymfonyQuestionHelper.php b/vendor/symfony/console/Helper/SymfonyQuestionHelper.php index 109045d0..8ebc8437 100644 --- a/vendor/symfony/console/Helper/SymfonyQuestionHelper.php +++ b/vendor/symfony/console/Helper/SymfonyQuestionHelper.php @@ -25,6 +25,9 @@ use Symfony\Component\Console\Style\SymfonyStyle; */ class SymfonyQuestionHelper extends QuestionHelper { + /** + * @return void + */ protected function writePrompt(OutputInterface $output, Question $question) { $text = OutputFormatter::escapeTrailingBackslash($question->getQuestion()); @@ -80,6 +83,9 @@ class SymfonyQuestionHelper extends QuestionHelper $output->write($prompt); } + /** + * @return void + */ protected function writeError(OutputInterface $output, \Exception $error) { if ($output instanceof SymfonyStyle) { diff --git a/vendor/symfony/console/Helper/Table.php b/vendor/symfony/console/Helper/Table.php index 893b3192..cf714873 100644 --- a/vendor/symfony/console/Helper/Table.php +++ b/vendor/symfony/console/Helper/Table.php @@ -66,6 +66,8 @@ class Table /** * Sets a style definition. + * + * @return void */ public static function setStyleDefinition(string $name, TableStyle $style) { @@ -310,6 +312,8 @@ class Table * | 9971-5-0210-0 | A Tale of Two Cities | Charles Dickens | * | 960-425-059-0 | The Lord of the Rings | J. R. R. Tolkien | * +---------------+-----------------------+------------------+ + * + * @return void */ public function render() { @@ -450,7 +454,7 @@ class Table * * +-----+-----------+-------+ */ - private function renderRowSeparator(int $type = self::SEPARATOR_MID, string $title = null, string $titleFormat = null) + private function renderRowSeparator(int $type = self::SEPARATOR_MID, string $title = null, string $titleFormat = null): void { if (!$count = $this->numberOfColumns) { return; @@ -515,7 +519,7 @@ class Table * * | 9971-5-0210-0 | A Tale of Two Cities | Charles Dickens | */ - private function renderRow(array $row, string $cellFormat, string $firstCellFormat = null) + private function renderRow(array $row, string $cellFormat, string $firstCellFormat = null): void { $rowContent = $this->renderColumnSeparator(self::BORDER_OUTSIDE); $columns = $this->getRowColumns($row); @@ -588,7 +592,7 @@ class Table /** * Calculate number of columns for this table. */ - private function calculateNumberOfColumns(array $rows) + private function calculateNumberOfColumns(array $rows): void { $columns = [0]; foreach ($rows as $row) { @@ -727,7 +731,7 @@ class Table /** * fill cells for a row that contains colspan > 1. */ - private function fillCells(iterable $row) + private function fillCells(iterable $row): iterable { $newRow = []; @@ -789,7 +793,7 @@ class Table /** * Calculates columns widths. */ - private function calculateColumnsWidth(iterable $groups) + private function calculateColumnsWidth(iterable $groups): void { for ($column = 0; $column < $this->numberOfColumns; ++$column) { $lengths = []; @@ -804,7 +808,7 @@ class Table $textContent = Helper::removeDecoration($this->output->getFormatter(), $cell); $textLength = Helper::width($textContent); if ($textLength > 0) { - $contentColumns = str_split($textContent, ceil($textLength / $cell->getColspan())); + $contentColumns = mb_str_split($textContent, ceil($textLength / $cell->getColspan())); foreach ($contentColumns as $position => $content) { $row[$i + $position] = $content; } @@ -843,7 +847,7 @@ class Table /** * Called after rendering to cleanup cache data. */ - private function cleanup() + private function cleanup(): void { $this->effectiveColumnWidths = []; unset($this->numberOfColumns); diff --git a/vendor/symfony/console/Helper/TableCellStyle.php b/vendor/symfony/console/Helper/TableCellStyle.php index 65ae9e72..9419dcb4 100644 --- a/vendor/symfony/console/Helper/TableCellStyle.php +++ b/vendor/symfony/console/Helper/TableCellStyle.php @@ -67,9 +67,7 @@ class TableCellStyle { return array_filter( $this->getOptions(), - function ($key) { - return \in_array($key, self::TAG_OPTIONS) && isset($this->options[$key]); - }, + fn ($key) => \in_array($key, self::TAG_OPTIONS) && isset($this->options[$key]), \ARRAY_FILTER_USE_KEY ); } diff --git a/vendor/symfony/console/Input/ArgvInput.php b/vendor/symfony/console/Input/ArgvInput.php index c0c28bb5..59f9217e 100644 --- a/vendor/symfony/console/Input/ArgvInput.php +++ b/vendor/symfony/console/Input/ArgvInput.php @@ -55,11 +55,17 @@ class ArgvInput extends Input parent::__construct($definition); } + /** + * @return void + */ protected function setTokens(array $tokens) { $this->tokens = $tokens; } + /** + * @return void + */ protected function parse() { $parseOptions = true; @@ -89,7 +95,7 @@ class ArgvInput extends Input /** * Parses a short option. */ - private function parseShortOption(string $token) + private function parseShortOption(string $token): void { $name = substr($token, 1); @@ -110,7 +116,7 @@ class ArgvInput extends Input * * @throws RuntimeException When option given doesn't exist */ - private function parseShortOptionSet(string $name) + private function parseShortOptionSet(string $name): void { $len = \strlen($name); for ($i = 0; $i < $len; ++$i) { @@ -133,7 +139,7 @@ class ArgvInput extends Input /** * Parses a long option. */ - private function parseLongOption(string $token) + private function parseLongOption(string $token): void { $name = substr($token, 2); @@ -152,7 +158,7 @@ class ArgvInput extends Input * * @throws RuntimeException When too many arguments are given */ - private function parseArgument(string $token) + private function parseArgument(string $token): void { $c = \count($this->arguments); @@ -196,7 +202,7 @@ class ArgvInput extends Input * * @throws RuntimeException When option given doesn't exist */ - private function addShortOption(string $shortcut, mixed $value) + private function addShortOption(string $shortcut, mixed $value): void { if (!$this->definition->hasShortcut($shortcut)) { throw new RuntimeException(sprintf('The "-%s" option does not exist.', $shortcut)); @@ -210,7 +216,7 @@ class ArgvInput extends Input * * @throws RuntimeException When option given doesn't exist */ - private function addLongOption(string $name, mixed $value) + private function addLongOption(string $name, mixed $value): void { if (!$this->definition->hasOption($name)) { if (!$this->definition->hasNegation($name)) { diff --git a/vendor/symfony/console/Input/ArrayInput.php b/vendor/symfony/console/Input/ArrayInput.php index 02fb4e8e..355de61d 100644 --- a/vendor/symfony/console/Input/ArrayInput.php +++ b/vendor/symfony/console/Input/ArrayInput.php @@ -113,6 +113,9 @@ class ArrayInput extends Input return implode(' ', $params); } + /** + * @return void + */ protected function parse() { foreach ($this->parameters as $key => $value) { @@ -134,7 +137,7 @@ class ArrayInput extends Input * * @throws InvalidOptionException When option given doesn't exist */ - private function addShortOption(string $shortcut, mixed $value) + private function addShortOption(string $shortcut, mixed $value): void { if (!$this->definition->hasShortcut($shortcut)) { throw new InvalidOptionException(sprintf('The "-%s" option does not exist.', $shortcut)); @@ -149,7 +152,7 @@ class ArrayInput extends Input * @throws InvalidOptionException When option given doesn't exist * @throws InvalidOptionException When a required value is missing */ - private function addLongOption(string $name, mixed $value) + private function addLongOption(string $name, mixed $value): void { if (!$this->definition->hasOption($name)) { if (!$this->definition->hasNegation($name)) { @@ -182,7 +185,7 @@ class ArrayInput extends Input * * @throws InvalidArgumentException When argument given doesn't exist */ - private function addArgument(string|int $name, mixed $value) + private function addArgument(string|int $name, mixed $value): void { if (!$this->definition->hasArgument($name)) { throw new InvalidArgumentException(sprintf('The "%s" argument does not exist.', $name)); diff --git a/vendor/symfony/console/Input/Input.php b/vendor/symfony/console/Input/Input.php index 7b90713c..0f5617cd 100644 --- a/vendor/symfony/console/Input/Input.php +++ b/vendor/symfony/console/Input/Input.php @@ -43,6 +43,9 @@ abstract class Input implements InputInterface, StreamableInputInterface } } + /** + * @return void + */ public function bind(InputDefinition $definition) { $this->arguments = []; @@ -54,17 +57,20 @@ abstract class Input implements InputInterface, StreamableInputInterface /** * Processes command line arguments. + * + * @return void */ abstract protected function parse(); + /** + * @return void + */ 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(); - }); + $missingArguments = array_filter(array_keys($definition->getArguments()), fn ($argument) => !\array_key_exists($argument, $givenArguments) && $definition->getArgument($argument)->isRequired()); if (\count($missingArguments) > 0) { throw new RuntimeException(sprintf('Not enough arguments (missing: "%s").', implode(', ', $missingArguments))); @@ -76,6 +82,9 @@ abstract class Input implements InputInterface, StreamableInputInterface return $this->interactive; } + /** + * @return void + */ public function setInteractive(bool $interactive) { $this->interactive = $interactive; @@ -95,6 +104,9 @@ abstract class Input implements InputInterface, StreamableInputInterface return $this->arguments[$name] ?? $this->definition->getArgument($name)->getDefault(); } + /** + * @return void + */ public function setArgument(string $name, mixed $value) { if (!$this->definition->hasArgument($name)) { @@ -131,6 +143,9 @@ abstract class Input implements InputInterface, StreamableInputInterface return \array_key_exists($name, $this->options) ? $this->options[$name] : $this->definition->getOption($name)->getDefault(); } + /** + * @return void + */ public function setOption(string $name, mixed $value) { if ($this->definition->hasNegation($name)) { @@ -157,11 +172,19 @@ abstract class Input implements InputInterface, StreamableInputInterface return preg_match('{^[\w-]+$}', $token) ? $token : escapeshellarg($token); } + /** + * @param resource $stream + * + * @return void + */ public function setStream($stream) { $this->stream = $stream; } + /** + * @return resource + */ public function getStream() { return $this->stream; diff --git a/vendor/symfony/console/Input/InputArgument.php b/vendor/symfony/console/Input/InputArgument.php index a130c412..5cb15148 100644 --- a/vendor/symfony/console/Input/InputArgument.php +++ b/vendor/symfony/console/Input/InputArgument.php @@ -37,7 +37,7 @@ class InputArgument /** * @param string $name The argument name - * @param int|null $mode The argument mode: self::REQUIRED or self::OPTIONAL + * @param int|null $mode The argument mode: a bit mask of self::REQUIRED, self::OPTIONAL and self::IS_ARRAY * @param string $description A description text * @param string|bool|int|float|array|null $default The default value (for self::OPTIONAL mode only) * @param array|\Closure(CompletionInput,CompletionSuggestions):list $suggestedValues The values used for input completion @@ -91,6 +91,8 @@ class InputArgument /** * Sets the default value. * + * @return void + * * @throws LogicException When incorrect default value is given */ public function setDefault(string|bool|int|float|array $default = null) diff --git a/vendor/symfony/console/Input/InputAwareInterface.php b/vendor/symfony/console/Input/InputAwareInterface.php index 5a288de5..0ad27b45 100644 --- a/vendor/symfony/console/Input/InputAwareInterface.php +++ b/vendor/symfony/console/Input/InputAwareInterface.php @@ -21,6 +21,8 @@ interface InputAwareInterface { /** * Sets the Console Input. + * + * @return void */ public function setInput(InputInterface $input); } diff --git a/vendor/symfony/console/Input/InputDefinition.php b/vendor/symfony/console/Input/InputDefinition.php index f4b14a1c..b7162d77 100644 --- a/vendor/symfony/console/Input/InputDefinition.php +++ b/vendor/symfony/console/Input/InputDefinition.php @@ -46,6 +46,8 @@ class InputDefinition /** * Sets the definition of the input. + * + * @return void */ public function setDefinition(array $definition) { @@ -67,6 +69,8 @@ class InputDefinition * Sets the InputArgument objects. * * @param InputArgument[] $arguments An array of InputArgument objects + * + * @return void */ public function setArguments(array $arguments = []) { @@ -81,6 +85,8 @@ class InputDefinition * Adds an array of InputArgument objects. * * @param InputArgument[] $arguments An array of InputArgument objects + * + * @return void */ public function addArguments(?array $arguments = []) { @@ -92,6 +98,8 @@ class InputDefinition } /** + * @return void + * * @throws LogicException When incorrect argument is given */ public function addArgument(InputArgument $argument) @@ -190,6 +198,8 @@ class InputDefinition * Sets the InputOption objects. * * @param InputOption[] $options An array of InputOption objects + * + * @return void */ public function setOptions(array $options = []) { @@ -203,6 +213,8 @@ class InputDefinition * Adds an array of InputOption objects. * * @param InputOption[] $options An array of InputOption objects + * + * @return void */ public function addOptions(array $options = []) { @@ -212,6 +224,8 @@ class InputDefinition } /** + * @return void + * * @throws LogicException When option given already exist */ public function addOption(InputOption $option) diff --git a/vendor/symfony/console/Input/InputInterface.php b/vendor/symfony/console/Input/InputInterface.php index 3af991a7..aaed5fd0 100644 --- a/vendor/symfony/console/Input/InputInterface.php +++ b/vendor/symfony/console/Input/InputInterface.php @@ -61,6 +61,8 @@ interface InputInterface /** * Binds the current Input instance with the given arguments and options. * + * @return void + * * @throws RuntimeException */ public function bind(InputDefinition $definition); @@ -68,6 +70,8 @@ interface InputInterface /** * Validates the input. * + * @return void + * * @throws RuntimeException When not enough arguments are given */ public function validate(); @@ -91,6 +95,8 @@ interface InputInterface /** * Sets an argument value by name. * + * @return void + * * @throws InvalidArgumentException When argument given doesn't exist */ public function setArgument(string $name, mixed $value); @@ -119,6 +125,8 @@ interface InputInterface /** * Sets an option value by name. * + * @return void + * * @throws InvalidArgumentException When option given doesn't exist */ public function setOption(string $name, mixed $value); @@ -135,6 +143,8 @@ interface InputInterface /** * Sets the input interactivity. + * + * @return void */ public function setInteractive(bool $interactive); } diff --git a/vendor/symfony/console/Input/InputOption.php b/vendor/symfony/console/Input/InputOption.php index 9a7032a0..fdf88dcc 100644 --- a/vendor/symfony/console/Input/InputOption.php +++ b/vendor/symfony/console/Input/InputOption.php @@ -178,6 +178,9 @@ class InputOption return self::VALUE_NEGATABLE === (self::VALUE_NEGATABLE & $this->mode); } + /** + * @return void + */ public function setDefault(string|bool|int|float|array $default = null) { if (1 > \func_num_args()) { diff --git a/vendor/symfony/console/Input/StreamableInputInterface.php b/vendor/symfony/console/Input/StreamableInputInterface.php index d7e462f2..4b95fcb1 100644 --- a/vendor/symfony/console/Input/StreamableInputInterface.php +++ b/vendor/symfony/console/Input/StreamableInputInterface.php @@ -25,6 +25,8 @@ interface StreamableInputInterface extends InputInterface * This is mainly useful for testing purpose. * * @param resource $stream The input stream + * + * @return void */ public function setStream($stream); diff --git a/vendor/symfony/console/Output/AnsiColorMode.php b/vendor/symfony/console/Output/AnsiColorMode.php index c6cc5c12..5f9f744f 100644 --- a/vendor/symfony/console/Output/AnsiColorMode.php +++ b/vendor/symfony/console/Output/AnsiColorMode.php @@ -26,7 +26,7 @@ enum AnsiColorMode case Ansi4; /* - * 8-bit Ansi colors (240 differents colors + 16 duplicate color codes, ensuring backward compatibility). + * 8-bit Ansi colors (240 different colors + 16 duplicate color codes, ensuring backward compatibility). * Output syntax is: "ESC[38;5;${foreGroundColorcode};48;5;${backGroundColorcode}m" * Should be compatible with most terminals. */ @@ -78,25 +78,7 @@ enum AnsiColorMode private function degradeHexColorToAnsi4(int $r, int $g, int $b): int { - if (0 === round($this->getSaturation($r, $g, $b) / 50)) { - return 0; - } - - return (int) ((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) ((int) $diff * 100 / $v); + return round($b / 255) << 2 | (round($g / 255) << 1) | round($r / 255); } /** diff --git a/vendor/symfony/console/Output/BufferedOutput.php b/vendor/symfony/console/Output/BufferedOutput.php index 94d4e414..ef5099bf 100644 --- a/vendor/symfony/console/Output/BufferedOutput.php +++ b/vendor/symfony/console/Output/BufferedOutput.php @@ -29,6 +29,9 @@ class BufferedOutput extends Output return $content; } + /** + * @return void + */ protected function doWrite(string $message, bool $newline) { $this->buffer .= $message; diff --git a/vendor/symfony/console/Output/ConsoleOutput.php b/vendor/symfony/console/Output/ConsoleOutput.php index e3aa92c7..c1eb7cd1 100644 --- a/vendor/symfony/console/Output/ConsoleOutput.php +++ b/vendor/symfony/console/Output/ConsoleOutput.php @@ -64,18 +64,27 @@ class ConsoleOutput extends StreamOutput implements ConsoleOutputInterface return new ConsoleSectionOutput($this->getStream(), $this->consoleSectionOutputs, $this->getVerbosity(), $this->isDecorated(), $this->getFormatter()); } + /** + * @return void + */ public function setDecorated(bool $decorated) { parent::setDecorated($decorated); $this->stderr->setDecorated($decorated); } + /** + * @return void + */ public function setFormatter(OutputFormatterInterface $formatter) { parent::setFormatter($formatter); $this->stderr->setFormatter($formatter); } + /** + * @return void + */ public function setVerbosity(int $level) { parent::setVerbosity($level); @@ -87,6 +96,9 @@ class ConsoleOutput extends StreamOutput implements ConsoleOutputInterface return $this->stderr; } + /** + * @return void + */ public function setErrorOutput(OutputInterface $error) { $this->stderr = $error; diff --git a/vendor/symfony/console/Output/ConsoleOutputInterface.php b/vendor/symfony/console/Output/ConsoleOutputInterface.php index 6b4babc6..9c0049c8 100644 --- a/vendor/symfony/console/Output/ConsoleOutputInterface.php +++ b/vendor/symfony/console/Output/ConsoleOutputInterface.php @@ -24,6 +24,9 @@ interface ConsoleOutputInterface extends OutputInterface */ public function getErrorOutput(): OutputInterface; + /** + * @return void + */ public function setErrorOutput(OutputInterface $error); public function section(): ConsoleSectionOutput; diff --git a/vendor/symfony/console/Output/ConsoleSectionOutput.php b/vendor/symfony/console/Output/ConsoleSectionOutput.php index c813c811..3f3f1434 100644 --- a/vendor/symfony/console/Output/ConsoleSectionOutput.php +++ b/vendor/symfony/console/Output/ConsoleSectionOutput.php @@ -60,6 +60,8 @@ class ConsoleSectionOutput extends StreamOutput * 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 + * + * @return void */ public function clear(int $lines = null) { @@ -81,6 +83,8 @@ class ConsoleSectionOutput extends StreamOutput /** * Overwrites the previous output with a new message. + * + * @return void */ public function overwrite(string|iterable $message) { @@ -153,12 +157,15 @@ class ConsoleSectionOutput extends StreamOutput /** * @internal */ - public function addNewLineOfInputSubmit() + public function addNewLineOfInputSubmit(): void { $this->content[] = \PHP_EOL; ++$this->lines; } + /** + * @return void + */ protected function doWrite(string $message, bool $newline) { if (!$this->isDecorated()) { diff --git a/vendor/symfony/console/Output/NullOutput.php b/vendor/symfony/console/Output/NullOutput.php index 4884cbad..f3aa15b1 100644 --- a/vendor/symfony/console/Output/NullOutput.php +++ b/vendor/symfony/console/Output/NullOutput.php @@ -26,6 +26,9 @@ class NullOutput implements OutputInterface { private NullOutputFormatter $formatter; + /** + * @return void + */ public function setFormatter(OutputFormatterInterface $formatter) { // do nothing @@ -37,6 +40,9 @@ class NullOutput implements OutputInterface return $this->formatter ??= new NullOutputFormatter(); } + /** + * @return void + */ public function setDecorated(bool $decorated) { // do nothing @@ -47,6 +53,9 @@ class NullOutput implements OutputInterface return false; } + /** + * @return void + */ public function setVerbosity(int $level) { // do nothing @@ -77,11 +86,17 @@ class NullOutput implements OutputInterface return false; } + /** + * @return void + */ public function writeln(string|iterable $messages, int $options = self::OUTPUT_NORMAL) { // do nothing } + /** + * @return void + */ public function write(string|iterable $messages, bool $newline = false, int $options = self::OUTPUT_NORMAL) { // do nothing diff --git a/vendor/symfony/console/Output/Output.php b/vendor/symfony/console/Output/Output.php index 4cb71acb..3a06311a 100644 --- a/vendor/symfony/console/Output/Output.php +++ b/vendor/symfony/console/Output/Output.php @@ -44,6 +44,9 @@ abstract class Output implements OutputInterface $this->formatter->setDecorated($decorated); } + /** + * @return void + */ public function setFormatter(OutputFormatterInterface $formatter) { $this->formatter = $formatter; @@ -54,6 +57,9 @@ abstract class Output implements OutputInterface return $this->formatter; } + /** + * @return void + */ public function setDecorated(bool $decorated) { $this->formatter->setDecorated($decorated); @@ -64,6 +70,9 @@ abstract class Output implements OutputInterface return $this->formatter->isDecorated(); } + /** + * @return void + */ public function setVerbosity(int $level) { $this->verbosity = $level; @@ -94,11 +103,17 @@ abstract class Output implements OutputInterface return self::VERBOSITY_DEBUG <= $this->verbosity; } + /** + * @return void + */ public function writeln(string|iterable $messages, int $options = self::OUTPUT_NORMAL) { $this->write($messages, true, $options); } + /** + * @return void + */ public function write(string|iterable $messages, bool $newline = false, int $options = self::OUTPUT_NORMAL) { if (!is_iterable($messages)) { @@ -133,6 +148,8 @@ abstract class Output implements OutputInterface /** * Writes a message to the output. + * + * @return void */ abstract protected function doWrite(string $message, bool $newline); } diff --git a/vendor/symfony/console/Output/OutputInterface.php b/vendor/symfony/console/Output/OutputInterface.php index bc927c51..fb155772 100644 --- a/vendor/symfony/console/Output/OutputInterface.php +++ b/vendor/symfony/console/Output/OutputInterface.php @@ -36,6 +36,8 @@ interface OutputInterface * @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 + * + * @return void */ public function write(string|iterable $messages, bool $newline = false, int $options = 0); @@ -44,11 +46,15 @@ interface OutputInterface * * @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 + * + * @return void */ public function writeln(string|iterable $messages, int $options = 0); /** * Sets the verbosity of the output. + * + * @return void */ public function setVerbosity(int $level); @@ -79,6 +85,8 @@ interface OutputInterface /** * Sets the decorated flag. + * + * @return void */ public function setDecorated(bool $decorated); @@ -87,6 +95,9 @@ interface OutputInterface */ public function isDecorated(): bool; + /** + * @return void + */ public function setFormatter(OutputFormatterInterface $formatter); /** diff --git a/vendor/symfony/console/Output/StreamOutput.php b/vendor/symfony/console/Output/StreamOutput.php index 9ec524e4..155066ea 100644 --- a/vendor/symfony/console/Output/StreamOutput.php +++ b/vendor/symfony/console/Output/StreamOutput.php @@ -62,6 +62,9 @@ class StreamOutput extends Output return $this->stream; } + /** + * @return void + */ protected function doWrite(string $message, bool $newline) { if ($newline) { diff --git a/vendor/symfony/console/Output/TrimmedBufferOutput.php b/vendor/symfony/console/Output/TrimmedBufferOutput.php index 1ca5a13e..b00445ec 100644 --- a/vendor/symfony/console/Output/TrimmedBufferOutput.php +++ b/vendor/symfony/console/Output/TrimmedBufferOutput.php @@ -45,6 +45,9 @@ class TrimmedBufferOutput extends Output return $content; } + /** + * @return void + */ protected function doWrite(string $message, bool $newline) { $this->buffer .= $message; diff --git a/vendor/symfony/console/Question/Question.php b/vendor/symfony/console/Question/Question.php index b06db945..26896bb5 100644 --- a/vendor/symfony/console/Question/Question.php +++ b/vendor/symfony/console/Question/Question.php @@ -146,12 +146,11 @@ class Question if (\is_array($values)) { $values = $this->isAssoc($values) ? array_merge(array_keys($values), array_values($values)) : array_values($values); - $callback = static function () use ($values) { - return $values; - }; + $callback = static fn () => $values; } elseif ($values instanceof \Traversable) { - $valueCache = null; - $callback = static function () use ($values, &$valueCache) { + $callback = static function () use ($values) { + static $valueCache; + return $valueCache ??= iterator_to_array($values, false); }; } else { @@ -267,6 +266,9 @@ class Question return $this->normalizer; } + /** + * @return bool + */ protected function isAssoc(array $array) { return (bool) \count(array_filter(array_keys($array), 'is_string')); diff --git a/vendor/symfony/console/README.md b/vendor/symfony/console/README.md index c89b4a1a..bfd48810 100644 --- a/vendor/symfony/console/README.md +++ b/vendor/symfony/console/README.md @@ -4,6 +4,18 @@ Console Component The Console component eases the creation of beautiful and testable command line interfaces. +Sponsor +------- + +The Console component for Symfony 6.3 is [backed][1] by [Les-Tilleuls.coop][2]. + +Les-Tilleuls.coop is a team of 70+ Symfony experts who can help you design, develop and +fix your projects. They provide a wide range of professional services including development, +consulting, coaching, training and audits. They also are highly skilled in JS, Go and DevOps. +They are a worker cooperative! + +Help Symfony by [sponsoring][3] its development! + Resources --------- @@ -18,3 +30,7 @@ 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. + +[1]: https://symfony.com/backers +[2]: https://les-tilleuls.coop +[3]: https://symfony.com/sponsor diff --git a/vendor/symfony/console/Resources/completion.bash b/vendor/symfony/console/Resources/completion.bash index ad69eab0..0d76eacc 100644 --- a/vendor/symfony/console/Resources/completion.bash +++ b/vendor/symfony/console/Resources/completion.bash @@ -6,6 +6,16 @@ # https://symfony.com/doc/current/contributing/code/license.html _sf_{{ COMMAND_NAME }}() { + + # Use the default completion for shell redirect operators. + for w in '>' '>>' '&>' '<'; do + if [[ $w = "${COMP_WORDS[COMP_CWORD-1]}" ]]; then + compopt -o filenames + COMPREPLY=($(compgen -f -- "${COMP_WORDS[COMP_CWORD]}")) + return 0 + fi + done + # Use newline as only separator to allow space in completion values IFS=$'\n' local sf_cmd="${COMP_WORDS[0]}" diff --git a/vendor/symfony/console/Resources/completion.zsh b/vendor/symfony/console/Resources/completion.zsh index 97a9e88c..ff76fe5f 100644 --- a/vendor/symfony/console/Resources/completion.zsh +++ b/vendor/symfony/console/Resources/completion.zsh @@ -1,3 +1,5 @@ +#compdef {{ COMMAND_NAME }} + # This file is part of the Symfony package. # # (c) Fabien Potencier diff --git a/vendor/symfony/console/Style/OutputStyle.php b/vendor/symfony/console/Style/OutputStyle.php index b694bb53..ddfa8dec 100644 --- a/vendor/symfony/console/Style/OutputStyle.php +++ b/vendor/symfony/console/Style/OutputStyle.php @@ -30,6 +30,9 @@ abstract class OutputStyle implements OutputInterface, StyleInterface $this->output = $output; } + /** + * @return void + */ public function newLine(int $count = 1) { $this->output->write(str_repeat(\PHP_EOL, $count)); @@ -40,16 +43,25 @@ abstract class OutputStyle implements OutputInterface, StyleInterface return new ProgressBar($this->output, $max); } + /** + * @return void + */ public function write(string|iterable $messages, bool $newline = false, int $type = self::OUTPUT_NORMAL) { $this->output->write($messages, $newline, $type); } + /** + * @return void + */ public function writeln(string|iterable $messages, int $type = self::OUTPUT_NORMAL) { $this->output->writeln($messages, $type); } + /** + * @return void + */ public function setVerbosity(int $level) { $this->output->setVerbosity($level); @@ -60,6 +72,9 @@ abstract class OutputStyle implements OutputInterface, StyleInterface return $this->output->getVerbosity(); } + /** + * @return void + */ public function setDecorated(bool $decorated) { $this->output->setDecorated($decorated); @@ -70,6 +85,9 @@ abstract class OutputStyle implements OutputInterface, StyleInterface return $this->output->isDecorated(); } + /** + * @return void + */ public function setFormatter(OutputFormatterInterface $formatter) { $this->output->setFormatter($formatter); @@ -100,6 +118,9 @@ abstract class OutputStyle implements OutputInterface, StyleInterface return $this->output->isDebug(); } + /** + * @return OutputInterface + */ protected function getErrorOutput() { if (!$this->output instanceof ConsoleOutputInterface) { diff --git a/vendor/symfony/console/Style/StyleInterface.php b/vendor/symfony/console/Style/StyleInterface.php index 0bb12339..e25a65bd 100644 --- a/vendor/symfony/console/Style/StyleInterface.php +++ b/vendor/symfony/console/Style/StyleInterface.php @@ -20,51 +20,71 @@ interface StyleInterface { /** * Formats a command title. + * + * @return void */ public function title(string $message); /** * Formats a section title. + * + * @return void */ public function section(string $message); /** * Formats a list. + * + * @return void */ public function listing(array $elements); /** * Formats informational text. + * + * @return void */ public function text(string|array $message); /** * Formats a success result bar. + * + * @return void */ public function success(string|array $message); /** * Formats an error result bar. + * + * @return void */ public function error(string|array $message); /** * Formats an warning result bar. + * + * @return void */ public function warning(string|array $message); /** * Formats a note admonition. + * + * @return void */ public function note(string|array $message); /** * Formats a caution admonition. + * + * @return void */ public function caution(string|array $message); /** * Formats a table. + * + * @return void */ public function table(array $headers, array $rows); @@ -90,21 +110,29 @@ interface StyleInterface /** * Add newline(s). + * + * @return void */ public function newLine(int $count = 1); /** * Starts the progress output. + * + * @return void */ public function progressStart(int $max = 0); /** * Advances the progress output X steps. + * + * @return void */ public function progressAdvance(int $step = 1); /** * Finishes the progress output. + * + * @return void */ public function progressFinish(); } diff --git a/vendor/symfony/console/Style/SymfonyStyle.php b/vendor/symfony/console/Style/SymfonyStyle.php index 8fd6f849..cecce6c0 100644 --- a/vendor/symfony/console/Style/SymfonyStyle.php +++ b/vendor/symfony/console/Style/SymfonyStyle.php @@ -60,6 +60,8 @@ class SymfonyStyle extends OutputStyle /** * Formats a message as a block of text. + * + * @return void */ public function block(string|array $messages, string $type = null, string $style = null, string $prefix = ' ', bool $padding = false, bool $escape = true) { @@ -70,6 +72,9 @@ class SymfonyStyle extends OutputStyle $this->newLine(); } + /** + * @return void + */ public function title(string $message) { $this->autoPrependBlock(); @@ -80,6 +85,9 @@ class SymfonyStyle extends OutputStyle $this->newLine(); } + /** + * @return void + */ public function section(string $message) { $this->autoPrependBlock(); @@ -90,17 +98,21 @@ class SymfonyStyle extends OutputStyle $this->newLine(); } + /** + * @return void + */ public function listing(array $elements) { $this->autoPrependText(); - $elements = array_map(function ($element) { - return sprintf(' * %s', $element); - }, $elements); + $elements = array_map(fn ($element) => sprintf(' * %s', $element), $elements); $this->writeln($elements); $this->newLine(); } + /** + * @return void + */ public function text(string|array $message) { $this->autoPrependText(); @@ -113,27 +125,41 @@ class SymfonyStyle extends OutputStyle /** * Formats a command comment. + * + * @return void */ public function comment(string|array $message) { $this->block($message, null, null, ' // ', false, false); } + /** + * @return void + */ public function success(string|array $message) { $this->block($message, 'OK', 'fg=black;bg=green', ' ', true); } + /** + * @return void + */ public function error(string|array $message) { $this->block($message, 'ERROR', 'fg=white;bg=red', ' ', true); } + /** + * @return void + */ public function warning(string|array $message) { $this->block($message, 'WARNING', 'fg=black;bg=yellow', ' ', true); } + /** + * @return void + */ public function note(string|array $message) { $this->block($message, 'NOTE', 'fg=yellow', ' ! '); @@ -141,17 +167,25 @@ class SymfonyStyle extends OutputStyle /** * Formats an info message. + * + * @return void */ public function info(string|array $message) { $this->block($message, 'INFO', 'fg=green', ' ', true); } + /** + * @return void + */ public function caution(string|array $message) { $this->block($message, 'CAUTION', 'fg=white;bg=red', ' ! ', true); } + /** + * @return void + */ public function table(array $headers, array $rows) { $this->createTable() @@ -165,6 +199,8 @@ class SymfonyStyle extends OutputStyle /** * Formats a horizontal table. + * + * @return void */ public function horizontalTable(array $headers, array $rows) { @@ -185,6 +221,8 @@ class SymfonyStyle extends OutputStyle * * 'A title' * * ['key' => 'value'] * * new TableSeparator() + * + * @return void */ public function definitionList(string|array|TableSeparator ...$list) { @@ -247,17 +285,26 @@ class SymfonyStyle extends OutputStyle return $this->askQuestion($questionChoice); } + /** + * @return void + */ public function progressStart(int $max = 0) { $this->progressBar = $this->createProgressBar($max); $this->progressBar->start(); } + /** + * @return void + */ public function progressAdvance(int $step = 1) { $this->getProgressBar()->advance($step); } + /** + * @return void + */ public function progressFinish() { $this->getProgressBar()->finish(); @@ -311,6 +358,9 @@ class SymfonyStyle extends OutputStyle return $answer; } + /** + * @return void + */ public function writeln(string|iterable $messages, int $type = self::OUTPUT_NORMAL) { if (!is_iterable($messages)) { @@ -323,6 +373,9 @@ class SymfonyStyle extends OutputStyle } } + /** + * @return void + */ public function write(string|iterable $messages, bool $newline = false, int $type = self::OUTPUT_NORMAL) { if (!is_iterable($messages)) { @@ -335,6 +388,9 @@ class SymfonyStyle extends OutputStyle } } + /** + * @return void + */ public function newLine(int $count = 1) { parent::newLine($count); @@ -381,7 +437,7 @@ class SymfonyStyle extends OutputStyle { $fetched = $this->bufferedOutput->fetch(); // Prepend new line if last char isn't EOL: - if (!str_ends_with($fetched, "\n")) { + if ($fetched && !str_ends_with($fetched, "\n")) { $this->newLine(); } } diff --git a/vendor/symfony/console/Terminal.php b/vendor/symfony/console/Terminal.php index 216c609f..3eda0376 100644 --- a/vendor/symfony/console/Terminal.php +++ b/vendor/symfony/console/Terminal.php @@ -123,20 +123,19 @@ class Terminal return self::$stty; } - // skip check if exec function is disabled - if (!\function_exists('exec')) { + // skip check if shell_exec function is disabled + if (!\function_exists('shell_exec')) { return false; } - exec('stty 2>&1', $output, $exitcode); - - return self::$stty = 0 === $exitcode; + return self::$stty = (bool) shell_exec('stty 2> '.('\\' === \DIRECTORY_SEPARATOR ? 'NUL' : '/dev/null')); } - private static function initDimensions() + private static function initDimensions(): void { if ('\\' === \DIRECTORY_SEPARATOR) { - if (preg_match('/^(\d+)x(\d+)(?: \((\d+)x(\d+)\))?$/', trim(getenv('ANSICON')), $matches)) { + $ansicon = getenv('ANSICON'); + if (false !== $ansicon && preg_match('/^(\d+)x(\d+)(?: \((\d+)x(\d+)\))?$/', trim($ansicon), $matches)) { // extract [w, H] from "wxh (WxH)" // or [w, h] from "wxh" self::$width = (int) $matches[1]; @@ -166,7 +165,7 @@ class Terminal /** * Initializes dimensions using the output of an stty columns line. */ - private static function initDimensionsUsingStty() + private static function initDimensionsUsingStty(): void { if ($sttyString = self::getSttyColumns()) { if (preg_match('/rows.(\d+);.columns.(\d+);/is', $sttyString, $matches)) { @@ -216,6 +215,8 @@ class Terminal 2 => ['pipe', 'w'], ]; + $cp = \function_exists('sapi_windows_cp_set') ? sapi_windows_cp_get() : 0; + $process = proc_open($command, $descriptorspec, $pipes, null, null, ['suppress_errors' => true]); if (!\is_resource($process)) { return null; @@ -226,6 +227,10 @@ class Terminal fclose($pipes[2]); proc_close($process); + if ($cp) { + sapi_windows_cp_set($cp); + } + return $info; } } diff --git a/vendor/symfony/console/Tester/TesterTrait.php b/vendor/symfony/console/Tester/TesterTrait.php index 9670a496..497b8c8c 100644 --- a/vendor/symfony/console/Tester/TesterTrait.php +++ b/vendor/symfony/console/Tester/TesterTrait.php @@ -128,7 +128,7 @@ trait TesterTrait * * verbosity: Sets the output verbosity flag * * capture_stderr_separately: Make output of stdOut and stdErr separately available */ - private function initOutput(array $options) + private function initOutput(array $options): void { $this->captureStreamsIndependently = \array_key_exists('capture_stderr_separately', $options) && $options['capture_stderr_separately']; if (!$this->captureStreamsIndependently) { diff --git a/vendor/symfony/console/composer.json b/vendor/symfony/console/composer.json index bafe5d16..c3442129 100644 --- a/vendor/symfony/console/composer.json +++ b/vendor/symfony/console/composer.json @@ -2,7 +2,7 @@ "name": "symfony/console", "type": "library", "description": "Eases the creation of beautiful and testable command line interfaces", - "keywords": ["console", "cli", "command line", "terminal"], + "keywords": ["console", "cli", "command-line", "terminal"], "homepage": "https://symfony.com", "license": "MIT", "authors": [ @@ -17,9 +17,9 @@ ], "require": { "php": ">=8.1", - "symfony/deprecation-contracts": "^2.1|^3", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", - "symfony/service-contracts": "^1.1|^2|^3", + "symfony/service-contracts": "^2.5|^3", "symfony/string": "^5.4|^6.0" }, "require-dev": { @@ -34,12 +34,6 @@ "provide": { "psr/log-implementation": "1.0|2.0|3.0" }, - "suggest": { - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "", - "psr/log": "For using the console logger" - }, "conflict": { "symfony/dependency-injection": "<5.4", "symfony/dotenv": "<5.4", diff --git a/vendor/symfony/deprecation-contracts/composer.json b/vendor/symfony/deprecation-contracts/composer.json index 774200fd..c6d02d87 100644 --- a/vendor/symfony/deprecation-contracts/composer.json +++ b/vendor/symfony/deprecation-contracts/composer.json @@ -25,7 +25,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-main": "3.3-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", diff --git a/vendor/symfony/service-contracts/Test/ServiceLocatorTest.php b/vendor/symfony/service-contracts/Test/ServiceLocatorTest.php index 88f6a068..07d12b4a 100644 --- a/vendor/symfony/service-contracts/Test/ServiceLocatorTest.php +++ b/vendor/symfony/service-contracts/Test/ServiceLocatorTest.php @@ -11,82 +11,13 @@ namespace Symfony\Contracts\Service\Test; -use PHPUnit\Framework\TestCase; -use Psr\Container\ContainerInterface; -use Symfony\Contracts\Service\ServiceLocatorTrait; +class_alias(ServiceLocatorTestCase::class, ServiceLocatorTest::class); -abstract class ServiceLocatorTest extends TestCase -{ - protected function getServiceLocator(array $factories): ContainerInterface +if (false) { + /** + * @deprecated since PHPUnit 9.6 + */ + class ServiceLocatorTest { - 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/vendor/symfony/service-contracts/Test/ServiceLocatorTestCase.php b/vendor/symfony/service-contracts/Test/ServiceLocatorTestCase.php new file mode 100644 index 00000000..a0f20a6a --- /dev/null +++ b/vendor/symfony/service-contracts/Test/ServiceLocatorTestCase.php @@ -0,0 +1,92 @@ + + * + * 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 ServiceLocatorTestCase extends TestCase +{ + protected function getServiceLocator(array $factories): ContainerInterface + { + 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/vendor/symfony/service-contracts/composer.json b/vendor/symfony/service-contracts/composer.json index 36b0d95e..a64188b5 100644 --- a/vendor/symfony/service-contracts/composer.json +++ b/vendor/symfony/service-contracts/composer.json @@ -22,9 +22,6 @@ "conflict": { "ext-psr": "<1.1|>=2" }, - "suggest": { - "symfony/service-implementation": "" - }, "autoload": { "psr-4": { "Symfony\\Contracts\\Service\\": "" }, "exclude-from-classmap": [ @@ -34,7 +31,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-main": "3.3-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", diff --git a/vendor/symfony/string/AbstractUnicodeString.php b/vendor/symfony/string/AbstractUnicodeString.php index 2a2bed71..d19a61a9 100644 --- a/vendor/symfony/string/AbstractUnicodeString.php +++ b/vendor/symfony/string/AbstractUnicodeString.php @@ -40,10 +40,6 @@ abstract class AbstractUnicodeString extends AbstractString private const FOLD_FROM = ['İ', 'µ', 'ſ', "\xCD\x85", 'ς', 'ϐ', 'ϑ', 'ϕ', 'ϖ', 'ϰ', 'ϱ', 'ϵ', 'ẛ', "\xE1\xBE\xBE", 'ß', 'ʼn', 'ǰ', 'ΐ', 'ΰ', 'և', 'ẖ', 'ẗ', 'ẘ', 'ẙ', 'ẚ', 'ẞ', 'ὐ', 'ὒ', 'ὔ', 'ὖ', 'ᾀ', 'ᾁ', 'ᾂ', 'ᾃ', 'ᾄ', 'ᾅ', 'ᾆ', 'ᾇ', 'ᾈ', 'ᾉ', 'ᾊ', 'ᾋ', 'ᾌ', 'ᾍ', 'ᾎ', 'ᾏ', 'ᾐ', 'ᾑ', 'ᾒ', 'ᾓ', 'ᾔ', 'ᾕ', 'ᾖ', 'ᾗ', 'ᾘ', 'ᾙ', 'ᾚ', 'ᾛ', 'ᾜ', 'ᾝ', 'ᾞ', 'ᾟ', 'ᾠ', 'ᾡ', 'ᾢ', 'ᾣ', 'ᾤ', 'ᾥ', 'ᾦ', 'ᾧ', 'ᾨ', 'ᾩ', 'ᾪ', 'ᾫ', 'ᾬ', 'ᾭ', 'ᾮ', 'ᾯ', 'ᾲ', 'ᾳ', 'ᾴ', 'ᾶ', 'ᾷ', 'ᾼ', 'ῂ', 'ῃ', 'ῄ', 'ῆ', 'ῇ', 'ῌ', 'ῒ', 'ῖ', 'ῗ', 'ῢ', 'ῤ', 'ῦ', 'ῧ', 'ῲ', 'ῳ', 'ῴ', 'ῶ', 'ῷ', 'ῼ', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'ſt', 'st', 'ﬓ', 'ﬔ', 'ﬕ', 'ﬖ', 'ﬗ']; private const FOLD_TO = ['i̇', 'μ', 's', 'ι', 'σ', 'β', 'θ', 'φ', 'π', 'κ', 'ρ', 'ε', 'ṡ', 'ι', 'ss', 'ʼ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', '\'', '\'', ',', '\'', '"', '"', ',,', '"', '\'', '"', '"', '"', '<<', '>>', '<', '>', '-', '-', '-', '-', '-', '-', '-', '-', '-', '||', '/', '[', ']', '*', ',', '.', '<', '>', '<<', '>>', '[', ']', '[', ']', '[', ']', ',', '.', '[', ']', '<<', '>>', '<', '>', ',', '[', ']', '((', '))', '.', ',', '*', '/', '-', '/', '\\', '|', '||', '<<', '>>', '((', '))']; @@ -159,7 +155,9 @@ abstract class AbstractUnicodeString extends AbstractString public function camel(): static { $str = clone $this; - $str->string = str_replace(' ', '', preg_replace_callback('/\b.(?![A-Z]{2,})/u', static function ($m) use (&$i) { + $str->string = str_replace(' ', '', preg_replace_callback('/\b.(?![A-Z]{2,})/u', static function ($m) { + static $i = 0; + 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))); @@ -360,9 +358,7 @@ abstract class AbstractUnicodeString extends AbstractString $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); + $str->string = preg_replace_callback('/\b./u', static fn (array $m): string => mb_convert_case($m[0], \MB_CASE_TITLE, 'UTF-8'), $str->string, $limit); return $str; } diff --git a/vendor/symfony/string/Inflector/EnglishInflector.php b/vendor/symfony/string/Inflector/EnglishInflector.php index 4474736a..2871e4e5 100644 --- a/vendor/symfony/string/Inflector/EnglishInflector.php +++ b/vendor/symfony/string/Inflector/EnglishInflector.php @@ -55,6 +55,9 @@ final class EnglishInflector implements InflectorInterface // indices (index), appendices (appendix), prices (price) ['seci', 4, false, true, ['ex', 'ix', 'ice']], + // codes (code) + ['sedoc', 5, false, true, 'code'], + // selfies (selfie) ['seifles', 7, true, true, 'selfie'], @@ -64,6 +67,9 @@ final class EnglishInflector implements InflectorInterface // movies (movie) ['seivom', 6, true, true, 'movie'], + // names (name) + ['seman', 5, true, false, 'name'], + // conspectuses (conspectus), prospectuses (prospectus) ['sesutcep', 8, true, true, 'pectus'], diff --git a/vendor/symfony/string/LazyString.php b/vendor/symfony/string/LazyString.php index 9523b8cd..3128ebb3 100644 --- a/vendor/symfony/string/LazyString.php +++ b/vendor/symfony/string/LazyString.php @@ -30,7 +30,9 @@ class LazyString implements \Stringable, \JsonSerializable } $lazyString = new static(); - $lazyString->value = static function () use (&$callback, &$arguments, &$value): string { + $lazyString->value = static function () use (&$callback, &$arguments): string { + static $value; + if (null !== $arguments) { if (!\is_callable($callback)) { $callback[0] = $callback[0](); diff --git a/vendor/symfony/string/Slugger/AsciiSlugger.php b/vendor/symfony/string/Slugger/AsciiSlugger.php index 826d07ca..6e550c61 100644 --- a/vendor/symfony/string/Slugger/AsciiSlugger.php +++ b/vendor/symfony/string/Slugger/AsciiSlugger.php @@ -74,6 +74,9 @@ class AsciiSlugger implements SluggerInterface, LocaleAwareInterface $this->symbolsMap = $symbolsMap ?? $this->symbolsMap; } + /** + * @return void + */ public function setLocale(string $locale) { $this->defaultLocale = $locale; @@ -121,9 +124,7 @@ class AsciiSlugger implements SluggerInterface, LocaleAwareInterface // 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); - }); + array_unshift($transliterator, static fn ($s) => $symbolsMap($s, $locale)); } $unicodeString = (new UnicodeString($string))->ascii($transliterator); diff --git a/vendor/symfony/string/composer.json b/vendor/symfony/string/composer.json index 44a809d5..3545c853 100644 --- a/vendor/symfony/string/composer.json +++ b/vendor/symfony/string/composer.json @@ -26,11 +26,11 @@ "symfony/error-handler": "^5.4|^6.0", "symfony/intl": "^6.2", "symfony/http-client": "^5.4|^6.0", - "symfony/translation-contracts": "^2.0|^3.0", + "symfony/translation-contracts": "^2.5|^3.0", "symfony/var-exporter": "^5.4|^6.0" }, "conflict": { - "symfony/translation-contracts": "<2.0" + "symfony/translation-contracts": "<2.5" }, "autoload": { "psr-4": { "Symfony\\Component\\String\\": "" }, diff --git a/www/admin/class_test.hash.php b/www/admin/class_test.hash.php index 0c2d6aeb..0392ae09 100644 --- a/www/admin/class_test.hash.php +++ b/www/admin/class_test.hash.php @@ -43,12 +43,19 @@ print "S::__SHA1SHORT(off): $to_crc: " . $hash_class::__sha1short($to_crc) . ""; print "S::__hash(d): " . $to_crc . "/" . Hash::STANDARD_HASH_SHORT . ": " . $hash_class::__hash($to_crc) . "
"; -foreach (['adler32', 'fnv132', 'fnv1a32', 'joaat'] as $__hash_c) { +foreach (['adler32', 'fnv132', 'fnv1a32', 'joaat', 'sha512'] as $__hash_c) { print "S::__hash($__hash_c): $to_crc: " . $hash_class::__hash($to_crc, $__hash_c) . "
"; } // static use print "U-S::__CRC32B: $to_crc: " . Hash::__crc32b($to_crc) . "
"; +echo "
"; +$text = 'Some String Text'; +$type = 'crc32b'; +print "Hash: " . $type . ": " . hash($type, $text) . "
"; +print "Class: " . $type . ": " . Hash::__hash($text, $type) . "
"; + +echo "
"; print "
CURRENT STANDARD_HASH_SHORT: " . Hash::STANDARD_HASH_SHORT . "
"; print "
CURRENT STANDARD_HASH_LONG: " . Hash::STANDARD_HASH_LONG . "
"; print "HASH SHORT: " . $to_crc . ": " . Hash::__hash($to_crc) . "
"; diff --git a/www/admin/class_test.image.php b/www/admin/class_test.image.php index a773a5f5..cabc8814 100644 --- a/www/admin/class_test.image.php +++ b/www/admin/class_test.image.php @@ -85,7 +85,7 @@ foreach ($images as $image) { $image = BASE . LAYOUT . CONTENT_PATH . IMAGES . $image; list ($height, $width, $img_type) = \CoreLibs\Convert\SetVarType::setArray(getimagesize($image)); echo "
IMAGE INFO: " . $height . "x" . $width . ", TYPE: " - . \CoreLibs\Debug\Support::printArray($img_type) . " [" . $finfo->file($image) . "]
"; + . \CoreLibs\Debug\Support::dumpVar($img_type) . " [" . $finfo->file($image) . "]"; // rotate image first Image::correctImageOrientation($image); // thumbnail tests diff --git a/www/admin/class_test.logging.php b/www/admin/class_test.logging.php index 87f25ac9..7ac13765 100644 --- a/www/admin/class_test.logging.php +++ b/www/admin/class_test.logging.php @@ -1,4 +1,4 @@ -getName() . "
"; print "Flag: per_run getName(): " . Flag::per_class->getName() . "
"; print "Flag: per_run ->name: " . Flag::per_class->name . "
"; print "Flag: per_run ->value: " . Flag::per_class->value . "
"; +$log->setLogUniqueId(); +print "LogUniqId: " . $log->getLogUniqueId() . "
"; print "DUMP: " . $log->dV(['something' => 'error']) . "
"; @@ -82,6 +84,26 @@ try { 'log_file_id' => 'a', ]); */ +// @codingStandardsIgnoreLine +Class TestP +{ + /** @var \CoreLibs\Logging\Logging */ + public $log; + public function __construct( + \CoreLibs\Logging\Logging $log + ) { + $this->log = $log; + } + + public function test(): void + { + $this->log->info('TestL::test call'); + } +} + +$tl = new TestP($log); +$tl->test(); + print '
' . '
' // . '
'
diff --git a/www/admin/class_test.uids.php b/www/admin/class_test.uids.php
index 9aef4bdf..715f6df5 100644
--- a/www/admin/class_test.uids.php
+++ b/www/admin/class_test.uids.php
@@ -39,11 +39,16 @@ print "UUIDV4: " . $_uids->uuidv4() . "
"; print "UNIQID (d): " . $_uids->uniqId() . "
"; print "UNIQID (md5): " . $_uids->uniqId('md5') . "
"; print "UNIQID (sha256): " . $_uids->uniqId('sha256') . "
"; -// statc +// static print "S::UUIDV4: " . $uids_class::uuidv4() . "
"; print "S::UNIQID (d): " . $uids_class::uniqId() . "
"; print "S::UNIQID (md5): " . $uids_class::uniqId('md5') . "
"; print "S::UNIQID (sha256): " . $uids_class::uniqId('sha256') . "
"; +// with direct length +print "S:UNIQID (0->4): " . Uids::uniqId(0) . "
"; +print "S:UNIQID (9->8): " . Uids::uniqId(9) . "
"; +print "S:UNIQID (9,true): " . Uids::uniqId(9, true) . "
"; +print "S:UNIQID (512): " . Uids::uniqId(512) . "
"; // uniq ids print "UNIQU ID SHORT : " . Uids::uniqIdShort() . "
"; print "UNIQU ID LONG : " . Uids::uniqIdLong() . "
";