From 28909fdc034b8c672448d83d9b6681b9f5298aca Mon Sep 17 00:00:00 2001 From: Clemens Schwaighofer Date: Tue, 28 Mar 2023 11:51:54 +0900 Subject: [PATCH] composer base packages updates --- composer.lock | 238 +- vendor/composer/autoload_psr4.php | 3 +- vendor/composer/autoload_static.php | 14 +- vendor/composer/installed.json | 260 +- vendor/composer/installed.php | 65 +- .../package-versions-deprecated/CHANGELOG.md | 120 - .../CONTRIBUTING.md | 39 - .../package-versions-deprecated/README.md | 7 - .../package-versions-deprecated/SECURITY.md | 5 - .../package-versions-deprecated/composer.json | 48 - .../package-versions-deprecated/composer.lock | 2603 ----------------- .../src/PackageVersions/FallbackVersions.php | 128 - .../src/PackageVersions/Installer.php | 290 -- .../src/PackageVersions/Versions.php | 94 - .../deprecations}/LICENSE | 2 +- vendor/doctrine/deprecations/README.md | 154 + vendor/doctrine/deprecations/composer.json | 32 + .../lib/Doctrine/Deprecations/Deprecation.php | 266 ++ .../PHPUnit/VerifyDeprecations.php | 66 + vendor/doctrine/deprecations/phpcs.xml | 22 + .../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 | 30 + vendor/phpstan/phpdoc-parser/composer.json | 42 + .../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 + vendor/phpstan/phpdoc-parser/src/Ast/Node.php | 22 + .../phpdoc-parser/src/Ast/NodeAttributes.php | 38 + .../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 | 52 + .../src/Ast/PhpDoc/MethodTagValueNode.php | 54 + .../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 | 47 + .../src/Ast/Type/ArrayTypeNode.php | 26 + .../src/Ast/Type/CallableTypeNode.php | 36 + .../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 | 54 + .../src/Ast/Type/IdentifierTypeNode.php | 26 + .../src/Ast/Type/IntersectionTypeNode.php | 27 + .../src/Ast/Type/NullableTypeNode.php | 26 + .../src/Ast/Type/OffsetAccessTypeNode.php | 29 + .../src/Ast/Type/ThisTypeNode.php | 17 + .../phpdoc-parser/src/Ast/Type/TypeNode.php | 10 + .../src/Ast/Type/UnionTypeNode.php | 27 + .../phpstan/phpdoc-parser/src/Lexer/Lexer.php | 170 ++ .../src/Parser/ConstExprParser.php | 230 ++ .../src/Parser/ParserException.php | 93 + .../phpdoc-parser/src/Parser/PhpDocParser.php | 598 ++++ .../src/Parser/TokenIterator.php | 224 ++ .../phpdoc-parser/src/Parser/TypeParser.php | 585 ++++ .../AccessDeprecatedStaticPropertyRule.php | 6 +- vendor/phpstan/phpstan/composer.json | 7 + vendor/phpstan/phpstan/phpstan.phar | Bin 21589615 -> 21593272 bytes vendor/phpstan/phpstan/phpstan.phar.asc | 26 +- vendor/sebastian/diff/ChangeLog.md | 9 +- vendor/sebastian/diff/SECURITY.md | 29 +- vendor/sebastian/diff/composer.json | 4 + vendor/sebastian/diff/src/Parser.php | 6 +- vendor/vimeo/psalm/composer.json | 6 +- vendor/vimeo/psalm/config.xsd | 2 + vendor/vimeo/psalm/dictionaries/CallMap.php | 865 +++--- .../psalm/dictionaries/CallMap_80_delta.php | 200 +- .../psalm/dictionaries/CallMap_81_delta.php | 20 + .../psalm/dictionaries/CallMap_83_delta.php | 32 + .../psalm/dictionaries/CallMap_historical.php | 860 +++--- .../dictionaries/InternalTaintSinkMap.php | 2 +- .../psalm/docs/running_psalm/error_levels.md | 1 + .../vimeo/psalm/docs/running_psalm/issues.md | 1 + .../issues/PrivateFinalMethod.md | 14 + vendor/vimeo/psalm/src/Psalm/Config.php | 43 +- .../Psalm/Internal/Analyzer/ClassAnalyzer.php | 12 + .../Internal/Analyzer/InterfaceAnalyzer.php | 4 + .../Statements/Block/ForeachAnalyzer.php | 15 + .../Statements/Expression/ArrayAnalyzer.php | 3 +- .../Statements/Expression/AssertionFinder.php | 19 +- .../Assignment/ArrayAssignmentAnalyzer.php | 24 +- .../Expression/BinaryOp/ConcatAnalyzer.php | 28 +- .../Expression/BitwiseNotAnalyzer.php | 2 +- .../Call/FunctionCallReturnTypeFetcher.php | 4 +- .../Call/NamedFunctionCallHandler.php | 13 +- .../Statements/Expression/CastAnalyzer.php | 10 +- .../Expression/EncapsulatedStringAnalyzer.php | 3 +- .../Expression/Fetch/ArrayFetchAnalyzer.php | 9 +- .../Fetch/AtomicPropertyFetchAnalyzer.php | 5 +- .../Fetch/VariableFetchAnalyzer.php | 8 +- .../Statements/Expression/MatchAnalyzer.php | 3 +- .../Expression/SimpleTypeInferer.php | 2 +- .../Expression/UnaryPlusMinusAnalyzer.php | 6 +- .../Internal/Analyzer/StatementsAnalyzer.php | 15 +- .../Psalm/Internal/Analyzer/TraitAnalyzer.php | 5 + .../psalm/src/Psalm/Internal/Cli/Psalm.php | 12 +- .../Psalm/Internal/Codebase/ClassLikes.php | 4 + .../Codebase/ConstantTypeResolver.php | 4 +- .../src/Psalm/Internal/Codebase/Functions.php | 2 +- .../Codebase/InternalCallMapHandler.php | 42 +- .../FunctionDocblockManipulator.php | 24 + .../Reflector/ClassLikeDocblockParser.php | 7 +- .../Reflector/ClassLikeNodeScanner.php | 33 +- .../Reflector/FunctionLikeDocblockParser.php | 2 + .../Reflector/FunctionLikeDocblockScanner.php | 5 +- .../Reflector/FunctionLikeNodeScanner.php | 20 +- .../AddRemoveTaints/HtmlFunctionTainter.php | 6 + .../GetObjectVarsReturnTypeProvider.php | 4 +- .../VersionCompareReturnTypeProvider.php | 29 +- .../Scanner/FunctionDocblockComment.php | 2 + .../Internal/Type/AssertionReconciler.php | 9 + .../Psalm/Internal/Type/ParseTreeCreator.php | 3 +- .../Type/SimpleNegatedAssertionReconciler.php | 10 +- .../src/Psalm/Internal/Type/TypeCombiner.php | 2 +- .../src/Psalm/Internal/Type/TypeParser.php | 3 +- .../Internal/TypeVisitor/TypeChecker.php | 1 + .../psalm/src/Psalm/Internal/VersionUtils.php | 12 +- .../src/Psalm/Issue/PrivateFinalMethod.php | 9 + .../vimeo/psalm/src/Psalm/Plugin/Shepherd.php | 206 +- .../src/Psalm/Storage/ClassLikeStorage.php | 2 + .../src/Psalm/Storage/FunctionLikeStorage.php | 2 + vendor/vimeo/psalm/src/Psalm/Type.php | 30 +- .../src/Psalm/Type/Atomic/TKeyedArray.php | 7 +- .../src/Psalm/Type/Atomic/TLiteralString.php | 35 + .../psalm/stubs/CoreGenericClasses.phpstub | 11 - vendor/vimeo/psalm/stubs/Php80.phpstub | 7 + vendor/vimeo/psalm/stubs/Php82.phpstub | 12 + .../vimeo/psalm/stubs/extensions/ffi.phpstub | 51 +- .../psalm/stubs/extensions/ibm_db2.phpstub | 9 + 174 files changed, 7527 insertions(+), 5286 deletions(-) delete mode 100644 vendor/composer/package-versions-deprecated/CHANGELOG.md delete mode 100644 vendor/composer/package-versions-deprecated/CONTRIBUTING.md delete mode 100644 vendor/composer/package-versions-deprecated/README.md delete mode 100644 vendor/composer/package-versions-deprecated/SECURITY.md delete mode 100644 vendor/composer/package-versions-deprecated/composer.json delete mode 100644 vendor/composer/package-versions-deprecated/composer.lock delete mode 100644 vendor/composer/package-versions-deprecated/src/PackageVersions/FallbackVersions.php delete mode 100644 vendor/composer/package-versions-deprecated/src/PackageVersions/Installer.php delete mode 100644 vendor/composer/package-versions-deprecated/src/PackageVersions/Versions.php rename vendor/{composer/package-versions-deprecated => doctrine/deprecations}/LICENSE (96%) 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 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/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/Node.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Ast/NodeAttributes.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/NullableTypeNode.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/TokenIterator.php create mode 100644 vendor/phpstan/phpdoc-parser/src/Parser/TypeParser.php create mode 100644 vendor/vimeo/psalm/dictionaries/CallMap_83_delta.php create mode 100644 vendor/vimeo/psalm/docs/running_psalm/issues/PrivateFinalMethod.md create mode 100644 vendor/vimeo/psalm/src/Psalm/Issue/PrivateFinalMethod.php create mode 100644 vendor/vimeo/psalm/stubs/extensions/ibm_db2.phpstub diff --git a/composer.lock b/composer.lock index 2db2d870..7c17f09f 100644 --- a/composer.lock +++ b/composer.lock @@ -173,79 +173,6 @@ ], "time": "2021-03-30T17:13:30+00:00" }, - { - "name": "composer/package-versions-deprecated", - "version": "1.11.99.5", - "source": { - "type": "git", - "url": "https://github.com/composer/package-versions-deprecated.git", - "reference": "b4f54f74ef3453349c24a845d22392cd31e65f1d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/b4f54f74ef3453349c24a845d22392cd31e65f1d", - "reference": "b4f54f74ef3453349c24a845d22392cd31e65f1d", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^1.1.0 || ^2.0", - "php": "^7 || ^8" - }, - "replace": { - "ocramius/package-versions": "1.11.99" - }, - "require-dev": { - "composer/composer": "^1.9.3 || ^2.0@dev", - "ext-zip": "^1.13", - "phpunit/phpunit": "^6.5 || ^7" - }, - "type": "composer-plugin", - "extra": { - "class": "PackageVersions\\Installer", - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "PackageVersions\\": "src/PackageVersions" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be" - } - ], - "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", - "support": { - "issues": "https://github.com/composer/package-versions-deprecated/issues", - "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.5" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2022-01-17T14:14:24+00:00" - }, { "name": "composer/pcre", "version": "3.1.0", @@ -501,6 +428,49 @@ }, "time": "2019-12-04T15:06:13+00:00" }, + { + "name": "doctrine/deprecations", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de", + "reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de", + "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.0.0" + }, + "time": "2022-05-02T15:47:09+00:00" + }, { "name": "felixfbecker/advanced-json-rpc", "version": "v3.2.1", @@ -1006,24 +976,27 @@ }, { "name": "phpdocumentor/type-resolver", - "version": "1.6.2", + "version": "1.7.1", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "48f445a408c131e38cab1c235aa6d2bb7a0bb20d" + "reference": "dfc078e8af9c99210337325ff5aa152872c98714" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/48f445a408c131e38cab1c235aa6d2bb7a0bb20d", - "reference": "48f445a408c131e38cab1c235aa6d2bb7a0bb20d", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/dfc078e8af9c99210337325ff5aa152872c98714", + "reference": "dfc078e8af9c99210337325ff5aa152872c98714", "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", @@ -1055,9 +1028,9 @@ "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.1" }, - "time": "2022-10-14T12:47:21+00:00" + "time": "2023-03-27T19:02:04+00:00" }, { "name": "phpstan/extension-installer", @@ -1104,17 +1077,62 @@ "time": "2022-10-17T12:59:16+00:00" }, { - "name": "phpstan/phpstan", - "version": "1.10.5", + "name": "phpstan/phpdoc-parser", + "version": "1.16.1", "source": { "type": "git", - "url": "https://github.com/phpstan/phpstan.git", - "reference": "1fb6f494d82455151ecf15c5c191923f5d84324e" + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "e27e92d939e2e3636f0a1f0afaba59692c0bf571" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/1fb6f494d82455151ecf15c5c191923f5d84324e", - "reference": "1fb6f494d82455151ecf15c5c191923f5d84324e", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/e27e92d939e2e3636f0a1f0afaba59692c0bf571", + "reference": "e27e92d939e2e3636f0a1f0afaba59692c0bf571", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "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.16.1" + }, + "time": "2023-02-07T18:11:17+00:00" + }, + { + "name": "phpstan/phpstan", + "version": "1.10.8", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan.git", + "reference": "0166aef76e066f0dd2adc2799bdadfa1635711e9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/0166aef76e066f0dd2adc2799bdadfa1635711e9", + "reference": "0166aef76e066f0dd2adc2799bdadfa1635711e9", "shasum": "" }, "require": { @@ -1143,8 +1161,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.5" + "security": "https://github.com/phpstan/phpstan/security/policy", + "source": "https://github.com/phpstan/phpstan-src" }, "funding": [ { @@ -1160,20 +1181,20 @@ "type": "tidelift" } ], - "time": "2023-03-07T16:48:45+00:00" + "time": "2023-03-24T10:28:16+00:00" }, { "name": "phpstan/phpstan-deprecation-rules", - "version": "1.1.2", + "version": "1.1.3", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-deprecation-rules.git", - "reference": "bcc1e8cdf81c3da1a2ba9188ee94cd7e2a62e865" + "reference": "a22b36b955a2e9a3d39fe533b6c1bb5359f9c319" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-deprecation-rules/zipball/bcc1e8cdf81c3da1a2ba9188ee94cd7e2a62e865", - "reference": "bcc1e8cdf81c3da1a2ba9188ee94cd7e2a62e865", + "url": "https://api.github.com/repos/phpstan/phpstan-deprecation-rules/zipball/a22b36b955a2e9a3d39fe533b6c1bb5359f9c319", + "reference": "a22b36b955a2e9a3d39fe533b6c1bb5359f9c319", "shasum": "" }, "require": { @@ -1206,9 +1227,9 @@ "description": "PHPStan rules for detecting usage of deprecated classes, methods, properties, constants and traits.", "support": { "issues": "https://github.com/phpstan/phpstan-deprecation-rules/issues", - "source": "https://github.com/phpstan/phpstan-deprecation-rules/tree/1.1.2" + "source": "https://github.com/phpstan/phpstan-deprecation-rules/tree/1.1.3" }, - "time": "2023-01-17T16:14:21+00:00" + "time": "2023-03-17T07:50:08+00:00" }, { "name": "psr/container", @@ -1381,16 +1402,16 @@ }, { "name": "sebastian/diff", - "version": "5.0.0", + "version": "5.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "70dd1b20bc198da394ad542e988381b44e64e39f" + "reference": "aae9a0a43bff37bd5d8d0311426c87bf36153f02" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/70dd1b20bc198da394ad542e988381b44e64e39f", - "reference": "70dd1b20bc198da394ad542e988381b44e64e39f", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/aae9a0a43bff37bd5d8d0311426c87bf36153f02", + "reference": "aae9a0a43bff37bd5d8d0311426c87bf36153f02", "shasum": "" }, "require": { @@ -1435,7 +1456,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/5.0.0" + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/5.0.1" }, "funding": [ { @@ -1443,7 +1465,7 @@ "type": "github" } ], - "time": "2023-02-03T07:00:31+00:00" + "time": "2023-03-23T05:12:41+00:00" }, { "name": "spatie/array-to-xml", @@ -2382,22 +2404,22 @@ }, { "name": "vimeo/psalm", - "version": "5.7.7", + "version": "5.8.0", "source": { "type": "git", "url": "https://github.com/vimeo/psalm.git", - "reference": "e028ba46ba0d7f9a78bc3201c251e137383e145f" + "reference": "9cf4f60a333f779ad3bc704a555920e81d4fdcda" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vimeo/psalm/zipball/e028ba46ba0d7f9a78bc3201c251e137383e145f", - "reference": "e028ba46ba0d7f9a78bc3201c251e137383e145f", + "url": "https://api.github.com/repos/vimeo/psalm/zipball/9cf4f60a333f779ad3bc704a555920e81d4fdcda", + "reference": "9cf4f60a333f779ad3bc704a555920e81d4fdcda", "shasum": "" }, "require": { "amphp/amp": "^2.4.2", "amphp/byte-stream": "^1.5", - "composer/package-versions-deprecated": "^1.10.0", + "composer-runtime-api": "^2", "composer/semver": "^1.4 || ^2.0 || ^3.0", "composer/xdebug-handler": "^2.0 || ^3.0", "dnoegel/php-xdg-base-dir": "^0.1.1", @@ -2412,7 +2434,7 @@ "felixfbecker/language-server-protocol": "^1.5.2", "fidry/cpu-core-counter": "^0.4.1 || ^0.5.1", "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", - "nikic/php-parser": "^4.13", + "nikic/php-parser": "^4.14", "php": "^7.4 || ~8.0.0 || ~8.1.0 || ~8.2.0", "sebastian/diff": "^4.0 || ^5.0", "spatie/array-to-xml": "^2.17.0 || ^3.0", @@ -2481,9 +2503,9 @@ ], "support": { "issues": "https://github.com/vimeo/psalm/issues", - "source": "https://github.com/vimeo/psalm/tree/5.7.7" + "source": "https://github.com/vimeo/psalm/tree/5.8.0" }, - "time": "2023-02-25T01:05:07+00:00" + "time": "2023-03-09T04:14:35+00:00" }, { "name": "webmozart/assert", diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php index 39e53205..9830ddd7 100644 --- a/vendor/composer/autoload_psr4.php +++ b/vendor/composer/autoload_psr4.php @@ -26,12 +26,13 @@ return array( 'Psalm\\' => array($vendorDir . '/vimeo/psalm/src/Psalm'), 'PhpParser\\' => array($vendorDir . '/nikic/php-parser/lib/PhpParser'), 'Phan\\' => array($vendorDir . '/phan/phan/src/Phan'), - 'PackageVersions\\' => array($vendorDir . '/composer/package-versions-deprecated/src/PackageVersions'), + 'PHPStan\\PhpDocParser\\' => array($vendorDir . '/phpstan/phpdoc-parser/src'), 'PHPStan\\ExtensionInstaller\\' => array($vendorDir . '/phpstan/extension-installer/src'), 'PHPStan\\' => array($vendorDir . '/phpstan/phpstan-deprecation-rules/src'), 'Microsoft\\PhpParser\\' => array($vendorDir . '/microsoft/tolerant-php-parser/src'), 'LanguageServerProtocol\\' => array($vendorDir . '/felixfbecker/language-server-protocol/src'), 'Fidry\\CpuCoreCounter\\' => array($vendorDir . '/fidry/cpu-core-counter/src'), + 'Doctrine\\Deprecations\\' => array($vendorDir . '/doctrine/deprecations/lib/Doctrine/Deprecations'), 'Composer\\XdebugHandler\\' => array($vendorDir . '/composer/xdebug-handler/src'), 'Composer\\Semver\\' => array($vendorDir . '/composer/semver/src'), 'Composer\\Pcre\\' => array($vendorDir . '/composer/pcre/src'), diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php index f9cf85b5..647cadf6 100644 --- a/vendor/composer/autoload_static.php +++ b/vendor/composer/autoload_static.php @@ -62,7 +62,7 @@ class ComposerStaticInitdd705c6e8ab22e0d642372dec7767718 'Psalm\\' => 6, 'PhpParser\\' => 10, 'Phan\\' => 5, - 'PackageVersions\\' => 16, + 'PHPStan\\PhpDocParser\\' => 21, 'PHPStan\\ExtensionInstaller\\' => 27, 'PHPStan\\' => 8, ), @@ -78,6 +78,10 @@ class ComposerStaticInitdd705c6e8ab22e0d642372dec7767718 array ( 'Fidry\\CpuCoreCounter\\' => 21, ), + 'D' => + array ( + 'Doctrine\\Deprecations\\' => 22, + ), 'C' => array ( 'Composer\\XdebugHandler\\' => 23, @@ -175,9 +179,9 @@ class ComposerStaticInitdd705c6e8ab22e0d642372dec7767718 array ( 0 => __DIR__ . '/..' . '/phan/phan/src/Phan', ), - 'PackageVersions\\' => + 'PHPStan\\PhpDocParser\\' => array ( - 0 => __DIR__ . '/..' . '/composer/package-versions-deprecated/src/PackageVersions', + 0 => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src', ), 'PHPStan\\ExtensionInstaller\\' => array ( @@ -199,6 +203,10 @@ class ComposerStaticInitdd705c6e8ab22e0d642372dec7767718 array ( 0 => __DIR__ . '/..' . '/fidry/cpu-core-counter/src', ), + 'Doctrine\\Deprecations\\' => + array ( + 0 => __DIR__ . '/..' . '/doctrine/deprecations/lib/Doctrine/Deprecations', + ), 'Composer\\XdebugHandler\\' => array ( 0 => __DIR__ . '/..' . '/composer/xdebug-handler/src', diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json index a47ea436..2fe33c4b 100644 --- a/vendor/composer/installed.json +++ b/vendor/composer/installed.json @@ -172,82 +172,6 @@ ], "install-path": "../amphp/byte-stream" }, - { - "name": "composer/package-versions-deprecated", - "version": "1.11.99.5", - "version_normalized": "1.11.99.5", - "source": { - "type": "git", - "url": "https://github.com/composer/package-versions-deprecated.git", - "reference": "b4f54f74ef3453349c24a845d22392cd31e65f1d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/b4f54f74ef3453349c24a845d22392cd31e65f1d", - "reference": "b4f54f74ef3453349c24a845d22392cd31e65f1d", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^1.1.0 || ^2.0", - "php": "^7 || ^8" - }, - "replace": { - "ocramius/package-versions": "1.11.99" - }, - "require-dev": { - "composer/composer": "^1.9.3 || ^2.0@dev", - "ext-zip": "^1.13", - "phpunit/phpunit": "^6.5 || ^7" - }, - "time": "2022-01-17T14:14:24+00:00", - "type": "composer-plugin", - "extra": { - "class": "PackageVersions\\Installer", - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "PackageVersions\\": "src/PackageVersions" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be" - } - ], - "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", - "support": { - "issues": "https://github.com/composer/package-versions-deprecated/issues", - "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.5" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "install-path": "./package-versions-deprecated" - }, { "name": "composer/pcre", "version": "3.1.0", @@ -515,6 +439,52 @@ }, "install-path": "../dnoegel/php-xdg-base-dir" }, + { + "name": "doctrine/deprecations", + "version": "v1.0.0", + "version_normalized": "1.0.0.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de", + "reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de", + "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": "2022-05-02T15:47:09+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.0.0" + }, + "install-path": "../doctrine/deprecations" + }, { "name": "felixfbecker/advanced-json-rpc", "version": "v3.2.1", @@ -1047,25 +1017,28 @@ }, { "name": "phpdocumentor/type-resolver", - "version": "1.6.2", - "version_normalized": "1.6.2.0", + "version": "1.7.1", + "version_normalized": "1.7.1.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "48f445a408c131e38cab1c235aa6d2bb7a0bb20d" + "reference": "dfc078e8af9c99210337325ff5aa152872c98714" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/48f445a408c131e38cab1c235aa6d2bb7a0bb20d", - "reference": "48f445a408c131e38cab1c235aa6d2bb7a0bb20d", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/dfc078e8af9c99210337325ff5aa152872c98714", + "reference": "dfc078e8af9c99210337325ff5aa152872c98714", "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", @@ -1073,7 +1046,7 @@ "rector/rector": "^0.13.9", "vimeo/psalm": "^4.25" }, - "time": "2022-10-14T12:47:21+00:00", + "time": "2023-03-27T19:02:04+00:00", "type": "library", "extra": { "branch-alias": { @@ -1099,7 +1072,7 @@ "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.1" }, "install-path": "../phpdocumentor/type-resolver" }, @@ -1151,18 +1124,66 @@ "install-path": "../phpstan/extension-installer" }, { - "name": "phpstan/phpstan", - "version": "1.10.5", - "version_normalized": "1.10.5.0", + "name": "phpstan/phpdoc-parser", + "version": "1.16.1", + "version_normalized": "1.16.1.0", "source": { "type": "git", - "url": "https://github.com/phpstan/phpstan.git", - "reference": "1fb6f494d82455151ecf15c5c191923f5d84324e" + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "e27e92d939e2e3636f0a1f0afaba59692c0bf571" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/1fb6f494d82455151ecf15c5c191923f5d84324e", - "reference": "1fb6f494d82455151ecf15c5c191923f5d84324e", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/e27e92d939e2e3636f0a1f0afaba59692c0bf571", + "reference": "e27e92d939e2e3636f0a1f0afaba59692c0bf571", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "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-02-07T18:11:17+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.16.1" + }, + "install-path": "../phpstan/phpdoc-parser" + }, + { + "name": "phpstan/phpstan", + "version": "1.10.8", + "version_normalized": "1.10.8.0", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan.git", + "reference": "0166aef76e066f0dd2adc2799bdadfa1635711e9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/0166aef76e066f0dd2adc2799bdadfa1635711e9", + "reference": "0166aef76e066f0dd2adc2799bdadfa1635711e9", "shasum": "" }, "require": { @@ -1171,7 +1192,7 @@ "conflict": { "phpstan/phpstan-shim": "*" }, - "time": "2023-03-07T16:48:45+00:00", + "time": "2023-03-24T10:28:16+00:00", "bin": [ "phpstan", "phpstan.phar" @@ -1193,8 +1214,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.5" + "security": "https://github.com/phpstan/phpstan/security/policy", + "source": "https://github.com/phpstan/phpstan-src" }, "funding": [ { @@ -1214,17 +1238,17 @@ }, { "name": "phpstan/phpstan-deprecation-rules", - "version": "1.1.2", - "version_normalized": "1.1.2.0", + "version": "1.1.3", + "version_normalized": "1.1.3.0", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-deprecation-rules.git", - "reference": "bcc1e8cdf81c3da1a2ba9188ee94cd7e2a62e865" + "reference": "a22b36b955a2e9a3d39fe533b6c1bb5359f9c319" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-deprecation-rules/zipball/bcc1e8cdf81c3da1a2ba9188ee94cd7e2a62e865", - "reference": "bcc1e8cdf81c3da1a2ba9188ee94cd7e2a62e865", + "url": "https://api.github.com/repos/phpstan/phpstan-deprecation-rules/zipball/a22b36b955a2e9a3d39fe533b6c1bb5359f9c319", + "reference": "a22b36b955a2e9a3d39fe533b6c1bb5359f9c319", "shasum": "" }, "require": { @@ -1237,7 +1261,7 @@ "phpstan/phpstan-phpunit": "^1.0", "phpunit/phpunit": "^9.5" }, - "time": "2023-01-17T16:14:21+00:00", + "time": "2023-03-17T07:50:08+00:00", "type": "phpstan-extension", "extra": { "phpstan": { @@ -1259,7 +1283,7 @@ "description": "PHPStan rules for detecting usage of deprecated classes, methods, properties, constants and traits.", "support": { "issues": "https://github.com/phpstan/phpstan-deprecation-rules/issues", - "source": "https://github.com/phpstan/phpstan-deprecation-rules/tree/1.1.2" + "source": "https://github.com/phpstan/phpstan-deprecation-rules/tree/1.1.3" }, "install-path": "../phpstan/phpstan-deprecation-rules" }, @@ -1443,17 +1467,17 @@ }, { "name": "sebastian/diff", - "version": "5.0.0", - "version_normalized": "5.0.0.0", + "version": "5.0.1", + "version_normalized": "5.0.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "70dd1b20bc198da394ad542e988381b44e64e39f" + "reference": "aae9a0a43bff37bd5d8d0311426c87bf36153f02" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/70dd1b20bc198da394ad542e988381b44e64e39f", - "reference": "70dd1b20bc198da394ad542e988381b44e64e39f", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/aae9a0a43bff37bd5d8d0311426c87bf36153f02", + "reference": "aae9a0a43bff37bd5d8d0311426c87bf36153f02", "shasum": "" }, "require": { @@ -1463,7 +1487,7 @@ "phpunit/phpunit": "^10.0", "symfony/process": "^4.2 || ^5" }, - "time": "2023-02-03T07:00:31+00:00", + "time": "2023-03-23T05:12:41+00:00", "type": "library", "extra": { "branch-alias": { @@ -1500,7 +1524,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/5.0.0" + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/5.0.1" }, "funding": [ { @@ -2483,23 +2508,23 @@ }, { "name": "vimeo/psalm", - "version": "5.7.7", - "version_normalized": "5.7.7.0", + "version": "5.8.0", + "version_normalized": "5.8.0.0", "source": { "type": "git", "url": "https://github.com/vimeo/psalm.git", - "reference": "e028ba46ba0d7f9a78bc3201c251e137383e145f" + "reference": "9cf4f60a333f779ad3bc704a555920e81d4fdcda" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vimeo/psalm/zipball/e028ba46ba0d7f9a78bc3201c251e137383e145f", - "reference": "e028ba46ba0d7f9a78bc3201c251e137383e145f", + "url": "https://api.github.com/repos/vimeo/psalm/zipball/9cf4f60a333f779ad3bc704a555920e81d4fdcda", + "reference": "9cf4f60a333f779ad3bc704a555920e81d4fdcda", "shasum": "" }, "require": { "amphp/amp": "^2.4.2", "amphp/byte-stream": "^1.5", - "composer/package-versions-deprecated": "^1.10.0", + "composer-runtime-api": "^2", "composer/semver": "^1.4 || ^2.0 || ^3.0", "composer/xdebug-handler": "^2.0 || ^3.0", "dnoegel/php-xdg-base-dir": "^0.1.1", @@ -2514,7 +2539,7 @@ "felixfbecker/language-server-protocol": "^1.5.2", "fidry/cpu-core-counter": "^0.4.1 || ^0.5.1", "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", - "nikic/php-parser": "^4.13", + "nikic/php-parser": "^4.14", "php": "^7.4 || ~8.0.0 || ~8.1.0 || ~8.2.0", "sebastian/diff": "^4.0 || ^5.0", "spatie/array-to-xml": "^2.17.0 || ^3.0", @@ -2543,7 +2568,7 @@ "ext-curl": "In order to send data to shepherd", "ext-igbinary": "^2.0.5 is required, used to serialize caching data" }, - "time": "2023-02-25T01:05:07+00:00", + "time": "2023-03-09T04:14:35+00:00", "bin": [ "psalm", "psalm-language-server", @@ -2585,7 +2610,7 @@ ], "support": { "issues": "https://github.com/vimeo/psalm/issues", - "source": "https://github.com/vimeo/psalm/tree/5.7.7" + "source": "https://github.com/vimeo/psalm/tree/5.8.0" }, "install-path": "../vimeo/psalm" }, @@ -2655,11 +2680,11 @@ "dev-package-names": [ "amphp/amp", "amphp/byte-stream", - "composer/package-versions-deprecated", "composer/pcre", "composer/semver", "composer/xdebug-handler", "dnoegel/php-xdg-base-dir", + "doctrine/deprecations", "felixfbecker/advanced-json-rpc", "felixfbecker/language-server-protocol", "fidry/cpu-core-counter", @@ -2671,6 +2696,7 @@ "phpdocumentor/reflection-docblock", "phpdocumentor/type-resolver", "phpstan/extension-installer", + "phpstan/phpdoc-parser", "phpstan/phpstan", "phpstan/phpstan-deprecation-rules", "psr/container", diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php index 4c12da7f..9f147870 100644 --- a/vendor/composer/installed.php +++ b/vendor/composer/installed.php @@ -28,15 +28,6 @@ 'aliases' => array(), 'dev_requirement' => true, ), - 'composer/package-versions-deprecated' => array( - 'pretty_version' => '1.11.99.5', - 'version' => '1.11.99.5', - 'reference' => 'b4f54f74ef3453349c24a845d22392cd31e65f1d', - 'type' => 'composer-plugin', - 'install_path' => __DIR__ . '/./package-versions-deprecated', - 'aliases' => array(), - 'dev_requirement' => true, - ), 'composer/pcre' => array( 'pretty_version' => '3.1.0', 'version' => '3.1.0.0', @@ -73,6 +64,15 @@ 'aliases' => array(), 'dev_requirement' => true, ), + 'doctrine/deprecations' => array( + 'pretty_version' => 'v1.0.0', + 'version' => '1.0.0.0', + 'reference' => '0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de', + 'type' => 'library', + 'install_path' => __DIR__ . '/../doctrine/deprecations', + 'aliases' => array(), + 'dev_requirement' => true, + ), 'egrajp/development-corelibs-dev' => array( 'pretty_version' => 'dev-master', 'version' => 'dev-master', @@ -136,12 +136,6 @@ 'aliases' => array(), 'dev_requirement' => true, ), - 'ocramius/package-versions' => array( - 'dev_requirement' => true, - 'replaced' => array( - 0 => '1.11.99', - ), - ), 'phan/phan' => array( 'pretty_version' => '5.4.2', 'version' => '5.4.2.0', @@ -170,9 +164,9 @@ 'dev_requirement' => true, ), 'phpdocumentor/type-resolver' => array( - 'pretty_version' => '1.6.2', - 'version' => '1.6.2.0', - 'reference' => '48f445a408c131e38cab1c235aa6d2bb7a0bb20d', + 'pretty_version' => '1.7.1', + 'version' => '1.7.1.0', + 'reference' => 'dfc078e8af9c99210337325ff5aa152872c98714', 'type' => 'library', 'install_path' => __DIR__ . '/../phpdocumentor/type-resolver', 'aliases' => array(), @@ -187,19 +181,28 @@ 'aliases' => array(), 'dev_requirement' => true, ), + 'phpstan/phpdoc-parser' => array( + 'pretty_version' => '1.16.1', + 'version' => '1.16.1.0', + 'reference' => 'e27e92d939e2e3636f0a1f0afaba59692c0bf571', + 'type' => 'library', + 'install_path' => __DIR__ . '/../phpstan/phpdoc-parser', + 'aliases' => array(), + 'dev_requirement' => true, + ), 'phpstan/phpstan' => array( - 'pretty_version' => '1.10.5', - 'version' => '1.10.5.0', - 'reference' => '1fb6f494d82455151ecf15c5c191923f5d84324e', + 'pretty_version' => '1.10.8', + 'version' => '1.10.8.0', + 'reference' => '0166aef76e066f0dd2adc2799bdadfa1635711e9', 'type' => 'library', 'install_path' => __DIR__ . '/../phpstan/phpstan', 'aliases' => array(), 'dev_requirement' => true, ), 'phpstan/phpstan-deprecation-rules' => array( - 'pretty_version' => '1.1.2', - 'version' => '1.1.2.0', - 'reference' => 'bcc1e8cdf81c3da1a2ba9188ee94cd7e2a62e865', + 'pretty_version' => '1.1.3', + 'version' => '1.1.3.0', + 'reference' => 'a22b36b955a2e9a3d39fe533b6c1bb5359f9c319', 'type' => 'phpstan-extension', 'install_path' => __DIR__ . '/../phpstan/phpstan-deprecation-rules', 'aliases' => array(), @@ -208,7 +211,7 @@ 'psalm/psalm' => array( 'dev_requirement' => true, 'provided' => array( - 0 => '5.7.7', + 0 => '5.8.0', ), ), 'psr/container' => array( @@ -245,9 +248,9 @@ 'dev_requirement' => true, ), 'sebastian/diff' => array( - 'pretty_version' => '5.0.0', - 'version' => '5.0.0.0', - 'reference' => '70dd1b20bc198da394ad542e988381b44e64e39f', + 'pretty_version' => '5.0.1', + 'version' => '5.0.1.0', + 'reference' => 'aae9a0a43bff37bd5d8d0311426c87bf36153f02', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/diff', 'aliases' => array(), @@ -362,9 +365,9 @@ 'dev_requirement' => true, ), 'vimeo/psalm' => array( - 'pretty_version' => '5.7.7', - 'version' => '5.7.7.0', - 'reference' => 'e028ba46ba0d7f9a78bc3201c251e137383e145f', + 'pretty_version' => '5.8.0', + 'version' => '5.8.0.0', + 'reference' => '9cf4f60a333f779ad3bc704a555920e81d4fdcda', 'type' => 'library', 'install_path' => __DIR__ . '/../vimeo/psalm', 'aliases' => array(), diff --git a/vendor/composer/package-versions-deprecated/CHANGELOG.md b/vendor/composer/package-versions-deprecated/CHANGELOG.md deleted file mode 100644 index a838c56a..00000000 --- a/vendor/composer/package-versions-deprecated/CHANGELOG.md +++ /dev/null @@ -1,120 +0,0 @@ -# CHANGELOG - -## 1.1.3 - 2017-09-06 - -This release fixes a bug that caused PackageVersions to prevent -the `composer remove` and `composer update` commands to fail when -this package is removed. - -In addition to that, mutation testing has been added to the suite, -ensuring that the package is accurately and extensively tested. - -Total issues resolved: **3** - -- [40: Mutation testing, PHP 7.1 testing](https://github.com/Ocramius/PackageVersions/pull/40) thanks to @Ocramius -- [41: Removing this package on install results in file access error](https://github.com/Ocramius/PackageVersions/issues/41) thanks to @Xerkus -- [46: #41 Avoid issues when the package is scheduled for removal](https://github.com/Ocramius/PackageVersions/pull/46) thanks to @Jean85 - -## 1.1.2 - 2016-12-30 - -This release fixes a bug that caused PackageVersions to be enabled -even when it was part of a globally installed package. - -Total issues resolved: **3** - -- [35: remove all temp directories](https://github.com/Ocramius/PackageVersions/pull/35) -- [38: Interferes with other projects when installed globally](https://github.com/Ocramius/PackageVersions/issues/38) -- [39: Ignore the global plugin when updating local projects](https://github.com/Ocramius/PackageVersions/pull/39) - -## 1.1.1 - 2016-07-25 - -This release removes the [`"files"`](https://getcomposer.org/doc/04-schema.md#files) directive from -[`composer.json`](https://github.com/Ocramius/PackageVersions/commit/86f2636f7c5e7b56fa035fa3826d5fcf80b6dc72), -as it is no longer needed for `composer install --classmap-authoritative`. -Also, that directive was causing issues with HHVM installations, since -PackageVersions is not compatible with it. - -Total issues resolved: **1** - -- [34: Fatal error during travis build after update to 1.1.0](https://github.com/Ocramius/PackageVersions/issues/34) - -## 1.1.0 - 2016-07-22 - -This release introduces support for running `composer install --classmap-authoritative` -and `composer install --no-scripts`. Please note that performance -while using these modes may be degraded, but the package will -still work. - -Additionally, the package was tuned to prevent the plugin from -running twice at installation. - -Total issues resolved: **10** - -- [18: Fails when using composer install --no-scripts](https://github.com/Ocramius/PackageVersions/issues/18) -- [20: CS (spacing)](https://github.com/Ocramius/PackageVersions/pull/20) -- [22: Document the way the require-dev section is treated](https://github.com/Ocramius/PackageVersions/issues/22) -- [23: Underline that composer.lock is used as source of information](https://github.com/Ocramius/PackageVersions/pull/23) -- [27: Fix incompatibility with --classmap-authoritative](https://github.com/Ocramius/PackageVersions/pull/27) -- [29: mention optimize-autoloader composer.json config option in README](https://github.com/Ocramius/PackageVersions/pull/29) -- [30: The version class is generated twice during composer update](https://github.com/Ocramius/PackageVersions/issues/30) -- [31: Remove double registration of the event listeners](https://github.com/Ocramius/PackageVersions/pull/31) -- [32: Update the usage of mock APIs to use the new API](https://github.com/Ocramius/PackageVersions/pull/32) -- [33: Fix for #18 - support running with --no-scripts flag](https://github.com/Ocramius/PackageVersions/pull/33) - -## 1.0.4 - 2016-04-23 - -This release includes a fix/workaround for composer/composer#5237, -which causes `ocramius/package-versions` to sometimes generate a -`Versions` class with malformed name (something like -`Versions_composer_tmp0`) when running `composer require `. - -Total issues resolved: **2** - -- [16: Workaround for composer/composer#5237 - class parsing](https://github.com/Ocramius/PackageVersions/pull/16) -- [17: Weird Class name being generated](https://github.com/Ocramius/PackageVersions/issues/17) - -## 1.0.3 - 2016-02-26 - -This release fixes an issue related to concurrent autoloader -re-generation caused by multiple composer plugins being installed. -The issue was solved by removing autoloader re-generation from this -package, but it may still affect other packages. - -It is now recommended that you run `composer dump-autoload --optimize` -after installation when using this particular package. -Please note that `composer (install|update) -o` is not sufficient -to avoid autoload overhead when using this particular package. - -Total issues resolved: **1** - -- [15: Remove autoload re-dump optimization](https://github.com/Ocramius/PackageVersions/pull/15) - -## 1.0.2 - 2016-02-24 - -This release fixes issues related to installing the component without -any dev dependencies or with packages that don't have a source or dist -reference, which is usual with packages defined directly in the -`composer.json`. - -Total issues resolved: **3** - -- [11: fix composer install --no-dev PHP7](https://github.com/Ocramius/PackageVersions/pull/11) -- [12: Packages don't always have a source/reference](https://github.com/Ocramius/PackageVersions/issues/12) -- [13: Fix #12 - support dist and missing package version references](https://github.com/Ocramius/PackageVersions/pull/13) - -## 1.0.1 - 2016-02-01 - -This release fixes an issue related with composer updates to -already installed versions. -Using `composer require` within a package that already used -`ocramius/package-versions` caused the installation to be unable -to write the `PackageVersions\Versions` class to a file. - -Total issues resolved: **6** - -- [2: remove unused use statement](https://github.com/Ocramius/PackageVersions/pull/2) -- [3: Remove useless files from dist package](https://github.com/Ocramius/PackageVersions/pull/3) -- [5: failed to open stream: phar error: write operations disabled by the php.ini setting phar.readonly](https://github.com/Ocramius/PackageVersions/issues/5) -- [6: Fix/#5 use composer vendor dir](https://github.com/Ocramius/PackageVersions/pull/6) -- [7: Hotfix - #5 generate package versions also when in phar context](https://github.com/Ocramius/PackageVersions/pull/7) -- [8: Versions class should be ignored by VCS, as it is an install-time artifact](https://github.com/Ocramius/PackageVersions/pull/8) diff --git a/vendor/composer/package-versions-deprecated/CONTRIBUTING.md b/vendor/composer/package-versions-deprecated/CONTRIBUTING.md deleted file mode 100644 index 71806175..00000000 --- a/vendor/composer/package-versions-deprecated/CONTRIBUTING.md +++ /dev/null @@ -1,39 +0,0 @@ ---- -title: Contributing ---- - -# Contributing - - * Coding standard for the project is [PSR-2](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md) - * The project will follow strict [object calisthenics](http://www.slideshare.net/guilhermeblanco/object-calisthenics-applied-to-php) - * Any contribution must provide tests for additional introduced conditions - * Any un-confirmed issue needs a failing test case before being accepted - * Pull requests must be sent from a new hotfix/feature branch, not from `master`. - -## Installation - -To install the project and run the tests, you need to clone it first: - -```sh -$ git clone git://github.com/Ocramius/PackageVersions.git -``` - -You will then need to run a composer installation: - -```sh -$ cd PackageVersions -$ curl -s https://getcomposer.org/installer | php -$ php composer.phar update -``` - -## Testing - -The PHPUnit version to be used is the one installed as a dev- dependency via composer: - -```sh -$ ./vendor/bin/phpunit -``` - -Accepted coverage for new contributions is 80%. Any contribution not satisfying this requirement -won't be merged. - diff --git a/vendor/composer/package-versions-deprecated/README.md b/vendor/composer/package-versions-deprecated/README.md deleted file mode 100644 index 8bea9d41..00000000 --- a/vendor/composer/package-versions-deprecated/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# Package Versions - -**`composer/package-versions-deprecated` is a fully-compatible fork of [`ocramius/package-versions`](https://github.com/Ocramius/PackageVersions)** which provides compatibility with Composer 1 and 2 on PHP 7+. It replaces ocramius/package-versions so if you have a dependency requiring it and you want to use Composer v2 but can not upgrade to PHP 7.4 just yet, you can require this package instead. - -If you have a **direct** dependency on `ocramius/package-versions`, we recommend that once you migrated to Composer 2.x you also migrate to use the [`Composer\InstalledVersions`](https://getcomposer.org/doc/07-runtime.md#installed-versions) class which offers the functionality present here out of the box. You can then remove the require on this package. - -This package is EOL / deprecated and you should aim to migrate away from it as soon as possible! diff --git a/vendor/composer/package-versions-deprecated/SECURITY.md b/vendor/composer/package-versions-deprecated/SECURITY.md deleted file mode 100644 index da9c516d..00000000 --- a/vendor/composer/package-versions-deprecated/SECURITY.md +++ /dev/null @@ -1,5 +0,0 @@ -## Security contact information - -To report a security vulnerability, please use the -[Tidelift security contact](https://tidelift.com/security). -Tidelift will coordinate the fix and disclosure. diff --git a/vendor/composer/package-versions-deprecated/composer.json b/vendor/composer/package-versions-deprecated/composer.json deleted file mode 100644 index d5a40daa..00000000 --- a/vendor/composer/package-versions-deprecated/composer.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "name": "composer/package-versions-deprecated", - "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", - "type": "composer-plugin", - "license": "MIT", - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be" - } - ], - "require": { - "php": "^7 || ^8", - "composer-plugin-api": "^1.1.0 || ^2.0" - }, - "replace": { - "ocramius/package-versions": "1.11.99" - }, - "require-dev": { - "phpunit/phpunit": "^6.5 || ^7", - "composer/composer": "^1.9.3 || ^2.0@dev", - "ext-zip": "^1.13" - }, - "autoload": { - "psr-4": { - "PackageVersions\\": "src/PackageVersions" - } - }, - "autoload-dev": { - "psr-4": { - "PackageVersionsTest\\": "test/PackageVersionsTest" - } - }, - "extra": { - "class": "PackageVersions\\Installer", - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "scripts": { - "post-update-cmd": "PackageVersions\\Installer::dumpVersionsClass", - "post-install-cmd": "PackageVersions\\Installer::dumpVersionsClass" - } -} diff --git a/vendor/composer/package-versions-deprecated/composer.lock b/vendor/composer/package-versions-deprecated/composer.lock deleted file mode 100644 index b711f6b1..00000000 --- a/vendor/composer/package-versions-deprecated/composer.lock +++ /dev/null @@ -1,2603 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", - "This file is @generated automatically" - ], - "content-hash": "6bfe0a7d7a51c4bdf14a2d7ea1d22d11", - "packages": [], - "packages-dev": [ - { - "name": "composer/ca-bundle", - "version": "1.2.7", - "source": { - "type": "git", - "url": "https://github.com/composer/ca-bundle.git", - "reference": "95c63ab2117a72f48f5a55da9740a3273d45b7fd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/95c63ab2117a72f48f5a55da9740a3273d45b7fd", - "reference": "95c63ab2117a72f48f5a55da9740a3273d45b7fd", - "shasum": "" - }, - "require": { - "ext-openssl": "*", - "ext-pcre": "*", - "php": "^5.3.2 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8", - "psr/log": "^1.0", - "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\CaBundle\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.", - "keywords": [ - "cabundle", - "cacert", - "certificate", - "ssl", - "tls" - ], - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2020-04-08T08:27:21+00:00" - }, - { - "name": "composer/composer", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/composer/composer.git", - "reference": "a8c105da344dd84ebd5d11be7943a45b09dc076f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/a8c105da344dd84ebd5d11be7943a45b09dc076f", - "reference": "a8c105da344dd84ebd5d11be7943a45b09dc076f", - "shasum": "" - }, - "require": { - "composer/ca-bundle": "^1.0", - "composer/semver": "^1.0", - "composer/spdx-licenses": "^1.2", - "composer/xdebug-handler": "^1.1", - "justinrainbow/json-schema": "^3.0 || ^4.0 || ^5.0", - "php": "^5.3.2 || ^7.0", - "psr/log": "^1.0", - "seld/jsonlint": "^1.4", - "seld/phar-utils": "^1.0", - "symfony/console": "^2.7 || ^3.0 || ^4.0 || ^5.0", - "symfony/filesystem": "^2.7 || ^3.0 || ^4.0 || ^5.0", - "symfony/finder": "^2.7 || ^3.0 || ^4.0 || ^5.0", - "symfony/process": "^2.7 || ^3.0 || ^4.0 || ^5.0" - }, - "conflict": { - "symfony/console": "2.8.38" - }, - "require-dev": { - "phpspec/prophecy": "^1.10", - "symfony/phpunit-bridge": "^3.4" - }, - "suggest": { - "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", - "ext-zip": "Enabling the zip extension allows you to unzip archives", - "ext-zlib": "Allow gzip compression of HTTP requests" - }, - "bin": [ - "bin/composer" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.10-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\": "src/Composer" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "http://www.naderman.de" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "Composer helps you declare, manage and install dependencies of PHP projects. It ensures you have the right stack everywhere.", - "homepage": "https://getcomposer.org/", - "keywords": [ - "autoload", - "dependency", - "package" - ], - "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/composer/issues", - "source": "https://github.com/composer/composer/tree/master" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2020-03-29T14:59:26+00:00" - }, - { - "name": "composer/semver", - "version": "1.5.1", - "source": { - "type": "git", - "url": "https://github.com/composer/semver.git", - "reference": "c6bea70230ef4dd483e6bbcab6005f682ed3a8de" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/c6bea70230ef4dd483e6bbcab6005f682ed3a8de", - "reference": "c6bea70230ef4dd483e6bbcab6005f682ed3a8de", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.5 || ^5.0.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\Semver\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "http://www.naderman.de" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - }, - { - "name": "Rob Bast", - "email": "rob.bast@gmail.com", - "homepage": "http://robbast.nl" - } - ], - "description": "Semver library that offers utilities, version constraint parsing and validation.", - "keywords": [ - "semantic", - "semver", - "validation", - "versioning" - ], - "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/1.5.1" - }, - "time": "2020-01-13T12:06:48+00:00" - }, - { - "name": "composer/spdx-licenses", - "version": "1.5.3", - "source": { - "type": "git", - "url": "https://github.com/composer/spdx-licenses.git", - "reference": "0c3e51e1880ca149682332770e25977c70cf9dae" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/0c3e51e1880ca149682332770e25977c70cf9dae", - "reference": "0c3e51e1880ca149682332770e25977c70cf9dae", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 7" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\Spdx\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "http://www.naderman.de" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - }, - { - "name": "Rob Bast", - "email": "rob.bast@gmail.com", - "homepage": "http://robbast.nl" - } - ], - "description": "SPDX licenses list and validation library.", - "keywords": [ - "license", - "spdx", - "validator" - ], - "time": "2020-02-14T07:44:31+00:00" - }, - { - "name": "composer/xdebug-handler", - "version": "1.4.1", - "source": { - "type": "git", - "url": "https://github.com/composer/xdebug-handler.git", - "reference": "1ab9842d69e64fb3a01be6b656501032d1b78cb7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/1ab9842d69e64fb3a01be6b656501032d1b78cb7", - "reference": "1ab9842d69e64fb3a01be6b656501032d1b78cb7", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0 || ^8.0", - "psr/log": "^1.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8" - }, - "type": "library", - "autoload": { - "psr-4": { - "Composer\\XdebugHandler\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "John Stevenson", - "email": "john-stevenson@blueyonder.co.uk" - } - ], - "description": "Restarts a process without Xdebug.", - "keywords": [ - "Xdebug", - "performance" - ], - "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/xdebug-handler/issues", - "source": "https://github.com/composer/xdebug-handler/tree/master" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - } - ], - "time": "2020-03-01T12:26:26+00:00" - }, - { - "name": "doctrine/instantiator", - "version": "1.3.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "ae466f726242e637cebdd526a7d991b9433bacf1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/ae466f726242e637cebdd526a7d991b9433bacf1", - "reference": "ae466f726242e637cebdd526a7d991b9433bacf1", - "shasum": "" - }, - "require": { - "php": "^7.1" - }, - "require-dev": { - "doctrine/coding-standard": "^6.0", - "ext-pdo": "*", - "ext-phar": "*", - "phpbench/phpbench": "^0.13", - "phpstan/phpstan-phpunit": "^0.11", - "phpstan/phpstan-shim": "^0.11", - "phpunit/phpunit": "^7.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "http://ocramius.github.com/" - } - ], - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://www.doctrine-project.org/projects/instantiator.html", - "keywords": [ - "constructor", - "instantiate" - ], - "support": { - "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/master" - }, - "time": "2019-10-21T16:45:58+00:00" - }, - { - "name": "justinrainbow/json-schema", - "version": "5.2.9", - "source": { - "type": "git", - "url": "https://github.com/justinrainbow/json-schema.git", - "reference": "44c6787311242a979fa15c704327c20e7221a0e4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/44c6787311242a979fa15c704327c20e7221a0e4", - "reference": "44c6787311242a979fa15c704327c20e7221a0e4", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1", - "json-schema/json-schema-test-suite": "1.2.0", - "phpunit/phpunit": "^4.8.35" - }, - "bin": [ - "bin/validate-json" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "JsonSchema\\": "src/JsonSchema/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bruno Prieto Reis", - "email": "bruno.p.reis@gmail.com" - }, - { - "name": "Justin Rainbow", - "email": "justin.rainbow@gmail.com" - }, - { - "name": "Igor Wiedler", - "email": "igor@wiedler.ch" - }, - { - "name": "Robert Schönthal", - "email": "seroscho@googlemail.com" - } - ], - "description": "A library to validate a json schema.", - "homepage": "https://github.com/justinrainbow/json-schema", - "keywords": [ - "json", - "schema" - ], - "support": { - "issues": "https://github.com/justinrainbow/json-schema/issues", - "source": "https://github.com/justinrainbow/json-schema/tree/5.2.9" - }, - "time": "2019-09-25T14:49:45+00:00" - }, - { - "name": "myclabs/deep-copy", - "version": "1.9.5", - "source": { - "type": "git", - "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "b2c28789e80a97badd14145fda39b545d83ca3ef" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/b2c28789e80a97badd14145fda39b545d83ca3ef", - "reference": "b2c28789e80a97badd14145fda39b545d83ca3ef", - "shasum": "" - }, - "require": { - "php": "^7.1" - }, - "replace": { - "myclabs/deep-copy": "self.version" - }, - "require-dev": { - "doctrine/collections": "^1.0", - "doctrine/common": "^2.6", - "phpunit/phpunit": "^7.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "DeepCopy\\": "src/DeepCopy/" - }, - "files": [ - "src/DeepCopy/deep_copy.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Create deep copies (clones) of your objects", - "keywords": [ - "clone", - "copy", - "duplicate", - "object", - "object graph" - ], - "support": { - "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.9.5" - }, - "time": "2020-01-17T21:11:47+00:00" - }, - { - "name": "phar-io/manifest", - "version": "1.0.3", - "source": { - "type": "git", - "url": "https://github.com/phar-io/manifest.git", - "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", - "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-phar": "*", - "phar-io/version": "^2.0", - "php": "^5.6 || ^7.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", - "time": "2018-07-08T19:23:20+00:00" - }, - { - "name": "phar-io/version", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/phar-io/version.git", - "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6", - "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Library for handling version information and constraints", - "time": "2018-07-08T19:19:57+00:00" - }, - { - "name": "phpdocumentor/reflection-common", - "version": "2.0.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "63a995caa1ca9e5590304cd845c15ad6d482a62a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/63a995caa1ca9e5590304cd845c15ad6d482a62a", - "reference": "63a995caa1ca9e5590304cd845c15ad6d482a62a", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "require-dev": { - "phpunit/phpunit": "~6" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org", - "time": "2018-08-07T13:53:10+00:00" - }, - { - "name": "phpdocumentor/reflection-docblock", - "version": "5.1.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e", - "reference": "cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e", - "shasum": "" - }, - "require": { - "ext-filter": "^7.1", - "php": "^7.2", - "phpdocumentor/reflection-common": "^2.0", - "phpdocumentor/type-resolver": "^1.0", - "webmozart/assert": "^1" - }, - "require-dev": { - "doctrine/instantiator": "^1", - "mockery/mockery": "^1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - }, - { - "name": "Jaap van Otterdijk", - "email": "account@ijaap.nl" - } - ], - "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "time": "2020-02-22T12:28:44+00:00" - }, - { - "name": "phpdocumentor/type-resolver", - "version": "1.1.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "7462d5f123dfc080dfdf26897032a6513644fc95" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/7462d5f123dfc080dfdf26897032a6513644fc95", - "reference": "7462d5f123dfc080dfdf26897032a6513644fc95", - "shasum": "" - }, - "require": { - "php": "^7.2", - "phpdocumentor/reflection-common": "^2.0" - }, - "require-dev": { - "ext-tokenizer": "^7.2", - "mockery/mockery": "~1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } - ], - "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/master" - }, - "time": "2020-02-18T18:59:58+00:00" - }, - { - "name": "phpspec/prophecy", - "version": "v1.10.3", - "source": { - "type": "git", - "url": "https://github.com/phpspec/prophecy.git", - "reference": "451c3cd1418cf640de218914901e51b064abb093" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/451c3cd1418cf640de218914901e51b064abb093", - "reference": "451c3cd1418cf640de218914901e51b064abb093", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.0.2", - "php": "^5.3|^7.0", - "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0|^5.0", - "sebastian/comparator": "^1.2.3|^2.0|^3.0|^4.0", - "sebastian/recursion-context": "^1.0|^2.0|^3.0|^4.0" - }, - "require-dev": { - "phpspec/phpspec": "^2.5 || ^3.2", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.10.x-dev" - } - }, - "autoload": { - "psr-4": { - "Prophecy\\": "src/Prophecy" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" - }, - { - "name": "Marcello Duarte", - "email": "marcello.duarte@gmail.com" - } - ], - "description": "Highly opinionated mocking framework for PHP 5.3+", - "homepage": "https://github.com/phpspec/prophecy", - "keywords": [ - "Double", - "Dummy", - "fake", - "mock", - "spy", - "stub" - ], - "support": { - "issues": "https://github.com/phpspec/prophecy/issues", - "source": "https://github.com/phpspec/prophecy/tree/v1.10.3" - }, - "time": "2020-03-05T15:02:03+00:00" - }, - { - "name": "phpunit/php-code-coverage", - "version": "6.1.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "807e6013b00af69b6c5d9ceb4282d0393dbb9d8d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/807e6013b00af69b6c5d9ceb4282d0393dbb9d8d", - "reference": "807e6013b00af69b6c5d9ceb4282d0393dbb9d8d", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-xmlwriter": "*", - "php": "^7.1", - "phpunit/php-file-iterator": "^2.0", - "phpunit/php-text-template": "^1.2.1", - "phpunit/php-token-stream": "^3.0", - "sebastian/code-unit-reverse-lookup": "^1.0.1", - "sebastian/environment": "^3.1 || ^4.0", - "sebastian/version": "^2.0.1", - "theseer/tokenizer": "^1.1" - }, - "require-dev": { - "phpunit/phpunit": "^7.0" - }, - "suggest": { - "ext-xdebug": "^2.6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "6.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", - "homepage": "https://github.com/sebastianbergmann/php-code-coverage", - "keywords": [ - "coverage", - "testing", - "xunit" - ], - "time": "2018-10-31T16:06:48+00:00" - }, - { - "name": "phpunit/php-file-iterator", - "version": "2.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "050bedf145a257b1ff02746c31894800e5122946" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/050bedf145a257b1ff02746c31894800e5122946", - "reference": "050bedf145a257b1ff02746c31894800e5122946", - "shasum": "" - }, - "require": { - "php": "^7.1" - }, - "require-dev": { - "phpunit/phpunit": "^7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", - "keywords": [ - "filesystem", - "iterator" - ], - "time": "2018-09-13T20:33:42+00:00" - }, - { - "name": "phpunit/php-text-template", - "version": "1.2.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", - "keywords": [ - "template" - ], - "time": "2015-06-21T13:50:34+00:00" - }, - { - "name": "phpunit/php-timer", - "version": "2.1.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "1038454804406b0b5f5f520358e78c1c2f71501e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/1038454804406b0b5f5f520358e78c1c2f71501e", - "reference": "1038454804406b0b5f5f520358e78c1c2f71501e", - "shasum": "" - }, - "require": { - "php": "^7.1" - }, - "require-dev": { - "phpunit/phpunit": "^7.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", - "keywords": [ - "timer" - ], - "time": "2019-06-07T04:22:29+00:00" - }, - { - "name": "phpunit/php-token-stream", - "version": "3.1.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/995192df77f63a59e47f025390d2d1fdf8f425ff", - "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": "^7.1" - }, - "require-dev": { - "phpunit/phpunit": "^7.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Wrapper around PHP's tokenizer extension.", - "homepage": "https://github.com/sebastianbergmann/php-token-stream/", - "keywords": [ - "tokenizer" - ], - "time": "2019-09-17T06:23:10+00:00" - }, - { - "name": "phpunit/phpunit", - "version": "7.5.20", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "9467db479d1b0487c99733bb1e7944d32deded2c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/9467db479d1b0487c99733bb1e7944d32deded2c", - "reference": "9467db479d1b0487c99733bb1e7944d32deded2c", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.1", - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-xml": "*", - "myclabs/deep-copy": "^1.7", - "phar-io/manifest": "^1.0.2", - "phar-io/version": "^2.0", - "php": "^7.1", - "phpspec/prophecy": "^1.7", - "phpunit/php-code-coverage": "^6.0.7", - "phpunit/php-file-iterator": "^2.0.1", - "phpunit/php-text-template": "^1.2.1", - "phpunit/php-timer": "^2.1", - "sebastian/comparator": "^3.0", - "sebastian/diff": "^3.0", - "sebastian/environment": "^4.0", - "sebastian/exporter": "^3.1", - "sebastian/global-state": "^2.0", - "sebastian/object-enumerator": "^3.0.3", - "sebastian/resource-operations": "^2.0", - "sebastian/version": "^2.0.1" - }, - "conflict": { - "phpunit/phpunit-mock-objects": "*" - }, - "require-dev": { - "ext-pdo": "*" - }, - "suggest": { - "ext-soap": "*", - "ext-xdebug": "*", - "phpunit/php-invoker": "^2.0" - }, - "bin": [ - "phpunit" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "7.5-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", - "keywords": [ - "phpunit", - "testing", - "xunit" - ], - "time": "2020-01-08T08:45:45+00:00" - }, - { - "name": "psr/container", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", - "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Container\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", - "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" - ], - "time": "2017-02-14T16:28:37+00:00" - }, - { - "name": "psr/log", - "version": "1.1.3", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Log\\": "Psr/Log/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "time": "2020-03-23T09:12:05+00:00" - }, - { - "name": "sebastian/code-unit-reverse-lookup", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", - "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.7 || ^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Looks up which function or method a line of code belongs to", - "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", - "time": "2017-03-04T06:30:41+00:00" - }, - { - "name": "sebastian/comparator", - "version": "3.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/5de4fc177adf9bce8df98d8d141a7559d7ccf6da", - "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da", - "shasum": "" - }, - "require": { - "php": "^7.1", - "sebastian/diff": "^3.0", - "sebastian/exporter": "^3.1" - }, - "require-dev": { - "phpunit/phpunit": "^7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides the functionality to compare PHP values for equality", - "homepage": "https://github.com/sebastianbergmann/comparator", - "keywords": [ - "comparator", - "compare", - "equality" - ], - "time": "2018-07-12T15:12:46+00:00" - }, - { - "name": "sebastian/diff", - "version": "3.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/720fcc7e9b5cf384ea68d9d930d480907a0c1a29", - "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29", - "shasum": "" - }, - "require": { - "php": "^7.1" - }, - "require-dev": { - "phpunit/phpunit": "^7.5 || ^8.0", - "symfony/process": "^2 || ^3.3 || ^4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Diff implementation", - "homepage": "https://github.com/sebastianbergmann/diff", - "keywords": [ - "diff", - "udiff", - "unidiff", - "unified diff" - ], - "time": "2019-02-04T06:01:07+00:00" - }, - { - "name": "sebastian/environment", - "version": "4.2.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/464c90d7bdf5ad4e8a6aea15c091fec0603d4368", - "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368", - "shasum": "" - }, - "require": { - "php": "^7.1" - }, - "require-dev": { - "phpunit/phpunit": "^7.5" - }, - "suggest": { - "ext-posix": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.2-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "http://www.github.com/sebastianbergmann/environment", - "keywords": [ - "Xdebug", - "environment", - "hhvm" - ], - "time": "2019-11-20T08:46:58+00:00" - }, - { - "name": "sebastian/exporter", - "version": "3.1.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/68609e1261d215ea5b21b7987539cbfbe156ec3e", - "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e", - "shasum": "" - }, - "require": { - "php": "^7.0", - "sebastian/recursion-context": "^3.0" - }, - "require-dev": { - "ext-mbstring": "*", - "phpunit/phpunit": "^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "http://www.github.com/sebastianbergmann/exporter", - "keywords": [ - "export", - "exporter" - ], - "time": "2019-09-14T09:02:43+00:00" - }, - { - "name": "sebastian/global-state", - "version": "2.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", - "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", - "shasum": "" - }, - "require": { - "php": "^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.0" - }, - "suggest": { - "ext-uopz": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Snapshotting of global state", - "homepage": "http://www.github.com/sebastianbergmann/global-state", - "keywords": [ - "global state" - ], - "time": "2017-04-27T15:39:26+00:00" - }, - { - "name": "sebastian/object-enumerator", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5", - "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5", - "shasum": "" - }, - "require": { - "php": "^7.0", - "sebastian/object-reflector": "^1.1.1", - "sebastian/recursion-context": "^3.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Traverses array structures and object graphs to enumerate all referenced objects", - "homepage": "https://github.com/sebastianbergmann/object-enumerator/", - "time": "2017-08-03T12:35:26+00:00" - }, - { - "name": "sebastian/object-reflector", - "version": "1.1.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "773f97c67f28de00d397be301821b06708fca0be" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be", - "reference": "773f97c67f28de00d397be301821b06708fca0be", - "shasum": "" - }, - "require": { - "php": "^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Allows reflection of object attributes, including inherited and non-public ones", - "homepage": "https://github.com/sebastianbergmann/object-reflector/", - "time": "2017-03-29T09:07:27+00:00" - }, - { - "name": "sebastian/recursion-context", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", - "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", - "shasum": "" - }, - "require": { - "php": "^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides functionality to recursively process PHP variables", - "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "time": "2017-03-03T06:23:57+00:00" - }, - { - "name": "sebastian/resource-operations", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/4d7a795d35b889bf80a0cc04e08d77cedfa917a9", - "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9", - "shasum": "" - }, - "require": { - "php": "^7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides a list of PHP built-in functions that operate on resources", - "homepage": "https://www.github.com/sebastianbergmann/resource-operations", - "time": "2018-10-04T04:07:39+00:00" - }, - { - "name": "sebastian/version", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", - "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", - "shasum": "" - }, - "require": { - "php": ">=5.6" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", - "time": "2016-10-03T07:35:21+00:00" - }, - { - "name": "seld/jsonlint", - "version": "1.7.2", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/jsonlint.git", - "reference": "e2e5d290e4d2a4f0eb449f510071392e00e10d19" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/e2e5d290e4d2a4f0eb449f510071392e00e10d19", - "reference": "e2e5d290e4d2a4f0eb449f510071392e00e10d19", - "shasum": "" - }, - "require": { - "php": "^5.3 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" - }, - "bin": [ - "bin/jsonlint" - ], - "type": "library", - "autoload": { - "psr-4": { - "Seld\\JsonLint\\": "src/Seld/JsonLint/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "JSON Linter", - "keywords": [ - "json", - "linter", - "parser", - "validator" - ], - "support": { - "issues": "https://github.com/Seldaek/jsonlint/issues", - "source": "https://github.com/Seldaek/jsonlint/tree/1.7.2" - }, - "time": "2019-10-24T14:27:39+00:00" - }, - { - "name": "seld/phar-utils", - "version": "1.1.0", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/phar-utils.git", - "reference": "8800503d56b9867d43d9c303b9cbcc26016e82f0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/8800503d56b9867d43d9c303b9cbcc26016e82f0", - "reference": "8800503d56b9867d43d9c303b9cbcc26016e82f0", - "shasum": "" - }, - "require": { - "php": ">=5.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Seld\\PharUtils\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be" - } - ], - "description": "PHAR file format utilities, for when PHP phars you up", - "keywords": [ - "phar" - ], - "support": { - "issues": "https://github.com/Seldaek/phar-utils/issues", - "source": "https://github.com/Seldaek/phar-utils/tree/1.1.0" - }, - "time": "2020-02-14T15:25:33+00:00" - }, - { - "name": "symfony/console", - "version": "v5.0.7", - "source": { - "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "5fa1caadc8cdaa17bcfb25219f3b53fe294a9935" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/5fa1caadc8cdaa17bcfb25219f3b53fe294a9935", - "reference": "5fa1caadc8cdaa17bcfb25219f3b53fe294a9935", - "shasum": "" - }, - "require": { - "php": "^7.2.5", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.8", - "symfony/service-contracts": "^1.1|^2" - }, - "conflict": { - "symfony/dependency-injection": "<4.4", - "symfony/event-dispatcher": "<4.4", - "symfony/lock": "<4.4", - "symfony/process": "<4.4" - }, - "provide": { - "psr/log-implementation": "1.0" - }, - "require-dev": { - "psr/log": "~1.0", - "symfony/config": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/event-dispatcher": "^4.4|^5.0", - "symfony/lock": "^4.4|^5.0", - "symfony/process": "^4.4|^5.0", - "symfony/var-dumper": "^4.4|^5.0" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Console\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Console Component", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/console/tree/v5.0.7" - }, - "time": "2020-03-30T11:42:42+00:00" - }, - { - "name": "symfony/filesystem", - "version": "v5.0.7", - "source": { - "type": "git", - "url": "https://github.com/symfony/filesystem.git", - "reference": "ca3b87dd09fff9b771731637f5379965fbfab420" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/ca3b87dd09fff9b771731637f5379965fbfab420", - "reference": "ca3b87dd09fff9b771731637f5379965fbfab420", - "shasum": "" - }, - "require": { - "php": "^7.2.5", - "symfony/polyfill-ctype": "~1.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Filesystem\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Filesystem Component", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.0.7" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-03-27T16:56:45+00:00" - }, - { - "name": "symfony/finder", - "version": "v5.0.7", - "source": { - "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "600a52c29afc0d1caa74acbec8d3095ca7e9910d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/600a52c29afc0d1caa74acbec8d3095ca7e9910d", - "reference": "600a52c29afc0d1caa74acbec8d3095ca7e9910d", - "shasum": "" - }, - "require": { - "php": "^7.2.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Finder\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Finder Component", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/finder/tree/5.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-03-27T16:56:45+00:00" - }, - { - "name": "symfony/polyfill-ctype", - "version": "v1.15.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "4719fa9c18b0464d399f1a63bf624b42b6fa8d14" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/4719fa9c18b0464d399f1a63bf624b42b6fa8d14", - "reference": "4719fa9c18b0464d399f1a63bf624b42b6fa8d14", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "suggest": { - "ext-ctype": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.15-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for ctype functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" - ], - "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.15.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-02-27T09:26:54+00:00" - }, - { - "name": "symfony/polyfill-mbstring", - "version": "v1.15.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "81ffd3a9c6d707be22e3012b827de1c9775fc5ac" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/81ffd3a9c6d707be22e3012b827de1c9775fc5ac", - "reference": "81ffd3a9c6d707be22e3012b827de1c9775fc5ac", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.15-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.15.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-03-09T19:04:49+00:00" - }, - { - "name": "symfony/polyfill-php73", - "version": "v1.15.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "0f27e9f464ea3da33cbe7ca3bdf4eb66def9d0f7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/0f27e9f464ea3da33cbe7ca3bdf4eb66def9d0f7", - "reference": "0f27e9f464ea3da33cbe7ca3bdf4eb66def9d0f7", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.15-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php73\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.15.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-02-27T09:26:54+00:00" - }, - { - "name": "symfony/process", - "version": "v5.0.7", - "source": { - "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "c5ca4a0fc16a0c888067d43fbcfe1f8a53d8e70e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/c5ca4a0fc16a0c888067d43fbcfe1f8a53d8e70e", - "reference": "c5ca4a0fc16a0c888067d43fbcfe1f8a53d8e70e", - "shasum": "" - }, - "require": { - "php": "^7.2.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Process\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Process Component", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/process/tree/v5.0.7" - }, - "time": "2020-03-27T16:56:45+00:00" - }, - { - "name": "symfony/service-contracts", - "version": "v2.0.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "144c5e51266b281231e947b51223ba14acf1a749" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/144c5e51266b281231e947b51223ba14acf1a749", - "reference": "144c5e51266b281231e947b51223ba14acf1a749", - "shasum": "" - }, - "require": { - "php": "^7.2.5", - "psr/container": "^1.0" - }, - "suggest": { - "symfony/service-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\Service\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to writing services", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.0.1" - }, - "time": "2019-11-18T17:27:11+00:00" - }, - { - "name": "theseer/tokenizer", - "version": "1.1.3", - "source": { - "type": "git", - "url": "https://github.com/theseer/tokenizer.git", - "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/11336f6f84e16a720dae9d8e6ed5019efa85a0f9", - "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": "^7.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - } - ], - "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", - "time": "2019-06-13T22:48:21+00:00" - }, - { - "name": "webmozart/assert", - "version": "1.8.0", - "source": { - "type": "git", - "url": "https://github.com/webmozart/assert.git", - "reference": "ab2cb0b3b559010b75981b1bdce728da3ee90ad6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozart/assert/zipball/ab2cb0b3b559010b75981b1bdce728da3ee90ad6", - "reference": "ab2cb0b3b559010b75981b1bdce728da3ee90ad6", - "shasum": "" - }, - "require": { - "php": "^5.3.3 || ^7.0", - "symfony/polyfill-ctype": "^1.8" - }, - "conflict": { - "vimeo/psalm": "<3.9.1" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.36 || ^7.5.13" - }, - "type": "library", - "autoload": { - "psr-4": { - "Webmozart\\Assert\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Assertions to validate method input/output with nice error messages.", - "keywords": [ - "assert", - "check", - "validate" - ], - "support": { - "issues": "https://github.com/webmozart/assert/issues", - "source": "https://github.com/webmozart/assert/tree/master" - }, - "time": "2020-04-18T12:12:48+00:00" - } - ], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": { - "composer/composer": 20 - }, - "prefer-stable": false, - "prefer-lowest": false, - "platform": { - "php": "^7", - "composer-plugin-api": "^1.1.0 || ^2.0" - }, - "platform-dev": { - "ext-zip": "^1.13" - }, - "plugin-api-version": "1.1.0" -} diff --git a/vendor/composer/package-versions-deprecated/src/PackageVersions/FallbackVersions.php b/vendor/composer/package-versions-deprecated/src/PackageVersions/FallbackVersions.php deleted file mode 100644 index 18e5fe64..00000000 --- a/vendor/composer/package-versions-deprecated/src/PackageVersions/FallbackVersions.php +++ /dev/null @@ -1,128 +0,0 @@ - - */ - private static function getVersions(array $packageData): Generator - { - foreach ($packageData as $package) { - yield $package['name'] => $package['version'] . '@' . ( - $package['source']['reference'] ?? $package['dist']['reference'] ?? '' - ); - } - - yield self::ROOT_PACKAGE_NAME => self::ROOT_PACKAGE_NAME; - } -} diff --git a/vendor/composer/package-versions-deprecated/src/PackageVersions/Installer.php b/vendor/composer/package-versions-deprecated/src/PackageVersions/Installer.php deleted file mode 100644 index 05bdac9a..00000000 --- a/vendor/composer/package-versions-deprecated/src/PackageVersions/Installer.php +++ /dev/null @@ -1,290 +0,0 @@ - - * @internal - */ - const VERSIONS = %s; - - private function __construct() - { - } - - /** - * @psalm-pure - * - * @psalm-suppress ImpureMethodCall we know that {@see InstalledVersions} interaction does not - * cause any side effects here. - */ - public static function rootPackageName() : string - { - if (!self::composer2ApiUsable()) { - return self::ROOT_PACKAGE_NAME; - } - - return InstalledVersions::getRootPackage()['name']; - } - - /** - * @throws OutOfBoundsException If a version cannot be located. - * - * @psalm-param key-of $packageName - * @psalm-pure - * - * @psalm-suppress ImpureMethodCall we know that {@see InstalledVersions} interaction does not - * cause any side effects here. - */ - public static function getVersion(string $packageName): string - { - if (self::composer2ApiUsable()) { - return InstalledVersions::getPrettyVersion($packageName) - . '@' . InstalledVersions::getReference($packageName); - } - - if (isset(self::VERSIONS[$packageName])) { - return self::VERSIONS[$packageName]; - } - - throw new OutOfBoundsException( - 'Required package "' . $packageName . '" is not installed: check your ./vendor/composer/installed.json and/or ./composer.lock files' - ); - } - - private static function composer2ApiUsable(): bool - { - if (!class_exists(InstalledVersions::class, false)) { - return false; - } - - if (method_exists(InstalledVersions::class, 'getAllRawData')) { - $rawData = InstalledVersions::getAllRawData(); - if (count($rawData) === 1 && count($rawData[0]) === 0) { - return false; - } - } else { - $rawData = InstalledVersions::getRawData(); - if ($rawData === null || $rawData === []) { - return false; - } - } - - return true; - } -} - -PHP; - - public function activate(Composer $composer, IOInterface $io) - { - // Nothing to do here, as all features are provided through event listeners - } - - public function deactivate(Composer $composer, IOInterface $io) - { - // Nothing to do here, as all features are provided through event listeners - } - - public function uninstall(Composer $composer, IOInterface $io) - { - // Nothing to do here, as all features are provided through event listeners - } - - /** - * {@inheritDoc} - */ - public static function getSubscribedEvents(): array - { - return [ScriptEvents::POST_AUTOLOAD_DUMP => 'dumpVersionsClass']; - } - - /** - * @throws RuntimeException - */ - public static function dumpVersionsClass(Event $composerEvent) - { - $composer = $composerEvent->getComposer(); - $rootPackage = $composer->getPackage(); - $versions = iterator_to_array(self::getVersions($composer->getLocker(), $rootPackage)); - - if (! array_key_exists('composer/package-versions-deprecated', $versions)) { - //plugin must be globally installed - we only want to generate versions for projects which specifically - //require composer/package-versions-deprecated - return; - } - - $versionClass = self::generateVersionsClass($rootPackage->getName(), $versions); - - self::writeVersionClassToFile($versionClass, $composer, $composerEvent->getIO()); - } - - /** - * @param string[] $versions - */ - private static function generateVersionsClass(string $rootPackageName, array $versions): string - { - return sprintf( - self::$generatedClassTemplate, - 'fin' . 'al ' . 'cla' . 'ss ' . 'Versions', // note: workaround for regex-based code parsers :-( - $rootPackageName, - var_export($versions, true) - ); - } - - /** - * @throws RuntimeException - */ - private static function writeVersionClassToFile(string $versionClassSource, Composer $composer, IOInterface $io) - { - $installPath = self::locateRootPackageInstallPath($composer->getConfig(), $composer->getPackage()) - . '/src/PackageVersions/Versions.php'; - - $installDir = dirname($installPath); - if (! file_exists($installDir)) { - $io->write('composer/package-versions-deprecated: Package not found (probably scheduled for removal); generation of version class skipped.'); - - return; - } - - if (! is_writable($installDir)) { - $io->write( - sprintf( - 'composer/package-versions-deprecated: %s is not writable; generation of version class skipped.', - $installDir - ) - ); - - return; - } - - $io->write('composer/package-versions-deprecated: Generating version class...'); - - $installPathTmp = $installPath . '_' . uniqid('tmp', true); - file_put_contents($installPathTmp, $versionClassSource); - chmod($installPathTmp, 0664); - rename($installPathTmp, $installPath); - - $io->write('composer/package-versions-deprecated: ...done generating version class'); - } - - /** - * @throws RuntimeException - */ - private static function locateRootPackageInstallPath( - Config $composerConfig, - RootPackageInterface $rootPackage - ): string { - if (self::getRootPackageAlias($rootPackage)->getName() === 'composer/package-versions-deprecated') { - return dirname($composerConfig->get('vendor-dir')); - } - - return $composerConfig->get('vendor-dir') . '/composer/package-versions-deprecated'; - } - - private static function getRootPackageAlias(RootPackageInterface $rootPackage): PackageInterface - { - $package = $rootPackage; - - while ($package instanceof AliasPackage) { - $package = $package->getAliasOf(); - } - - return $package; - } - - /** - * @return Generator&string[] - * - * @psalm-return Generator - */ - private static function getVersions(Locker $locker, RootPackageInterface $rootPackage): Generator - { - $lockData = $locker->getLockData(); - - $lockData['packages-dev'] = $lockData['packages-dev'] ?? []; - - $packages = $lockData['packages']; - if (getenv('COMPOSER_DEV_MODE') !== '0') { - $packages = array_merge($packages, $lockData['packages-dev']); - } - foreach ($packages as $package) { - yield $package['name'] => $package['version'] . '@' . ( - $package['source']['reference'] ?? $package['dist']['reference'] ?? '' - ); - } - - foreach ($rootPackage->getReplaces() as $replace) { - $version = $replace->getPrettyConstraint(); - if ($version === 'self.version') { - $version = $rootPackage->getPrettyVersion(); - } - - yield $replace->getTarget() => $version . '@' . $rootPackage->getSourceReference(); - } - - yield $rootPackage->getName() => $rootPackage->getPrettyVersion() . '@' . $rootPackage->getSourceReference(); - } -} diff --git a/vendor/composer/package-versions-deprecated/src/PackageVersions/Versions.php b/vendor/composer/package-versions-deprecated/src/PackageVersions/Versions.php deleted file mode 100644 index c1f45b5d..00000000 --- a/vendor/composer/package-versions-deprecated/src/PackageVersions/Versions.php +++ /dev/null @@ -1,94 +0,0 @@ - $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..1029372f --- /dev/null +++ b/vendor/doctrine/deprecations/lib/Doctrine/Deprecations/Deprecation.php @@ -0,0 +1,266 @@ + */ + 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 + { + if (self::$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 + { + if (self::$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 + { + if ((self::$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 (! ((self::$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; + } +} 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/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..c22eff07 --- /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 Float_(); + } + + 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..080e25ee --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/README.md @@ -0,0 +1,30 @@ +

PHPDoc-Parser for PHPStan

+ +

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

+ +* [PHPStan](https://phpstan.org) + +------ + +Next generation phpDoc parser with support for intersection types and generics. + +## 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..3b902ae2 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/composer.json @@ -0,0 +1,42 @@ +{ + "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": { + "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/src/Ast/ConstExpr/ConstExprArrayItemNode.php b/vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprArrayItemNode.php new file mode 100644 index 00000000..ef144521 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprArrayItemNode.php @@ -0,0 +1,36 @@ +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/Node.php b/vendor/phpstan/phpdoc-parser/src/Ast/Node.php new file mode 100644 index 00000000..51a1a19a --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/Node.php @@ -0,0 +1,22 @@ + */ + 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/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..17bf04f2 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/InvalidTagValueNode.php @@ -0,0 +1,52 @@ +value = $value; + $this->exceptionArgs = [ + $exception->getCurrentTokenValue(), + $exception->getCurrentTokenType(), + $exception->getCurrentOffset(), + $exception->getExpectedTokenType(), + $exception->getExpectedTokenValue(), + ]; + } + + public function __get(string $name) + { + 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..075cec04 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueNode.php @@ -0,0 +1,54 @@ +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..41941f80 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeNode.php @@ -0,0 +1,47 @@ +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..90cb9f08 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayTypeNode.php @@ -0,0 +1,26 @@ +type = $type; + } + + + public function __toString(): string + { + 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..83ade94c --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeNode.php @@ -0,0 +1,36 @@ +identifier = $identifier; + $this->parameters = $parameters; + $this->returnType = $returnType; + } + + + public function __toString(): string + { + $parameters = implode(', ', $this->parameters); + return "{$this->identifier}({$parameters}): {$this->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..7ab2d7e3 --- /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 ? '...' : ''; + $default = $this->isOptional ? ' = default' : ''; + return trim("{$type}{$isReference}{$isVariadic}{$this->parameterName}") . $default; + } + +} 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..179de55a --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/Type/GenericTypeNode.php @@ -0,0 +1,54 @@ +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..7f9aff33 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/Type/IntersectionTypeNode.php @@ -0,0 +1,27 @@ +types = $types; + } + + + public function __toString(): string + { + return '(' . implode(' & ', $this->types) . ')'; + } + +} 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/OffsetAccessTypeNode.php b/vendor/phpstan/phpdoc-parser/src/Ast/Type/OffsetAccessTypeNode.php new file mode 100644 index 00000000..1d5b04ef --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Ast/Type/OffsetAccessTypeNode.php @@ -0,0 +1,29 @@ +type = $type; + $this->offset = $offset; + } + + public function __toString(): string + { + 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(' | ', $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..1b98839d --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Lexer/Lexer.php @@ -0,0 +1,170 @@ + '\'&\'', + 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; + + /** @var string|null */ + private $regexp; + + 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 = []; + foreach ($matches as $match) { + $tokens[] = [$match[0], (int) $match['MARK']]; + } + + $tokens[] = ['', self::TOKEN_END]; + + 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]*+(?:e-?[0-9]++)?)|(?:-?[0-9]*+\\.[0-9]++(?:e-?[0-9]++)?)|(?:-?[0-9]++e-?[0-9]++)', + self::TOKEN_INTEGER => '-?(?:(?:0b[0-1]++)|(?:0o[0-7]++)|(?:0x[0-9a-f]++)|(?:[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..d7876303 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Parser/ConstExprParser.php @@ -0,0 +1,230 @@ + '\\', + 'n' => "\n", + 'r' => "\r", + 't' => "\t", + 'f' => "\f", + 'v' => "\v", + 'e' => "\x1B", + ]; + + /** @var bool */ + private $unescapeStrings; + + public function __construct(bool $unescapeStrings = false) + { + $this->unescapeStrings = $unescapeStrings; + } + + public function parse(TokenIterator $tokens, bool $trimStrings = false): Ast\ConstExpr\ConstExprNode + { + if ($tokens->isCurrentTokenType(Lexer::TOKEN_FLOAT)) { + $value = $tokens->currentTokenValue(); + $tokens->next(); + return new Ast\ConstExpr\ConstExprFloatNode($value); + } + + if ($tokens->isCurrentTokenType(Lexer::TOKEN_INTEGER)) { + $value = $tokens->currentTokenValue(); + $tokens->next(); + return new Ast\ConstExpr\ConstExprIntegerNode($value); + } + + if ($tokens->isCurrentTokenType(Lexer::TOKEN_SINGLE_QUOTED_STRING, Lexer::TOKEN_DOUBLE_QUOTED_STRING)) { + $value = $tokens->currentTokenValue(); + if ($trimStrings) { + if ($this->unescapeStrings) { + $value = self::unescapeString($value); + } else { + $value = substr($value, 1, -1); + } + } + $tokens->next(); + return new Ast\ConstExpr\ConstExprStringNode($value); + + } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_IDENTIFIER)) { + $identifier = $tokens->currentTokenValue(); + $tokens->next(); + + switch (strtolower($identifier)) { + case 'true': + return new Ast\ConstExpr\ConstExprTrueNode(); + case 'false': + return new Ast\ConstExpr\ConstExprFalseNode(); + case 'null': + return new Ast\ConstExpr\ConstExprNullNode(); + case 'array': + $tokens->consumeTokenType(Lexer::TOKEN_OPEN_PARENTHESES); + return $this->parseArray($tokens, Lexer::TOKEN_CLOSE_PARENTHESES); + } + + 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 new Ast\ConstExpr\ConstFetchNode($identifier, $classConstantName); + + } + + return new Ast\ConstExpr\ConstFetchNode('', $identifier); + + } elseif ($tokens->tryConsumeTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { + return $this->parseArray($tokens, Lexer::TOKEN_CLOSE_SQUARE_BRACKET); + } + + throw new ParserException( + $tokens->currentTokenValue(), + $tokens->currentTokenType(), + $tokens->currentTokenOffset(), + Lexer::TOKEN_IDENTIFIER + ); + } + + + private function parseArray(TokenIterator $tokens, int $endToken): Ast\ConstExpr\ConstExprArrayNode + { + $items = []; + + if (!$tokens->tryConsumeTokenType($endToken)) { + do { + $items[] = $this->parseArrayItem($tokens); + } while ($tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA) && !$tokens->isCurrentTokenType($endToken)); + $tokens->consumeTokenType($endToken); + } + + return new Ast\ConstExpr\ConstExprArrayNode($items); + } + + + private function parseArrayItem(TokenIterator $tokens): Ast\ConstExpr\ConstExprArrayItemNode + { + $expr = $this->parse($tokens); + + if ($tokens->tryConsumeTokenType(Lexer::TOKEN_DOUBLE_ARROW)) { + $key = $expr; + $value = $this->parse($tokens); + + } else { + $key = null; + $value = $expr; + } + + return new Ast\ConstExpr\ConstExprArrayItemNode($key, $value); + } + + private 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(hexdec(substr($str, 1))); + } + if ($str[0] === 'u') { + return self::codePointToUtf8(hexdec($matches[2])); + } + + return chr(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/ParserException.php b/vendor/phpstan/phpdoc-parser/src/Parser/ParserException.php new file mode 100644 index 00000000..badcdcbb --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Parser/ParserException.php @@ -0,0 +1,93 @@ +currentTokenValue = $currentTokenValue; + $this->currentTokenType = $currentTokenType; + $this->currentOffset = $currentOffset; + $this->expectedTokenType = $expectedTokenType; + $this->expectedTokenValue = $expectedTokenValue; + + parent::__construct(sprintf( + 'Unexpected token %s, expected %s%s at offset %d', + $this->formatValue($currentTokenValue), + Lexer::TOKEN_LABELS[$expectedTokenType], + $expectedTokenValue !== null ? sprintf(' (%s)', $this->formatValue($expectedTokenValue)) : '', + $currentOffset + )); + } + + + 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; + } + + + private function formatValue(string $value): string + { + $json = json_encode($value, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); + 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..d9942b3d --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Parser/PhpDocParser.php @@ -0,0 +1,598 @@ +typeParser = $typeParser; + $this->constantExprParser = $constantExprParser; + $this->requireWhitespaceBeforeDescription = $requireWhitespaceBeforeDescription; + } + + + 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 = ''; + if (count($children) > 0) { + $lastChild = $children[count($children) - 1]; + if ($lastChild instanceof Ast\PhpDoc\PhpDocTagNode) { + $name = $lastChild->name; + } + } + $tokens->forwardToTheEnd(); + return new Ast\PhpDoc\PhpDocNode([ + new Ast\PhpDoc\PhpDocTagNode($name, new Ast\PhpDoc\InvalidTagValueNode($e->getMessage(), $e)), + ]); + } + + return new Ast\PhpDoc\PhpDocNode(array_values($children)); + } + + + private function parseChild(TokenIterator $tokens): Ast\PhpDoc\PhpDocChildNode + { + if ($tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_TAG)) { + return $this->parseTag($tokens); + + } + + return $this->parseText($tokens); + } + + + 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 + { + 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 $tagValue; + } + + + /** + * @return Ast\PhpDoc\ParamTagValueNode|Ast\PhpDoc\TypelessParamTagValueNode + */ + private function parseParamTagValue(TokenIterator $tokens): Ast\PhpDoc\PhpDocTagValueNode + { + if ( + $tokens->isCurrentTokenType(Lexer::TOKEN_REFERENCE) + || $tokens->isCurrentTokenType(Lexer::TOKEN_VARIADIC) + || $tokens->isCurrentTokenType(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'); + $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 ? new Ast\Type\IdentifierTypeNode('static') : 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 { + $templateTypes[] = $this->parseTemplateTagValue($tokens, false); + } 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 + { + 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 new Ast\PhpDoc\MethodTagValueParameterNode($parameterType, $isReference, $isVariadic, $parameterName, $defaultValue); + } + + 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 + { + $baseType = new IdentifierTypeNode($tokens->currentTokenValue()); + $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); + + $type = $this->typeParser->parseGeneric($tokens, $baseType); + + $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); + + $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'); + + $importedFrom = $tokens->currentTokenValue(); + $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); + + $importedAs = null; + if ($tokens->tryConsumeTokenValue('as')) { + $importedAs = $tokens->currentTokenValue(); + $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); + } + + return new Ast\PhpDoc\TypeAliasImportTagValueNode($importedAlias, new IdentifierTypeNode($importedFrom), $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/TokenIterator.php b/vendor/phpstan/phpdoc-parser/src/Parser/TokenIterator.php new file mode 100644 index 00000000..569a9321 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Parser/TokenIterator.php @@ -0,0 +1,224 @@ +tokens = $tokens; + $this->index = $index; + + if ($this->tokens[$this->index][Lexer::TYPE_OFFSET] !== Lexer::TOKEN_HORIZONTAL_WS) { + return; + } + + $this->index++; + } + + + 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 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 + ); + } + +} 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..d196eb94 --- /dev/null +++ b/vendor/phpstan/phpdoc-parser/src/Parser/TypeParser.php @@ -0,0 +1,585 @@ +constExprParser = $constExprParser; + } + + /** @phpstan-impure */ + public function parse(TokenIterator $tokens): Ast\Type\TypeNode + { + 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 $type; + } + + /** @phpstan-impure */ + private function subParse(TokenIterator $tokens): Ast\Type\TypeNode + { + 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 $type; + } + + + /** @phpstan-impure */ + private function parseAtomic(TokenIterator $tokens): Ast\Type\TypeNode + { + 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)) { + return $this->tryParseArrayOrOffsetAccess($tokens, $type); + } + + return $type; + } + + if ($tokens->tryConsumeTokenType(Lexer::TOKEN_THIS_VARIABLE)) { + $type = new Ast\Type\ThisTypeNode(); + + if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { + return $this->tryParseArrayOrOffsetAccess($tokens, $type); + } + + return $type; + } + + $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)) { + $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'], true) && $tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET) && !$tokens->isPrecededByHorizontalWhitespace()) { + $type = $this->parseArrayShape($tokens, $type, $type->name); + + if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { + $type = $this->tryParseArrayOrOffsetAccess($tokens, $type); + } + } + + 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 + ); + + if ($this->constExprParser === null) { + throw $exception; + } + + try { + $constExpr = $this->constExprParser->parse($tokens, true); + if ($constExpr instanceof Ast\ConstExpr\ConstExprArrayNode) { + throw $exception; + } + + return new Ast\Type\ConstTypeNode($constExpr); + } 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 + return new Ast\Type\GenericTypeNode($baseType, $genericTypes, $variances); + } + [$genericTypes[], $variances[]] = $this->parseGenericTypeArgument($tokens); + $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + } + + $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_ANGLE_BRACKET); + + return new Ast\Type\GenericTypeNode($baseType, $genericTypes, $variances); + } + + + /** + * @phpstan-impure + * @return array{Ast\Type\TypeNode, Ast\Type\GenericTypeNode::VARIANCE_*} + */ + public function parseGenericTypeArgument(TokenIterator $tokens): array + { + if ($tokens->tryConsumeTokenType(Lexer::TOKEN_WILDCARD)) { + return [ + new Ast\Type\IdentifierTypeNode('mixed'), + 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); + $returnType = $this->parseCallableReturnType($tokens); + + return new Ast\Type\CallableTypeNode($identifier, $parameters, $returnType); + } + + + /** @phpstan-impure */ + private function parseCallableParameter(TokenIterator $tokens): Ast\Type\CallableTypeParameterNode + { + $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 new Ast\Type\CallableTypeParameterNode($type, $isReference, $isVariadic, $parameterName, $isOptional); + } + + + /** @phpstan-impure */ + private function parseCallableReturnType(TokenIterator $tokens): Ast\Type\TypeNode + { + if ($tokens->isCurrentTokenType(Lexer::TOKEN_NULLABLE)) { + $type = $this->parseNullable($tokens); + + } elseif ($tokens->tryConsumeTokenType(Lexer::TOKEN_OPEN_PARENTHESES)) { + $type = $this->parse($tokens); + $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_PARENTHESES); + + } else { + $type = new Ast\Type\IdentifierTypeNode($tokens->currentTokenValue()); + $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); + + if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_ANGLE_BRACKET)) { + $type = $this->parseGeneric($tokens, $type); + + } elseif (in_array($type->name, ['array', 'list'], true) && $tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET) && !$tokens->isPrecededByHorizontalWhitespace()) { + $type = $this->parseArrayShape($tokens, $type, $type->name); + } + } + + if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { + $type = $this->tryParseArrayOrOffsetAccess($tokens, $type); + } + + return $type; + } + + + /** @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 + { + 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); + } else { + $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_SQUARE_BRACKET); + $tokens->dropSavePoint(); + $type = new Ast\Type\ArrayTypeNode($type); + } + } + + } 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 + { + 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 new Ast\Type\ArrayShapeItemNode($key, $optional, $value); + } catch (ParserException $e) { + $tokens->rollback(); + $value = $this->parse($tokens); + + return new Ast\Type\ArrayShapeItemNode(null, false, $value); + } + } + + /** + * @phpstan-impure + * @return Ast\ConstExpr\ConstExprIntegerNode|Ast\ConstExpr\ConstExprStringNode|Ast\Type\IdentifierTypeNode + */ + private function parseArrayShapeKey(TokenIterator $tokens) + { + if ($tokens->isCurrentTokenType(Lexer::TOKEN_INTEGER)) { + $key = new Ast\ConstExpr\ConstExprIntegerNode($tokens->currentTokenValue()); + $tokens->next(); + + } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_SINGLE_QUOTED_STRING)) { + $key = new Ast\ConstExpr\ConstExprStringNode(trim($tokens->currentTokenValue(), "'")); + $tokens->next(); + + } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_DOUBLE_QUOTED_STRING)) { + $key = new Ast\ConstExpr\ConstExprStringNode(trim($tokens->currentTokenValue(), '"')); + $tokens->next(); + + } else { + $key = new Ast\Type\IdentifierTypeNode($tokens->currentTokenValue()); + $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); + } + + return $key; + } + +} diff --git a/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/AccessDeprecatedStaticPropertyRule.php b/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/AccessDeprecatedStaticPropertyRule.php index db128cc5..beb9891f 100644 --- a/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/AccessDeprecatedStaticPropertyRule.php +++ b/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/AccessDeprecatedStaticPropertyRule.php @@ -53,7 +53,7 @@ class AccessDeprecatedStaticPropertyRule implements Rule $referencedClasses = []; if ($node->class instanceof Name) { - $referencedClasses[] = (string) $node->class; + $referencedClasses[] = $scope->resolveName($node->class); } else { $classTypeResult = $this->ruleLevelHelper->findTypeToCheck( $scope, @@ -87,14 +87,14 @@ class AccessDeprecatedStaticPropertyRule implements Rule return [sprintf( 'Access to deprecated static property $%s of class %s.', $propertyName, - $referencedClass + $property->getDeclaringClass()->getName() )]; } return [sprintf( "Access to deprecated static property $%s of class %s:\n%s", $propertyName, - $referencedClass, + $property->getDeclaringClass()->getName(), $description )]; } 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 f96912fbaa69857537033039ca02e1711774e602..947d5ab020763ed0cc67902dcde0f7016a29a2a4 100755 GIT binary patch delta 323643 zcmZ5p1zc83(+7of2!TU)w@3+!iG+nHq1XW`wuIdZ#Q#&X>_Jyu6JyhqJIxlYGl zt~0Te>tL&;&{!sJj|9xF*$jvMR)Uq({3Yv3c;3Qdq1+XISqoZnHYm*OuEN8OQSYbNU5*w-apTHkN3`(vw36!U`L~OD@sIHe*&TssV7|C1;RMk9`}C zK%AZ6Ah*%QHv8f>g@Ua!r+f|RD86mbgDLickKCreprX=qPPjHWItadUNfOf0TGqWB z%A5tKrlfUGO>DE6YGGcM9$}2u)=7*K`yD<*IV5(tpv~0UkLCtr#0v^7C6(OKNP9vFx;$ zs;TrI%ZO>hKj#xVz!E2+jokVz4%RYYiU1l;g12091xx-6Tlo$aISRhU)JqF{tv=kv zQmGVA(039{V6T&)3&~D`BzIekjo$sd_!+u6a%(piRaBx27p;T{dv05GbkcK=emg^) z18xk8JT-4%xc}A6fcOy9HmV5jq@k zN4VmRwhc7i!--ZR(W!aeheOJ4u2NqldVgS48_+ivjiJn3w2&#Eq|w8htcEBH(G*@M z6zWO-YK$u3@e6-$!BH!b#h_(K<45r9t<=W*{n6iUJF#LqL`|#2-PN1CMQUEazL+7q%Jn;>tpwu zSM~v4w57)I*;@3InRl}hTgqd_W8?c58kK;r4eDi4y=rqwms2Ke+HYn~BsnU>=ksHzy;X&vA%R$>hY%cfMg7zCdvta^hzyt~` zMSaNEs8*8>@E(L47o?&ZOmXN1iG>Ez0d5w;w0(CSpuQC!em3f(|E36cm~JVu`I(E| z2N^ldg|7x;Q+dE%*lT1|?rb8+0;Pmvm>U&0B~2T{K@?GLC}8o&vlEXn7wl)nU9bsK zGJ;cv~{pgQT9n&u)`{eI4pNZ%~T&PE#T;`b(!=dlo@Va!Fa z#8Jm(1n*$R>1>7?v@sKPWR6^MO?>}0eE_&xi~e#+EUt)eUOX;ftvyV+DX$@sPG$)J zd#%NmW~6vGEa|skFeqKv4dV_Rx>M#RMIbNKf^fXUj9zflShRp-6F!kBs&2n>wKo;F zkjH$D4d?Ioua(ucYErenco5ql3Akn=x`4Nd$RbH5mX_Z!Jpc<(HaWBzqki%pzI{^1 z1kEFxO<(*}HH~Q9)aR@ae*WCECuyF=sZ?aQCTLF{+-@SYmbsw$rh4q(%`h`SFogjD zf{|Rj4ZFI(Iu#7o&G^Fj6bIElAFv+QHsyu7_-Yp{+c<)SC!)uzhl&iMW>W3V{JwvPwDpI-DqvUr)7zS^h}K z(oe9GxjIiuoN{Ul(f5&6F&0ZKd<$Nbh1y|QqA@)|1MV~y%wd23LM^E~CQT$J;o)r&06iM>)S(+PlxJ`v z66X4F8^+)e&3;Ya2xEQuy15e_;z*6hXd=iG%^#?)AOlA;*ze01w@^$kY8Q=ngvH+6 z&hxR&wV5|E!K5)~H4Jl(-fQOVV2tS?V^HZWsLAR~z|f?j`N@B^57(3lO0mb{O%|N< z;c~q~HryKwJpkUm0$Y!^;}BtKJ&(W>FRnJqE%#@|o`V&Qd9QcaYyI04%!z%uOHM

sz7aR@!~o&RF&F7IbAUpP+8O-Cp+(^zAITYLiAA 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

J_4CW|AAbY(( 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 z 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�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

f%5Boc_gC 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�jfjjj%&oCr{=b3EuV-`H&0{C%{V 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 diff --git a/vendor/phpstan/phpstan/phpstan.phar.asc b/vendor/phpstan/phpstan/phpstan.phar.asc index 89f0c673..7d0dcea9 100644 --- a/vendor/phpstan/phpstan/phpstan.phar.asc +++ b/vendor/phpstan/phpstan/phpstan.phar.asc @@ -1,16 +1,16 @@ -----BEGIN PGP SIGNATURE----- -iQIzBAABCgAdFiEE0yaA1ZV9xxFr4pwUzxoQjQ565yAFAmQHatYACgkQzxoQjQ56 -5yAU7A/8CLVE46kub8QEP/s8/w9T4uOyG1vsFwv9dafa4PySyvhZCr/vliCuYyF9 -JUUSXqyGIFi+VKsuY8y7u5zaVqpq6O6qJBkzsUK/X9BHZfFEo1k2v/NNJD7t3p0b -or5u9bOTlSJnXV+1hPNjkW4wcnxR6kuJQIoz9XwNsQC07mPVxNrHknxnkgGFVDNR -ITjpW3rBW3vRtoOWajPJMXZt6f+pJCl8ccISK97gskAzK75t2Ymle9fV9FdQYGWt -8X/gfQtVfJOkEmHV6F+pUE9o++aNCPljNo1O+1eS62TTOSRlS6fNhppu/o7Z4IIi -9QS3DHhDTGQPLUCXbMToK/kwRCAzDe9lFgjpKIUQhmEGKOjTNup2NPqWGtQNQj7h -WTP6W2GNpGh5g+d7Tm667FKej/AgixwvpdJqR1VGk2PI2EYMryMz17nQ1cvGinOW -X3auWZe/HWuyqFtt5r85ffZGVS/4xKxeAK85HPrn3mzotiXr/KZf8S525BuGqUaZ -lQ7paCM6kZ9rn9vMmLEe57Ypl7bMzfUV6c2k5KYYR2EV9LXzNPS9G7Yhpg/Q3G2S -cTqxKuBk+hvXd3rp4OwzrjAUps8w4XzyHBpDl9k1n2oB+1Plygrkew8Z5CRglTL4 -lSQAD2FLSTEAvPcFi3kkiBxxeoXSSnjP2iruPsAkcfzsENBFTdM= -=4/CB +iQIzBAABCgAdFiEEynwsejDI6OEnSoR2UcZzBf/C5cAFAmQdeygACgkQUcZzBf/C +5cAe5Q//YDKPvVm4HlLT90M/Ov0IJ8brPP6LN0fbMV93TJlXFhh6Ph79YUwxRWve +FPYr93HDCSOdlg3q3xRNgPcUim5+7U5xf5ze5RWIBR07IDY5+i9Os66CLRALlO4u +ToXHCO2k0hw26sSskRXmF2IrNIibvPjVjR+ephFGFenWI0S7vq5cYGqOnzwdURyu +ZNIswHWQsJSGLn4AXfDnushBCy3w5IsSgnENIWD7L9a37A45kek+iHETcX1OLTOd +AlJOvQ0l2OAE4kMx8tailGYtJo9yLnjtSLw6xQbdw5mf47iapm1U09C52XvYsZg4 +oZNCJ8QFHR1YbbLpdMxPFcMQgbVLGKBwHYcpsi2VdMKdR+7altlF9govkvBLxxm7 +Polq9ya0fS7wAJP0vMESGeP6UJi68DMWH7hxJ7d9tyBieYJHSpm5q5QSYjj4RxM5 +LiTTv9ug8DFIsLJiw1CplE4pxtJ82arXBqggpqO15MRNxwzyJmY7XIHtEZI2dl+d +BImd5bWl6nCkhKEYPs+6SEt/caXIz/XERap5gO9Q8UBx5jaKPHEKRbuvTgbW1Ods +fFNDgIsQyg+56LzIxgp2a6IUVeeQSrL4kjeHYQDBMzG0P78ZXjXdUl3kYG3TJHmb +QNWgYcz3jJJd/F5YSMPpAPT/gpcD4FBnHZ+mlLnGvXvuuGh+MyU= +=vW1l -----END PGP SIGNATURE----- diff --git a/vendor/sebastian/diff/ChangeLog.md b/vendor/sebastian/diff/ChangeLog.md index 7db073c7..ab8640c8 100644 --- a/vendor/sebastian/diff/ChangeLog.md +++ b/vendor/sebastian/diff/ChangeLog.md @@ -2,7 +2,13 @@ All notable changes are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. -## [5.0.0] - 2022-02-03 +## [5.0.1] - 2023-03-23 + +### Fixed + +* [#115](https://github.com/sebastianbergmann/diff/pull/115): `Parser::parseFileDiff()` does not handle diffs correctly that only add lines or only remove lines + +## [5.0.0] - 2023-02-03 ### Changed @@ -86,6 +92,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 +[5.0.1]: https://github.com/sebastianbergmann/diff/compare/5.0.0...5.0.1 [5.0.0]: https://github.com/sebastianbergmann/diff/compare/4.0.4...5.0.0 [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 diff --git a/vendor/sebastian/diff/SECURITY.md b/vendor/sebastian/diff/SECURITY.md index d4ee967b..778f018b 100644 --- a/vendor/sebastian/diff/SECURITY.md +++ b/vendor/sebastian/diff/SECURITY.md @@ -1,9 +1,30 @@ # Security Policy -This library is intended to be used in development environments only. For instance, it is used by the testing framework PHPUnit. There is no reason why this library should be installed on a webserver. +If you believe you have found a security vulnerability in the library that is developed in this repository, please report it to us through coordinated disclosure. -**If you upload this library to a webserver then your deployment process is broken. On a more general note, if your `vendor` directory is publicly accessible on your webserver then your deployment process is also broken.** +**Please do not report security vulnerabilities through public GitHub issues, discussions, or pull requests.** -## Security Contact Information +Instead, please send an email to `sebastian@phpunit.de`. + +Please include as much of the information listed below as you can to help us better understand and resolve the issue: + +* The type of issue +* Full paths of source file(s) related to the manifestation of the issue +* The location of the affected source code (tag/branch/commit or direct URL) +* Any special configuration required to reproduce the issue +* Step-by-step instructions to reproduce the issue +* Proof-of-concept or exploit code (if possible) +* Impact of the issue, including how an attacker might exploit the issue + +This information will help us triage your report more quickly. + +## Web Context + +The library that is developed in this repository was either extracted from [PHPUnit](https://github.com/sebastianbergmann/phpunit) or developed specifically as a dependency for PHPUnit. + +The library is developed with a focus on development environments and the command-line. No specific testing or hardening with regard to using the library in a HTTP or web context or with untrusted input data is performed. The library might also contain functionality that intentionally exposes internal application data for debugging purposes. + +If the library is used in a web application, the application developer is responsible for filtering inputs or escaping outputs as necessary and for verifying that the used functionality is safe for use within the intended context. + +Vulnerabilities specific to the use outside of a development context will be fixed as applicable, provided that the fix does not have an averse effect on the primary use case for development purposes. -After the above, if you still would like to report a security vulnerability, please email `sebastian@phpunit.de`. diff --git a/vendor/sebastian/diff/composer.json b/vendor/sebastian/diff/composer.json index b8e778b5..cd37ef6b 100644 --- a/vendor/sebastian/diff/composer.json +++ b/vendor/sebastian/diff/composer.json @@ -14,6 +14,10 @@ "email": "mail@kore-nordmann.de" } ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "security": "https://github.com/sebastianbergmann/diff/security/policy" + }, "prefer-stable": true, "config": { "platform": { diff --git a/vendor/sebastian/diff/src/Parser.php b/vendor/sebastian/diff/src/Parser.php index b0ec6403..698b815c 100644 --- a/vendor/sebastian/diff/src/Parser.php +++ b/vendor/sebastian/diff/src/Parser.php @@ -74,12 +74,12 @@ final class Parser $diffLines = []; foreach ($lines as $line) { - if (preg_match('/^@@\s+-(?P\d+)(?:,\s*(?P\d+))?\s+\+(?P\d+)(?:,\s*(?P\d+))?\s+@@/', $line, $match)) { + if (preg_match('/^@@\s+-(?P\d+)(?:,\s*(?P\d+))?\s+\+(?P\d+)(?:,\s*(?P\d+))?\s+@@/', $line, $match, PREG_UNMATCHED_AS_NULL)) { $chunk = new Chunk( (int) $match['start'], - isset($match['startrange']) ? max(1, (int) $match['startrange']) : 1, + isset($match['startrange']) ? max(0, (int) $match['startrange']) : 1, (int) $match['end'], - isset($match['endrange']) ? max(1, (int) $match['endrange']) : 1 + isset($match['endrange']) ? max(0, (int) $match['endrange']) : 1 ); $chunks[] = $chunk; diff --git a/vendor/vimeo/psalm/composer.json b/vendor/vimeo/psalm/composer.json index d62c80c2..ed857f9a 100644 --- a/vendor/vimeo/psalm/composer.json +++ b/vendor/vimeo/psalm/composer.json @@ -25,7 +25,7 @@ "ext-tokenizer": "*", "amphp/amp": "^2.4.2", "amphp/byte-stream": "^1.5", - "composer/package-versions-deprecated": "^1.10.0", + "composer-runtime-api": "^2", "composer/semver": "^1.4 || ^2.0 || ^3.0", "composer/xdebug-handler": "^2.0 || ^3.0", "dnoegel/php-xdg-base-dir": "^0.1.1", @@ -33,7 +33,7 @@ "felixfbecker/language-server-protocol": "^1.5.2", "fidry/cpu-core-counter": "^0.4.1 || ^0.5.1", "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", - "nikic/php-parser": "^4.13", + "nikic/php-parser": "^4.14", "sebastian/diff": "^4.0 || ^5.0", "spatie/array-to-xml": "^2.17.0 || ^3.0", "symfony/console": "^4.1.6 || ^5.0 || ^6.0", @@ -117,7 +117,7 @@ "Composer\\Config::disableProcessTimeout", "phpunit" ], - "verify-callmap": "phpunit tests/Internal/Codebase/InternalCallMapHandlerTest.php", + "verify-callmap": "@php phpunit tests/Internal/Codebase/InternalCallMapHandlerTest.php", "psalm": "@php ./psalm", "psalm-set-baseline": "@php ./psalm --set-baseline=psalm-baseline.xml", "tests": [ diff --git a/vendor/vimeo/psalm/config.xsd b/vendor/vimeo/psalm/config.xsd index 9d08a678..f4302e20 100644 --- a/vendor/vimeo/psalm/config.xsd +++ b/vendor/vimeo/psalm/config.xsd @@ -407,6 +407,7 @@ + @@ -725,6 +726,7 @@ + diff --git a/vendor/vimeo/psalm/dictionaries/CallMap.php b/vendor/vimeo/psalm/dictionaries/CallMap.php index 4cc19235..2e1191c8 100644 --- a/vendor/vimeo/psalm/dictionaries/CallMap.php +++ b/vendor/vimeo/psalm/dictionaries/CallMap.php @@ -2,7 +2,7 @@ namespace Phan\Language\Internal; /** - * CURRENT PHP TARGET VERSION: 8.2 + * CURRENT PHP TARGET VERSION: 8.3 * The version above has to match Psalm\Internal\Codebase\InternalCallMapHandler::PHP_(MAJOR|MINOR)_VERSION * * Format @@ -359,29 +359,29 @@ return [ 'ArithmeticError::getPrevious' => ['?Throwable'], 'ArithmeticError::getTrace' => ['list\',args?:array}>'], 'ArithmeticError::getTraceAsString' => ['string'], -'array_change_key_case' => ['associative-array', 'array'=>'array', 'case='=>'int'], +'array_change_key_case' => ['array', 'array'=>'array', 'case='=>'int'], 'array_chunk' => ['list', 'array'=>'array', 'length'=>'int', 'preserve_keys='=>'bool'], 'array_column' => ['array', 'array'=>'array', 'column_key'=>'int|string|null', 'index_key='=>'int|string|null'], -'array_combine' => ['associative-array', 'keys'=>'string[]|int[]', 'values'=>'array'], -'array_count_values' => ['associative-array', 'array'=>'array'], -'array_diff' => ['associative-array', 'array'=>'array', '...arrays='=>'array'], -'array_diff_assoc' => ['associative-array', 'array'=>'array', '...arrays='=>'array'], -'array_diff_key' => ['associative-array', 'array'=>'array', '...arrays='=>'array'], -'array_diff_uassoc' => ['associative-array', 'array'=>'array', 'rest'=>'array', 'data_comp_func'=>'callable(mixed,mixed):int'], -'array_diff_uassoc\'1' => ['associative-array', 'array'=>'array', 'rest'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable(mixed,mixed):int', '...rest='=>'array|callable(mixed,mixed):int'], -'array_diff_ukey' => ['associative-array', 'array'=>'array', 'rest'=>'array', 'key_comp_func'=>'callable(mixed,mixed):int'], -'array_diff_ukey\'1' => ['associative-array', 'array'=>'array', 'rest'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable(mixed,mixed):int', '...rest='=>'array|callable(mixed,mixed):int'], +'array_combine' => ['array', 'keys'=>'string[]|int[]', 'values'=>'array'], +'array_count_values' => ['array', 'array'=>'array'], +'array_diff' => ['array', 'array'=>'array', '...arrays='=>'array'], +'array_diff_assoc' => ['array', 'array'=>'array', '...arrays='=>'array'], +'array_diff_key' => ['array', 'array'=>'array', '...arrays='=>'array'], +'array_diff_uassoc' => ['array', 'array'=>'array', 'rest'=>'array', 'data_comp_func'=>'callable(mixed,mixed):int'], +'array_diff_uassoc\'1' => ['array', 'array'=>'array', 'rest'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable(mixed,mixed):int', '...rest='=>'array|callable(mixed,mixed):int'], +'array_diff_ukey' => ['array', 'array'=>'array', 'rest'=>'array', 'key_comp_func'=>'callable(mixed,mixed):int'], +'array_diff_ukey\'1' => ['array', 'array'=>'array', 'rest'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable(mixed,mixed):int', '...rest='=>'array|callable(mixed,mixed):int'], 'array_fill' => ['array', 'start_index'=>'int', 'count'=>'int', 'value'=>'mixed'], 'array_fill_keys' => ['array', 'keys'=>'array', 'value'=>'mixed'], -'array_filter' => ['associative-array', 'array'=>'array', 'callback='=>'callable(mixed,mixed=):scalar|null', 'mode='=>'int'], -'array_flip' => ['associative-array|associative-array', 'array'=>'array'], -'array_intersect' => ['associative-array', 'array'=>'array', '...arrays='=>'array'], -'array_intersect_assoc' => ['associative-array', 'array'=>'array', '...arrays='=>'array'], -'array_intersect_key' => ['associative-array', 'array'=>'array', '...arrays='=>'array'], -'array_intersect_uassoc' => ['associative-array', 'array'=>'array', 'rest'=>'array', 'key_compare_func'=>'callable(mixed,mixed):int'], -'array_intersect_uassoc\'1' => ['associative-array', 'array'=>'array', 'rest'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable(mixed,mixed):int', '...rest'=>'array|callable(mixed,mixed):int'], -'array_intersect_ukey' => ['associative-array', 'array'=>'array', 'rest'=>'array', 'key_compare_func'=>'callable(mixed,mixed):int'], -'array_intersect_ukey\'1' => ['associative-array', 'array'=>'array', 'rest'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable(mixed,mixed):int', '...rest'=>'array|callable(mixed,mixed):int'], +'array_filter' => ['array', 'array'=>'array', 'callback='=>'callable(mixed,mixed=):scalar|null', 'mode='=>'int'], +'array_flip' => ['array', 'array'=>'array'], +'array_intersect' => ['array', 'array'=>'array', '...arrays='=>'array'], +'array_intersect_assoc' => ['array', 'array'=>'array', '...arrays='=>'array'], +'array_intersect_key' => ['array', 'array'=>'array', '...arrays='=>'array'], +'array_intersect_uassoc' => ['array', 'array'=>'array', 'rest'=>'array', 'key_compare_func'=>'callable(mixed,mixed):int'], +'array_intersect_uassoc\'1' => ['array', 'array'=>'array', 'rest'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable(mixed,mixed):int', '...rest'=>'array|callable(mixed,mixed):int'], +'array_intersect_ukey' => ['array', 'array'=>'array', 'rest'=>'array', 'key_compare_func'=>'callable(mixed,mixed):int'], +'array_intersect_ukey\'1' => ['array', 'array'=>'array', 'rest'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable(mixed,mixed):int', '...rest'=>'array|callable(mixed,mixed):int'], 'array_is_list' => ['bool', 'array'=>'array'], 'array_key_exists' => ['bool', 'key'=>'string|int', 'array'=>'array'], 'array_key_first' => ['int|string|null', 'array'=>'array'], @@ -406,18 +406,18 @@ return [ 'array_slice' => ['array', 'array'=>'array', 'offset'=>'int', 'length='=>'?int', 'preserve_keys='=>'bool'], 'array_splice' => ['array', '&rw_array'=>'array', 'offset'=>'int', 'length='=>'?int', 'replacement='=>'array|string'], 'array_sum' => ['int|float', 'array'=>'array'], -'array_udiff' => ['associative-array', 'array'=>'array', 'rest'=>'array', 'data_comp_func'=>'callable(mixed,mixed):int'], -'array_udiff\'1' => ['associative-array', 'array'=>'array', 'rest'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable(mixed,mixed):int', '...rest='=>'array|callable(mixed,mixed):int'], -'array_udiff_assoc' => ['associative-array', 'array'=>'array', 'rest'=>'array', 'key_comp_func'=>'callable(mixed,mixed):int'], -'array_udiff_assoc\'1' => ['associative-array', 'array'=>'array', 'rest'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable(mixed,mixed):int', '...rest='=>'array|callable(mixed,mixed):int'], -'array_udiff_uassoc' => ['associative-array', 'array'=>'array', 'rest'=>'array', 'data_comp_func'=>'callable(mixed,mixed):int', 'key_comp_func'=>'callable(mixed,mixed):int'], -'array_udiff_uassoc\'1' => ['associative-array', 'array'=>'array', 'rest'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable(mixed,mixed):int', 'arg5'=>'array|callable(mixed,mixed):int', '...rest='=>'array|callable(mixed,mixed):int'], -'array_uintersect' => ['associative-array', 'array'=>'array', 'rest'=>'array', 'data_compare_func'=>'callable(mixed,mixed):int'], -'array_uintersect\'1' => ['associative-array', 'array'=>'array', 'rest'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable(mixed,mixed):int', '...rest='=>'array|callable(mixed,mixed):int'], -'array_uintersect_assoc' => ['associative-array', 'array'=>'array', 'rest'=>'array', 'data_compare_func'=>'callable(mixed,mixed):int'], -'array_uintersect_assoc\'1' => ['associative-array', 'array'=>'array', 'rest'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable', '...rest='=>'array|callable(mixed,mixed):int'], -'array_uintersect_uassoc' => ['associative-array', 'array'=>'array', 'rest'=>'array', 'data_compare_func'=>'callable(mixed,mixed):int', 'key_compare_func'=>'callable(mixed,mixed):int'], -'array_uintersect_uassoc\'1' => ['associative-array', 'array'=>'array', 'rest'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable(mixed,mixed):int', 'arg5'=>'array|callable(mixed,mixed):int', '...rest='=>'array|callable(mixed,mixed):int'], +'array_udiff' => ['array', 'array'=>'array', 'rest'=>'array', 'data_comp_func'=>'callable(mixed,mixed):int'], +'array_udiff\'1' => ['array', 'array'=>'array', 'rest'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable(mixed,mixed):int', '...rest='=>'array|callable(mixed,mixed):int'], +'array_udiff_assoc' => ['array', 'array'=>'array', 'rest'=>'array', 'key_comp_func'=>'callable(mixed,mixed):int'], +'array_udiff_assoc\'1' => ['array', 'array'=>'array', 'rest'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable(mixed,mixed):int', '...rest='=>'array|callable(mixed,mixed):int'], +'array_udiff_uassoc' => ['array', 'array'=>'array', 'rest'=>'array', 'data_comp_func'=>'callable(mixed,mixed):int', 'key_comp_func'=>'callable(mixed,mixed):int'], +'array_udiff_uassoc\'1' => ['array', 'array'=>'array', 'rest'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable(mixed,mixed):int', 'arg5'=>'array|callable(mixed,mixed):int', '...rest='=>'array|callable(mixed,mixed):int'], +'array_uintersect' => ['array', 'array'=>'array', 'rest'=>'array', 'data_compare_func'=>'callable(mixed,mixed):int'], +'array_uintersect\'1' => ['array', 'array'=>'array', 'rest'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable(mixed,mixed):int', '...rest='=>'array|callable(mixed,mixed):int'], +'array_uintersect_assoc' => ['array', 'array'=>'array', 'rest'=>'array', 'data_compare_func'=>'callable(mixed,mixed):int'], +'array_uintersect_assoc\'1' => ['array', 'array'=>'array', 'rest'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable', '...rest='=>'array|callable(mixed,mixed):int'], +'array_uintersect_uassoc' => ['array', 'array'=>'array', 'rest'=>'array', 'data_compare_func'=>'callable(mixed,mixed):int', 'key_compare_func'=>'callable(mixed,mixed):int'], +'array_uintersect_uassoc\'1' => ['array', 'array'=>'array', 'rest'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable(mixed,mixed):int', 'arg5'=>'array|callable(mixed,mixed):int', '...rest='=>'array|callable(mixed,mixed):int'], 'array_unique' => ['array', 'array'=>'array', 'flags='=>'0'], 'array_unique\'1' => ['array', 'array'=>'array', 'flags='=>'1'], 'array_unique\'2' => ['array', 'array'=>'array', 'flags='=>'2|5'], @@ -433,50 +433,50 @@ return [ 'ArrayAccess::offsetUnset' => ['void', 'offset'=>'mixed'], 'ArrayIterator::__construct' => ['void', 'array='=>'array|object', 'flags='=>'int'], 'ArrayIterator::append' => ['void', 'value'=>'mixed'], -'ArrayIterator::asort' => ['void'], +'ArrayIterator::asort' => ['true', 'flags='=>'int'], 'ArrayIterator::count' => ['int'], 'ArrayIterator::current' => ['mixed'], 'ArrayIterator::getArrayCopy' => ['array'], 'ArrayIterator::getFlags' => ['int'], 'ArrayIterator::key' => ['int|string|null'], -'ArrayIterator::ksort' => ['void'], +'ArrayIterator::ksort' => ['true', 'flags='=>'int'], 'ArrayIterator::natcasesort' => ['true'], 'ArrayIterator::natsort' => ['true'], 'ArrayIterator::next' => ['void'], -'ArrayIterator::offsetExists' => ['bool', 'index'=>'string|int'], -'ArrayIterator::offsetGet' => ['mixed', 'index'=>'string|int'], -'ArrayIterator::offsetSet' => ['void', 'index'=>'string|int', 'newval'=>'mixed'], -'ArrayIterator::offsetUnset' => ['void', 'index'=>'string|int'], +'ArrayIterator::offsetExists' => ['bool', 'key'=>'string|int'], +'ArrayIterator::offsetGet' => ['mixed', 'key'=>'string|int'], +'ArrayIterator::offsetSet' => ['void', 'key'=>'string|int', 'value'=>'mixed'], +'ArrayIterator::offsetUnset' => ['void', 'key'=>'string|int'], 'ArrayIterator::rewind' => ['void'], -'ArrayIterator::seek' => ['void', 'position'=>'int'], +'ArrayIterator::seek' => ['void', 'offset'=>'int'], 'ArrayIterator::serialize' => ['string'], -'ArrayIterator::setFlags' => ['void', 'flags'=>'string'], -'ArrayIterator::uasort' => ['void', 'cmp_function'=>'callable(mixed,mixed):int'], -'ArrayIterator::uksort' => ['void', 'cmp_function'=>'callable(mixed,mixed):int'], -'ArrayIterator::unserialize' => ['void', 'serialized'=>'string'], +'ArrayIterator::setFlags' => ['void', 'flags'=>'int'], +'ArrayIterator::uasort' => ['true', 'callback'=>'callable(mixed,mixed):int'], +'ArrayIterator::uksort' => ['true', 'callback'=>'callable(mixed,mixed):int'], +'ArrayIterator::unserialize' => ['void', 'data'=>'string'], 'ArrayIterator::valid' => ['bool'], -'ArrayObject::__construct' => ['void', 'input='=>'array|object', 'flags='=>'int', 'iterator_class='=>'string'], +'ArrayObject::__construct' => ['void', 'array='=>'array|object', 'flags='=>'int', 'iteratorClass='=>'class-string'], 'ArrayObject::append' => ['void', 'value'=>'mixed'], -'ArrayObject::asort' => ['void'], +'ArrayObject::asort' => ['true', 'flags='=>'int'], 'ArrayObject::count' => ['int'], -'ArrayObject::exchangeArray' => ['array', 'ar'=>'mixed'], +'ArrayObject::exchangeArray' => ['array', 'array'=>'array|object'], 'ArrayObject::getArrayCopy' => ['array'], 'ArrayObject::getFlags' => ['int'], 'ArrayObject::getIterator' => ['ArrayIterator'], 'ArrayObject::getIteratorClass' => ['string'], -'ArrayObject::ksort' => ['void'], +'ArrayObject::ksort' => ['true', 'flags='=>'int'], 'ArrayObject::natcasesort' => ['true'], 'ArrayObject::natsort' => ['true'], -'ArrayObject::offsetExists' => ['bool', 'index'=>'int|string'], -'ArrayObject::offsetGet' => ['mixed|null', 'index'=>'int|string'], -'ArrayObject::offsetSet' => ['void', 'index'=>'int|string', 'newval'=>'mixed'], -'ArrayObject::offsetUnset' => ['void', 'index'=>'int|string'], +'ArrayObject::offsetExists' => ['bool', 'key'=>'int|string'], +'ArrayObject::offsetGet' => ['mixed|null', 'key'=>'int|string'], +'ArrayObject::offsetSet' => ['void', 'key'=>'int|string', 'value'=>'mixed'], +'ArrayObject::offsetUnset' => ['void', 'key'=>'int|string'], 'ArrayObject::serialize' => ['string'], 'ArrayObject::setFlags' => ['void', 'flags'=>'int'], -'ArrayObject::setIteratorClass' => ['void', 'iterator_class'=>'string'], -'ArrayObject::uasort' => ['void', 'cmp_function'=>'callable(mixed,mixed):int'], -'ArrayObject::uksort' => ['void', 'cmp_function'=>'callable(mixed,mixed):int'], -'ArrayObject::unserialize' => ['void', 'serialized'=>'string'], +'ArrayObject::setIteratorClass' => ['void', 'iteratorClass'=>'class-string'], +'ArrayObject::uasort' => ['true', 'callback'=>'callable(mixed,mixed):int'], +'ArrayObject::uksort' => ['true', 'callback'=>'callable(mixed,mixed):int'], +'ArrayObject::unserialize' => ['void', 'data'=>'string'], 'arsort' => ['true', '&rw_array'=>'array', 'flags='=>'int'], 'asin' => ['float', 'num'=>'float'], 'asinh' => ['float', 'num'=>'float'], @@ -587,10 +587,10 @@ return [ 'CachingIterator::hasNext' => ['bool'], 'CachingIterator::key' => ['int|string|float|bool'], 'CachingIterator::next' => ['void'], -'CachingIterator::offsetExists' => ['bool', 'index'=>'string'], -'CachingIterator::offsetGet' => ['mixed', 'index'=>'string'], -'CachingIterator::offsetSet' => ['void', 'index'=>'string', 'newval'=>'mixed'], -'CachingIterator::offsetUnset' => ['void', 'index'=>'string'], +'CachingIterator::offsetExists' => ['bool', 'key'=>'string'], +'CachingIterator::offsetGet' => ['mixed', 'key'=>'string'], +'CachingIterator::offsetSet' => ['void', 'key'=>'string', 'value'=>'mixed'], +'CachingIterator::offsetUnset' => ['void', 'key'=>'string'], 'CachingIterator::rewind' => ['void'], 'CachingIterator::setFlags' => ['void', 'flags'=>'int'], 'CachingIterator::valid' => ['bool'], @@ -604,7 +604,7 @@ return [ 'call_user_func_array' => ['mixed|false', 'callback'=>'callable', 'args'=>'list'], 'call_user_method' => ['mixed', 'method_name'=>'string', 'object'=>'object', 'parameter='=>'mixed', '...args='=>'mixed'], 'call_user_method_array' => ['mixed', 'method_name'=>'string', 'object'=>'object', 'params'=>'list'], -'CallbackFilterIterator::__construct' => ['void', 'iterator'=>'Iterator', 'func'=>'callable(mixed):bool|callable(mixed,mixed):bool|callable(mixed,mixed,mixed):bool'], +'CallbackFilterIterator::__construct' => ['void', 'iterator'=>'Iterator', 'callback'=>'callable(mixed,mixed=,mixed=):bool'], 'CallbackFilterIterator::accept' => ['bool'], 'CallbackFilterIterator::current' => ['mixed'], 'CallbackFilterIterator::getInnerIterator' => ['Iterator'], @@ -685,19 +685,19 @@ return [ 'clusterObj::setFilter' => ['int', 'expression'=>'string'], 'clusterObj::setGroup' => ['int', 'expression'=>'string'], 'Collator::__construct' => ['void', 'locale'=>'string'], -'Collator::asort' => ['bool', '&rw_arr'=>'array', 'sort_flag='=>'int'], +'Collator::asort' => ['bool', '&rw_array'=>'array', 'flags='=>'int'], 'Collator::compare' => ['int|false', 'string1'=>'string', 'string2'=>'string'], 'Collator::create' => ['?Collator', 'locale'=>'string'], -'Collator::getAttribute' => ['int|false', 'attr'=>'int'], +'Collator::getAttribute' => ['int|false', 'attribute'=>'int'], 'Collator::getErrorCode' => ['int'], 'Collator::getErrorMessage' => ['string'], 'Collator::getLocale' => ['string', 'type'=>'int'], 'Collator::getSortKey' => ['string|false', 'string'=>'string'], 'Collator::getStrength' => ['int'], -'Collator::setAttribute' => ['bool', 'attr'=>'int', 'value'=>'int'], +'Collator::setAttribute' => ['bool', 'attribute'=>'int', 'value'=>'int'], 'Collator::setStrength' => ['bool', 'strength'=>'int'], -'Collator::sort' => ['bool', '&rw_arr'=>'array', 'sort_flags='=>'int'], -'Collator::sortWithSortKeys' => ['bool', '&rw_arr'=>'array'], +'Collator::sort' => ['bool', '&rw_array'=>'array', 'flags='=>'int'], +'Collator::sortWithSortKeys' => ['bool', '&rw_array'=>'array'], 'collator_asort' => ['bool', 'object'=>'collator', '&rw_array'=>'array', 'flags='=>'int'], 'collator_compare' => ['int', 'object'=>'collator', 'string1'=>'string', 'string2'=>'string'], 'collator_create' => ['?Collator', 'locale'=>'string'], @@ -1292,13 +1292,13 @@ return [ 'curl_upkeep' => ['bool', 'handle'=>'CurlHandle'], 'curl_unescape' => ['string|false', 'handle'=>'CurlHandle', 'string'=>'string'], 'curl_version' => ['array', 'version='=>'int'], -'CURLFile::__construct' => ['void', 'filename'=>'string', 'mimetype='=>'string', 'postfilename='=>'string'], +'CURLFile::__construct' => ['void', 'filename'=>'string', 'mime_type='=>'?string', 'posted_filename='=>'?string'], 'CURLFile::__wakeup' => ['void'], 'CURLFile::getFilename' => ['string'], 'CURLFile::getMimeType' => ['string'], 'CURLFile::getPostFilename' => ['string'], -'CURLFile::setMimeType' => ['void', 'mime'=>'string'], -'CURLFile::setPostFilename' => ['void', 'name'=>'string'], +'CURLFile::setMimeType' => ['void', 'mime_type'=>'string'], +'CURLFile::setPostFilename' => ['void', 'posted_filename'=>'string'], 'CURLStringFile::__construct' => ['void', 'data'=>'string', 'postname'=>'string', 'mime='=>'string'], 'current' => ['mixed|false', 'array'=>'array|object'], 'cyrus_authenticate' => ['void', 'connection'=>'resource', 'mechlist='=>'string', 'service='=>'string', 'user='=>'string', 'minssf='=>'int', 'maxssf='=>'int', 'authname='=>'string', 'password='=>'string'], @@ -1355,10 +1355,10 @@ return [ 'datefmt_set_lenient' => ['void', 'formatter'=>'IntlDateFormatter', 'lenient'=>'bool'], 'datefmt_set_pattern' => ['bool', 'formatter'=>'IntlDateFormatter', 'pattern'=>'string'], 'datefmt_set_timezone' => ['false|null', 'formatter'=>'IntlDateFormatter', 'timezone'=>'IntlTimeZone|DateTimeZone|string|null'], -'DateInterval::__construct' => ['void', 'spec'=>'string'], +'DateInterval::__construct' => ['void', 'duration'=>'string'], 'DateInterval::__set_state' => ['DateInterval', 'array'=>'array'], 'DateInterval::__wakeup' => ['void'], -'DateInterval::createFromDateString' => ['DateInterval|false', 'time'=>'string'], +'DateInterval::createFromDateString' => ['DateInterval|false', 'datetime'=>'string'], 'DateInterval::format' => ['string', 'format'=>'string'], 'DatePeriod::__construct' => ['void', 'start'=>'DateTimeInterface', 'interval'=>'DateInterval', 'recur'=>'int', 'options='=>'int'], 'DatePeriod::__construct\'1' => ['void', 'start'=>'DateTimeInterface', 'interval'=>'DateInterval', 'end'=>'DateTimeInterface', 'options='=>'int'], @@ -1371,20 +1371,20 @@ return [ 'DateTime::__construct\'1' => ['void', 'time'=>'?string', 'timezone'=>'?DateTimeZone'], 'DateTime::__wakeup' => ['void'], 'DateTime::add' => ['static', 'interval'=>'DateInterval'], -'DateTime::createFromFormat' => ['static|false', 'format'=>'string', 'time'=>'string', 'timezone='=>'?DateTimeZone'], +'DateTime::createFromFormat' => ['static|false', 'format'=>'string', 'datetime'=>'string', 'timezone='=>'?DateTimeZone'], 'DateTime::createFromImmutable' => ['static', 'object'=>'DateTimeImmutable'], 'DateTime::createFromInterface' => ['static', 'object' => 'DateTimeInterface'], -'DateTime::diff' => ['DateInterval', 'datetime2'=>'DateTimeInterface', 'absolute='=>'bool'], +'DateTime::diff' => ['DateInterval', 'targetObject'=>'DateTimeInterface', 'absolute='=>'bool'], 'DateTime::format' => ['string', 'format'=>'string'], 'DateTime::getLastErrors' => ['array{warning_count:int,warnings:array,error_count:int,errors:array}|false'], 'DateTime::getOffset' => ['int'], 'DateTime::getTimestamp' => ['int'], 'DateTime::getTimezone' => ['DateTimeZone|false'], -'DateTime::modify' => ['static|false', 'modify'=>'string'], +'DateTime::modify' => ['static|false', 'modifier'=>'string'], 'DateTime::setDate' => ['static', 'year'=>'int', 'month'=>'int', 'day'=>'int'], -'DateTime::setISODate' => ['static', 'year'=>'int', 'week'=>'int', 'day='=>'int'], -'DateTime::setTime' => ['static', 'hour'=>'int', 'minute'=>'int', 'second='=>'int', 'microseconds='=>'int'], -'DateTime::setTimestamp' => ['static', 'unixtimestamp'=>'int'], +'DateTime::setISODate' => ['static', 'year'=>'int', 'week'=>'int', 'dayOfWeek='=>'int'], +'DateTime::setTime' => ['static', 'hour'=>'int', 'minute'=>'int', 'second='=>'int', 'microsecond='=>'int'], +'DateTime::setTimestamp' => ['static', 'timestamp'=>'int'], 'DateTime::setTimezone' => ['static', 'timezone'=>'DateTimeZone'], 'DateTime::sub' => ['static', 'interval'=>'DateInterval'], 'DateTimeImmutable::__wakeup' => ['void'], @@ -1403,65 +1403,65 @@ return [ 'DateTimeZone::getLocation' => ['array|false'], 'DateTimeZone::getName' => ['string'], 'DateTimeZone::getOffset' => ['int', 'datetime'=>'DateTimeInterface'], -'DateTimeZone::getTransitions' => ['list|false', 'timestamp_begin='=>'int', 'timestamp_end='=>'int'], +'DateTimeZone::getTransitions' => ['list|false', 'timestampBegin='=>'int', 'timestampEnd='=>'int'], 'DateTimeZone::listAbbreviations' => ['array>'], 'DateTimeZone::listIdentifiers' => ['list', 'timezoneGroup='=>'int', 'countryCode='=>'string|null'], -'db2_autocommit' => ['mixed', 'connection'=>'resource', 'value='=>'int'], +'db2_autocommit' => ['0|1|bool', 'connection'=>'resource', 'value='=>'0|1'], 'db2_bind_param' => ['bool', 'stmt'=>'resource', 'parameter_number'=>'int', 'variable_name'=>'string', 'parameter_type='=>'int', 'data_type='=>'int', 'precision='=>'int', 'scale='=>'int'], -'db2_client_info' => ['object|false', 'connection'=>'resource'], +'db2_client_info' => ['stdClass|false', 'connection'=>'resource'], 'db2_close' => ['bool', 'connection'=>'resource'], -'db2_column_privileges' => ['resource|false', 'connection'=>'resource', 'qualifier='=>'string', 'schema='=>'string', 'table_name='=>'string', 'column_name='=>'string'], -'db2_columns' => ['resource|false', 'connection'=>'resource', 'qualifier='=>'string', 'schema='=>'string', 'table_name='=>'string', 'column_name='=>'string'], +'db2_column_privileges' => ['resource|false', 'connection'=>'resource', 'qualifier='=>'?string', 'schema='=>'?string', 'table_name='=>'?string', 'column_name='=>'?string'], +'db2_columns' => ['resource|false', 'connection'=>'resource', 'qualifier='=>'?string', 'schema='=>'?string', 'table_name='=>'?string', 'column_name='=>'?string'], 'db2_commit' => ['bool', 'connection'=>'resource'], 'db2_conn_error' => ['string', 'connection='=>'resource'], 'db2_conn_errormsg' => ['string', 'connection='=>'resource'], -'db2_connect' => ['resource|false', 'database'=>'string', 'username'=>'string', 'password'=>'string', 'options='=>'array'], +'db2_connect' => ['resource|false', 'database'=>'string', 'username'=>'?string', 'password'=>'?string', 'options='=>'array'], 'db2_cursor_type' => ['int', 'stmt'=>'resource'], 'db2_escape_string' => ['string', 'string_literal'=>'string'], 'db2_exec' => ['resource|false', 'connection'=>'resource', 'statement'=>'string', 'options='=>'array'], 'db2_execute' => ['bool', 'stmt'=>'resource', 'parameters='=>'array'], -'db2_fetch_array' => ['array|false', 'stmt'=>'resource', 'row_number='=>'int'], -'db2_fetch_assoc' => ['array|false', 'stmt'=>'resource', 'row_number='=>'int'], -'db2_fetch_both' => ['array|false', 'stmt'=>'resource', 'row_number='=>'int'], -'db2_fetch_object' => ['object|false', 'stmt'=>'resource', 'row_number='=>'int'], -'db2_fetch_row' => ['bool', 'stmt'=>'resource', 'row_number='=>'int'], -'db2_field_display_size' => ['int|false', 'stmt'=>'resource', 'column'=>'mixed'], -'db2_field_name' => ['string|false', 'stmt'=>'resource', 'column'=>'mixed'], -'db2_field_num' => ['int|false', 'stmt'=>'resource', 'column'=>'mixed'], -'db2_field_precision' => ['int|false', 'stmt'=>'resource', 'column'=>'mixed'], -'db2_field_scale' => ['int|false', 'stmt'=>'resource', 'column'=>'mixed'], -'db2_field_type' => ['string|false', 'stmt'=>'resource', 'column'=>'mixed'], -'db2_field_width' => ['int|false', 'stmt'=>'resource', 'column'=>'mixed'], -'db2_foreign_keys' => ['resource|false', 'connection'=>'resource', 'qualifier'=>'string', 'schema'=>'string', 'table_name'=>'string'], +'db2_fetch_array' => ['array|false', 'stmt'=>'resource', 'row_number='=>'?int'], +'db2_fetch_assoc' => ['array|false', 'stmt'=>'resource', 'row_number='=>'?int'], +'db2_fetch_both' => ['array|false', 'stmt'=>'resource', 'row_number='=>'?int'], +'db2_fetch_object' => ['stdClass|false', 'stmt'=>'resource', 'row_number='=>'?int'], +'db2_fetch_row' => ['bool', 'stmt'=>'resource', 'row_number='=>'?int'], +'db2_field_display_size' => ['int|false', 'stmt'=>'resource', 'column'=>'string|int'], +'db2_field_name' => ['string|false', 'stmt'=>'resource', 'column'=>'string|int'], +'db2_field_num' => ['int|false', 'stmt'=>'resource', 'column'=>'string|int'], +'db2_field_precision' => ['int|false', 'stmt'=>'resource', 'column'=>'string|int'], +'db2_field_scale' => ['int|false', 'stmt'=>'resource', 'column'=>'string|int'], +'db2_field_type' => ['string|false', 'stmt'=>'resource', 'column'=>'string|int'], +'db2_field_width' => ['int|false', 'stmt'=>'resource', 'column'=>'string|int'], +'db2_foreign_keys' => ['resource|false', 'connection'=>'resource', 'qualifier'=>'?string', 'schema'=>'?string', 'table_name'=>'string'], 'db2_free_result' => ['bool', 'stmt'=>'resource'], 'db2_free_stmt' => ['bool', 'stmt'=>'resource'], 'db2_get_option' => ['string|false', 'resource'=>'resource', 'option'=>'string'], -'db2_last_insert_id' => ['string', 'resource'=>'resource'], +'db2_last_insert_id' => ['string|null', 'resource'=>'resource'], 'db2_lob_read' => ['string|false', 'stmt'=>'resource', 'colnum'=>'int', 'length'=>'int'], 'db2_next_result' => ['resource|false', 'stmt'=>'resource'], 'db2_num_fields' => ['int|false', 'stmt'=>'resource'], -'db2_num_rows' => ['int', 'stmt'=>'resource'], +'db2_num_rows' => ['int|false', 'stmt'=>'resource'], 'db2_pclose' => ['bool', 'resource'=>'resource'], -'db2_pconnect' => ['resource|false', 'database'=>'string', 'username'=>'string', 'password'=>'string', 'options='=>'array'], +'db2_pconnect' => ['resource|false', 'database'=>'string', 'username'=>'?string', 'password'=>'?string', 'options='=>'array'], 'db2_prepare' => ['resource|false', 'connection'=>'resource', 'statement'=>'string', 'options='=>'array'], -'db2_primary_keys' => ['resource|false', 'connection'=>'resource', 'qualifier'=>'string', 'schema'=>'string', 'table_name'=>'string'], +'db2_primary_keys' => ['resource|false', 'connection'=>'resource', 'qualifier'=>'?string', 'schema'=>'?string', 'table_name'=>'string'], 'db2_primarykeys' => [''], -'db2_procedure_columns' => ['resource|false', 'connection'=>'resource', 'qualifier'=>'string', 'schema'=>'string', 'procedure'=>'string', 'parameter'=>'string'], +'db2_procedure_columns' => ['resource|false', 'connection'=>'resource', 'qualifier'=>'?string', 'schema'=>'string', 'procedure'=>'string', 'parameter'=>'?string'], 'db2_procedurecolumns' => [''], -'db2_procedures' => ['resource|false', 'connection'=>'resource', 'qualifier'=>'string', 'schema'=>'string', 'procedure'=>'string'], -'db2_result' => ['mixed', 'stmt'=>'resource', 'column'=>'mixed'], +'db2_procedures' => ['resource|false', 'connection'=>'resource', 'qualifier'=>'?string', 'schema'=>'string', 'procedure'=>'string'], +'db2_result' => ['mixed', 'stmt'=>'resource', 'column'=>'string|int'], 'db2_rollback' => ['bool', 'connection'=>'resource'], -'db2_server_info' => ['object|false', 'connection'=>'resource'], +'db2_server_info' => ['stdClass|false', 'connection'=>'resource'], 'db2_set_option' => ['bool', 'resource'=>'resource', 'options'=>'array', 'type'=>'int'], 'db2_setoption' => [''], -'db2_special_columns' => ['resource|false', 'connection'=>'resource', 'qualifier'=>'string', 'schema'=>'string', 'table_name'=>'string', 'scope'=>'int'], +'db2_special_columns' => ['resource|false', 'connection'=>'resource', 'qualifier'=>'?string', 'schema'=>'string', 'table_name'=>'string', 'scope'=>'int'], 'db2_specialcolumns' => [''], -'db2_statistics' => ['resource|false', 'connection'=>'resource', 'qualifier'=>'string', 'schema'=>'string', 'table_name'=>'string', 'unique'=>'bool'], +'db2_statistics' => ['resource|false', 'connection'=>'resource', 'qualifier'=>'?string', 'schema'=>'?string', 'table_name'=>'string', 'unique'=>'bool'], 'db2_stmt_error' => ['string', 'stmt='=>'resource'], 'db2_stmt_errormsg' => ['string', 'stmt='=>'resource'], -'db2_table_privileges' => ['resource|false', 'connection'=>'resource', 'qualifier='=>'string', 'schema='=>'string', 'table_name='=>'string'], +'db2_table_privileges' => ['resource|false', 'connection'=>'resource', 'qualifier='=>'?string', 'schema='=>'?string', 'table_name='=>'?string'], 'db2_tableprivileges' => [''], -'db2_tables' => ['resource|false', 'connection'=>'resource', 'qualifier='=>'string', 'schema='=>'string', 'table_name='=>'string', 'table_type='=>'string'], +'db2_tables' => ['resource|false', 'connection'=>'resource', 'qualifier='=>'?string', 'schema='=>'?string', 'table_name='=>'?string', 'table_type='=>'?string'], 'dba_close' => ['void', 'dba'=>'resource'], 'dba_delete' => ['bool', 'key'=>'string', 'dba'=>'resource'], 'dba_exists' => ['bool', 'key'=>'string', 'dba'=>'resource'], @@ -1579,14 +1579,14 @@ return [ 'Directory::close' => ['void'], 'Directory::read' => ['string|false'], 'Directory::rewind' => ['void'], -'DirectoryIterator::__construct' => ['void', 'path'=>'string'], +'DirectoryIterator::__construct' => ['void', 'directory'=>'string'], 'DirectoryIterator::__toString' => ['string'], 'DirectoryIterator::current' => ['DirectoryIterator'], 'DirectoryIterator::getATime' => ['int'], 'DirectoryIterator::getBasename' => ['string', 'suffix='=>'string'], 'DirectoryIterator::getCTime' => ['int'], 'DirectoryIterator::getExtension' => ['string'], -'DirectoryIterator::getFileInfo' => ['SplFileInfo', 'class_name='=>'string'], +'DirectoryIterator::getFileInfo' => ['SplFileInfo', 'class='=>'?class-string'], 'DirectoryIterator::getFilename' => ['string'], 'DirectoryIterator::getGroup' => ['int'], 'DirectoryIterator::getInode' => ['int'], @@ -1594,7 +1594,7 @@ return [ 'DirectoryIterator::getMTime' => ['int'], 'DirectoryIterator::getOwner' => ['int'], 'DirectoryIterator::getPath' => ['string'], -'DirectoryIterator::getPathInfo' => ['SplFileInfo', 'class_name='=>'string'], +'DirectoryIterator::getPathInfo' => ['?SplFileInfo', 'class='=>'?class-string'], 'DirectoryIterator::getPathname' => ['string'], 'DirectoryIterator::getPerms' => ['int'], 'DirectoryIterator::getRealPath' => ['string'], @@ -1609,11 +1609,11 @@ return [ 'DirectoryIterator::isWritable' => ['bool'], 'DirectoryIterator::key' => ['string'], 'DirectoryIterator::next' => ['void'], -'DirectoryIterator::openFile' => ['SplFileObject', 'mode='=>'string', 'use_include_path='=>'bool', 'context='=>'resource'], +'DirectoryIterator::openFile' => ['SplFileObject', 'mode='=>'string', 'useIncludePath='=>'bool', 'context='=>'?resource'], 'DirectoryIterator::rewind' => ['void'], -'DirectoryIterator::seek' => ['void', 'position'=>'int'], -'DirectoryIterator::setFileClass' => ['void', 'class_name='=>'string'], -'DirectoryIterator::setInfoClass' => ['void', 'class_name='=>'string'], +'DirectoryIterator::seek' => ['void', 'offset'=>'int'], +'DirectoryIterator::setFileClass' => ['void', 'class='=>'class-string'], +'DirectoryIterator::setInfoClass' => ['void', 'class='=>'class-string'], 'DirectoryIterator::valid' => ['bool'], 'dirname' => ['string', 'path'=>'string', 'levels='=>'int'], 'disk_free_space' => ['float|false', 'directory'=>'string'], @@ -1651,48 +1651,48 @@ return [ 'DOMAttr::getNodePath' => ['?string'], 'DOMAttr::hasAttributes' => ['bool'], 'DOMAttr::hasChildNodes' => ['bool'], -'DOMAttr::insertBefore' => ['DOMNode', 'newnode'=>'DOMNode', 'refnode='=>'DOMNode'], -'DOMAttr::isDefaultNamespace' => ['bool', 'namespaceuri'=>'string'], +'DOMAttr::insertBefore' => ['DOMNode|false', 'node'=>'DOMNode', 'child='=>'?DOMNode'], +'DOMAttr::isDefaultNamespace' => ['bool', 'namespace'=>'string'], 'DOMAttr::isId' => ['bool'], -'DOMAttr::isSameNode' => ['bool', 'node'=>'DOMNode'], +'DOMAttr::isSameNode' => ['bool', 'otherNode'=>'DOMNode'], 'DOMAttr::isSupported' => ['bool', 'feature'=>'string', 'version'=>'string'], 'DOMAttr::lookupNamespaceUri' => ['string|null', 'prefix'=>'string|null'], -'DOMAttr::lookupPrefix' => ['string|null', 'namespaceuri'=>'string'], +'DOMAttr::lookupPrefix' => ['string|null', 'namespace'=>'string'], 'DOMAttr::normalize' => ['void'], -'DOMAttr::removeChild' => ['DOMNode', 'oldnode'=>'DOMNode'], -'DOMAttr::replaceChild' => ['DOMNode', 'newnode'=>'DOMNode', 'oldnode'=>'DOMNode'], +'DOMAttr::removeChild' => ['DOMNode|false', 'child'=>'DOMNode'], +'DOMAttr::replaceChild' => ['DOMNode|false', 'node'=>'DOMNode', 'child'=>'DOMNode'], 'DomAttribute::name' => ['string'], 'DomAttribute::set_value' => ['bool', 'content'=>'string'], 'DomAttribute::specified' => ['bool'], 'DomAttribute::value' => ['string'], -'DOMCdataSection::__construct' => ['void', 'value'=>'string'], +'DOMCdataSection::__construct' => ['void', 'data'=>'string'], 'DOMCharacterData::appendData' => ['true', 'data'=>'string'], 'DOMCharacterData::deleteData' => ['bool', 'offset'=>'int', 'count'=>'int'], 'DOMCharacterData::insertData' => ['bool', 'offset'=>'int', 'data'=>'string'], 'DOMCharacterData::replaceData' => ['bool', 'offset'=>'int', 'count'=>'int', 'data'=>'string'], 'DOMCharacterData::substringData' => ['string', 'offset'=>'int', 'count'=>'int'], -'DOMComment::__construct' => ['void', 'value='=>'string'], +'DOMComment::__construct' => ['void', 'data='=>'string'], 'DOMDocument::__construct' => ['void', 'version='=>'string', 'encoding='=>'string'], -'DOMDocument::createAttribute' => ['DOMAttr|false', 'name'=>'string'], -'DOMDocument::createAttributeNS' => ['DOMAttr|false', 'namespaceuri'=>'string|null', 'qualifiedname'=>'string'], +'DOMDocument::createAttribute' => ['DOMAttr|false', 'localName'=>'string'], +'DOMDocument::createAttributeNS' => ['DOMAttr|false', 'namespace'=>'string|null', 'qualifiedName'=>'string'], 'DOMDocument::createCDATASection' => ['DOMCDATASection|false', 'data'=>'string'], 'DOMDocument::createComment' => ['DOMComment', 'data'=>'string'], 'DOMDocument::createDocumentFragment' => ['DOMDocumentFragment'], -'DOMDocument::createElement' => ['DOMElement|false', 'name'=>'string', 'value='=>'string'], -'DOMDocument::createElementNS' => ['DOMElement|false', 'namespaceuri'=>'string|null', 'qualifiedname'=>'string', 'value='=>'string'], +'DOMDocument::createElement' => ['DOMElement|false', 'localName'=>'string', 'value='=>'string'], +'DOMDocument::createElementNS' => ['DOMElement|false', 'namespace'=>'string|null', 'qualifiedName'=>'string', 'value='=>'string'], 'DOMDocument::createEntityReference' => ['DOMEntityReference|false', 'name'=>'string'], 'DOMDocument::createProcessingInstruction' => ['DOMProcessingInstruction|false', 'target'=>'string', 'data='=>'string'], -'DOMDocument::createTextNode' => ['DOMText|false', 'content'=>'string'], -'DOMDocument::getElementById' => ['?DOMElement', 'elementid'=>'string'], -'DOMDocument::getElementsByTagName' => ['DOMNodeList', 'name'=>'string'], -'DOMDocument::getElementsByTagNameNS' => ['DOMNodeList', 'namespaceuri'=>'string|null', 'localname'=>'string'], -'DOMDocument::importNode' => ['DOMNode|false', 'importednode'=>'DOMNode', 'deep='=>'bool'], +'DOMDocument::createTextNode' => ['DOMText', 'data'=>'string'], +'DOMDocument::getElementById' => ['?DOMElement', 'elementId'=>'string'], +'DOMDocument::getElementsByTagName' => ['DOMNodeList', 'qualifiedName'=>'string'], +'DOMDocument::getElementsByTagNameNS' => ['DOMNodeList', 'namespace'=>'?string', 'localName'=>'string'], +'DOMDocument::importNode' => ['DOMNode|false', 'node'=>'DOMNode', 'deep='=>'bool'], 'DOMDocument::load' => ['DOMDocument|bool', 'filename'=>'string', 'options='=>'int'], 'DOMDocument::loadHTML' => ['bool', 'source'=>'non-empty-string', 'options='=>'int'], 'DOMDocument::loadHTMLFile' => ['bool', 'filename'=>'string', 'options='=>'int'], 'DOMDocument::loadXML' => ['DOMDocument|bool', 'source'=>'non-empty-string', 'options='=>'int'], 'DOMDocument::normalizeDocument' => ['void'], -'DOMDocument::registerNodeClass' => ['bool', 'baseclass'=>'string', 'extendedclass'=>'string'], +'DOMDocument::registerNodeClass' => ['bool', 'baseClass'=>'string', 'extendedClass'=>'?string'], 'DOMDocument::relaxNGValidate' => ['bool', 'filename'=>'string'], 'DOMDocument::relaxNGValidateSource' => ['bool', 'source'=>'string'], 'DOMDocument::save' => ['int|false', 'filename'=>'string', 'options='=>'int'], @@ -1705,55 +1705,55 @@ return [ 'DOMDocument::xinclude' => ['int', 'options='=>'int'], 'DOMDocumentFragment::__construct' => ['void'], 'DOMDocumentFragment::appendXML' => ['bool', 'data'=>'string'], -'DOMElement::__construct' => ['void', 'name'=>'string', 'value='=>'string', 'uri='=>'string'], -'DOMElement::getAttribute' => ['string', 'name'=>'string'], -'DOMElement::getAttributeNode' => ['DOMAttr', 'name'=>'string'], -'DOMElement::getAttributeNodeNS' => ['DOMAttr', 'namespaceuri'=>'string|null', 'localname'=>'string'], -'DOMElement::getAttributeNS' => ['string', 'namespaceuri'=>'string|null', 'localname'=>'string'], -'DOMElement::getElementsByTagName' => ['DOMNodeList', 'name'=>'string'], -'DOMElement::getElementsByTagNameNS' => ['DOMNodeList', 'namespaceuri'=>'string|null', 'localname'=>'string'], -'DOMElement::hasAttribute' => ['bool', 'name'=>'string'], -'DOMElement::hasAttributeNS' => ['bool', 'namespaceuri'=>'string|null', 'localname'=>'string'], -'DOMElement::removeAttribute' => ['bool', 'name'=>'string'], -'DOMElement::removeAttributeNode' => ['bool', 'oldnode'=>'DOMAttr'], -'DOMElement::removeAttributeNS' => ['bool', 'namespaceuri'=>'string|null', 'localname'=>'string'], -'DOMElement::setAttribute' => ['DOMAttr|false', 'name'=>'string', 'value'=>'string'], +'DOMElement::__construct' => ['void', 'qualifiedName'=>'string', 'value='=>'?string', 'namespace='=>'string'], +'DOMElement::getAttribute' => ['string', 'qualifiedName'=>'string'], +'DOMElement::getAttributeNode' => ['DOMAttr', 'qualifiedName'=>'string'], +'DOMElement::getAttributeNodeNS' => ['DOMAttr', 'namespace'=>'string|null', 'localName'=>'string'], +'DOMElement::getAttributeNS' => ['string', 'namespace'=>'string|null', 'localName'=>'string'], +'DOMElement::getElementsByTagName' => ['DOMNodeList', 'qualifiedName'=>'string'], +'DOMElement::getElementsByTagNameNS' => ['DOMNodeList', 'namespace'=>'string|null', 'localName'=>'string'], +'DOMElement::hasAttribute' => ['bool', 'qualifiedName'=>'string'], +'DOMElement::hasAttributeNS' => ['bool', 'namespace'=>'string|null', 'localName'=>'string'], +'DOMElement::removeAttribute' => ['bool', 'qualifiedName'=>'string'], +'DOMElement::removeAttributeNode' => ['DOMAttr|false', 'attr'=>'DOMAttr'], +'DOMElement::removeAttributeNS' => ['void', 'namespace'=>'string|null', 'localName'=>'string'], +'DOMElement::setAttribute' => ['DOMAttr|false', 'qualifiedName'=>'string', 'value'=>'string'], 'DOMElement::setAttributeNode' => ['?DOMAttr', 'attr'=>'DOMAttr'], 'DOMElement::setAttributeNodeNS' => ['DOMAttr', 'attr'=>'DOMAttr'], -'DOMElement::setAttributeNS' => ['void', 'namespaceuri'=>'string|null', 'qualifiedname'=>'string', 'value'=>'string'], -'DOMElement::setIdAttribute' => ['void', 'name'=>'string', 'isid'=>'bool'], -'DOMElement::setIdAttributeNode' => ['void', 'attr'=>'DOMAttr', 'isid'=>'bool'], -'DOMElement::setIdAttributeNS' => ['void', 'namespaceuri'=>'string', 'localname'=>'string', 'isid'=>'bool'], +'DOMElement::setAttributeNS' => ['void', 'namespace'=>'string|null', 'qualifiedName'=>'string', 'value'=>'string'], +'DOMElement::setIdAttribute' => ['void', 'qualifiedName'=>'string', 'isId'=>'bool'], +'DOMElement::setIdAttributeNode' => ['void', 'attr'=>'DOMAttr', 'isId'=>'bool'], +'DOMElement::setIdAttributeNS' => ['void', 'namespace'=>'string', 'qualifiedName'=>'string', 'isId'=>'bool'], 'DOMEntityReference::__construct' => ['void', 'name'=>'string'], 'DOMImplementation::__construct' => ['void'], -'DOMImplementation::createDocument' => ['DOMDocument', 'namespaceuri='=>'string', 'qualifiedname='=>'string', 'doctype='=>'DOMDocumentType'], -'DOMImplementation::createDocumentType' => ['DOMDocumentType', 'qualifiedname='=>'string', 'publicid='=>'string', 'systemid='=>'string'], +'DOMImplementation::createDocument' => ['DOMDocument|false', 'namespace='=>'?string', 'qualifiedName='=>'string', 'doctype='=>'?DOMDocumentType'], +'DOMImplementation::createDocumentType' => ['DOMDocumentType|false', 'qualifiedName'=>'string', 'publicId='=>'string', 'systemId='=>'string'], 'DOMImplementation::hasFeature' => ['bool', 'feature'=>'string', 'version'=>'string'], 'DOMNamedNodeMap::count' => ['int'], -'DOMNamedNodeMap::getNamedItem' => ['?DOMNode', 'name'=>'string'], -'DOMNamedNodeMap::getNamedItemNS' => ['?DOMNode', 'namespaceuri'=>'string', 'localname'=>'string'], +'DOMNamedNodeMap::getNamedItem' => ['?DOMNode', 'qualifiedName'=>'string'], +'DOMNamedNodeMap::getNamedItemNS' => ['?DOMNode', 'namespace'=>'?string', 'localName'=>'string'], 'DOMNamedNodeMap::item' => ['?DOMNode', 'index'=>'int'], -'DOMNode::appendChild' => ['DOMNode', 'newnode'=>'DOMNode'], -'DOMNode::C14N' => ['string', 'exclusive='=>'bool', 'with_comments='=>'bool', 'xpath='=>'array', 'ns_prefixes='=>'array'], -'DOMNode::C14NFile' => ['int|false', 'uri='=>'string', 'exclusive='=>'bool', 'with_comments='=>'bool', 'xpath='=>'array', 'ns_prefixes='=>'array'], +'DOMNode::appendChild' => ['DOMNode|false', 'node'=>'DOMNode'], +'DOMNode::C14N' => ['string|false', 'exclusive='=>'bool', 'withComments='=>'bool', 'xpath='=>'?array', 'nsPrefixes='=>'?array'], +'DOMNode::C14NFile' => ['int|false', 'uri'=>'string', 'exclusive='=>'bool', 'withComments='=>'bool', 'xpath='=>'?array', 'nsPrefixes='=>'?array'], 'DOMNode::cloneNode' => ['DOMNode', 'deep='=>'bool'], 'DOMNode::getLineNo' => ['int'], 'DOMNode::getNodePath' => ['?string'], 'DOMNode::hasAttributes' => ['bool'], 'DOMNode::hasChildNodes' => ['bool'], -'DOMNode::insertBefore' => ['DOMNode', 'newnode'=>'DOMNode', 'refnode='=>'DOMNode|null'], -'DOMNode::isDefaultNamespace' => ['bool', 'namespaceuri'=>'string'], -'DOMNode::isSameNode' => ['bool', 'node'=>'DOMNode'], +'DOMNode::insertBefore' => ['DOMNode|false', 'node'=>'DOMNode', 'child='=>'?DOMNode'], +'DOMNode::isDefaultNamespace' => ['bool', 'namespace'=>'string'], +'DOMNode::isSameNode' => ['bool', 'otherNode'=>'DOMNode'], 'DOMNode::isSupported' => ['bool', 'feature'=>'string', 'version'=>'string'], 'DOMNode::lookupNamespaceURI' => ['string|null', 'prefix'=>'string|null'], -'DOMNode::lookupPrefix' => ['string|null', 'namespaceuri'=>'string'], +'DOMNode::lookupPrefix' => ['string|null', 'namespace'=>'string'], 'DOMNode::normalize' => ['void'], -'DOMNode::removeChild' => ['DOMNode', 'oldnode'=>'DOMNode'], -'DOMNode::replaceChild' => ['DOMNode|false', 'newnode'=>'DOMNode', 'oldnode'=>'DOMNode'], +'DOMNode::removeChild' => ['DOMNode|false', 'child'=>'DOMNode'], +'DOMNode::replaceChild' => ['DOMNode|false', 'node'=>'DOMNode', 'child'=>'DOMNode'], 'DOMNodeList::count' => ['int'], 'DOMNodeList::item' => ['?DOMNode', 'index'=>'int'], -'DOMProcessingInstruction::__construct' => ['void', 'name'=>'string', 'value'=>'string'], -'DOMText::__construct' => ['void', 'value='=>'string'], +'DOMProcessingInstruction::__construct' => ['void', 'name'=>'string', 'value='=>'string'], +'DOMText::__construct' => ['void', 'data='=>'string'], 'DOMText::isElementContentWhitespace' => ['bool'], 'DOMText::isWhitespaceInElementContent' => ['bool'], 'DOMText::splitText' => ['DOMText', 'offset'=>'int'], @@ -1766,11 +1766,11 @@ return [ 'domxml_xslt_stylesheet_doc' => ['DomXsltStylesheet', 'xsl_doc'=>'DOMDocument'], 'domxml_xslt_stylesheet_file' => ['DomXsltStylesheet', 'xsl_file'=>'string'], 'domxml_xslt_version' => ['int'], -'DOMXPath::__construct' => ['void', 'doc'=>'DOMDocument'], -'DOMXPath::evaluate' => ['mixed', 'expression'=>'string', 'contextnode='=>'?DOMNode', 'registernodens='=>'bool'], -'DOMXPath::query' => ['DOMNodeList|false', 'expression'=>'string', 'contextnode='=>'DOMNode|null', 'registernodens='=>'bool'], -'DOMXPath::registerNamespace' => ['bool', 'prefix'=>'string', 'namespaceuri'=>'string'], -'DOMXPath::registerPhpFunctions' => ['void', 'restrict='=>'mixed'], +'DOMXPath::__construct' => ['void', 'document'=>'DOMDocument', 'registerNodeNS='=>'bool'], +'DOMXPath::evaluate' => ['mixed', 'expression'=>'string', 'contextNode='=>'?DOMNode', 'registerNodeNS='=>'bool'], +'DOMXPath::query' => ['DOMNodeList|false', 'expression'=>'string', 'contextNode='=>'?DOMNode', 'registerNodeNS='=>'bool'], +'DOMXPath::registerNamespace' => ['bool', 'prefix'=>'string', 'namespace'=>'string'], +'DOMXPath::registerPhpFunctions' => ['void', 'restrict='=>'array|string|null'], 'DomXsltStylesheet::process' => ['DomDocument', 'xml_doc'=>'DOMDocument', 'xslt_params='=>'array', 'is_xpath_param='=>'bool', 'profile_filename='=>'string'], 'DomXsltStylesheet::result_dump_file' => ['string', 'xmldoc'=>'DOMDocument', 'filename'=>'string'], 'DomXsltStylesheet::result_dump_mem' => ['string', 'xmldoc'=>'DOMDocument'], @@ -2817,14 +2817,14 @@ return [ 'filepro_retrieve' => ['string', 'row_number'=>'int', 'field_number'=>'int'], 'filepro_rowcount' => ['int'], 'filesize' => ['int|false', 'filename'=>'string'], -'FilesystemIterator::__construct' => ['void', 'path'=>'string', 'flags='=>'int'], +'FilesystemIterator::__construct' => ['void', 'directory'=>'string', 'flags='=>'int'], 'FilesystemIterator::__toString' => ['string'], 'FilesystemIterator::current' => ['SplFileInfo|FilesystemIterator|string'], 'FilesystemIterator::getATime' => ['int'], 'FilesystemIterator::getBasename' => ['string', 'suffix='=>'string'], 'FilesystemIterator::getCTime' => ['int'], 'FilesystemIterator::getExtension' => ['string'], -'FilesystemIterator::getFileInfo' => ['SplFileInfo', 'class_name='=>'string'], +'FilesystemIterator::getFileInfo' => ['SplFileInfo', 'class='=>'?class-string'], 'FilesystemIterator::getFilename' => ['string'], 'FilesystemIterator::getFlags' => ['int'], 'FilesystemIterator::getGroup' => ['int'], @@ -2833,7 +2833,7 @@ return [ 'FilesystemIterator::getMTime' => ['int'], 'FilesystemIterator::getOwner' => ['int'], 'FilesystemIterator::getPath' => ['string'], -'FilesystemIterator::getPathInfo' => ['SplFileInfo', 'class_name='=>'string'], +'FilesystemIterator::getPathInfo' => ['?SplFileInfo', 'class='=>'?class-string'], 'FilesystemIterator::getPathname' => ['string'], 'FilesystemIterator::getPerms' => ['int'], 'FilesystemIterator::getRealPath' => ['string'], @@ -2848,12 +2848,12 @@ return [ 'FilesystemIterator::isWritable' => ['bool'], 'FilesystemIterator::key' => ['string'], 'FilesystemIterator::next' => ['void'], -'FilesystemIterator::openFile' => ['SplFileObject', 'mode='=>'string', 'use_include_path='=>'bool', 'context='=>'resource'], +'FilesystemIterator::openFile' => ['SplFileObject', 'mode='=>'string', 'useIncludePath='=>'bool', 'context='=>'?resource'], 'FilesystemIterator::rewind' => ['void'], -'FilesystemIterator::seek' => ['void', 'position'=>'int'], -'FilesystemIterator::setFileClass' => ['void', 'class_name='=>'string'], -'FilesystemIterator::setFlags' => ['void', 'flags='=>'int'], -'FilesystemIterator::setInfoClass' => ['void', 'class_name='=>'string'], +'FilesystemIterator::seek' => ['void', 'offset'=>'int'], +'FilesystemIterator::setFileClass' => ['void', 'class='=>'class-string'], +'FilesystemIterator::setFlags' => ['void', 'flags'=>'int'], +'FilesystemIterator::setInfoClass' => ['void', 'class='=>'class-string'], 'FilesystemIterator::valid' => ['bool'], 'filetype' => ['string|false', 'filename'=>'string'], 'filter_has_var' => ['bool', 'input_type'=>'int', 'var_name'=>'string'], @@ -2951,7 +2951,7 @@ return [ 'gc_enable' => ['void'], 'gc_enabled' => ['bool'], 'gc_mem_caches' => ['int'], -'gc_status' => ['array{runs:int,collected:int,threshold:int,roots:int}'], +'gc_status' => ['array{runs:int,collected:int,threshold:int,roots:int,running:bool,protected:bool,full:bool,buffer_size:int}'], 'gd_info' => ['array'], 'gearman_bugreport' => [''], 'gearman_client_add_options' => ['', 'client_object'=>'', 'option'=>''], @@ -3334,14 +3334,14 @@ return [ 'gettimeofday\'1' => ['float', 'as_float='=>'true'], 'gettype' => ['string', 'value'=>'mixed'], 'glob' => ['list|false', 'pattern'=>'string', 'flags='=>'int'], -'GlobIterator::__construct' => ['void', 'path'=>'string', 'flags='=>'int'], +'GlobIterator::__construct' => ['void', 'pattern'=>'string', 'flags='=>'int'], 'GlobIterator::count' => ['int'], 'GlobIterator::current' => ['FilesystemIterator|SplFileInfo|string'], 'GlobIterator::getATime' => ['int'], 'GlobIterator::getBasename' => ['string', 'suffix='=>'string'], 'GlobIterator::getCTime' => ['int'], 'GlobIterator::getExtension' => ['string'], -'GlobIterator::getFileInfo' => ['SplFileInfo'], +'GlobIterator::getFileInfo' => ['SplFileInfo', 'class='=>'?class-string'], 'GlobIterator::getFilename' => ['string'], 'GlobIterator::getFlags' => ['int'], 'GlobIterator::getGroup' => ['int'], @@ -3350,7 +3350,7 @@ return [ 'GlobIterator::getMTime' => ['int'], 'GlobIterator::getOwner' => ['int'], 'GlobIterator::getPath' => ['string'], -'GlobIterator::getPathInfo' => ['?SplFileInfo'], +'GlobIterator::getPathInfo' => ['?SplFileInfo', 'class='=>'?class-string'], 'GlobIterator::getPathname' => ['string'], 'GlobIterator::getPerms' => ['int'], 'GlobIterator::getRealPath' => ['string|false'], @@ -3365,12 +3365,12 @@ return [ 'GlobIterator::isWritable' => ['bool'], 'GlobIterator::key' => ['string'], 'GlobIterator::next' => ['void'], -'GlobIterator::openFile' => ['SplFileObject'], +'GlobIterator::openFile' => ['SplFileObject', 'mode='=>'string', 'useIncludePath='=>'bool', 'context='=>'?resource'], 'GlobIterator::rewind' => ['void'], -'GlobIterator::seek' => ['void', 'position'=>'int'], -'GlobIterator::setFileClass' => ['void'], -'GlobIterator::setFlags' => ['void', 'flags='=>'int'], -'GlobIterator::setInfoClass' => ['void'], +'GlobIterator::seek' => ['void', 'offset'=>'int'], +'GlobIterator::setFileClass' => ['void', 'class='=>'class-string'], +'GlobIterator::setFlags' => ['void', 'flags'=>'int'], +'GlobIterator::setInfoClass' => ['void', 'class='=>'class-string'], 'GlobIterator::valid' => ['bool'], 'Gmagick::__construct' => ['void', 'filename='=>'string'], 'Gmagick::addimage' => ['Gmagick', 'gmagick'=>'gmagick'], @@ -5735,8 +5735,8 @@ return [ 'IntlBreakIterator::following' => ['int', 'offset'=>'int'], 'IntlBreakIterator::getErrorCode' => ['int'], 'IntlBreakIterator::getErrorMessage' => ['string'], -'IntlBreakIterator::getLocale' => ['string', 'locale_type'=>'string'], -'IntlBreakIterator::getPartsIterator' => ['IntlPartsIterator', 'key_type='=>'int'], +'IntlBreakIterator::getLocale' => ['string|false', 'type'=>'int'], +'IntlBreakIterator::getPartsIterator' => ['IntlPartsIterator', 'type='=>'string'], 'IntlBreakIterator::getText' => ['?string'], 'IntlBreakIterator::isBoundary' => ['bool', 'offset'=>'int'], 'IntlBreakIterator::last' => ['int'], @@ -5750,8 +5750,8 @@ return [ 'intlcal_clear' => ['bool', 'calendar'=>'IntlCalendar', 'field='=>'?int'], 'intlcal_create_instance' => ['?IntlCalendar', 'timezone='=>'mixed', 'locale='=>'?string'], 'intlcal_equals' => ['bool', 'calendar'=>'IntlCalendar', 'other'=>'IntlCalendar'], -'intlcal_field_difference' => ['int', 'calendar'=>'IntlCalendar', 'timestamp'=>'float', 'field'=>'int'], -'intlcal_from_date_time' => ['IntlCalendar', 'datetime'=>'DateTime|string'], +'intlcal_field_difference' => ['int|false', 'calendar'=>'IntlCalendar', 'timestamp'=>'float', 'field'=>'int'], +'intlcal_from_date_time' => ['?IntlCalendar', 'datetime'=>'DateTime|string', 'locale='=>'?string'], 'intlcal_get' => ['int|false', 'calendar'=>'IntlCalendar', 'field'=>'int'], 'intlcal_get_actual_maximum' => ['int', 'calendar'=>'IntlCalendar', 'field'=>'int'], 'intlcal_get_actual_minimum' => ['int', 'calendar'=>'IntlCalendar', 'field'=>'int'], @@ -5771,7 +5771,7 @@ return [ 'intlcal_get_time' => ['float', 'calendar'=>'IntlCalendar'], 'intlcal_get_time_zone' => ['IntlTimeZone', 'calendar'=>'IntlCalendar'], 'intlcal_get_type' => ['string', 'calendar'=>'IntlCalendar'], -'intlcal_get_weekend_transition' => ['int', 'calendar'=>'IntlCalendar', 'dayOfWeek'=>'string'], +'intlcal_get_weekend_transition' => ['int|false', 'calendar'=>'IntlCalendar', 'dayOfWeek'=>'int'], 'intlcal_in_daylight_time' => ['bool', 'calendar'=>'IntlCalendar'], 'intlcal_is_equivalent_to' => ['bool', 'calendar'=>'IntlCalendar', 'other'=>'IntlCalendar'], 'intlcal_is_lenient' => ['bool', 'calendar'=>'IntlCalendar'], @@ -5782,20 +5782,20 @@ return [ 'intlcal_set\'1' => ['bool', 'calendar'=>'IntlCalendar', 'year'=>'int', 'month'=>'int', 'dayOfMonth='=>'int', 'hour='=>'int', 'minute='=>'int', 'second='=>'int'], 'intlcal_set_first_day_of_week' => ['bool', 'calendar'=>'IntlCalendar', 'dayOfWeek'=>'int'], 'intlcal_set_lenient' => ['bool', 'calendar'=>'IntlCalendar', 'lenient'=>'bool'], -'intlcal_set_repeated_wall_time_option' => ['bool', 'calendar'=>'IntlCalendar', 'option'=>'int'], -'intlcal_set_skipped_wall_time_option' => ['bool', 'calendar'=>'IntlCalendar', 'option'=>'int'], +'intlcal_set_repeated_wall_time_option' => ['true', 'calendar'=>'IntlCalendar', 'option'=>'int'], +'intlcal_set_skipped_wall_time_option' => ['true', 'calendar'=>'IntlCalendar', 'option'=>'int'], 'intlcal_set_time' => ['bool', 'calendar'=>'IntlCalendar', 'timestamp'=>'float'], 'intlcal_set_time_zone' => ['bool', 'calendar'=>'IntlCalendar', 'timezone'=>'mixed'], 'intlcal_to_date_time' => ['DateTime|false', 'calendar'=>'IntlCalendar'], 'IntlCalendar::__construct' => ['void'], -'IntlCalendar::add' => ['bool', 'field'=>'int', 'amount'=>'int'], +'IntlCalendar::add' => ['bool', 'field'=>'int', 'value'=>'int'], 'IntlCalendar::after' => ['bool', 'other'=>'IntlCalendar'], 'IntlCalendar::before' => ['bool', 'other'=>'IntlCalendar'], 'IntlCalendar::clear' => ['bool', 'field='=>'?int'], -'IntlCalendar::createInstance' => ['IntlCalendar', 'timeZone='=>'mixed', 'locale='=>'string'], +'IntlCalendar::createInstance' => ['?IntlCalendar', 'timezone='=>'IntlTimeZone|DateTimeZone|string|null', 'locale='=>'?string'], 'IntlCalendar::equals' => ['bool', 'other'=>'IntlCalendar'], -'IntlCalendar::fieldDifference' => ['int', 'when'=>'float', 'field'=>'int'], -'IntlCalendar::fromDateTime' => ['IntlCalendar', 'dateTime'=>'DateTime|string'], +'IntlCalendar::fieldDifference' => ['int|false', 'timestamp'=>'float', 'field'=>'int'], +'IntlCalendar::fromDateTime' => ['?IntlCalendar', 'datetime'=>'DateTime|string', 'locale='=>'?string'], 'IntlCalendar::get' => ['int', 'field'=>'int'], 'IntlCalendar::getActualMaximum' => ['int', 'field'=>'int'], 'IntlCalendar::getActualMinimum' => ['int', 'field'=>'int'], @@ -5805,9 +5805,9 @@ return [ 'IntlCalendar::getErrorMessage' => ['string'], 'IntlCalendar::getFirstDayOfWeek' => ['int'], 'IntlCalendar::getGreatestMinimum' => ['int', 'field'=>'int'], -'IntlCalendar::getKeywordValuesForLocale' => ['Iterator|false', 'key'=>'string', 'locale'=>'string', 'commonlyUsed'=>'bool'], +'IntlCalendar::getKeywordValuesForLocale' => ['IntlIterator|false', 'keyword'=>'string', 'locale'=>'string', 'onlyCommon'=>'bool'], 'IntlCalendar::getLeastMaximum' => ['int', 'field'=>'int'], -'IntlCalendar::getLocale' => ['string', 'localeType'=>'int'], +'IntlCalendar::getLocale' => ['string|false', 'type'=>'int'], 'IntlCalendar::getMaximum' => ['int|false', 'field'=>'int'], 'IntlCalendar::getMinimalDaysInFirstWeek' => ['int'], 'IntlCalendar::getMinimum' => ['int', 'field'=>'int'], @@ -5817,82 +5817,82 @@ return [ 'IntlCalendar::getTime' => ['float'], 'IntlCalendar::getTimeZone' => ['IntlTimeZone'], 'IntlCalendar::getType' => ['string'], -'IntlCalendar::getWeekendTransition' => ['int', 'dayOfWeek'=>'string'], +'IntlCalendar::getWeekendTransition' => ['int|false', 'dayOfWeek'=>'int'], 'IntlCalendar::inDaylightTime' => ['bool'], 'IntlCalendar::isEquivalentTo' => ['bool', 'other'=>'IntlCalendar'], 'IntlCalendar::isLenient' => ['bool'], 'IntlCalendar::isSet' => ['bool', 'field'=>'int'], -'IntlCalendar::isWeekend' => ['bool', 'date='=>'?float'], -'IntlCalendar::roll' => ['bool', 'field'=>'int', 'amountOrUpOrDown'=>'mixed'], +'IntlCalendar::isWeekend' => ['bool', 'timestamp='=>'?float'], +'IntlCalendar::roll' => ['bool', 'field'=>'int', 'value'=>'int|bool'], 'IntlCalendar::set' => ['bool', 'field'=>'int', 'value'=>'int'], 'IntlCalendar::set\'1' => ['bool', 'year'=>'int', 'month'=>'int', 'dayOfMonth='=>'int', 'hour='=>'int', 'minute='=>'int', 'second='=>'int'], 'IntlCalendar::setFirstDayOfWeek' => ['bool', 'dayOfWeek'=>'int'], -'IntlCalendar::setLenient' => ['bool', 'isLenient'=>'string'], -'IntlCalendar::setMinimalDaysInFirstWeek' => ['bool', 'minimalDays'=>'int'], -'IntlCalendar::setRepeatedWallTimeOption' => ['bool', 'wallTimeOption'=>'int'], -'IntlCalendar::setSkippedWallTimeOption' => ['bool', 'wallTimeOption'=>'int'], -'IntlCalendar::setTime' => ['bool', 'date'=>'float'], -'IntlCalendar::setTimeZone' => ['bool', 'timeZone'=>'mixed'], +'IntlCalendar::setLenient' => ['true', 'lenient'=>'bool'], +'IntlCalendar::setMinimalDaysInFirstWeek' => ['bool', 'days'=>'int'], +'IntlCalendar::setRepeatedWallTimeOption' => ['true', 'option'=>'int'], +'IntlCalendar::setSkippedWallTimeOption' => ['true', 'option'=>'int'], +'IntlCalendar::setTime' => ['bool', 'timestamp'=>'float'], +'IntlCalendar::setTimeZone' => ['bool', 'timezone'=>'IntlTimeZone|DateTimeZone|string|null'], 'IntlCalendar::toDateTime' => ['DateTime|false'], -'IntlChar::charAge' => ['array', 'char'=>'int|string'], -'IntlChar::charDigitValue' => ['int', 'codepoint'=>'mixed'], -'IntlChar::charDirection' => ['int', 'codepoint'=>'mixed'], -'IntlChar::charFromName' => ['?int', 'name'=>'string', 'namechoice='=>'int'], -'IntlChar::charMirror' => ['mixed', 'codepoint'=>'mixed'], -'IntlChar::charName' => ['string', 'char'=>'int|string', 'namechoice='=>'int'], -'IntlChar::charType' => ['int', 'codepoint'=>'mixed'], -'IntlChar::chr' => ['string', 'codepoint'=>'mixed'], -'IntlChar::digit' => ['int|false', 'char'=>'int|string', 'radix='=>'int'], -'IntlChar::enumCharNames' => ['void', 'start'=>'mixed', 'limit'=>'mixed', 'callback'=>'callable', 'nameChoice='=>'int'], -'IntlChar::enumCharTypes' => ['void', 'cb='=>'callable'], -'IntlChar::foldCase' => ['int|string', 'char'=>'int|string', 'options='=>'int'], -'IntlChar::forDigit' => ['int', 'digit'=>'int', 'radix'=>'int'], -'IntlChar::getBidiPairedBracket' => ['mixed', 'codepoint'=>'mixed'], -'IntlChar::getBlockCode' => ['int', 'char'=>'int|string'], -'IntlChar::getCombiningClass' => ['int', 'codepoint'=>'mixed'], -'IntlChar::getFC_NFKC_Closure' => ['string', 'char'=>'int|string'], +'IntlChar::charAge' => ['?array', 'codepoint'=>'int|string'], +'IntlChar::charDigitValue' => ['?int', 'codepoint'=>'int|string'], +'IntlChar::charDirection' => ['?int', 'codepoint'=>'int|string'], +'IntlChar::charFromName' => ['?int', 'name'=>'string', 'type='=>'int'], +'IntlChar::charMirror' => ['int|string|null', 'codepoint'=>'int|string'], +'IntlChar::charName' => ['?string', 'codepoint'=>'int|string', 'type='=>'int'], +'IntlChar::charType' => ['?int', 'codepoint'=>'int|string'], +'IntlChar::chr' => ['?string', 'codepoint'=>'int|string'], +'IntlChar::digit' => ['int|false|null', 'codepoint'=>'int|string', 'base='=>'int'], +'IntlChar::enumCharNames' => ['?bool', 'start'=>'string|int', 'end'=>'string|int', 'callback'=>'callable(int,int,int):void', 'type='=>'int'], +'IntlChar::enumCharTypes' => ['void', 'callback'=>'callable(int,int,int):void'], +'IntlChar::foldCase' => ['int|string|null', 'codepoint'=>'int|string', 'options='=>'int'], +'IntlChar::forDigit' => ['int', 'digit'=>'int', 'base='=>'int'], +'IntlChar::getBidiPairedBracket' => ['int|string|null', 'codepoint'=>'int|string'], +'IntlChar::getBlockCode' => ['?int', 'codepoint'=>'int|string'], +'IntlChar::getCombiningClass' => ['?int', 'codepoint'=>'int|string'], +'IntlChar::getFC_NFKC_Closure' => ['?string', 'codepoint'=>'int|string'], 'IntlChar::getIntPropertyMaxValue' => ['int', 'property'=>'int'], 'IntlChar::getIntPropertyMinValue' => ['int', 'property'=>'int'], -'IntlChar::getIntPropertyValue' => ['int', 'char'=>'int|string', 'property'=>'int'], -'IntlChar::getNumericValue' => ['float', 'char'=>'int|string'], +'IntlChar::getIntPropertyValue' => ['?int', 'codepoint'=>'int|string', 'property'=>'int'], +'IntlChar::getNumericValue' => ['?float', 'codepoint'=>'int|string'], 'IntlChar::getPropertyEnum' => ['int', 'alias'=>'string'], -'IntlChar::getPropertyName' => ['string|false', 'property'=>'int', 'namechoice='=>'int'], +'IntlChar::getPropertyName' => ['string|false', 'property'=>'int', 'type='=>'int'], 'IntlChar::getPropertyValueEnum' => ['int', 'property'=>'int', 'name'=>'string'], -'IntlChar::getPropertyValueName' => ['string|false', 'prop'=>'int', 'value'=>'int', 'namechoice='=>'int'], +'IntlChar::getPropertyValueName' => ['string|false', 'property'=>'int', 'value'=>'int', 'type='=>'int'], 'IntlChar::getUnicodeVersion' => ['array'], -'IntlChar::hasBinaryProperty' => ['bool', 'char'=>'int|string', 'property'=>'int'], -'IntlChar::isalnum' => ['bool', 'codepoint'=>'mixed'], -'IntlChar::isalpha' => ['bool', 'codepoint'=>'mixed'], -'IntlChar::isbase' => ['bool', 'codepoint'=>'mixed'], -'IntlChar::isblank' => ['bool', 'codepoint'=>'mixed'], -'IntlChar::iscntrl' => ['bool', 'codepoint'=>'mixed'], -'IntlChar::isdefined' => ['bool', 'codepoint'=>'mixed'], -'IntlChar::isdigit' => ['bool', 'codepoint'=>'mixed'], -'IntlChar::isgraph' => ['bool', 'codepoint'=>'mixed'], -'IntlChar::isIDIgnorable' => ['bool', 'codepoint'=>'mixed'], -'IntlChar::isIDPart' => ['bool', 'codepoint'=>'mixed'], -'IntlChar::isIDStart' => ['bool', 'codepoint'=>'mixed'], -'IntlChar::isISOControl' => ['bool', 'codepoint'=>'mixed'], -'IntlChar::isJavaIDPart' => ['bool', 'codepoint'=>'mixed'], -'IntlChar::isJavaIDStart' => ['bool', 'codepoint'=>'mixed'], -'IntlChar::isJavaSpaceChar' => ['bool', 'codepoint'=>'mixed'], -'IntlChar::islower' => ['bool', 'codepoint'=>'mixed'], -'IntlChar::isMirrored' => ['bool', 'codepoint'=>'mixed'], -'IntlChar::isprint' => ['bool', 'codepoint'=>'mixed'], -'IntlChar::ispunct' => ['bool', 'codepoint'=>'mixed'], -'IntlChar::isspace' => ['bool', 'codepoint'=>'mixed'], -'IntlChar::istitle' => ['bool', 'codepoint'=>'mixed'], -'IntlChar::isUAlphabetic' => ['bool', 'codepoint'=>'mixed'], -'IntlChar::isULowercase' => ['bool', 'codepoint'=>'mixed'], -'IntlChar::isupper' => ['bool', 'codepoint'=>'mixed'], -'IntlChar::isUUppercase' => ['bool', 'codepoint'=>'mixed'], -'IntlChar::isUWhiteSpace' => ['bool', 'codepoint'=>'mixed'], -'IntlChar::isWhitespace' => ['bool', 'codepoint'=>'mixed'], -'IntlChar::isxdigit' => ['bool', 'codepoint'=>'mixed'], -'IntlChar::ord' => ['int', 'character'=>'mixed'], -'IntlChar::tolower' => ['mixed', 'codepoint'=>'mixed'], -'IntlChar::totitle' => ['mixed', 'codepoint'=>'mixed'], -'IntlChar::toupper' => ['mixed', 'codepoint'=>'mixed'], +'IntlChar::hasBinaryProperty' => ['?bool', 'codepoint'=>'int|string', 'property'=>'int'], +'IntlChar::isalnum' => ['?bool', 'codepoint'=>'int|string'], +'IntlChar::isalpha' => ['?bool', 'codepoint'=>'int|string'], +'IntlChar::isbase' => ['?bool', 'codepoint'=>'int|string'], +'IntlChar::isblank' => ['?bool', 'codepoint'=>'int|string'], +'IntlChar::iscntrl' => ['?bool', 'codepoint'=>'int|string'], +'IntlChar::isdefined' => ['?bool', 'codepoint'=>'int|string'], +'IntlChar::isdigit' => ['?bool', 'codepoint'=>'int|string'], +'IntlChar::isgraph' => ['?bool', 'codepoint'=>'int|string'], +'IntlChar::isIDIgnorable' => ['?bool', 'codepoint'=>'int|string'], +'IntlChar::isIDPart' => ['?bool', 'codepoint'=>'int|string'], +'IntlChar::isIDStart' => ['?bool', 'codepoint'=>'int|string'], +'IntlChar::isISOControl' => ['?bool', 'codepoint'=>'int|string'], +'IntlChar::isJavaIDPart' => ['?bool', 'codepoint'=>'int|string'], +'IntlChar::isJavaIDStart' => ['?bool', 'codepoint'=>'int|string'], +'IntlChar::isJavaSpaceChar' => ['?bool', 'codepoint'=>'int|string'], +'IntlChar::islower' => ['?bool', 'codepoint'=>'int|string'], +'IntlChar::isMirrored' => ['?bool', 'codepoint'=>'int|string'], +'IntlChar::isprint' => ['?bool', 'codepoint'=>'int|string'], +'IntlChar::ispunct' => ['?bool', 'codepoint'=>'int|string'], +'IntlChar::isspace' => ['?bool', 'codepoint'=>'int|string'], +'IntlChar::istitle' => ['?bool', 'codepoint'=>'int|string'], +'IntlChar::isUAlphabetic' => ['?bool', 'codepoint'=>'int|string'], +'IntlChar::isULowercase' => ['?bool', 'codepoint'=>'int|string'], +'IntlChar::isupper' => ['?bool', 'codepoint'=>'int|string'], +'IntlChar::isUUppercase' => ['?bool', 'codepoint'=>'int|string'], +'IntlChar::isUWhiteSpace' => ['?bool', 'codepoint'=>'int|string'], +'IntlChar::isWhitespace' => ['?bool', 'codepoint'=>'int|string'], +'IntlChar::isxdigit' => ['?bool', 'codepoint'=>'int|string'], +'IntlChar::ord' => ['?int', 'character'=>'int|string'], +'IntlChar::tolower' => ['int|string|null', 'codepoint'=>'int|string'], +'IntlChar::totitle' => ['int|string|null', 'codepoint'=>'int|string'], +'IntlChar::toupper' => ['int|string|null', 'codepoint'=>'int|string'], 'IntlCodePointBreakIterator::__construct' => ['void'], 'IntlCodePointBreakIterator::createCharacterInstance' => ['?IntlRuleBasedBreakIterator', 'locale='=>'?string'], 'IntlCodePointBreakIterator::createCodePointInstance' => ['IntlCodePointBreakIterator'], @@ -5902,17 +5902,17 @@ return [ 'IntlCodePointBreakIterator::createWordInstance' => ['?IntlRuleBasedBreakIterator', 'locale='=>'?string'], 'IntlCodePointBreakIterator::current' => ['int'], 'IntlCodePointBreakIterator::first' => ['int'], -'IntlCodePointBreakIterator::following' => ['int', 'offset'=>'string'], +'IntlCodePointBreakIterator::following' => ['int', 'offset'=>'int'], 'IntlCodePointBreakIterator::getErrorCode' => ['int'], 'IntlCodePointBreakIterator::getErrorMessage' => ['string'], 'IntlCodePointBreakIterator::getLastCodePoint' => ['int'], -'IntlCodePointBreakIterator::getLocale' => ['string', 'locale_type'=>'string'], -'IntlCodePointBreakIterator::getPartsIterator' => ['IntlPartsIterator', 'key_type='=>'string'], +'IntlCodePointBreakIterator::getLocale' => ['string|false', 'type'=>'int'], +'IntlCodePointBreakIterator::getPartsIterator' => ['IntlPartsIterator', 'type='=>'string'], 'IntlCodePointBreakIterator::getText' => ['?string'], -'IntlCodePointBreakIterator::isBoundary' => ['bool', 'offset'=>'string'], +'IntlCodePointBreakIterator::isBoundary' => ['bool', 'offset'=>'int'], 'IntlCodePointBreakIterator::last' => ['int'], -'IntlCodePointBreakIterator::next' => ['int', 'offset='=>'string'], -'IntlCodePointBreakIterator::preceding' => ['int', 'offset'=>'string'], +'IntlCodePointBreakIterator::next' => ['int', 'offset='=>'?int'], +'IntlCodePointBreakIterator::preceding' => ['int', 'offset'=>'int'], 'IntlCodePointBreakIterator::previous' => ['int'], 'IntlCodePointBreakIterator::setText' => ['?bool', 'text'=>'string'], 'IntlDateFormatter::__construct' => ['void', 'locale'=>'?string', 'dateType='=>'int', 'timeType='=>'int', 'timezone='=>'IntlTimeZone|DateTimeZone|string|null', 'calendar='=>'IntlCalendar|int|null', 'pattern='=>'?string'], @@ -5937,7 +5937,7 @@ return [ 'IntlDateFormatter::setPattern' => ['bool', 'pattern'=>'string'], 'IntlDateFormatter::setTimeZone' => ['null|false', 'timezone'=>'IntlTimeZone|DateTimeZone|string|null'], 'IntlException::__clone' => ['void'], -'IntlException::__construct' => ['void'], +'IntlException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable'], 'IntlException::__toString' => ['string'], 'IntlException::__wakeup' => ['void'], 'IntlException::getCode' => ['int'], @@ -5947,19 +5947,19 @@ return [ 'IntlException::getPrevious' => ['?Throwable'], 'IntlException::getTrace' => ['list\',args?:array}>'], 'IntlException::getTraceAsString' => ['string'], -'intlgregcal_create_instance' => ['IntlGregorianCalendar', 'timezoneOrYear='=>'mixed', 'localeOrMonth='=>'string'], +'intlgregcal_create_instance' => ['?IntlGregorianCalendar', 'timezoneOrYear='=>'IntlTimeZone|DateTimeZone|string|null', 'localeOrMonth='=>'string|int|null', 'day='=>'int', 'hour='=>'int', 'minute='=>'int', 'second='=>'int'], 'intlgregcal_get_gregorian_change' => ['float', 'calendar'=>'IntlGregorianCalendar'], -'intlgregcal_is_leap_year' => ['bool', 'calendar'=>'int'], +'intlgregcal_is_leap_year' => ['bool', 'calendar'=>'IntlGregorianCalendar', 'year'=>'int'], 'intlgregcal_set_gregorian_change' => ['bool', 'calendar'=>'IntlGregorianCalendar', 'timestamp'=>'float'], 'IntlGregorianCalendar::__construct' => ['void'], -'IntlGregorianCalendar::add' => ['bool', 'field'=>'int', 'amount'=>'int'], +'IntlGregorianCalendar::add' => ['bool', 'field'=>'int', 'value'=>'int'], 'IntlGregorianCalendar::after' => ['bool', 'other'=>'IntlCalendar'], 'IntlGregorianCalendar::before' => ['bool', 'other'=>'IntlCalendar'], 'IntlGregorianCalendar::clear' => ['bool', 'field='=>'?int'], -'IntlGregorianCalendar::createInstance' => ['IntlGregorianCalendar', 'timeZone='=>'mixed', 'locale='=>'string'], +'IntlGregorianCalendar::createInstance' => ['?IntlGregorianCalendar', 'timezone='=>'IntlTimeZone|DateTimeZone|string|null', 'locale='=>'?string'], 'IntlGregorianCalendar::equals' => ['bool', 'other'=>'IntlCalendar'], -'IntlGregorianCalendar::fieldDifference' => ['int', 'when'=>'float', 'field'=>'int'], -'IntlGregorianCalendar::fromDateTime' => ['IntlCalendar', 'dateTime'=>'DateTime|string'], +'IntlGregorianCalendar::fieldDifference' => ['int|false', 'timestamp'=>'float', 'field'=>'int'], +'IntlGregorianCalendar::fromDateTime' => ['?IntlCalendar', 'datetime'=>'DateTime|string', 'locale='=>'?string'], 'IntlGregorianCalendar::get' => ['int', 'field'=>'int'], 'IntlGregorianCalendar::getActualMaximum' => ['int', 'field'=>'int'], 'IntlGregorianCalendar::getActualMinimum' => ['int', 'field'=>'int'], @@ -5970,9 +5970,9 @@ return [ 'IntlGregorianCalendar::getFirstDayOfWeek' => ['int'], 'IntlGregorianCalendar::getGreatestMinimum' => ['int', 'field'=>'int'], 'IntlGregorianCalendar::getGregorianChange' => ['float'], -'IntlGregorianCalendar::getKeywordValuesForLocale' => ['Iterator', 'key'=>'string', 'locale'=>'string', 'commonlyUsed'=>'bool'], +'IntlGregorianCalendar::getKeywordValuesForLocale' => ['IntlIterator|false', 'keyword'=>'string', 'locale'=>'string', 'onlyCommon'=>'bool'], 'IntlGregorianCalendar::getLeastMaximum' => ['int', 'field'=>'int'], -'IntlGregorianCalendar::getLocale' => ['string', 'localeType'=>'int'], +'IntlGregorianCalendar::getLocale' => ['string|false', 'type'=>'int'], 'IntlGregorianCalendar::getMaximum' => ['int', 'field'=>'int'], 'IntlGregorianCalendar::getMinimalDaysInFirstWeek' => ['int'], 'IntlGregorianCalendar::getMinimum' => ['int', 'field'=>'int'], @@ -5982,24 +5982,24 @@ return [ 'IntlGregorianCalendar::getTime' => ['float'], 'IntlGregorianCalendar::getTimeZone' => ['IntlTimeZone'], 'IntlGregorianCalendar::getType' => ['string'], -'IntlGregorianCalendar::getWeekendTransition' => ['int', 'dayOfWeek'=>'string'], +'IntlGregorianCalendar::getWeekendTransition' => ['int|false', 'dayOfWeek'=>'int'], 'IntlGregorianCalendar::inDaylightTime' => ['bool'], 'IntlGregorianCalendar::isEquivalentTo' => ['bool', 'other'=>'IntlCalendar'], 'IntlGregorianCalendar::isLeapYear' => ['bool', 'year'=>'int'], 'IntlGregorianCalendar::isLenient' => ['bool'], 'IntlGregorianCalendar::isSet' => ['bool', 'field'=>'int'], -'IntlGregorianCalendar::isWeekend' => ['bool', 'date='=>'float'], -'IntlGregorianCalendar::roll' => ['bool', 'field'=>'int', 'amountOrUpOrDown'=>'mixed'], +'IntlGregorianCalendar::isWeekend' => ['bool', 'timestamp='=>'?float'], +'IntlGregorianCalendar::roll' => ['bool', 'field'=>'int', 'value'=>'int|bool'], 'IntlGregorianCalendar::set' => ['bool', 'field'=>'int', 'value'=>'int'], 'IntlGregorianCalendar::set\'1' => ['bool', 'year'=>'int', 'month'=>'int', 'dayOfMonth='=>'int', 'hour='=>'int', 'minute='=>'int', 'second='=>'int'], 'IntlGregorianCalendar::setFirstDayOfWeek' => ['bool', 'dayOfWeek'=>'int'], -'IntlGregorianCalendar::setGregorianChange' => ['bool', 'date'=>'float'], -'IntlGregorianCalendar::setLenient' => ['bool', 'isLenient'=>'string'], -'IntlGregorianCalendar::setMinimalDaysInFirstWeek' => ['bool', 'minimalDays'=>'int'], -'IntlGregorianCalendar::setRepeatedWallTimeOption' => ['bool', 'wallTimeOption'=>'int'], -'IntlGregorianCalendar::setSkippedWallTimeOption' => ['bool', 'wallTimeOption'=>'int'], -'IntlGregorianCalendar::setTime' => ['bool', 'date'=>'float'], -'IntlGregorianCalendar::setTimeZone' => ['bool', 'timeZone'=>'mixed'], +'IntlGregorianCalendar::setGregorianChange' => ['bool', 'timestamp'=>'float'], +'IntlGregorianCalendar::setLenient' => ['true', 'lenient'=>'bool'], +'IntlGregorianCalendar::setMinimalDaysInFirstWeek' => ['bool', 'days'=>'int'], +'IntlGregorianCalendar::setRepeatedWallTimeOption' => ['true', 'option'=>'int'], +'IntlGregorianCalendar::setSkippedWallTimeOption' => ['true', 'option'=>'int'], +'IntlGregorianCalendar::setTime' => ['bool', 'timestamp'=>'float'], +'IntlGregorianCalendar::setTimeZone' => ['bool', 'timezone'=>'IntlTimeZone|DateTimeZone|string|null'], 'IntlGregorianCalendar::toDateTime' => ['DateTime'], 'IntlIterator::__construct' => ['void'], 'IntlIterator::current' => ['mixed'], @@ -6008,7 +6008,7 @@ return [ 'IntlIterator::rewind' => ['void'], 'IntlIterator::valid' => ['bool'], 'IntlPartsIterator::getBreakIterator' => ['IntlBreakIterator'], -'IntlRuleBasedBreakIterator::__construct' => ['void', 'rules'=>'string', 'areCompiled='=>'string'], +'IntlRuleBasedBreakIterator::__construct' => ['void', 'rules'=>'string', 'compiled='=>'bool'], 'IntlRuleBasedBreakIterator::createCharacterInstance' => ['?IntlRuleBasedBreakIterator', 'locale='=>'?string'], 'IntlRuleBasedBreakIterator::createCodePointInstance' => ['IntlCodePointBreakIterator'], 'IntlRuleBasedBreakIterator::createLineInstance' => ['?IntlRuleBasedBreakIterator', 'locale='=>'?string'], @@ -6021,8 +6021,8 @@ return [ 'IntlRuleBasedBreakIterator::getBinaryRules' => ['string'], 'IntlRuleBasedBreakIterator::getErrorCode' => ['int'], 'IntlRuleBasedBreakIterator::getErrorMessage' => ['string'], -'IntlRuleBasedBreakIterator::getLocale' => ['string', 'locale_type'=>'string'], -'IntlRuleBasedBreakIterator::getPartsIterator' => ['IntlPartsIterator', 'key_type='=>'int'], +'IntlRuleBasedBreakIterator::getLocale' => ['string|false', 'type'=>'int'], +'IntlRuleBasedBreakIterator::getPartsIterator' => ['IntlPartsIterator', 'type='=>'string'], 'IntlRuleBasedBreakIterator::getRules' => ['string'], 'IntlRuleBasedBreakIterator::getRuleStatus' => ['int'], 'IntlRuleBasedBreakIterator::getRuleStatusVec' => ['array'], @@ -6033,36 +6033,36 @@ return [ 'IntlRuleBasedBreakIterator::preceding' => ['int', 'offset'=>'int'], 'IntlRuleBasedBreakIterator::previous' => ['int'], 'IntlRuleBasedBreakIterator::setText' => ['?bool', 'text'=>'string'], -'IntlTimeZone::countEquivalentIDs' => ['int|false', 'zoneId'=>'string'], +'IntlTimeZone::countEquivalentIDs' => ['int|false', 'timezoneId'=>'string'], 'IntlTimeZone::createDefault' => ['IntlTimeZone'], -'IntlTimeZone::createEnumeration' => ['IntlIterator|false', 'countryOrRawOffset='=>'mixed'], -'IntlTimeZone::createTimeZone' => ['IntlTimeZone|false', 'zoneId'=>'string'], -'IntlTimeZone::createTimeZoneIDEnumeration' => ['IntlIterator|false', 'zoneType'=>'int', 'region='=>'string', 'rawOffset='=>'int'], -'IntlTimeZone::fromDateTimeZone' => ['?IntlTimeZone', 'zoneId'=>'DateTimeZone'], -'IntlTimeZone::getCanonicalID' => ['string|false', 'zoneId'=>'string', '&w_isSystemID='=>'bool'], -'IntlTimeZone::getDisplayName' => ['string|false', 'isDaylight='=>'bool', 'style='=>'int', 'locale='=>'string'], +'IntlTimeZone::createEnumeration' => ['IntlIterator|false', 'countryOrRawOffset='=>'IntlTimeZone|string|int|float|null'], +'IntlTimeZone::createTimeZone' => ['?IntlTimeZone', 'timezoneId'=>'string'], +'IntlTimeZone::createTimeZoneIDEnumeration' => ['IntlIterator|false', 'type'=>'int', 'region='=>'?string', 'rawOffset='=>'?int'], +'IntlTimeZone::fromDateTimeZone' => ['?IntlTimeZone', 'timezone'=>'DateTimeZone'], +'IntlTimeZone::getCanonicalID' => ['string|false', 'timezoneId'=>'string', '&w_isSystemId='=>'bool'], +'IntlTimeZone::getDisplayName' => ['string|false', 'dst='=>'bool', 'style='=>'int', 'locale='=>'?string'], 'IntlTimeZone::getDSTSavings' => ['int'], -'IntlTimeZone::getEquivalentID' => ['string|false', 'zoneId'=>'string', 'index'=>'int'], +'IntlTimeZone::getEquivalentID' => ['string|false', 'timezoneId'=>'string', 'offset'=>'int'], 'IntlTimeZone::getErrorCode' => ['int'], 'IntlTimeZone::getErrorMessage' => ['string'], 'IntlTimeZone::getGMT' => ['IntlTimeZone'], 'IntlTimeZone::getID' => ['string'], -'IntlTimeZone::getIDForWindowsID' => ['string', 'timezone'=>'string', 'region='=>'string'], -'IntlTimeZone::getOffset' => ['int', 'date'=>'float', 'local'=>'bool', '&w_rawOffset'=>'int', '&w_dstOffset'=>'int'], +'IntlTimeZone::getIDForWindowsID' => ['string|false', 'timezoneId'=>'string', 'region='=>'?string'], +'IntlTimeZone::getOffset' => ['bool', 'timestamp'=>'float', 'local'=>'bool', '&w_rawOffset'=>'int', '&w_dstOffset'=>'int'], 'IntlTimeZone::getRawOffset' => ['int'], -'IntlTimeZone::getRegion' => ['string|false', 'zoneId'=>'string'], +'IntlTimeZone::getRegion' => ['string|false', 'timezoneId'=>'string'], 'IntlTimeZone::getTZDataVersion' => ['string'], 'IntlTimeZone::getUnknown' => ['IntlTimeZone'], -'IntlTimeZone::getWindowsID' => ['string|false', 'timezone'=>'string'], -'IntlTimeZone::hasSameRules' => ['bool', 'otherTimeZone'=>'IntlTimeZone'], +'IntlTimeZone::getWindowsID' => ['string|false', 'timezoneId'=>'string'], +'IntlTimeZone::hasSameRules' => ['bool', 'other'=>'IntlTimeZone'], 'IntlTimeZone::toDateTimeZone' => ['DateTimeZone|false'], 'IntlTimeZone::useDaylightTime' => ['bool'], 'intltz_count_equivalent_ids' => ['int', 'timezoneId'=>'string'], -'intltz_create_enumeration' => ['IntlIterator', 'countryOrRawOffset'=>'mixed'], +'intltz_create_enumeration' => ['IntlIterator|false', 'countryOrRawOffset='=>'IntlTimeZone|string|int|float|null'], 'intltz_create_time_zone' => ['?IntlTimeZone', 'timezoneId'=>'string'], 'intltz_from_date_time_zone' => ['?IntlTimeZone', 'timezone'=>'DateTimeZone'], -'intltz_get_canonical_id' => ['string', 'timezoneId'=>'string', '&isSystemId'=>'bool'], -'intltz_get_display_name' => ['string', 'timezone'=>'IntlTimeZone', 'dst'=>'bool', 'style'=>'int', 'locale'=>'string'], +'intltz_get_canonical_id' => ['string|false', 'timezoneId'=>'string', '&isSystemId='=>'bool'], +'intltz_get_display_name' => ['string|false', 'timezone'=>'IntlTimeZone', 'dst='=>'bool', 'style='=>'int', 'locale='=>'?string'], 'intltz_get_dst_savings' => ['int', 'timezone'=>'IntlTimeZone'], 'intltz_get_equivalent_id' => ['string', 'timezoneId'=>'string', 'offset'=>'int'], 'intltz_get_error_code' => ['int', 'timezone'=>'IntlTimeZone'], @@ -6162,6 +6162,7 @@ return [ 'json_encode' => ['non-empty-string|false', 'value'=>'mixed', 'flags='=>'int', 'depth='=>'int'], 'json_last_error' => ['int'], 'json_last_error_msg' => ['string'], +'json_validate' => ['bool', 'json'=>'string', 'depth='=>'positive-int', 'flags='=>'int'], 'JsonException::__clone' => ['void'], 'JsonException::__construct' => ['void'], 'JsonException::__toString' => ['string'], @@ -7888,7 +7889,7 @@ return [ 'mysqli_fetch_field_direct' => ['object|false', 'result'=>'mysqli_result', 'index'=>'int'], 'mysqli_fetch_fields' => ['stdClass[]', 'result'=>'mysqli_result'], 'mysqli_fetch_lengths' => ['array|false', 'result'=>'mysqli_result'], -'mysqli_fetch_object' => ['object|false|null', 'result'=>'mysqli_result', 'class='=>'class-string', 'constructor_args='=>'array'], +'mysqli_fetch_object' => ['object|false|null', 'result'=>'mysqli_result', 'class='=>'string', 'constructor_args='=>'array'], 'mysqli_fetch_row' => ['list|false|null', 'result'=>'mysqli_result'], 'mysqli_field_count' => ['int', 'mysql'=>'mysqli'], 'mysqli_field_seek' => ['bool', 'result'=>'mysqli_result', 'index'=>'int'], @@ -7943,7 +7944,7 @@ return [ 'mysqli_result::fetch_field' => ['object|false'], 'mysqli_result::fetch_field_direct' => ['object|false', 'index'=>'int'], 'mysqli_result::fetch_fields' => ['stdClass[]'], -'mysqli_result::fetch_object' => ['object|false|null', 'class='=>'class-string', 'constructor_args='=>'array'], +'mysqli_result::fetch_object' => ['object|false|null', 'class='=>'string', 'constructor_args='=>'array'], 'mysqli_result::fetch_row' => ['list|false|null'], 'mysqli_result::field_seek' => ['bool', 'index'=>'int'], 'mysqli_result::free' => ['void'], @@ -9051,7 +9052,7 @@ return [ 'PDOStatement::fetch' => ['mixed', 'mode='=>'int', 'cursorOrientation='=>'int', 'cursorOffset='=>'int'], 'PDOStatement::fetchAll' => ['array', 'mode='=>'int', '...args='=>'mixed'], 'PDOStatement::fetchColumn' => ['mixed', 'column='=>'int'], -'PDOStatement::fetchObject' => ['object|false', 'class='=>'?string', 'constructorArgs='=>'array'], +'PDOStatement::fetchObject' => ['object|false', 'class='=>'?class-string', 'constructorArgs='=>'array'], 'PDOStatement::getAttribute' => ['mixed', 'name'=>'int'], 'PDOStatement::getColumnMeta' => ['array|false', 'column'=>'int'], 'PDOStatement::nextRowset' => ['bool'], @@ -9169,29 +9170,27 @@ return [ 'pg_untrace' => ['bool', 'connection='=>'?\PgSql\Connection'], 'pg_update' => ['string|bool', 'connection'=>'\PgSql\Connection', 'table_name'=>'string', 'values'=>'array', 'conditions'=>'array', 'flags='=>'int'], 'pg_version' => ['array', 'connection='=>'?\PgSql\Connection'], -'Phar::__construct' => ['void', 'fname'=>'string', 'flags='=>'int', 'alias='=>'string'], -'Phar::addEmptyDir' => ['void', 'dirname'=>'string'], -'Phar::addFile' => ['void', 'file'=>'string', 'localname='=>'string'], -'Phar::addFromString' => ['void', 'localname'=>'string', 'contents'=>'string'], +'Phar::__construct' => ['void', 'filename'=>'string', 'flags='=>'int', 'alias='=>'?string'], +'Phar::addEmptyDir' => ['void', 'directory'=>'string'], +'Phar::addFile' => ['void', 'filename'=>'string', 'localName='=>'?string'], +'Phar::addFromString' => ['void', 'localName'=>'string', 'contents'=>'string'], 'Phar::apiVersion' => ['string'], -'Phar::buildFromDirectory' => ['array', 'base_dir'=>'string', 'regex='=>'string'], -'Phar::buildFromIterator' => ['array', 'iter'=>'Iterator', 'base_directory='=>'string'], -'Phar::canCompress' => ['bool', 'method='=>'int'], +'Phar::buildFromDirectory' => ['array', 'directory'=>'string', 'pattern='=>'string'], +'Phar::buildFromIterator' => ['array', 'iterator'=>'Traversable', 'baseDirectory='=>'?string'], +'Phar::canCompress' => ['bool', 'compression='=>'int'], 'Phar::canWrite' => ['bool'], 'Phar::compress' => ['?Phar', 'compression'=>'int', 'extension='=>'?string'], -'Phar::compressAllFilesBZIP2' => ['bool'], -'Phar::compressAllFilesGZ' => ['bool'], 'Phar::compressFiles' => ['void', 'compression'=>'int'], 'Phar::convertToData' => ['?PharData', 'format='=>'?int', 'compression='=>'?int', 'extension='=>'?string'], 'Phar::convertToExecutable' => ['?Phar', 'format='=>'?int', 'compression='=>'?int', 'extension='=>'?string'], -'Phar::copy' => ['bool', 'oldfile'=>'string', 'newfile'=>'string'], -'Phar::count' => ['int'], -'Phar::createDefaultStub' => ['string', 'indexfile='=>'string', 'webindexfile='=>'string'], +'Phar::copy' => ['bool', 'from'=>'string', 'to'=>'string'], +'Phar::count' => ['int', 'mode='=>'int'], +'Phar::createDefaultStub' => ['string', 'index='=>'?string', 'webIndex='=>'?string'], 'Phar::decompress' => ['?Phar', 'extension='=>'?string'], 'Phar::decompressFiles' => ['bool'], -'Phar::delete' => ['bool', 'entry'=>'string'], +'Phar::delete' => ['bool', 'localName'=>'string'], 'Phar::delMetadata' => ['bool'], -'Phar::extractTo' => ['bool', 'pathto'=>'string', 'files='=>'string|array|null', 'overwrite='=>'bool'], +'Phar::extractTo' => ['bool', 'directory'=>'string', 'files='=>'string|array|null', 'overwrite='=>'bool'], 'Phar::getAlias' => ['?string'], 'Phar::getMetadata' => ['mixed', 'unserializeOptions='=>'array'], 'Phar::getModified' => ['bool'], @@ -9209,52 +9208,51 @@ return [ 'Phar::isValidPharFilename' => ['bool', 'filename'=>'string', 'executable='=>'bool'], 'Phar::isWritable' => ['bool'], 'Phar::loadPhar' => ['bool', 'filename'=>'string', 'alias='=>'?string'], -'Phar::mapPhar' => ['bool', 'alias='=>'string', 'dataoffset='=>'int'], -'Phar::mount' => ['void', 'pharpath'=>'string', 'externalpath'=>'string'], -'Phar::mungServer' => ['void', 'munglist'=>'array'], -'Phar::offsetExists' => ['bool', 'offset'=>'string'], -'Phar::offsetGet' => ['PharFileInfo', 'offset'=>'string'], -'Phar::offsetSet' => ['void', 'offset'=>'string', 'value'=>'string'], -'Phar::offsetUnset' => ['bool', 'offset'=>'string'], -'Phar::running' => ['string', 'retphar='=>'bool'], +'Phar::mapPhar' => ['bool', 'alias='=>'?string', 'offset='=>'int'], +'Phar::mount' => ['void', 'pharPath'=>'string', 'externalPath'=>'string'], +'Phar::mungServer' => ['void', 'variables'=>'list'], +'Phar::offsetExists' => ['bool', 'localName'=>'string'], +'Phar::offsetGet' => ['PharFileInfo', 'localName'=>'string'], +'Phar::offsetSet' => ['void', 'localName'=>'string', 'value'=>'resource|string'], +'Phar::offsetUnset' => ['void', 'localName'=>'string'], +'Phar::running' => ['string', 'returnPhar='=>'bool'], 'Phar::setAlias' => ['bool', 'alias'=>'string'], -'Phar::setDefaultStub' => ['bool', 'index='=>'string', 'webindex='=>'string'], +'Phar::setDefaultStub' => ['bool', 'index='=>'?string', 'webIndex='=>'?string'], 'Phar::setMetadata' => ['void', 'metadata'=>''], -'Phar::setSignatureAlgorithm' => ['void', 'sigtype'=>'int', 'privatekey='=>'string'], +'Phar::setSignatureAlgorithm' => ['void', 'algo'=>'int', 'privateKey='=>'?string'], 'Phar::setStub' => ['bool', 'stub'=>'string', 'length='=>'int'], 'Phar::startBuffering' => ['void'], 'Phar::stopBuffering' => ['void'], -'Phar::uncompressAllFiles' => ['bool'], -'Phar::unlinkArchive' => ['bool', 'archive'=>'string'], -'Phar::webPhar' => ['', 'alias='=>'string', 'index='=>'string', 'f404='=>'string', 'mimetypes='=>'array', 'rewrites='=>'array'], -'PharData::__construct' => ['void', 'fname'=>'string', 'flags='=>'?int', 'alias='=>'?string', 'format='=>'int'], -'PharData::addEmptyDir' => ['bool', 'dirname'=>'string'], -'PharData::addFile' => ['void', 'file'=>'string', 'localname='=>'string'], -'PharData::addFromString' => ['bool', 'localname'=>'string', 'contents'=>'string'], -'PharData::buildFromDirectory' => ['array', 'base_dir'=>'string', 'regex='=>'string'], -'PharData::buildFromIterator' => ['array', 'iter'=>'Iterator', 'base_directory='=>'string'], +'Phar::unlinkArchive' => ['bool', 'filename'=>'string'], +'Phar::webPhar' => ['void', 'alias='=>'?string', 'index='=>'?string', 'fileNotFoundScript='=>'?string', 'mimeTypes='=>'array', 'rewrite='=>'?callable'], +'PharData::__construct' => ['void', 'filename'=>'string', 'flags='=>'int', 'alias='=>'?string', 'format='=>'int'], +'PharData::addEmptyDir' => ['void', 'directory'=>'string'], +'PharData::addFile' => ['void', 'filename'=>'string', 'localName='=>'?string'], +'PharData::addFromString' => ['void', 'localName'=>'string', 'contents'=>'string'], +'PharData::buildFromDirectory' => ['array', 'directory'=>'string', 'pattern='=>'string'], +'PharData::buildFromIterator' => ['array', 'iterator'=>'Traversable', 'baseDirectory='=>'?string'], 'PharData::compress' => ['?PharData', 'compression'=>'int', 'extension='=>'?string'], 'PharData::compressFiles' => ['void', 'compression'=>'int'], 'PharData::convertToData' => ['?PharData', 'format='=>'?int', 'compression='=>'?int', 'extension='=>'?string'], 'PharData::convertToExecutable' => ['?Phar', 'format='=>'?int', 'compression='=>'?int', 'extension='=>'?string'], -'PharData::copy' => ['bool', 'oldfile'=>'string', 'newfile'=>'string'], +'PharData::copy' => ['bool', 'from'=>'string', 'to'=>'string'], 'PharData::decompress' => ['?PharData', 'extension='=>'?string'], 'PharData::decompressFiles' => ['bool'], -'PharData::delete' => ['bool', 'entry'=>'string'], +'PharData::delete' => ['bool', 'localName'=>'string'], 'PharData::delMetadata' => ['bool'], -'PharData::extractTo' => ['bool', 'pathto'=>'string', 'files='=>'string|array|null', 'overwrite='=>'bool'], +'PharData::extractTo' => ['bool', 'directory'=>'string', 'files='=>'string|array|null', 'overwrite='=>'bool'], 'PharData::isWritable' => ['bool'], -'PharData::offsetExists' => ['bool', 'offset'=>'string'], -'PharData::offsetGet' => ['PharFileInfo', 'offset'=>'string'], -'PharData::offsetSet' => ['void', 'offset'=>'string', 'value'=>'string'], -'PharData::offsetUnset' => ['bool', 'offset'=>'string'], +'PharData::offsetExists' => ['bool', 'localName'=>'string'], +'PharData::offsetGet' => ['PharFileInfo', 'localName'=>'string'], +'PharData::offsetSet' => ['void', 'localName'=>'string', 'value'=>'string'], +'PharData::offsetUnset' => ['void', 'localName'=>'string'], 'PharData::setAlias' => ['bool', 'alias'=>'string'], -'PharData::setDefaultStub' => ['bool', 'index='=>'string', 'webindex='=>'string'], -'phardata::setMetadata' => ['void', 'metadata'=>'mixed'], -'phardata::setSignatureAlgorithm' => ['void', 'sigtype'=>'int'], +'PharData::setDefaultStub' => ['bool', 'index='=>'?string', 'webIndex='=>'?string'], +'PharData::setMetadata' => ['void', 'metadata'=>'mixed'], +'PharData::setSignatureAlgorithm' => ['void', 'algo'=>'int', 'privateKey='=>'?string'], 'PharData::setStub' => ['bool', 'stub'=>'string', 'length='=>'int'], -'PharFileInfo::__construct' => ['void', 'entry'=>'string'], -'PharFileInfo::chmod' => ['void', 'permissions'=>'int'], +'PharFileInfo::__construct' => ['void', 'filename'=>'string'], +'PharFileInfo::chmod' => ['void', 'perms'=>'int'], 'PharFileInfo::compress' => ['bool', 'compression'=>'int'], 'PharFileInfo::decompress' => ['bool'], 'PharFileInfo::delMetadata' => ['bool'], @@ -9264,14 +9262,9 @@ return [ 'PharFileInfo::getMetadata' => ['mixed', 'unserializeOptions='=>'array'], 'PharFileInfo::getPharFlags' => ['int'], 'PharFileInfo::hasMetadata' => ['bool'], -'PharFileInfo::isCompressed' => ['bool', 'compression_type='=>'int'], -'PharFileInfo::isCompressedBZIP2' => ['bool'], -'PharFileInfo::isCompressedGZ' => ['bool'], +'PharFileInfo::isCompressed' => ['bool', 'compression='=>'?int'], 'PharFileInfo::isCRCChecked' => ['bool'], -'PharFileInfo::setCompressedBZIP2' => ['bool'], -'PharFileInfo::setCompressedGZ' => ['bool'], 'PharFileInfo::setMetadata' => ['void', 'metadata'=>'mixed'], -'PharFileInfo::setUncompressed' => ['bool'], 'phdfs::__construct' => ['void', 'ip'=>'string', 'port'=>'string'], 'phdfs::__destruct' => ['void'], 'phdfs::connect' => ['bool'], @@ -9824,7 +9817,7 @@ return [ 'rectObj::setextent' => ['void', 'minx'=>'float', 'miny'=>'float', 'maxx'=>'float', 'maxy'=>'float'], 'RecursiveArrayIterator::__construct' => ['void', 'array='=>'array|object', 'flags='=>'int'], 'RecursiveArrayIterator::append' => ['void', 'value'=>'mixed'], -'RecursiveArrayIterator::asort' => ['void'], +'RecursiveArrayIterator::asort' => ['true', 'flags='=>'int'], 'RecursiveArrayIterator::count' => ['int'], 'RecursiveArrayIterator::current' => ['mixed'], 'RecursiveArrayIterator::getArrayCopy' => ['array'], @@ -9832,23 +9825,23 @@ return [ 'RecursiveArrayIterator::getFlags' => ['int'], 'RecursiveArrayIterator::hasChildren' => ['bool'], 'RecursiveArrayIterator::key' => ['string|int|null'], -'RecursiveArrayIterator::ksort' => ['void'], +'RecursiveArrayIterator::ksort' => ['true', 'flags='=>'int'], 'RecursiveArrayIterator::natcasesort' => ['true'], 'RecursiveArrayIterator::natsort' => ['true'], 'RecursiveArrayIterator::next' => ['void'], -'RecursiveArrayIterator::offsetExists' => ['void', 'index'=>'string'], -'RecursiveArrayIterator::offsetGet' => ['mixed', 'index'=>'string'], -'RecursiveArrayIterator::offsetSet' => ['void', 'index'=>'string', 'newval'=>'string'], -'RecursiveArrayIterator::offsetUnset' => ['void', 'index'=>'string'], +'RecursiveArrayIterator::offsetExists' => ['bool', 'key'=>'string|int'], +'RecursiveArrayIterator::offsetGet' => ['mixed', 'key'=>'string|int'], +'RecursiveArrayIterator::offsetSet' => ['void', 'key'=>'string|int', 'value'=>'string'], +'RecursiveArrayIterator::offsetUnset' => ['void', 'key'=>'string|int'], 'RecursiveArrayIterator::rewind' => ['void'], -'RecursiveArrayIterator::seek' => ['void', 'position'=>'int'], +'RecursiveArrayIterator::seek' => ['void', 'offset'=>'int'], 'RecursiveArrayIterator::serialize' => ['string'], -'RecursiveArrayIterator::setFlags' => ['void', 'flags'=>'string'], -'RecursiveArrayIterator::uasort' => ['void', 'cmp_function'=>'callable(mixed,mixed):int'], -'RecursiveArrayIterator::uksort' => ['void', 'cmp_function'=>'callable(mixed,mixed):int'], -'RecursiveArrayIterator::unserialize' => ['string', 'serialized'=>'string'], +'RecursiveArrayIterator::setFlags' => ['void', 'flags'=>'int'], +'RecursiveArrayIterator::uasort' => ['true', 'callback'=>'callable(mixed,mixed):int'], +'RecursiveArrayIterator::uksort' => ['true', 'callback'=>'callable(mixed,mixed):int'], +'RecursiveArrayIterator::unserialize' => ['void', 'data'=>'string'], 'RecursiveArrayIterator::valid' => ['bool'], -'RecursiveCachingIterator::__construct' => ['void', 'it'=>'Iterator', 'flags='=>'int'], +'RecursiveCachingIterator::__construct' => ['void', 'iterator'=>'Iterator', 'flags='=>'int'], 'RecursiveCachingIterator::__toString' => ['string'], 'RecursiveCachingIterator::count' => ['int'], 'RecursiveCachingIterator::current' => ['void'], @@ -9860,14 +9853,14 @@ return [ 'RecursiveCachingIterator::hasNext' => ['bool'], 'RecursiveCachingIterator::key' => ['bool|float|int|string'], 'RecursiveCachingIterator::next' => ['void'], -'RecursiveCachingIterator::offsetExists' => ['bool', 'index'=>'string'], -'RecursiveCachingIterator::offsetGet' => ['string', 'index'=>'string'], -'RecursiveCachingIterator::offsetSet' => ['void', 'index'=>'string', 'newval'=>'string'], -'RecursiveCachingIterator::offsetUnset' => ['void', 'index'=>'string'], +'RecursiveCachingIterator::offsetExists' => ['bool', 'key'=>'string'], +'RecursiveCachingIterator::offsetGet' => ['string', 'key'=>'string'], +'RecursiveCachingIterator::offsetSet' => ['void', 'key'=>'string', 'value'=>'string'], +'RecursiveCachingIterator::offsetUnset' => ['void', 'key'=>'string'], 'RecursiveCachingIterator::rewind' => ['void'], 'RecursiveCachingIterator::setFlags' => ['void', 'flags'=>'int'], 'RecursiveCachingIterator::valid' => ['bool'], -'RecursiveCallbackFilterIterator::__construct' => ['void', 'iterator'=>'RecursiveIterator', 'func'=>'callable'], +'RecursiveCallbackFilterIterator::__construct' => ['void', 'iterator'=>'RecursiveIterator', 'callback'=>'callable(mixed,mixed=,mixed=):bool'], 'RecursiveCallbackFilterIterator::accept' => ['bool'], 'RecursiveCallbackFilterIterator::current' => ['mixed'], 'RecursiveCallbackFilterIterator::getChildren' => ['RecursiveCallbackFilterIterator'], @@ -9877,7 +9870,7 @@ return [ 'RecursiveCallbackFilterIterator::next' => ['void'], 'RecursiveCallbackFilterIterator::rewind' => ['void'], 'RecursiveCallbackFilterIterator::valid' => ['bool'], -'RecursiveDirectoryIterator::__construct' => ['void', 'path'=>'string', 'flags='=>'int'], +'RecursiveDirectoryIterator::__construct' => ['void', 'directory'=>'string', 'flags='=>'int'], 'RecursiveDirectoryIterator::__toString' => ['string'], 'RecursiveDirectoryIterator::current' => ['string|SplFileInfo|FilesystemIterator'], 'RecursiveDirectoryIterator::getATime' => ['int'], @@ -9885,7 +9878,7 @@ return [ 'RecursiveDirectoryIterator::getChildren' => ['RecursiveDirectoryIterator'], 'RecursiveDirectoryIterator::getCTime' => ['int'], 'RecursiveDirectoryIterator::getExtension' => ['string'], -'RecursiveDirectoryIterator::getFileInfo' => ['SplFileInfo', 'class_name='=>'string'], +'RecursiveDirectoryIterator::getFileInfo' => ['SplFileInfo', 'class='=>'?class-string'], 'RecursiveDirectoryIterator::getFilename' => ['string'], 'RecursiveDirectoryIterator::getFlags' => ['int'], 'RecursiveDirectoryIterator::getGroup' => ['int'], @@ -9894,7 +9887,7 @@ return [ 'RecursiveDirectoryIterator::getMTime' => ['int'], 'RecursiveDirectoryIterator::getOwner' => ['int'], 'RecursiveDirectoryIterator::getPath' => ['string'], -'RecursiveDirectoryIterator::getPathInfo' => ['SplFileInfo', 'class_name='=>'string'], +'RecursiveDirectoryIterator::getPathInfo' => ['?SplFileInfo', 'class='=>'?class-string'], 'RecursiveDirectoryIterator::getPathname' => ['string'], 'RecursiveDirectoryIterator::getPerms' => ['int'], 'RecursiveDirectoryIterator::getRealPath' => ['string'], @@ -9902,7 +9895,7 @@ return [ 'RecursiveDirectoryIterator::getSubPath' => ['string'], 'RecursiveDirectoryIterator::getSubPathname' => ['string'], 'RecursiveDirectoryIterator::getType' => ['string'], -'RecursiveDirectoryIterator::hasChildren' => ['bool', 'allow_links='=>'bool'], +'RecursiveDirectoryIterator::hasChildren' => ['bool', 'allowLinks='=>'bool'], 'RecursiveDirectoryIterator::isDir' => ['bool'], 'RecursiveDirectoryIterator::isDot' => ['bool'], 'RecursiveDirectoryIterator::isExecutable' => ['bool'], @@ -9912,12 +9905,12 @@ return [ 'RecursiveDirectoryIterator::isWritable' => ['bool'], 'RecursiveDirectoryIterator::key' => ['string'], 'RecursiveDirectoryIterator::next' => ['void'], -'RecursiveDirectoryIterator::openFile' => ['SplFileObject', 'mode='=>'string', 'use_include_path='=>'bool', 'context='=>'resource'], +'RecursiveDirectoryIterator::openFile' => ['SplFileObject', 'mode='=>'string', 'useIncludePath='=>'bool', 'context='=>'?resource'], 'RecursiveDirectoryIterator::rewind' => ['void'], -'RecursiveDirectoryIterator::seek' => ['void', 'position'=>'int'], -'RecursiveDirectoryIterator::setFileClass' => ['void', 'class_name='=>'string'], -'RecursiveDirectoryIterator::setFlags' => ['void', 'flags='=>'int'], -'RecursiveDirectoryIterator::setInfoClass' => ['void', 'class_name='=>'string'], +'RecursiveDirectoryIterator::seek' => ['void', 'offset'=>'int'], +'RecursiveDirectoryIterator::setFileClass' => ['void', 'class='=>'class-string'], +'RecursiveDirectoryIterator::setFlags' => ['void', 'flags'=>'int'], +'RecursiveDirectoryIterator::setInfoClass' => ['void', 'class='=>'class-string'], 'RecursiveDirectoryIterator::valid' => ['bool'], 'RecursiveFilterIterator::__construct' => ['void', 'iterator'=>'RecursiveIterator'], 'RecursiveFilterIterator::accept' => ['bool'], @@ -9953,9 +9946,9 @@ return [ 'RecursiveIteratorIterator::next' => ['void'], 'RecursiveIteratorIterator::nextElement' => ['void'], 'RecursiveIteratorIterator::rewind' => ['void'], -'RecursiveIteratorIterator::setMaxDepth' => ['void', 'max_depth='=>'int'], +'RecursiveIteratorIterator::setMaxDepth' => ['void', 'maxDepth='=>'int'], 'RecursiveIteratorIterator::valid' => ['bool'], -'RecursiveRegexIterator::__construct' => ['void', 'iterator'=>'RecursiveIterator', 'regex'=>'string', 'mode='=>'int', 'flags='=>'int', 'preg_flags='=>'int'], +'RecursiveRegexIterator::__construct' => ['void', 'iterator'=>'RecursiveIterator', 'pattern'=>'string', 'mode='=>'int', 'flags='=>'int', 'pregFlags='=>'int'], 'RecursiveRegexIterator::accept' => ['bool'], 'RecursiveRegexIterator::current' => ['mixed'], 'RecursiveRegexIterator::getChildren' => ['RecursiveRegexIterator'], @@ -9968,11 +9961,11 @@ return [ 'RecursiveRegexIterator::key' => ['mixed'], 'RecursiveRegexIterator::next' => ['void'], 'RecursiveRegexIterator::rewind' => ['void'], -'RecursiveRegexIterator::setFlags' => ['void', 'new_flags'=>'int'], -'RecursiveRegexIterator::setMode' => ['void', 'new_mode'=>'int'], -'RecursiveRegexIterator::setPregFlags' => ['void', 'new_flags'=>'int'], +'RecursiveRegexIterator::setFlags' => ['void', 'flags'=>'int'], +'RecursiveRegexIterator::setMode' => ['void', 'mode'=>'int'], +'RecursiveRegexIterator::setPregFlags' => ['void', 'pregFlags'=>'int'], 'RecursiveRegexIterator::valid' => ['bool'], -'RecursiveTreeIterator::__construct' => ['void', 'iterator'=>'RecursiveIterator|IteratorAggregate', 'flags='=>'int', 'cit_flags='=>'int', 'mode'=>'int'], +'RecursiveTreeIterator::__construct' => ['void', 'iterator'=>'RecursiveIterator|IteratorAggregate', 'flags='=>'int', 'cachingIteratorFlags='=>'int', 'mode='=>'int'], 'RecursiveTreeIterator::beginChildren' => ['void'], 'RecursiveTreeIterator::beginIteration' => ['void'], 'RecursiveTreeIterator::callGetChildren' => ['?RecursiveIterator'], @@ -9991,9 +9984,9 @@ return [ 'RecursiveTreeIterator::next' => ['void'], 'RecursiveTreeIterator::nextElement' => ['void'], 'RecursiveTreeIterator::rewind' => ['void'], -'RecursiveTreeIterator::setMaxDepth' => ['void', 'max_depth='=>'int'], -'RecursiveTreeIterator::setPostfix' => ['void', 'prefix'=>'string'], -'RecursiveTreeIterator::setPrefixPart' => ['void', 'part'=>'int', 'prefix'=>'string'], +'RecursiveTreeIterator::setMaxDepth' => ['void', 'maxDepth='=>'int'], +'RecursiveTreeIterator::setPostfix' => ['void', 'postfix'=>'string'], +'RecursiveTreeIterator::setPrefixPart' => ['void', 'part'=>'int', 'value'=>'string'], 'RecursiveTreeIterator::valid' => ['bool'], 'Redis::__construct' => ['void'], 'Redis::__destruct' => ['void'], @@ -10762,7 +10755,7 @@ return [ 'ReflectionZendExtension::getVersion' => ['string'], 'Reflector::__toString' => ['string'], 'Reflector::export' => ['?string'], -'RegexIterator::__construct' => ['void', 'iterator'=>'Iterator', 'regex'=>'string', 'mode='=>'int', 'flags='=>'int', 'preg_flags='=>'int'], +'RegexIterator::__construct' => ['void', 'iterator'=>'Iterator', 'pattern'=>'string', 'mode='=>'int', 'flags='=>'int', 'pregFlags='=>'int'], 'RegexIterator::accept' => ['bool'], 'RegexIterator::current' => ['mixed'], 'RegexIterator::getFlags' => ['int'], @@ -10773,9 +10766,9 @@ return [ 'RegexIterator::key' => ['mixed'], 'RegexIterator::next' => ['void'], 'RegexIterator::rewind' => ['void'], -'RegexIterator::setFlags' => ['void', 'new_flags'=>'int'], -'RegexIterator::setMode' => ['void', 'new_mode'=>'int'], -'RegexIterator::setPregFlags' => ['void', 'new_flags'=>'int'], +'RegexIterator::setFlags' => ['void', 'flags'=>'int'], +'RegexIterator::setMode' => ['void', 'mode'=>'int'], +'RegexIterator::setPregFlags' => ['void', 'pregFlags'=>'int'], 'RegexIterator::valid' => ['bool'], 'register_event_handler' => ['bool', 'event_handler_func'=>'string', 'handler_register_name'=>'string', 'event_type_mask'=>'int'], 'register_shutdown_function' => ['void', 'callback'=>'callable', '...args='=>'mixed'], @@ -11334,7 +11327,7 @@ return [ 'SimpleXMLElement::xpath' => ['SimpleXMLElement[]|false', 'path'=>'string'], 'sin' => ['float', 'num'=>'float'], 'sinh' => ['float', 'num'=>'float'], -'sizeof' => ['int', 'value'=>'Countable|array', 'mode='=>'int'], +'sizeof' => ['int<0, max>', 'value'=>'Countable|array', 'mode='=>'int'], 'sleep' => ['int', 'seconds'=>'0|positive-int'], 'snmp2_get' => ['string|false', 'hostname'=>'string', 'community'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], 'snmp2_getnext' => ['string|false', 'hostname'=>'string', 'community'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], @@ -12280,7 +12273,7 @@ return [ 'spl_object_hash' => ['string', 'object'=>'object'], 'spl_object_id' => ['int', 'object'=>'object'], 'SplDoublyLinkedList::__construct' => ['void'], -'SplDoublyLinkedList::add' => ['void', 'index'=>'mixed', 'newval'=>'mixed'], +'SplDoublyLinkedList::add' => ['void', 'index'=>'int', 'value'=>'mixed'], 'SplDoublyLinkedList::bottom' => ['mixed'], 'SplDoublyLinkedList::count' => ['int'], 'SplDoublyLinkedList::current' => ['mixed'], @@ -12290,17 +12283,17 @@ return [ 'SplDoublyLinkedList::next' => ['void'], 'SplDoublyLinkedList::offsetExists' => ['bool', 'index'=>'mixed'], 'SplDoublyLinkedList::offsetGet' => ['mixed', 'index'=>'mixed'], -'SplDoublyLinkedList::offsetSet' => ['void', 'index'=>'mixed', 'newval'=>'mixed'], +'SplDoublyLinkedList::offsetSet' => ['void', 'index'=>'mixed', 'value'=>'mixed'], 'SplDoublyLinkedList::offsetUnset' => ['void', 'index'=>'mixed'], 'SplDoublyLinkedList::pop' => ['mixed'], 'SplDoublyLinkedList::prev' => ['void'], 'SplDoublyLinkedList::push' => ['void', 'value'=>'mixed'], 'SplDoublyLinkedList::rewind' => ['void'], 'SplDoublyLinkedList::serialize' => ['string'], -'SplDoublyLinkedList::setIteratorMode' => ['void', 'flags'=>'int'], +'SplDoublyLinkedList::setIteratorMode' => ['int', 'mode'=>'int'], 'SplDoublyLinkedList::shift' => ['mixed'], 'SplDoublyLinkedList::top' => ['mixed'], -'SplDoublyLinkedList::unserialize' => ['void', 'serialized'=>'string'], +'SplDoublyLinkedList::unserialize' => ['void', 'data'=>'string'], 'SplDoublyLinkedList::unshift' => ['void', 'value'=>'mixed'], 'SplDoublyLinkedList::valid' => ['bool'], 'SplEnum::__construct' => ['void', 'initial_value='=>'mixed', 'strict='=>'bool'], @@ -12312,7 +12305,7 @@ return [ 'SplFileInfo::getBasename' => ['string', 'suffix='=>'string'], 'SplFileInfo::getCTime' => ['int|false'], 'SplFileInfo::getExtension' => ['string'], -'SplFileInfo::getFileInfo' => ['SplFileInfo', 'class='=>'?string'], +'SplFileInfo::getFileInfo' => ['SplFileInfo', 'class='=>'?class-string'], 'SplFileInfo::getFilename' => ['string'], 'SplFileInfo::getGroup' => ['int|false'], 'SplFileInfo::getInode' => ['int|false'], @@ -12320,7 +12313,7 @@ return [ 'SplFileInfo::getMTime' => ['int|false'], 'SplFileInfo::getOwner' => ['int|false'], 'SplFileInfo::getPath' => ['string'], -'SplFileInfo::getPathInfo' => ['SplFileInfo|null', 'class='=>'?string'], +'SplFileInfo::getPathInfo' => ['SplFileInfo|null', 'class='=>'?class-string'], 'SplFileInfo::getPathname' => ['string'], 'SplFileInfo::getPerms' => ['int|false'], 'SplFileInfo::getRealPath' => ['string|false'], @@ -12333,8 +12326,8 @@ return [ 'SplFileInfo::isReadable' => ['bool'], 'SplFileInfo::isWritable' => ['bool'], 'SplFileInfo::openFile' => ['SplFileObject', 'mode='=>'string', 'useIncludePath='=>'bool', 'context='=>'?resource'], -'SplFileInfo::setFileClass' => ['void', 'class='=>'string'], -'SplFileInfo::setInfoClass' => ['void', 'class='=>'string'], +'SplFileInfo::setFileClass' => ['void', 'class='=>'class-string'], +'SplFileInfo::setInfoClass' => ['void', 'class='=>'class-string'], 'SplFileObject::__construct' => ['void', 'filename'=>'string', 'mode='=>'string', 'useIncludePath='=>'bool', 'context='=>'?resource'], 'SplFileObject::__toString' => ['string'], 'SplFileObject::current' => ['string|array|false'], @@ -12360,7 +12353,7 @@ return [ 'SplFileObject::getCTime' => ['int|false'], 'SplFileObject::getCurrentLine' => ['string'], 'SplFileObject::getExtension' => ['string'], -'SplFileObject::getFileInfo' => ['SplFileInfo', 'class='=>'?string'], +'SplFileObject::getFileInfo' => ['SplFileInfo', 'class='=>'?class-string'], 'SplFileObject::getFilename' => ['string'], 'SplFileObject::getFlags' => ['int'], 'SplFileObject::getGroup' => ['int|false'], @@ -12370,7 +12363,7 @@ return [ 'SplFileObject::getMTime' => ['int|false'], 'SplFileObject::getOwner' => ['int|false'], 'SplFileObject::getPath' => ['string'], -'SplFileObject::getPathInfo' => ['SplFileInfo|null', 'class='=>'?string'], +'SplFileObject::getPathInfo' => ['SplFileInfo|null', 'class='=>'?class-string'], 'SplFileObject::getPathname' => ['string'], 'SplFileObject::getPerms' => ['int|false'], 'SplFileObject::getRealPath' => ['false|string'], @@ -12389,22 +12382,22 @@ return [ 'SplFileObject::rewind' => ['void'], 'SplFileObject::seek' => ['void', 'line'=>'int'], 'SplFileObject::setCsvControl' => ['void', 'separator='=>'string', 'enclosure='=>'string', 'escape='=>'string'], -'SplFileObject::setFileClass' => ['void', 'class='=>'string'], +'SplFileObject::setFileClass' => ['void', 'class='=>'class-string'], 'SplFileObject::setFlags' => ['void', 'flags'=>'int'], -'SplFileObject::setInfoClass' => ['void', 'class='=>'string'], +'SplFileObject::setInfoClass' => ['void', 'class='=>'class-string'], 'SplFileObject::setMaxLineLen' => ['void', 'maxLength'=>'int'], 'SplFileObject::valid' => ['bool'], 'SplFixedArray::__construct' => ['void', 'size='=>'int'], 'SplFixedArray::__wakeup' => ['void'], 'SplFixedArray::count' => ['int'], 'SplFixedArray::current' => ['mixed'], -'SplFixedArray::fromArray' => ['SplFixedArray', 'data'=>'array', 'save_indexes='=>'bool'], +'SplFixedArray::fromArray' => ['SplFixedArray', 'array'=>'array', 'preserveKeys='=>'bool'], 'SplFixedArray::getSize' => ['int'], 'SplFixedArray::key' => ['int'], 'SplFixedArray::next' => ['void'], 'SplFixedArray::offsetExists' => ['bool', 'index'=>'int'], 'SplFixedArray::offsetGet' => ['mixed', 'index'=>'int'], -'SplFixedArray::offsetSet' => ['void', 'index'=>'int', 'newval'=>'mixed'], +'SplFixedArray::offsetSet' => ['void', 'index'=>'int', 'value'=>'mixed'], 'SplFixedArray::offsetUnset' => ['void', 'index'=>'int'], 'SplFixedArray::rewind' => ['void'], 'SplFixedArray::setSize' => ['bool', 'size'=>'int'], @@ -12425,8 +12418,8 @@ return [ 'SplHeap::top' => ['mixed'], 'SplHeap::valid' => ['bool'], 'SplMaxHeap::__construct' => ['void'], -'SplMaxHeap::compare' => ['int', 'a'=>'mixed', 'b'=>'mixed'], -'SplMinHeap::compare' => ['int', 'a'=>'mixed', 'b'=>'mixed'], +'SplMaxHeap::compare' => ['int', 'value1'=>'mixed', 'value2'=>'mixed'], +'SplMinHeap::compare' => ['int', 'value1'=>'mixed', 'value2'=>'mixed'], 'SplMinHeap::count' => ['int'], 'SplMinHeap::current' => ['mixed'], 'SplMinHeap::extract' => ['mixed'], @@ -12440,10 +12433,10 @@ return [ 'SplMinHeap::top' => ['mixed'], 'SplMinHeap::valid' => ['bool'], 'SplObjectStorage::__construct' => ['void'], -'SplObjectStorage::addAll' => ['void', 'os'=>'splobjectstorage'], -'SplObjectStorage::attach' => ['void', 'object'=>'object', 'inf='=>'mixed'], +'SplObjectStorage::addAll' => ['int', 'storage'=>'SplObjectStorage'], +'SplObjectStorage::attach' => ['void', 'object'=>'object', 'info='=>'mixed'], 'SplObjectStorage::contains' => ['bool', 'object'=>'object'], -'SplObjectStorage::count' => ['int'], +'SplObjectStorage::count' => ['int', 'mode='=>'int'], 'SplObjectStorage::current' => ['object'], 'SplObjectStorage::detach' => ['void', 'object'=>'object'], 'SplObjectStorage::getHash' => ['string', 'object'=>'object'], @@ -12452,18 +12445,18 @@ return [ 'SplObjectStorage::next' => ['void'], 'SplObjectStorage::offsetExists' => ['bool', 'object'=>'object'], 'SplObjectStorage::offsetGet' => ['mixed', 'object'=>'object'], -'SplObjectStorage::offsetSet' => ['object', 'object'=>'object', 'data='=>'mixed'], +'SplObjectStorage::offsetSet' => ['void', 'object'=>'object', 'info='=>'mixed'], 'SplObjectStorage::offsetUnset' => ['void', 'object'=>'object'], -'SplObjectStorage::removeAll' => ['void', 'os'=>'splobjectstorage'], -'SplObjectStorage::removeAllExcept' => ['void', 'os'=>'splobjectstorage'], +'SplObjectStorage::removeAll' => ['int', 'storage'=>'SplObjectStorage'], +'SplObjectStorage::removeAllExcept' => ['int', 'storage'=>'SplObjectStorage'], 'SplObjectStorage::rewind' => ['void'], 'SplObjectStorage::serialize' => ['string'], -'SplObjectStorage::setInfo' => ['void', 'inf'=>'mixed'], -'SplObjectStorage::unserialize' => ['void', 'serialized'=>'string'], +'SplObjectStorage::setInfo' => ['void', 'info'=>'mixed'], +'SplObjectStorage::unserialize' => ['void', 'data'=>'string'], 'SplObjectStorage::valid' => ['bool'], 'SplObserver::update' => ['void', 'subject'=>'SplSubject'], 'SplPriorityQueue::__construct' => ['void'], -'SplPriorityQueue::compare' => ['int', 'a'=>'mixed', 'b'=>'mixed'], +'SplPriorityQueue::compare' => ['int', 'priority1'=>'mixed', 'priority2'=>'mixed'], 'SplPriorityQueue::count' => ['int'], 'SplPriorityQueue::current' => ['mixed'], 'SplPriorityQueue::extract' => ['mixed'], @@ -12486,7 +12479,7 @@ return [ 'SplQueue::next' => ['void'], 'SplQueue::offsetExists' => ['bool', 'index'=>'mixed'], 'SplQueue::offsetGet' => ['mixed', 'index'=>'mixed'], -'SplQueue::offsetSet' => ['void', 'index'=>'mixed', 'newval'=>'mixed'], +'SplQueue::offsetSet' => ['void', 'index'=>'?int', 'value'=>'mixed'], 'SplQueue::offsetUnset' => ['void', 'index'=>'mixed'], 'SplQueue::pop' => ['mixed'], 'SplQueue::prev' => ['void'], @@ -12496,11 +12489,11 @@ return [ 'SplQueue::setIteratorMode' => ['int', 'mode'=>'int'], 'SplQueue::shift' => ['mixed'], 'SplQueue::top' => ['mixed'], -'SplQueue::unserialize' => ['void', 'serialized'=>'string'], +'SplQueue::unserialize' => ['void', 'data'=>'string'], 'SplQueue::unshift' => ['void', 'value'=>'mixed'], 'SplQueue::valid' => ['bool'], 'SplStack::__construct' => ['void'], -'SplStack::add' => ['void', 'index'=>'mixed', 'newval'=>'mixed'], +'SplStack::add' => ['void', 'index'=>'int', 'value'=>'mixed'], 'SplStack::bottom' => ['mixed'], 'SplStack::count' => ['int'], 'SplStack::current' => ['mixed'], @@ -12510,7 +12503,7 @@ return [ 'SplStack::next' => ['void'], 'SplStack::offsetExists' => ['bool', 'index'=>'mixed'], 'SplStack::offsetGet' => ['mixed', 'index'=>'mixed'], -'SplStack::offsetSet' => ['void', 'index'=>'mixed', 'newval'=>'mixed'], +'SplStack::offsetSet' => ['void', 'index'=>'?int', 'value'=>'mixed'], 'SplStack::offsetUnset' => ['void', 'index'=>'mixed'], 'SplStack::pop' => ['mixed'], 'SplStack::prev' => ['void'], @@ -12520,7 +12513,7 @@ return [ 'SplStack::setIteratorMode' => ['int', 'mode'=>'int'], 'SplStack::shift' => ['mixed'], 'SplStack::top' => ['mixed'], -'SplStack::unserialize' => ['void', 'serialized'=>'string'], +'SplStack::unserialize' => ['void', 'data'=>'string'], 'SplStack::unshift' => ['void', 'value'=>'mixed'], 'SplStack::valid' => ['bool'], 'SplSubject::attach' => ['void', 'observer'=>'SplObserver'], @@ -12551,7 +12544,7 @@ return [ 'SplTempFileObject::getCTime' => ['int|false'], 'SplTempFileObject::getCurrentLine' => ['string'], 'SplTempFileObject::getExtension' => ['string'], -'SplTempFileObject::getFileInfo' => ['SplFileInfo', 'class='=>'?string'], +'SplTempFileObject::getFileInfo' => ['SplFileInfo', 'class='=>'?class-string'], 'SplTempFileObject::getFilename' => ['string'], 'SplTempFileObject::getFlags' => ['int'], 'SplTempFileObject::getGroup' => ['int|false'], @@ -12561,7 +12554,7 @@ return [ 'SplTempFileObject::getMTime' => ['int|false'], 'SplTempFileObject::getOwner' => ['int|false'], 'SplTempFileObject::getPath' => ['string'], -'SplTempFileObject::getPathInfo' => ['SplFileInfo|null', 'class='=>'?string'], +'SplTempFileObject::getPathInfo' => ['SplFileInfo|null', 'class='=>'?class-string'], 'SplTempFileObject::getPathname' => ['string'], 'SplTempFileObject::getPerms' => ['int|false'], 'SplTempFileObject::getRealPath' => ['false|string'], @@ -12580,9 +12573,9 @@ return [ 'SplTempFileObject::rewind' => ['void'], 'SplTempFileObject::seek' => ['void', 'line'=>'int'], 'SplTempFileObject::setCsvControl' => ['void', 'separator='=>'string', 'enclosure='=>'string', 'escape='=>'string'], -'SplTempFileObject::setFileClass' => ['void', 'class='=>'string'], +'SplTempFileObject::setFileClass' => ['void', 'class='=>'class-string'], 'SplTempFileObject::setFlags' => ['void', 'flags'=>'int'], -'SplTempFileObject::setInfoClass' => ['void', 'class='=>'string'], +'SplTempFileObject::setInfoClass' => ['void', 'class='=>'class-string'], 'SplTempFileObject::setMaxLineLen' => ['void', 'maxLength'=>'int'], 'SplTempFileObject::valid' => ['bool'], 'SplType::__construct' => ['void', 'initial_value='=>'mixed', 'strict='=>'bool'], @@ -14271,7 +14264,7 @@ return [ 'uopz_get_hook\'1' => ['?Closure', 'function'=>'string'], 'uopz_get_mock' => ['string|object|null', 'class'=>'string'], 'uopz_get_property' => ['mixed', 'class'=>'object|string', 'property'=>'string'], -'uopz_get_return' => ['mixed', 'class='=>'string', 'function='=>'string'], +'uopz_get_return' => ['mixed', 'class='=>'class-string', 'function='=>'string'], 'uopz_get_static' => ['?array', 'class'=>'string', 'function'=>'string'], 'uopz_implement' => ['bool', 'class'=>'string', 'interface'=>'string'], 'uopz_overload' => ['void', 'opcode'=>'int', 'callable'=>'Callable'], @@ -14293,7 +14286,7 @@ return [ 'uopz_unset_hook' => ['bool', 'class'=>'string', 'function'=>'string'], 'uopz_unset_hook\'1' => ['bool', 'function'=>'string'], 'uopz_unset_mock' => ['void', 'class'=>'string'], -'uopz_unset_return' => ['bool', 'class='=>'string', 'function='=>'string'], +'uopz_unset_return' => ['bool', 'class='=>'class-string', 'function='=>'string'], 'uopz_unset_return\'1' => ['bool', 'function'=>'string'], 'urldecode' => ['string', 'string'=>'string'], 'urlencode' => ['string', 'string'=>'string'], diff --git a/vendor/vimeo/psalm/dictionaries/CallMap_80_delta.php b/vendor/vimeo/psalm/dictionaries/CallMap_80_delta.php index b2cc5c42..89b4bdfc 100644 --- a/vendor/vimeo/psalm/dictionaries/CallMap_80_delta.php +++ b/vendor/vimeo/psalm/dictionaries/CallMap_80_delta.php @@ -41,9 +41,9 @@ return [ 'old' => ['int|false'], 'new' => ['int'], ], - 'DateTime::diff' => [ - 'old' => ['DateInterval|false', 'datetime2'=>'DateTimeInterface', 'absolute='=>'bool'], - 'new' => ['DateInterval', 'datetime2'=>'DateTimeInterface', 'absolute='=>'bool'], + 'CURLFile::__construct' => [ + 'old' => ['void', 'filename'=>'string', 'mime_type='=>'string', 'posted_filename='=>'string'], + 'new' => ['void', 'filename'=>'string', 'mime_type='=>'?string', 'posted_filename='=>'?string'], ], 'DateTime::format' => [ 'old' => ['string|false', 'format'=>'string'], @@ -53,10 +53,6 @@ return [ 'old' => ['int|false'], 'new' => ['int'], ], - 'DateTime::setTime' => [ - 'old' => ['static|false', 'hour'=>'int', 'minute'=>'int', 'second='=>'int', 'microseconds='=>'int'], - 'new' => ['static', 'hour'=>'int', 'minute'=>'int', 'second='=>'int', 'microseconds='=>'int'], - ], 'DateTimeInterface::getTimestamp' => [ 'old' => ['int|false'], 'new' => ['int'], @@ -81,14 +77,58 @@ return [ 'old' => ['void', 'dir_handle='=>'resource'], 'new' => ['void'], ], + 'DirectoryIterator::getFileInfo' => [ + 'old' => ['SplFileInfo', 'class='=>'class-string'], + 'new' => ['SplFileInfo', 'class='=>'?class-string'], + ], + 'DirectoryIterator::getPathInfo' => [ + 'old' => ['?SplFileInfo', 'class='=>'class-string'], + 'new' => ['?SplFileInfo', 'class='=>'?class-string'], + ], + 'DirectoryIterator::openFile' => [ + 'old' => ['SplFileObject', 'mode='=>'string', 'useIncludePath='=>'bool', 'context='=>'resource'], + 'new' => ['SplFileObject', 'mode='=>'string', 'useIncludePath='=>'bool', 'context='=>'?resource'], + ], + 'DOMDocument::getElementsByTagNameNS' => [ + 'old' => ['DOMNodeList', 'namespace'=>'string', 'localName'=>'string'], + 'new' => ['DOMNodeList', 'namespace'=>'?string', 'localName'=>'string'], + ], + 'DOMImplementation::createDocument' => [ + 'old' => ['DOMDocument|false', 'namespace='=>'string', 'qualifiedName='=>'string', 'doctype='=>'DOMDocumentType'], + 'new' => ['DOMDocument|false', 'namespace='=>'?string', 'qualifiedName='=>'string', 'doctype='=>'?DOMDocumentType'], + ], 'ErrorException::__construct' => [ 'old' => ['void', 'message='=>'string', 'code='=>'int', 'severity='=>'int', 'filename='=>'string', 'line='=>'int', 'previous='=>'?Throwable'], 'new' => ['void', 'message='=>'string', 'code='=>'int', 'severity='=>'int', 'filename='=>'?string', 'line='=>'?int', 'previous='=>'?Throwable'], ], + 'FilesystemIterator::getFileInfo' => [ + 'old' => ['SplFileInfo', 'class='=>'class-string'], + 'new' => ['SplFileInfo', 'class='=>'?class-string'], + ], + 'FilesystemIterator::getPathInfo' => [ + 'old' => ['?SplFileInfo', 'class='=>'class-string'], + 'new' => ['?SplFileInfo', 'class='=>'?class-string'], + ], + 'FilesystemIterator::openFile' => [ + 'old' => ['SplFileObject', 'mode='=>'string', 'useIncludePath='=>'bool', 'context='=>'resource'], + 'new' => ['SplFileObject', 'mode='=>'string', 'useIncludePath='=>'bool', 'context='=>'?resource'], + ], 'finfo::__construct' => [ 'old' => ['void', 'flags='=>'int', 'magic_database='=>'string'], 'new' => ['void', 'flags='=>'int', 'magic_database='=>'?string'], ], + 'GlobIterator::getFileInfo' => [ + 'old' => ['SplFileInfo', 'class='=>'class-string'], + 'new' => ['SplFileInfo', 'class='=>'?class-string'], + ], + 'GlobIterator::getPathInfo' => [ + 'old' => ['?SplFileInfo', 'class='=>'class-string'], + 'new' => ['?SplFileInfo', 'class='=>'?class-string'], + ], + 'GlobIterator::openFile' => [ + 'old' => ['SplFileObject', 'mode='=>'string', 'useIncludePath='=>'bool', 'context='=>'resource'], + 'new' => ['SplFileObject', 'mode='=>'string', 'useIncludePath='=>'bool', 'context='=>'?resource'], + ], 'IntlDateFormatter::__construct' => [ 'old' => ['void', 'locale'=>'?string', 'datetype'=>'null|int', 'timetype'=>'null|int', 'timezone='=>'IntlTimeZone|DateTimeZone|string|null', 'calendar='=>'IntlCalendar|int|null', 'pattern='=>'?string'], 'new' => ['void', 'locale'=>'?string', 'dateType'=>'int', 'timeType'=>'int', 'timezone='=>'IntlTimeZone|DateTimeZone|string|null', 'calendar='=>'IntlCalendar|int|null', 'pattern='=>'?string'], @@ -153,6 +193,10 @@ return [ 'old' => ['null|false', 'zone'=>'IntlTimeZone|DateTimeZone|string|null'], 'new' => ['null|false', 'timezone'=>'IntlTimeZone|DateTimeZone|string|null'], ], + 'IntlTimeZone::getIDForWindowsID' => [ + 'old' => ['string|false', 'timezoneId'=>'string', 'region='=>'string'], + 'new' => ['string|false', 'timezoneId'=>'string', 'region='=>'?string'], + ], 'Locale::getDisplayLanguage' => [ 'old' => ['string', 'locale'=>'string', 'displayLocale='=>'string'], 'new' => ['string', 'locale'=>'string', 'displayLocale='=>'?string'], @@ -209,21 +253,17 @@ return [ 'old' => ['bool', 'mode'=>'int'], 'new' => ['bool', 'mode'=>'int', '...args='=>'mixed'], ], - 'PharData::compress' => [ - 'old' => ['?PharData', 'compression'=>'int', 'extension='=>'string'], - 'new' => ['?PharData', 'compression'=>'int', 'extension='=>'?string'], + 'Phar::addFile' => [ + 'old' => ['void', 'filename'=>'string', 'localName='=>'string'], + 'new' => ['void', 'filename'=>'string', 'localName='=>'?string'], ], - 'PharData::convertToData' => [ - 'old' => ['?PharData', 'format='=>'int', 'compression='=>'int', 'extension='=>'string'], - 'new' => ['?PharData', 'format='=>'?int', 'compression='=>'?int', 'extension='=>'?string'], + 'Phar::buildFromIterator' => [ + 'old' => ['array|false', 'iterator'=>'Traversable', 'baseDirectory='=>'string'], + 'new' => ['array|false', 'iterator'=>'Traversable', 'baseDirectory='=>'?string'], ], - 'PharData::convertToExecutable' => [ - 'old' => ['?Phar', 'format='=>'int', 'compression='=>'int', 'extension='=>'string'], - 'new' => ['?Phar', 'format='=>'?int', 'compression='=>'?int', 'extension='=>'?string'], - ], - 'PharData::decompress' => [ - 'old' => ['?PharData', 'extension='=>'string'], - 'new' => ['?PharData', 'extension='=>'?string'], + 'Phar::createDefaultStub' => [ + 'old' => ['string', 'index='=>'string', 'webIndex='=>'string'], + 'new' => ['string', 'index='=>'?string', 'webIndex='=>'?string'], ], 'Phar::compress' => [ 'old' => ['?Phar', 'compression'=>'int', 'extension='=>'string'], @@ -245,10 +285,70 @@ return [ 'old' => ['mixed'], 'new' => ['mixed', 'unserializeOptions='=>'array'], ], + 'Phar::setDefaultStub' => [ + 'old' => ['bool', 'index='=>'?string', 'webIndex='=>'string'], + 'new' => ['bool', 'index='=>'?string', 'webIndex='=>'?string'], + ], + 'Phar::setSignatureAlgorithm' => [ + 'old' => ['void', 'algo'=>'int', 'privateKey='=>'string'], + 'new' => ['void', 'algo'=>'int', 'privateKey='=>'?string'], + ], + 'Phar::webPhar' => [ + 'old' => ['void', 'alias='=>'?string', 'index='=>'?string', 'fileNotFoundScript='=>'string', 'mimeTypes='=>'array', 'rewrite='=>'callable'], + 'new' => ['void', 'alias='=>'?string', 'index='=>'?string', 'fileNotFoundScript='=>'?string', 'mimeTypes='=>'array', 'rewrite='=>'?callable'], + ], + 'PharData::addFile' => [ + 'old' => ['void', 'filename'=>'string', 'localName='=>'string'], + 'new' => ['void', 'filename'=>'string', 'localName='=>'?string'], + ], + 'PharData::buildFromIterator' => [ + 'old' => ['array|false', 'iterator'=>'Traversable', 'baseDirectory='=>'string'], + 'new' => ['array|false', 'iterator'=>'Traversable', 'baseDirectory='=>'?string'], + ], + 'PharData::compress' => [ + 'old' => ['?PharData', 'compression'=>'int', 'extension='=>'string'], + 'new' => ['?PharData', 'compression'=>'int', 'extension='=>'?string'], + ], + 'PharData::convertToData' => [ + 'old' => ['?PharData', 'format='=>'int', 'compression='=>'int', 'extension='=>'string'], + 'new' => ['?PharData', 'format='=>'?int', 'compression='=>'?int', 'extension='=>'?string'], + ], + 'PharData::convertToExecutable' => [ + 'old' => ['?Phar', 'format='=>'int', 'compression='=>'int', 'extension='=>'string'], + 'new' => ['?Phar', 'format='=>'?int', 'compression='=>'?int', 'extension='=>'?string'], + ], + 'PharData::decompress' => [ + 'old' => ['?PharData', 'extension='=>'string'], + 'new' => ['?PharData', 'extension='=>'?string'], + ], + 'PharData::setDefaultStub' => [ + 'old' => ['bool', 'index='=>'?string', 'webIndex='=>'string'], + 'new' => ['bool', 'index='=>'?string', 'webIndex='=>'?string'], + ], + 'PharData::setSignatureAlgorithm' => [ + 'old' => ['void', 'algo'=>'int', 'privateKey='=>'string'], + 'new' => ['void', 'algo'=>'int', 'privateKey='=>'?string'], + ], 'PharFileInfo::getMetadata' => [ 'old' => ['mixed'], 'new' => ['mixed', 'unserializeOptions='=>'array'], ], + 'PharFileInfo::isCompressed' => [ + 'old' => ['bool', 'compression='=>'int'], + 'new' => ['bool', 'compression='=>'?int'], + ], + 'RecursiveDirectoryIterator::getFileInfo' => [ + 'old' => ['SplFileInfo', 'class='=>'class-string'], + 'new' => ['SplFileInfo', 'class='=>'?class-string'], + ], + 'RecursiveDirectoryIterator::getPathInfo' => [ + 'old' => ['?SplFileInfo', 'class='=>'class-string'], + 'new' => ['?SplFileInfo', 'class='=>'?class-string'], + ], + 'RecursiveDirectoryIterator::openFile' => [ + 'old' => ['SplFileObject', 'mode='=>'string', 'useIncludePath='=>'bool', 'context='=>'resource'], + 'new' => ['SplFileObject', 'mode='=>'string', 'useIncludePath='=>'bool', 'context='=>'?resource'], + ], 'RecursiveIteratorIterator::getSubIterator' => [ 'old' => ['?RecursiveIterator', 'level='=>'int'], 'new' => ['?RecursiveIterator', 'level='=>'?int'], @@ -282,36 +382,36 @@ return [ 'new' => ['mixed', 'object='=>'null|object'], ], 'SplFileInfo::getFileInfo' => [ - 'old' => ['SplFileInfo', 'class='=>'string'], - 'new' => ['SplFileInfo', 'class='=>'?string'], + 'old' => ['SplFileInfo', 'class='=>'class-string'], + 'new' => ['SplFileInfo', 'class='=>'?class-string'], ], 'SplFileInfo::getPathInfo' => [ - 'old' => ['SplFileInfo|null', 'class='=>'string'], - 'new' => ['SplFileInfo|null', 'class='=>'?string'], + 'old' => ['SplFileInfo|null', 'class='=>'class-string'], + 'new' => ['SplFileInfo|null', 'class='=>'?class-string'], ], 'SplFileInfo::openFile' => [ 'old' => ['SplFileObject', 'mode='=>'string', 'useIncludePath='=>'bool', 'context='=>'resource'], 'new' => ['SplFileObject', 'mode='=>'string', 'useIncludePath='=>'bool', 'context='=>'?resource'], ], 'SplFileObject::getFileInfo' => [ - 'old' => ['SplFileInfo', 'class='=>'string'], - 'new' => ['SplFileInfo', 'class='=>'?string'], + 'old' => ['SplFileInfo', 'class='=>'class-string'], + 'new' => ['SplFileInfo', 'class='=>'?class-string'], ], 'SplFileObject::getPathInfo' => [ - 'old' => ['SplFileInfo|null', 'class='=>'string'], - 'new' => ['SplFileInfo|null', 'class='=>'?string'], + 'old' => ['SplFileInfo|null', 'class='=>'class-string'], + 'new' => ['SplFileInfo|null', 'class='=>'?class-string'], ], 'SplFileObject::openFile' => [ 'old' => ['SplFileObject', 'mode='=>'string', 'useIncludePath='=>'bool', 'context='=>'resource'], 'new' => ['SplFileObject', 'mode='=>'string', 'useIncludePath='=>'bool', 'context='=>'?resource'], ], 'SplTempFileObject::getFileInfo' => [ - 'old' => ['SplFileInfo', 'class='=>'string'], - 'new' => ['SplFileInfo', 'class='=>'?string'], + 'old' => ['SplFileInfo', 'class='=>'class-string'], + 'new' => ['SplFileInfo', 'class='=>'?class-string'], ], 'SplTempFileObject::getPathInfo' => [ - 'old' => ['SplFileInfo|null', 'class='=>'string'], - 'new' => ['SplFileInfo|null', 'class='=>'?string'], + 'old' => ['SplFileInfo|null', 'class='=>'class-string'], + 'new' => ['SplFileInfo|null', 'class='=>'?class-string'], ], 'SplTempFileObject::openFile' => [ 'old' => ['SplTempFileObject', 'mode='=>'string', 'useIncludePath='=>'bool', 'context='=>'resource'], @@ -390,40 +490,40 @@ return [ 'new' => ['array', 'array'=>'array', 'column_key'=>'int|string|null', 'index_key='=>'int|string|null'], ], 'array_combine' => [ - 'old' => ['associative-array|false', 'keys'=>'string[]|int[]', 'values'=>'array'], - 'new' => ['associative-array', 'keys'=>'string[]|int[]', 'values'=>'array'], + 'old' => ['array|false', 'keys'=>'string[]|int[]', 'values'=>'array'], + 'new' => ['array', 'keys'=>'string[]|int[]', 'values'=>'array'], ], 'array_diff' => [ - 'old' => ['associative-array', 'array'=>'array', '...arrays'=>'array'], - 'new' => ['associative-array', 'array'=>'array', '...arrays='=>'array'], + 'old' => ['array', 'array'=>'array', '...arrays'=>'array'], + 'new' => ['array', 'array'=>'array', '...arrays='=>'array'], ], 'array_diff_assoc' => [ - 'old' => ['associative-array', 'array'=>'array', '...arrays'=>'array'], - 'new' => ['associative-array', 'array'=>'array', '...arrays='=>'array'], + 'old' => ['array', 'array'=>'array', '...arrays'=>'array'], + 'new' => ['array', 'array'=>'array', '...arrays='=>'array'], ], 'array_diff_key' => [ - 'old' => ['associative-array', 'array'=>'array', '...arrays'=>'array'], - 'new' => ['associative-array', 'array'=>'array', '...arrays='=>'array'], + 'old' => ['array', 'array'=>'array', '...arrays'=>'array'], + 'new' => ['array', 'array'=>'array', '...arrays='=>'array'], ], 'array_filter' => [ - 'old' => ['associative-array', 'array'=>'array', 'callback='=>'callable(mixed,mixed=):scalar', 'mode='=>'int'], - 'new' => ['associative-array', 'array'=>'array', 'callback='=>'callable(mixed,mixed=):scalar|null', 'mode='=>'int'], + 'old' => ['array', 'array'=>'array', 'callback='=>'callable(mixed,mixed=):scalar', 'mode='=>'int'], + 'new' => ['array', 'array'=>'array', 'callback='=>'callable(mixed,mixed=):scalar|null', 'mode='=>'int'], ], 'array_key_exists' => [ 'old' => ['bool', 'key'=>'string|int', 'array'=>'array|object'], 'new' => ['bool', 'key'=>'string|int', 'array'=>'array'], ], 'array_intersect' => [ - 'old' => ['associative-array', 'array'=>'array', '...arrays'=>'array'], - 'new' => ['associative-array', 'array'=>'array', '...arrays='=>'array'], + 'old' => ['array', 'array'=>'array', '...arrays'=>'array'], + 'new' => ['array', 'array'=>'array', '...arrays='=>'array'], ], 'array_intersect_assoc' => [ - 'old' => ['associative-array', 'array'=>'array', '...arrays'=>'array'], - 'new' => ['associative-array', 'array'=>'array', '...arrays='=>'array'], + 'old' => ['array', 'array'=>'array', '...arrays'=>'array'], + 'new' => ['array', 'array'=>'array', '...arrays='=>'array'], ], 'array_intersect_key' => [ - 'old' => ['associative-array', 'array'=>'array', '...arrays'=>'array'], - 'new' => ['associative-array', 'array'=>'array', '...arrays='=>'array'], + 'old' => ['array', 'array'=>'array', '...arrays'=>'array'], + 'new' => ['array', 'array'=>'array', '...arrays='=>'array'], ], 'array_splice' => [ 'old' => ['array', '&rw_array'=>'array', 'offset'=>'int', 'length='=>'int', 'replacement='=>'array|string'], @@ -497,6 +597,10 @@ return [ 'old' => ['int<0, max>', 'value'=>'Countable|array|SimpleXMLElement', 'mode='=>'int'], 'new' => ['int<0, max>', 'value'=>'Countable|array', 'mode='=>'int'], ], + 'sizeof' => [ + 'old' => ['int<0, max>', 'value'=>'Countable|array|SimpleXMLElement', 'mode='=>'int'], + 'new' => ['int<0, max>', 'value'=>'Countable|array', 'mode='=>'int'], + ], 'count_chars' => [ 'old' => ['array|false', 'input'=>'string', 'mode='=>'0|1|2'], 'new' => ['array', 'input'=>'string', 'mode='=>'0|1|2'], diff --git a/vendor/vimeo/psalm/dictionaries/CallMap_81_delta.php b/vendor/vimeo/psalm/dictionaries/CallMap_81_delta.php index 6d76650b..ded1f5e4 100644 --- a/vendor/vimeo/psalm/dictionaries/CallMap_81_delta.php +++ b/vendor/vimeo/psalm/dictionaries/CallMap_81_delta.php @@ -66,6 +66,26 @@ return [ 'old' => ['DOMDocumentFragment|false'], 'new' => ['DOMDocumentFragment'], ], + 'DOMDocument::createTextNode' => [ + 'old' => ['DOMText|false', 'data'=>'string'], + 'new' => ['DOMText', 'data'=>'string'], + ], + 'Phar::buildFromDirectory' => [ + 'old' => ['array|false', 'directory'=>'string', 'pattern='=>'string'], + 'new' => ['array', 'directory'=>'string', 'pattern='=>'string'], + ], + 'Phar::buildFromIterator' => [ + 'old' => ['array|false', 'iterator'=>'Traversable', 'baseDirectory='=>'?string'], + 'new' => ['array', 'iterator'=>'Traversable', 'baseDirectory='=>'?string'], + ], + 'PharData::buildFromDirectory' => [ + 'old' => ['array|false', 'directory'=>'string', 'pattern='=>'string'], + 'new' => ['array', 'directory'=>'string', 'pattern='=>'string'], + ], + 'PharData::buildFromIterator' => [ + 'old' => ['array|false', 'iterator'=>'Traversable', 'baseDirectory='=>'?string'], + 'new' => ['array', 'iterator'=>'Traversable', 'baseDirectory='=>'?string'], + ], 'SplFileObject::fputcsv' => [ 'old' => ['int|false', 'fields'=>'array', 'separator='=>'string', 'enclosure='=>'string', 'escape='=>'string'], 'new' => ['int|false', 'fields'=>'array', 'separator='=>'string', 'enclosure='=>'string', 'escape='=>'string', 'eol='=>'string'], diff --git a/vendor/vimeo/psalm/dictionaries/CallMap_83_delta.php b/vendor/vimeo/psalm/dictionaries/CallMap_83_delta.php new file mode 100644 index 00000000..2d27020d --- /dev/null +++ b/vendor/vimeo/psalm/dictionaries/CallMap_83_delta.php @@ -0,0 +1,32 @@ + [ + 'json_validate' => ['bool', 'json'=>'string', 'depth='=>'positive-int', 'flags='=>'int'], + ], + + 'changed' => [ + 'gc_status' => [ + 'old' => ['array{runs:int,collected:int,threshold:int,roots:int}'], + 'new' => ['array{runs:int,collected:int,threshold:int,roots:int,running:bool,protected:bool,full:bool,buffer_size:int}'], + ], + ], + + 'removed' => [ + ], +]; diff --git a/vendor/vimeo/psalm/dictionaries/CallMap_historical.php b/vendor/vimeo/psalm/dictionaries/CallMap_historical.php index b5727394..2b14a8a5 100644 --- a/vendor/vimeo/psalm/dictionaries/CallMap_historical.php +++ b/vendor/vimeo/psalm/dictionaries/CallMap_historical.php @@ -215,50 +215,50 @@ return [ 'ArrayAccess::offsetUnset' => ['void', 'offset'=>'mixed'], 'ArrayIterator::__construct' => ['void', 'array='=>'array|object', 'flags='=>'int'], 'ArrayIterator::append' => ['void', 'value'=>'mixed'], - 'ArrayIterator::asort' => ['void'], + 'ArrayIterator::asort' => ['true', 'flags='=>'int'], 'ArrayIterator::count' => ['int'], 'ArrayIterator::current' => ['mixed'], 'ArrayIterator::getArrayCopy' => ['array'], 'ArrayIterator::getFlags' => ['int'], 'ArrayIterator::key' => ['int|string|null'], - 'ArrayIterator::ksort' => ['void'], + 'ArrayIterator::ksort' => ['true', 'flags='=>'int'], 'ArrayIterator::natcasesort' => ['true'], 'ArrayIterator::natsort' => ['true'], 'ArrayIterator::next' => ['void'], - 'ArrayIterator::offsetExists' => ['bool', 'index'=>'string|int'], - 'ArrayIterator::offsetGet' => ['mixed', 'index'=>'string|int'], - 'ArrayIterator::offsetSet' => ['void', 'index'=>'string|int', 'newval'=>'mixed'], - 'ArrayIterator::offsetUnset' => ['void', 'index'=>'string|int'], + 'ArrayIterator::offsetExists' => ['bool', 'key'=>'string|int'], + 'ArrayIterator::offsetGet' => ['mixed', 'key'=>'string|int'], + 'ArrayIterator::offsetSet' => ['void', 'key'=>'string|int', 'value'=>'mixed'], + 'ArrayIterator::offsetUnset' => ['void', 'key'=>'string|int'], 'ArrayIterator::rewind' => ['void'], - 'ArrayIterator::seek' => ['void', 'position'=>'int'], + 'ArrayIterator::seek' => ['void', 'offset'=>'int'], 'ArrayIterator::serialize' => ['string'], - 'ArrayIterator::setFlags' => ['void', 'flags'=>'string'], - 'ArrayIterator::uasort' => ['void', 'cmp_function'=>'callable(mixed,mixed):int'], - 'ArrayIterator::uksort' => ['void', 'cmp_function'=>'callable(mixed,mixed):int'], - 'ArrayIterator::unserialize' => ['void', 'serialized'=>'string'], + 'ArrayIterator::setFlags' => ['void', 'flags'=>'int'], + 'ArrayIterator::uasort' => ['true', 'callback'=>'callable(mixed,mixed):int'], + 'ArrayIterator::uksort' => ['true', 'callback'=>'callable(mixed,mixed):int'], + 'ArrayIterator::unserialize' => ['void', 'data'=>'string'], 'ArrayIterator::valid' => ['bool'], - 'ArrayObject::__construct' => ['void', 'input='=>'array|object', 'flags='=>'int', 'iterator_class='=>'string'], + 'ArrayObject::__construct' => ['void', 'array='=>'array|object', 'flags='=>'int', 'iteratorClass='=>'class-string'], 'ArrayObject::append' => ['void', 'value'=>'mixed'], - 'ArrayObject::asort' => ['void'], + 'ArrayObject::asort' => ['true', 'flags='=>'int'], 'ArrayObject::count' => ['int'], - 'ArrayObject::exchangeArray' => ['array', 'ar'=>'mixed'], + 'ArrayObject::exchangeArray' => ['array', 'array'=>'array|object'], 'ArrayObject::getArrayCopy' => ['array'], 'ArrayObject::getFlags' => ['int'], 'ArrayObject::getIterator' => ['ArrayIterator'], 'ArrayObject::getIteratorClass' => ['string'], - 'ArrayObject::ksort' => ['void'], + 'ArrayObject::ksort' => ['true', 'flags='=>'int'], 'ArrayObject::natcasesort' => ['true'], 'ArrayObject::natsort' => ['true'], - 'ArrayObject::offsetExists' => ['bool', 'index'=>'int|string'], - 'ArrayObject::offsetGet' => ['mixed|null', 'index'=>'int|string'], - 'ArrayObject::offsetSet' => ['void', 'index'=>'int|string', 'newval'=>'mixed'], - 'ArrayObject::offsetUnset' => ['void', 'index'=>'int|string'], + 'ArrayObject::offsetExists' => ['bool', 'key'=>'int|string'], + 'ArrayObject::offsetGet' => ['mixed|null', 'key'=>'int|string'], + 'ArrayObject::offsetSet' => ['void', 'key'=>'int|string', 'value'=>'mixed'], + 'ArrayObject::offsetUnset' => ['void', 'key'=>'int|string'], 'ArrayObject::serialize' => ['string'], 'ArrayObject::setFlags' => ['void', 'flags'=>'int'], - 'ArrayObject::setIteratorClass' => ['void', 'iterator_class'=>'string'], - 'ArrayObject::uasort' => ['void', 'cmp_function'=>'callable(mixed,mixed):int'], - 'ArrayObject::uksort' => ['void', 'cmp_function'=>'callable(mixed,mixed):int'], - 'ArrayObject::unserialize' => ['void', 'serialized'=>'string'], + 'ArrayObject::setIteratorClass' => ['void', 'iteratorClass'=>'class-string'], + 'ArrayObject::uasort' => ['true', 'callback'=>'callable(mixed,mixed):int'], + 'ArrayObject::uksort' => ['true', 'callback'=>'callable(mixed,mixed):int'], + 'ArrayObject::unserialize' => ['void', 'data'=>'string'], 'BadFunctionCallException::__clone' => ['void'], 'BadFunctionCallException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable'], 'BadFunctionCallException::__toString' => ['string'], @@ -292,13 +292,13 @@ return [ 'COMPersistHelper::SaveToFile' => ['bool', 'filename'=>'string', 'remember'=>'bool'], 'COMPersistHelper::SaveToStream' => ['int', 'stream'=>''], 'COMPersistHelper::__construct' => ['void', 'variant'=>'object'], - 'CURLFile::__construct' => ['void', 'filename'=>'string', 'mimetype='=>'string', 'postfilename='=>'string'], + 'CURLFile::__construct' => ['void', 'filename'=>'string', 'mime_type='=>'string', 'posted_filename='=>'string'], 'CURLFile::__wakeup' => ['void'], 'CURLFile::getFilename' => ['string'], 'CURLFile::getMimeType' => ['string'], 'CURLFile::getPostFilename' => ['string'], - 'CURLFile::setMimeType' => ['void', 'mime'=>'string'], - 'CURLFile::setPostFilename' => ['void', 'name'=>'string'], + 'CURLFile::setMimeType' => ['void', 'mime_type'=>'string'], + 'CURLFile::setPostFilename' => ['void', 'posted_filename'=>'string'], 'CachingIterator::__construct' => ['void', 'iterator'=>'Iterator', 'flags='=>''], 'CachingIterator::__toString' => ['string'], 'CachingIterator::count' => ['int'], @@ -309,14 +309,14 @@ return [ 'CachingIterator::hasNext' => ['bool'], 'CachingIterator::key' => ['int|string|float|bool'], 'CachingIterator::next' => ['void'], - 'CachingIterator::offsetExists' => ['bool', 'index'=>'string'], - 'CachingIterator::offsetGet' => ['mixed', 'index'=>'string'], - 'CachingIterator::offsetSet' => ['void', 'index'=>'string', 'newval'=>'mixed'], - 'CachingIterator::offsetUnset' => ['void', 'index'=>'string'], + 'CachingIterator::offsetExists' => ['bool', 'key'=>'string'], + 'CachingIterator::offsetGet' => ['mixed', 'key'=>'string'], + 'CachingIterator::offsetSet' => ['void', 'key'=>'string', 'value'=>'mixed'], + 'CachingIterator::offsetUnset' => ['void', 'key'=>'string'], 'CachingIterator::rewind' => ['void'], 'CachingIterator::setFlags' => ['void', 'flags'=>'int'], 'CachingIterator::valid' => ['bool'], - 'CallbackFilterIterator::__construct' => ['void', 'iterator'=>'Iterator', 'func'=>'callable(mixed):bool|callable(mixed,mixed):bool|callable(mixed,mixed,mixed):bool'], + 'CallbackFilterIterator::__construct' => ['void', 'iterator'=>'Iterator', 'callback'=>'callable(mixed,mixed=,mixed=):bool'], 'CallbackFilterIterator::accept' => ['bool'], 'CallbackFilterIterator::current' => ['mixed'], 'CallbackFilterIterator::getInnerIterator' => ['Iterator'], @@ -339,19 +339,19 @@ return [ 'Closure::bindTo' => ['?Closure', 'newThis'=>'?object', 'newScope='=>'object|string|null'], 'Closure::call' => ['mixed', 'newThis'=>'object', '...args='=>'mixed'], 'Collator::__construct' => ['void', 'locale'=>'string'], - 'Collator::asort' => ['bool', '&rw_arr'=>'array', 'sort_flag='=>'int'], + 'Collator::asort' => ['bool', '&rw_array'=>'array', 'flags='=>'int'], 'Collator::compare' => ['int|false', 'string1'=>'string', 'string2'=>'string'], 'Collator::create' => ['?Collator', 'locale'=>'string'], - 'Collator::getAttribute' => ['int|false', 'attr'=>'int'], + 'Collator::getAttribute' => ['int|false', 'attribute'=>'int'], 'Collator::getErrorCode' => ['int'], 'Collator::getErrorMessage' => ['string'], 'Collator::getLocale' => ['string', 'type'=>'int'], 'Collator::getSortKey' => ['string|false', 'string'=>'string'], 'Collator::getStrength' => ['int|false'], - 'Collator::setAttribute' => ['bool', 'attr'=>'int', 'value'=>'int'], + 'Collator::setAttribute' => ['bool', 'attribute'=>'int', 'value'=>'int'], 'Collator::setStrength' => ['bool', 'strength'=>'int'], - 'Collator::sort' => ['bool', '&rw_arr'=>'array', 'sort_flags='=>'int'], - 'Collator::sortWithSortKeys' => ['bool', '&rw_arr'=>'array'], + 'Collator::sort' => ['bool', '&rw_array'=>'array', 'flags='=>'int'], + 'Collator::sortWithSortKeys' => ['bool', '&rw_array'=>'array'], 'Collectable::isGarbage' => ['bool'], 'Collectable::setGarbage' => ['void'], 'Cond::broadcast' => ['bool', 'condition'=>'long'], @@ -701,44 +701,44 @@ return [ 'DOMAttr::getNodePath' => ['?string'], 'DOMAttr::hasAttributes' => ['bool'], 'DOMAttr::hasChildNodes' => ['bool'], - 'DOMAttr::insertBefore' => ['DOMNode', 'newnode'=>'DOMNode', 'refnode='=>'DOMNode'], - 'DOMAttr::isDefaultNamespace' => ['bool', 'namespaceuri'=>'string'], + 'DOMAttr::insertBefore' => ['DOMNode|false', 'node'=>'DOMNode', 'child='=>'?DOMNode'], + 'DOMAttr::isDefaultNamespace' => ['bool', 'namespace'=>'string'], 'DOMAttr::isId' => ['bool'], - 'DOMAttr::isSameNode' => ['bool', 'node'=>'DOMNode'], + 'DOMAttr::isSameNode' => ['bool', 'otherNode'=>'DOMNode'], 'DOMAttr::isSupported' => ['bool', 'feature'=>'string', 'version'=>'string'], 'DOMAttr::lookupNamespaceUri' => ['string|null', 'prefix'=>'string|null'], - 'DOMAttr::lookupPrefix' => ['string|null', 'namespaceuri'=>'string'], + 'DOMAttr::lookupPrefix' => ['string|null', 'namespace'=>'string'], 'DOMAttr::normalize' => ['void'], - 'DOMAttr::removeChild' => ['DOMNode', 'oldnode'=>'DOMNode'], - 'DOMAttr::replaceChild' => ['DOMNode', 'newnode'=>'DOMNode', 'oldnode'=>'DOMNode'], - 'DOMCdataSection::__construct' => ['void', 'value'=>'string'], + 'DOMAttr::removeChild' => ['DOMNode|false', 'child'=>'DOMNode'], + 'DOMAttr::replaceChild' => ['DOMNode|false', 'node'=>'DOMNode', 'child'=>'DOMNode'], + 'DOMCdataSection::__construct' => ['void', 'data'=>'string'], 'DOMCharacterData::appendData' => ['true', 'data'=>'string'], 'DOMCharacterData::deleteData' => ['bool', 'offset'=>'int', 'count'=>'int'], 'DOMCharacterData::insertData' => ['bool', 'offset'=>'int', 'data'=>'string'], 'DOMCharacterData::replaceData' => ['bool', 'offset'=>'int', 'count'=>'int', 'data'=>'string'], 'DOMCharacterData::substringData' => ['string', 'offset'=>'int', 'count'=>'int'], - 'DOMComment::__construct' => ['void', 'value='=>'string'], + 'DOMComment::__construct' => ['void', 'data='=>'string'], 'DOMDocument::__construct' => ['void', 'version='=>'string', 'encoding='=>'string'], - 'DOMDocument::createAttribute' => ['DOMAttr|false', 'name'=>'string'], - 'DOMDocument::createAttributeNS' => ['DOMAttr|false', 'namespaceuri'=>'string|null', 'qualifiedname'=>'string'], + 'DOMDocument::createAttribute' => ['DOMAttr|false', 'localName'=>'string'], + 'DOMDocument::createAttributeNS' => ['DOMAttr|false', 'namespace'=>'string|null', 'qualifiedName'=>'string'], 'DOMDocument::createCDATASection' => ['DOMCDATASection|false', 'data'=>'string'], 'DOMDocument::createComment' => ['DOMComment|false', 'data'=>'string'], 'DOMDocument::createDocumentFragment' => ['DOMDocumentFragment|false'], - 'DOMDocument::createElement' => ['DOMElement|false', 'name'=>'string', 'value='=>'string'], - 'DOMDocument::createElementNS' => ['DOMElement|false', 'namespaceuri'=>'string|null', 'qualifiedname'=>'string', 'value='=>'string'], + 'DOMDocument::createElement' => ['DOMElement|false', 'localName'=>'string', 'value='=>'string'], + 'DOMDocument::createElementNS' => ['DOMElement|false', 'namespace'=>'string|null', 'qualifiedName'=>'string', 'value='=>'string'], 'DOMDocument::createEntityReference' => ['DOMEntityReference|false', 'name'=>'string'], 'DOMDocument::createProcessingInstruction' => ['DOMProcessingInstruction|false', 'target'=>'string', 'data='=>'string'], - 'DOMDocument::createTextNode' => ['DOMText|false', 'content'=>'string'], - 'DOMDocument::getElementById' => ['?DOMElement', 'elementid'=>'string'], - 'DOMDocument::getElementsByTagName' => ['DOMNodeList', 'name'=>'string'], - 'DOMDocument::getElementsByTagNameNS' => ['DOMNodeList', 'namespaceuri'=>'string|null', 'localname'=>'string'], - 'DOMDocument::importNode' => ['DOMNode|false', 'importednode'=>'DOMNode', 'deep='=>'bool'], + 'DOMDocument::createTextNode' => ['DOMText|false', 'data'=>'string'], + 'DOMDocument::getElementById' => ['?DOMElement', 'elementId'=>'string'], + 'DOMDocument::getElementsByTagName' => ['DOMNodeList', 'qualifiedName'=>'string'], + 'DOMDocument::getElementsByTagNameNS' => ['DOMNodeList', 'namespace'=>'string', 'localName'=>'string'], + 'DOMDocument::importNode' => ['DOMNode|false', 'node'=>'DOMNode', 'deep='=>'bool'], 'DOMDocument::load' => ['DOMDocument|bool', 'filename'=>'string', 'options='=>'int'], 'DOMDocument::loadHTML' => ['bool', 'source'=>'non-empty-string', 'options='=>'int'], 'DOMDocument::loadHTMLFile' => ['bool', 'filename'=>'string', 'options='=>'int'], 'DOMDocument::loadXML' => ['DOMDocument|bool', 'source'=>'non-empty-string', 'options='=>'int'], 'DOMDocument::normalizeDocument' => ['void'], - 'DOMDocument::registerNodeClass' => ['bool', 'baseclass'=>'string', 'extendedclass'=>'string'], + 'DOMDocument::registerNodeClass' => ['bool', 'baseClass'=>'string', 'extendedClass'=>'?string'], 'DOMDocument::relaxNGValidate' => ['bool', 'filename'=>'string'], 'DOMDocument::relaxNGValidateSource' => ['bool', 'source'=>'string'], 'DOMDocument::save' => ['int|false', 'filename'=>'string', 'options='=>'int'], @@ -751,70 +751,70 @@ return [ 'DOMDocument::xinclude' => ['int', 'options='=>'int'], 'DOMDocumentFragment::__construct' => ['void'], 'DOMDocumentFragment::appendXML' => ['bool', 'data'=>'string'], - 'DOMElement::__construct' => ['void', 'name'=>'string', 'value='=>'string', 'uri='=>'string'], - 'DOMElement::getAttribute' => ['string', 'name'=>'string'], - 'DOMElement::getAttributeNS' => ['string', 'namespaceuri'=>'string|null', 'localname'=>'string'], - 'DOMElement::getAttributeNode' => ['DOMAttr', 'name'=>'string'], - 'DOMElement::getAttributeNodeNS' => ['DOMAttr', 'namespaceuri'=>'string|null', 'localname'=>'string'], - 'DOMElement::getElementsByTagName' => ['DOMNodeList', 'name'=>'string'], - 'DOMElement::getElementsByTagNameNS' => ['DOMNodeList', 'namespaceuri'=>'string|null', 'localname'=>'string'], - 'DOMElement::hasAttribute' => ['bool', 'name'=>'string'], - 'DOMElement::hasAttributeNS' => ['bool', 'namespaceuri'=>'string|null', 'localname'=>'string'], - 'DOMElement::removeAttribute' => ['bool', 'name'=>'string'], - 'DOMElement::removeAttributeNS' => ['bool', 'namespaceuri'=>'string|null', 'localname'=>'string'], - 'DOMElement::removeAttributeNode' => ['bool', 'oldnode'=>'DOMAttr'], - 'DOMElement::setAttribute' => ['DOMAttr|false', 'name'=>'string', 'value'=>'string'], - 'DOMElement::setAttributeNS' => ['void', 'namespaceuri'=>'string|null', 'qualifiedname'=>'string', 'value'=>'string'], + 'DOMElement::__construct' => ['void', 'qualifiedName'=>'string', 'value='=>'?string', 'namespace='=>'string'], + 'DOMElement::getAttribute' => ['string', 'qualifiedName'=>'string'], + 'DOMElement::getAttributeNS' => ['string', 'namespace'=>'string|null', 'localName'=>'string'], + 'DOMElement::getAttributeNode' => ['DOMAttr', 'qualifiedName'=>'string'], + 'DOMElement::getAttributeNodeNS' => ['DOMAttr', 'namespace'=>'string|null', 'localName'=>'string'], + 'DOMElement::getElementsByTagName' => ['DOMNodeList', 'qualifiedName'=>'string'], + 'DOMElement::getElementsByTagNameNS' => ['DOMNodeList', 'namespace'=>'string|null', 'localName'=>'string'], + 'DOMElement::hasAttribute' => ['bool', 'qualifiedName'=>'string'], + 'DOMElement::hasAttributeNS' => ['bool', 'namespace'=>'string|null', 'localName'=>'string'], + 'DOMElement::removeAttribute' => ['bool', 'qualifiedName'=>'string'], + 'DOMElement::removeAttributeNS' => ['void', 'namespace'=>'string|null', 'localName'=>'string'], + 'DOMElement::removeAttributeNode' => ['DOMAttr|false', 'attr'=>'DOMAttr'], + 'DOMElement::setAttribute' => ['DOMAttr|false', 'qualifiedName'=>'string', 'value'=>'string'], + 'DOMElement::setAttributeNS' => ['void', 'namespace'=>'string|null', 'qualifiedName'=>'string', 'value'=>'string'], 'DOMElement::setAttributeNode' => ['?DOMAttr', 'attr'=>'DOMAttr'], 'DOMElement::setAttributeNodeNS' => ['DOMAttr', 'attr'=>'DOMAttr'], - 'DOMElement::setIdAttribute' => ['void', 'name'=>'string', 'isid'=>'bool'], - 'DOMElement::setIdAttributeNS' => ['void', 'namespaceuri'=>'string', 'localname'=>'string', 'isid'=>'bool'], - 'DOMElement::setIdAttributeNode' => ['void', 'attr'=>'DOMAttr', 'isid'=>'bool'], + 'DOMElement::setIdAttribute' => ['void', 'qualifiedName'=>'string', 'isId'=>'bool'], + 'DOMElement::setIdAttributeNS' => ['void', 'namespace'=>'string', 'qualifiedName'=>'string', 'isId'=>'bool'], + 'DOMElement::setIdAttributeNode' => ['void', 'attr'=>'DOMAttr', 'isId'=>'bool'], 'DOMEntityReference::__construct' => ['void', 'name'=>'string'], 'DOMImplementation::__construct' => ['void'], - 'DOMImplementation::createDocument' => ['DOMDocument', 'namespaceuri='=>'string', 'qualifiedname='=>'string', 'doctype='=>'DOMDocumentType'], - 'DOMImplementation::createDocumentType' => ['DOMDocumentType', 'qualifiedname='=>'string', 'publicid='=>'string', 'systemid='=>'string'], + 'DOMImplementation::createDocument' => ['DOMDocument|false', 'namespace='=>'string', 'qualifiedName='=>'string', 'doctype='=>'DOMDocumentType'], + 'DOMImplementation::createDocumentType' => ['DOMDocumentType|false', 'qualifiedName'=>'string', 'publicId='=>'string', 'systemId='=>'string'], 'DOMImplementation::hasFeature' => ['bool', 'feature'=>'string', 'version'=>'string'], 'DOMNamedNodeMap::count' => ['int'], - 'DOMNamedNodeMap::getNamedItem' => ['?DOMNode', 'name'=>'string'], - 'DOMNamedNodeMap::getNamedItemNS' => ['?DOMNode', 'namespaceuri'=>'string', 'localname'=>'string'], + 'DOMNamedNodeMap::getNamedItem' => ['?DOMNode', 'qualifiedName'=>'string'], + 'DOMNamedNodeMap::getNamedItemNS' => ['?DOMNode', 'namespace'=>'?string', 'localName'=>'string'], 'DOMNamedNodeMap::item' => ['?DOMNode', 'index'=>'int'], - 'DOMNode::C14N' => ['string', 'exclusive='=>'bool', 'with_comments='=>'bool', 'xpath='=>'array', 'ns_prefixes='=>'array'], - 'DOMNode::C14NFile' => ['int|false', 'uri='=>'string', 'exclusive='=>'bool', 'with_comments='=>'bool', 'xpath='=>'array', 'ns_prefixes='=>'array'], - 'DOMNode::appendChild' => ['DOMNode', 'newnode'=>'DOMNode'], + 'DOMNode::C14N' => ['string|false', 'exclusive='=>'bool', 'withComments='=>'bool', 'xpath='=>'?array', 'nsPrefixes='=>'?array'], + 'DOMNode::C14NFile' => ['int|false', 'uri'=>'string', 'exclusive='=>'bool', 'withComments='=>'bool', 'xpath='=>'?array', 'nsPrefixes='=>'?array'], + 'DOMNode::appendChild' => ['DOMNode|false', 'node'=>'DOMNode'], 'DOMNode::cloneNode' => ['DOMNode', 'deep='=>'bool'], 'DOMNode::getLineNo' => ['int'], 'DOMNode::getNodePath' => ['?string'], 'DOMNode::hasAttributes' => ['bool'], 'DOMNode::hasChildNodes' => ['bool'], - 'DOMNode::insertBefore' => ['DOMNode', 'newnode'=>'DOMNode', 'refnode='=>'DOMNode|null'], - 'DOMNode::isDefaultNamespace' => ['bool', 'namespaceuri'=>'string'], - 'DOMNode::isSameNode' => ['bool', 'node'=>'DOMNode'], + 'DOMNode::insertBefore' => ['DOMNode|false', 'node'=>'DOMNode', 'child='=>'?DOMNode'], + 'DOMNode::isDefaultNamespace' => ['bool', 'namespace'=>'string'], + 'DOMNode::isSameNode' => ['bool', 'otherNode'=>'DOMNode'], 'DOMNode::isSupported' => ['bool', 'feature'=>'string', 'version'=>'string'], 'DOMNode::lookupNamespaceURI' => ['string|null', 'prefix'=>'string|null'], - 'DOMNode::lookupPrefix' => ['string|null', 'namespaceuri'=>'string'], + 'DOMNode::lookupPrefix' => ['string|null', 'namespace'=>'string'], 'DOMNode::normalize' => ['void'], - 'DOMNode::removeChild' => ['DOMNode', 'oldnode'=>'DOMNode'], - 'DOMNode::replaceChild' => ['DOMNode|false', 'newnode'=>'DOMNode', 'oldnode'=>'DOMNode'], + 'DOMNode::removeChild' => ['DOMNode|false', 'child'=>'DOMNode'], + 'DOMNode::replaceChild' => ['DOMNode|false', 'node'=>'DOMNode', 'child'=>'DOMNode'], 'DOMNodeList::item' => ['?DOMNode', 'index'=>'int'], - 'DOMProcessingInstruction::__construct' => ['void', 'name'=>'string', 'value'=>'string'], - 'DOMText::__construct' => ['void', 'value='=>'string'], + 'DOMProcessingInstruction::__construct' => ['void', 'name'=>'string', 'value='=>'string'], + 'DOMText::__construct' => ['void', 'data='=>'string'], 'DOMText::isElementContentWhitespace' => ['bool'], 'DOMText::isWhitespaceInElementContent' => ['bool'], 'DOMText::splitText' => ['DOMText', 'offset'=>'int'], - 'DOMXPath::__construct' => ['void', 'doc'=>'DOMDocument'], - 'DOMXPath::evaluate' => ['mixed', 'expression'=>'string', 'contextnode='=>'?DOMNode', 'registernodens='=>'bool'], - 'DOMXPath::query' => ['DOMNodeList|false', 'expression'=>'string', 'contextnode='=>'DOMNode|null', 'registernodens='=>'bool'], - 'DOMXPath::registerNamespace' => ['bool', 'prefix'=>'string', 'namespaceuri'=>'string'], - 'DOMXPath::registerPhpFunctions' => ['void', 'restrict='=>'mixed'], + 'DOMXPath::__construct' => ['void', 'document'=>'DOMDocument', 'registerNodeNS='=>'bool'], + 'DOMXPath::evaluate' => ['mixed', 'expression'=>'string', 'contextNode='=>'?DOMNode', 'registerNodeNS='=>'bool'], + 'DOMXPath::query' => ['DOMNodeList|false', 'expression'=>'string', 'contextNode='=>'?DOMNode', 'registerNodeNS='=>'bool'], + 'DOMXPath::registerNamespace' => ['bool', 'prefix'=>'string', 'namespace'=>'string'], + 'DOMXPath::registerPhpFunctions' => ['void', 'restrict='=>'array|string|null'], 'DOTNET::__call' => ['mixed', 'name'=>'string', 'args'=>''], 'DOTNET::__construct' => ['void', 'assembly_name'=>'string', 'datatype_name'=>'string', 'codepage='=>'int'], 'DOTNET::__get' => ['mixed', 'name'=>'string'], 'DOTNET::__set' => ['void', 'name'=>'string', 'value'=>''], - 'DateInterval::__construct' => ['void', 'spec'=>'string'], + 'DateInterval::__construct' => ['void', 'duration'=>'string'], 'DateInterval::__set_state' => ['DateInterval', 'array'=>'array'], 'DateInterval::__wakeup' => ['void'], - 'DateInterval::createFromDateString' => ['DateInterval|false', 'time'=>'string'], + 'DateInterval::createFromDateString' => ['DateInterval|false', 'datetime'=>'string'], 'DateInterval::format' => ['string', 'format'=>'string'], 'DatePeriod::__construct' => ['void', 'start'=>'DateTimeInterface', 'interval'=>'DateInterval', 'recur'=>'int', 'options='=>'int'], 'DatePeriod::__construct\'1' => ['void', 'start'=>'DateTimeInterface', 'interval'=>'DateInterval', 'end'=>'DateTimeInterface', 'options='=>'int'], @@ -827,18 +827,18 @@ return [ 'DateTime::__construct\'1' => ['void', 'time'=>'?string', 'timezone'=>'?DateTimeZone'], 'DateTime::__wakeup' => ['void'], 'DateTime::add' => ['static', 'interval'=>'DateInterval'], - 'DateTime::createFromFormat' => ['static|false', 'format'=>'string', 'time'=>'string', 'timezone='=>'?DateTimeZone'], - 'DateTime::diff' => ['DateInterval|false', 'datetime2'=>'DateTimeInterface', 'absolute='=>'bool'], + 'DateTime::createFromFormat' => ['static|false', 'format'=>'string', 'datetime'=>'string', 'timezone='=>'?DateTimeZone'], + 'DateTime::diff' => ['DateInterval', 'targetObject'=>'DateTimeInterface', 'absolute='=>'bool'], 'DateTime::format' => ['string|false', 'format'=>'string'], 'DateTime::getLastErrors' => ['array{warning_count:int,warnings:array,error_count:int,errors:array}|false'], 'DateTime::getOffset' => ['int'], 'DateTime::getTimestamp' => ['int|false'], 'DateTime::getTimezone' => ['DateTimeZone|false'], - 'DateTime::modify' => ['static|false', 'modify'=>'string'], + 'DateTime::modify' => ['static|false', 'modifier'=>'string'], 'DateTime::setDate' => ['static', 'year'=>'int', 'month'=>'int', 'day'=>'int'], - 'DateTime::setISODate' => ['static', 'year'=>'int', 'week'=>'int', 'day='=>'int'], - 'DateTime::setTime' => ['static|false', 'hour'=>'int', 'minute'=>'int', 'second='=>'int', 'microseconds='=>'int'], - 'DateTime::setTimestamp' => ['static', 'unixtimestamp'=>'int'], + 'DateTime::setISODate' => ['static', 'year'=>'int', 'week'=>'int', 'dayOfWeek='=>'int'], + 'DateTime::setTime' => ['static', 'hour'=>'int', 'minute'=>'int', 'second='=>'int', 'microsecond='=>'int'], + 'DateTime::setTimestamp' => ['static', 'timestamp'=>'int'], 'DateTime::setTimezone' => ['static', 'timezone'=>'DateTimeZone'], 'DateTime::sub' => ['static', 'interval'=>'DateInterval'], 'DateTimeImmutable::__wakeup' => ['void'], @@ -854,20 +854,20 @@ return [ 'DateTimeZone::getLocation' => ['array|false'], 'DateTimeZone::getName' => ['string'], 'DateTimeZone::getOffset' => ['int|false', 'datetime'=>'DateTimeInterface'], - 'DateTimeZone::getTransitions' => ['list|false', 'timestamp_begin='=>'int', 'timestamp_end='=>'int'], + 'DateTimeZone::getTransitions' => ['list|false', 'timestampBegin='=>'int', 'timestampEnd='=>'int'], 'DateTimeZone::listAbbreviations' => ['array>'], 'DateTimeZone::listIdentifiers' => ['list|false', 'timezoneGroup='=>'int', 'countryCode='=>'string'], 'Directory::close' => ['void', 'dir_handle='=>'resource'], 'Directory::read' => ['string|false', 'dir_handle='=>'resource'], 'Directory::rewind' => ['void', 'dir_handle='=>'resource'], - 'DirectoryIterator::__construct' => ['void', 'path'=>'string'], + 'DirectoryIterator::__construct' => ['void', 'directory'=>'string'], 'DirectoryIterator::__toString' => ['string'], 'DirectoryIterator::current' => ['DirectoryIterator'], 'DirectoryIterator::getATime' => ['int'], 'DirectoryIterator::getBasename' => ['string', 'suffix='=>'string'], 'DirectoryIterator::getCTime' => ['int'], 'DirectoryIterator::getExtension' => ['string'], - 'DirectoryIterator::getFileInfo' => ['SplFileInfo', 'class_name='=>'string'], + 'DirectoryIterator::getFileInfo' => ['SplFileInfo', 'class='=>'class-string'], 'DirectoryIterator::getFilename' => ['string'], 'DirectoryIterator::getGroup' => ['int'], 'DirectoryIterator::getInode' => ['int'], @@ -875,7 +875,7 @@ return [ 'DirectoryIterator::getMTime' => ['int'], 'DirectoryIterator::getOwner' => ['int'], 'DirectoryIterator::getPath' => ['string'], - 'DirectoryIterator::getPathInfo' => ['SplFileInfo', 'class_name='=>'string'], + 'DirectoryIterator::getPathInfo' => ['?SplFileInfo', 'class='=>'class-string'], 'DirectoryIterator::getPathname' => ['string'], 'DirectoryIterator::getPerms' => ['int'], 'DirectoryIterator::getRealPath' => ['string'], @@ -890,11 +890,11 @@ return [ 'DirectoryIterator::isWritable' => ['bool'], 'DirectoryIterator::key' => ['string'], 'DirectoryIterator::next' => ['void'], - 'DirectoryIterator::openFile' => ['SplFileObject', 'mode='=>'string', 'use_include_path='=>'bool', 'context='=>'resource'], + 'DirectoryIterator::openFile' => ['SplFileObject', 'mode='=>'string', 'useIncludePath='=>'bool', 'context='=>'resource'], 'DirectoryIterator::rewind' => ['void'], - 'DirectoryIterator::seek' => ['void', 'position'=>'int'], - 'DirectoryIterator::setFileClass' => ['void', 'class_name='=>'string'], - 'DirectoryIterator::setInfoClass' => ['void', 'class_name='=>'string'], + 'DirectoryIterator::seek' => ['void', 'offset'=>'int'], + 'DirectoryIterator::setFileClass' => ['void', 'class='=>'class-string'], + 'DirectoryIterator::setInfoClass' => ['void', 'class='=>'class-string'], 'DirectoryIterator::valid' => ['bool'], 'DomAttribute::name' => ['string'], 'DomAttribute::set_value' => ['bool', 'content'=>'string'], @@ -1489,14 +1489,14 @@ return [ 'FANNConnection::getToNeuron' => ['int'], 'FANNConnection::getWeight' => ['void'], 'FANNConnection::setWeight' => ['bool', 'weight'=>'float'], - 'FilesystemIterator::__construct' => ['void', 'path'=>'string', 'flags='=>'int'], + 'FilesystemIterator::__construct' => ['void', 'directory'=>'string', 'flags='=>'int'], 'FilesystemIterator::__toString' => ['string'], 'FilesystemIterator::current' => ['SplFileInfo|FilesystemIterator|string'], 'FilesystemIterator::getATime' => ['int'], 'FilesystemIterator::getBasename' => ['string', 'suffix='=>'string'], 'FilesystemIterator::getCTime' => ['int'], 'FilesystemIterator::getExtension' => ['string'], - 'FilesystemIterator::getFileInfo' => ['SplFileInfo', 'class_name='=>'string'], + 'FilesystemIterator::getFileInfo' => ['SplFileInfo', 'class='=>'class-string'], 'FilesystemIterator::getFilename' => ['string'], 'FilesystemIterator::getFlags' => ['int'], 'FilesystemIterator::getGroup' => ['int'], @@ -1505,7 +1505,7 @@ return [ 'FilesystemIterator::getMTime' => ['int'], 'FilesystemIterator::getOwner' => ['int'], 'FilesystemIterator::getPath' => ['string'], - 'FilesystemIterator::getPathInfo' => ['SplFileInfo', 'class_name='=>'string'], + 'FilesystemIterator::getPathInfo' => ['?SplFileInfo', 'class='=>'class-string'], 'FilesystemIterator::getPathname' => ['string'], 'FilesystemIterator::getPerms' => ['int'], 'FilesystemIterator::getRealPath' => ['string'], @@ -1520,12 +1520,12 @@ return [ 'FilesystemIterator::isWritable' => ['bool'], 'FilesystemIterator::key' => ['string'], 'FilesystemIterator::next' => ['void'], - 'FilesystemIterator::openFile' => ['SplFileObject', 'mode='=>'string', 'use_include_path='=>'bool', 'context='=>'resource'], + 'FilesystemIterator::openFile' => ['SplFileObject', 'mode='=>'string', 'useIncludePath='=>'bool', 'context='=>'resource'], 'FilesystemIterator::rewind' => ['void'], - 'FilesystemIterator::seek' => ['void', 'position'=>'int'], - 'FilesystemIterator::setFileClass' => ['void', 'class_name='=>'string'], - 'FilesystemIterator::setFlags' => ['void', 'flags='=>'int'], - 'FilesystemIterator::setInfoClass' => ['void', 'class_name='=>'string'], + 'FilesystemIterator::seek' => ['void', 'offset'=>'int'], + 'FilesystemIterator::setFileClass' => ['void', 'class='=>'class-string'], + 'FilesystemIterator::setFlags' => ['void', 'flags'=>'int'], + 'FilesystemIterator::setInfoClass' => ['void', 'class='=>'class-string'], 'FilesystemIterator::valid' => ['bool'], 'FilterIterator::__construct' => ['void', 'iterator'=>'Iterator'], 'FilterIterator::accept' => ['bool'], @@ -1747,14 +1747,14 @@ return [ 'Generator::send' => ['mixed', 'value'=>'mixed'], 'Generator::throw' => ['mixed', 'exception'=>'Throwable'], 'Generator::valid' => ['bool'], - 'GlobIterator::__construct' => ['void', 'path'=>'string', 'flags='=>'int'], + 'GlobIterator::__construct' => ['void', 'pattern'=>'string', 'flags='=>'int'], 'GlobIterator::count' => ['int'], 'GlobIterator::current' => ['FilesystemIterator|SplFileInfo|string'], 'GlobIterator::getATime' => ['int'], 'GlobIterator::getBasename' => ['string', 'suffix='=>'string'], 'GlobIterator::getCTime' => ['int'], 'GlobIterator::getExtension' => ['string'], - 'GlobIterator::getFileInfo' => ['SplFileInfo'], + 'GlobIterator::getFileInfo' => ['SplFileInfo', 'class='=>'class-string'], 'GlobIterator::getFilename' => ['string'], 'GlobIterator::getFlags' => ['int'], 'GlobIterator::getGroup' => ['int'], @@ -1763,7 +1763,7 @@ return [ 'GlobIterator::getMTime' => ['int'], 'GlobIterator::getOwner' => ['int'], 'GlobIterator::getPath' => ['string'], - 'GlobIterator::getPathInfo' => ['?SplFileInfo'], + 'GlobIterator::getPathInfo' => ['?SplFileInfo', 'class='=>'class-string'], 'GlobIterator::getPathname' => ['string'], 'GlobIterator::getPerms' => ['int'], 'GlobIterator::getRealPath' => ['string|false'], @@ -1778,12 +1778,12 @@ return [ 'GlobIterator::isWritable' => ['bool'], 'GlobIterator::key' => ['string'], 'GlobIterator::next' => ['void'], - 'GlobIterator::openFile' => ['SplFileObject'], + 'GlobIterator::openFile' => ['SplFileObject', 'mode='=>'string', 'useIncludePath='=>'bool', 'context='=>'resource'], 'GlobIterator::rewind' => ['void'], - 'GlobIterator::seek' => ['void', 'position'=>'int'], - 'GlobIterator::setFileClass' => ['void'], - 'GlobIterator::setFlags' => ['void', 'flags='=>'int'], - 'GlobIterator::setInfoClass' => ['void'], + 'GlobIterator::seek' => ['void', 'offset'=>'int'], + 'GlobIterator::setFileClass' => ['void', 'class='=>'class-string'], + 'GlobIterator::setFlags' => ['void', 'flags'=>'int'], + 'GlobIterator::setInfoClass' => ['void', 'class='=>'class-string'], 'GlobIterator::valid' => ['bool'], 'Gmagick::__construct' => ['void', 'filename='=>'string'], 'Gmagick::addimage' => ['Gmagick', 'gmagick'=>'gmagick'], @@ -2974,8 +2974,8 @@ return [ 'IntlBreakIterator::following' => ['int', 'offset'=>'int'], 'IntlBreakIterator::getErrorCode' => ['int'], 'IntlBreakIterator::getErrorMessage' => ['string'], - 'IntlBreakIterator::getLocale' => ['string', 'locale_type'=>'string'], - 'IntlBreakIterator::getPartsIterator' => ['IntlPartsIterator', 'key_type='=>'int'], + 'IntlBreakIterator::getLocale' => ['string|false', 'type'=>'int'], + 'IntlBreakIterator::getPartsIterator' => ['IntlPartsIterator', 'type='=>'string'], 'IntlBreakIterator::getText' => ['?string'], 'IntlBreakIterator::isBoundary' => ['bool', 'offset'=>'int'], 'IntlBreakIterator::last' => ['int'], @@ -2984,14 +2984,14 @@ return [ 'IntlBreakIterator::previous' => ['int'], 'IntlBreakIterator::setText' => ['?bool', 'text'=>'string'], 'IntlCalendar::__construct' => ['void'], - 'IntlCalendar::add' => ['bool', 'field'=>'int', 'amount'=>'int'], + 'IntlCalendar::add' => ['bool', 'field'=>'int', 'value'=>'int'], 'IntlCalendar::after' => ['bool', 'other'=>'IntlCalendar'], 'IntlCalendar::before' => ['bool', 'other'=>'IntlCalendar'], 'IntlCalendar::clear' => ['bool', 'field='=>'?int'], - 'IntlCalendar::createInstance' => ['IntlCalendar', 'timeZone='=>'mixed', 'locale='=>'string'], + 'IntlCalendar::createInstance' => ['?IntlCalendar', 'timezone='=>'IntlTimeZone|DateTimeZone|string|null', 'locale='=>'?string'], 'IntlCalendar::equals' => ['bool', 'other'=>'IntlCalendar'], - 'IntlCalendar::fieldDifference' => ['int', 'when'=>'float', 'field'=>'int'], - 'IntlCalendar::fromDateTime' => ['IntlCalendar', 'dateTime'=>'DateTime|string'], + 'IntlCalendar::fieldDifference' => ['int|false', 'timestamp'=>'float', 'field'=>'int'], + 'IntlCalendar::fromDateTime' => ['?IntlCalendar', 'datetime'=>'DateTime|string', 'locale='=>'?string'], 'IntlCalendar::get' => ['int', 'field'=>'int'], 'IntlCalendar::getActualMaximum' => ['int', 'field'=>'int'], 'IntlCalendar::getActualMinimum' => ['int', 'field'=>'int'], @@ -3001,9 +3001,9 @@ return [ 'IntlCalendar::getErrorMessage' => ['string'], 'IntlCalendar::getFirstDayOfWeek' => ['int'], 'IntlCalendar::getGreatestMinimum' => ['int', 'field'=>'int'], - 'IntlCalendar::getKeywordValuesForLocale' => ['Iterator|false', 'key'=>'string', 'locale'=>'string', 'commonlyUsed'=>'bool'], + 'IntlCalendar::getKeywordValuesForLocale' => ['IntlIterator|false', 'keyword'=>'string', 'locale'=>'string', 'onlyCommon'=>'bool'], 'IntlCalendar::getLeastMaximum' => ['int', 'field'=>'int'], - 'IntlCalendar::getLocale' => ['string', 'localeType'=>'int'], + 'IntlCalendar::getLocale' => ['string|false', 'type'=>'int'], 'IntlCalendar::getMaximum' => ['int|false', 'field'=>'int'], 'IntlCalendar::getMinimalDaysInFirstWeek' => ['int'], 'IntlCalendar::getMinimum' => ['int', 'field'=>'int'], @@ -3013,82 +3013,82 @@ return [ 'IntlCalendar::getTime' => ['float'], 'IntlCalendar::getTimeZone' => ['IntlTimeZone'], 'IntlCalendar::getType' => ['string'], - 'IntlCalendar::getWeekendTransition' => ['int', 'dayOfWeek'=>'string'], + 'IntlCalendar::getWeekendTransition' => ['int|false', 'dayOfWeek'=>'int'], 'IntlCalendar::inDaylightTime' => ['bool'], 'IntlCalendar::isEquivalentTo' => ['bool', 'other'=>'IntlCalendar'], 'IntlCalendar::isLenient' => ['bool'], 'IntlCalendar::isSet' => ['bool', 'field'=>'int'], - 'IntlCalendar::isWeekend' => ['bool', 'date='=>'?float'], - 'IntlCalendar::roll' => ['bool', 'field'=>'int', 'amountOrUpOrDown'=>'mixed'], + 'IntlCalendar::isWeekend' => ['bool', 'timestamp='=>'?float'], + 'IntlCalendar::roll' => ['bool', 'field'=>'int', 'value'=>'int|bool'], 'IntlCalendar::set' => ['bool', 'field'=>'int', 'value'=>'int'], 'IntlCalendar::set\'1' => ['bool', 'year'=>'int', 'month'=>'int', 'dayOfMonth='=>'int', 'hour='=>'int', 'minute='=>'int', 'second='=>'int'], 'IntlCalendar::setFirstDayOfWeek' => ['bool', 'dayOfWeek'=>'int'], - 'IntlCalendar::setLenient' => ['bool', 'isLenient'=>'string'], - 'IntlCalendar::setMinimalDaysInFirstWeek' => ['bool', 'minimalDays'=>'int'], - 'IntlCalendar::setRepeatedWallTimeOption' => ['bool', 'wallTimeOption'=>'int'], - 'IntlCalendar::setSkippedWallTimeOption' => ['bool', 'wallTimeOption'=>'int'], - 'IntlCalendar::setTime' => ['bool', 'date'=>'float'], - 'IntlCalendar::setTimeZone' => ['bool', 'timeZone'=>'mixed'], + 'IntlCalendar::setLenient' => ['true', 'lenient'=>'bool'], + 'IntlCalendar::setMinimalDaysInFirstWeek' => ['bool', 'days'=>'int'], + 'IntlCalendar::setRepeatedWallTimeOption' => ['true', 'option'=>'int'], + 'IntlCalendar::setSkippedWallTimeOption' => ['true', 'option'=>'int'], + 'IntlCalendar::setTime' => ['bool', 'timestamp'=>'float'], + 'IntlCalendar::setTimeZone' => ['bool', 'timezone'=>'IntlTimeZone|DateTimeZone|string|null'], 'IntlCalendar::toDateTime' => ['DateTime|false'], - 'IntlChar::charAge' => ['array', 'char'=>'int|string'], - 'IntlChar::charDigitValue' => ['int', 'codepoint'=>'mixed'], - 'IntlChar::charDirection' => ['int', 'codepoint'=>'mixed'], - 'IntlChar::charFromName' => ['?int', 'name'=>'string', 'namechoice='=>'int'], - 'IntlChar::charMirror' => ['mixed', 'codepoint'=>'mixed'], - 'IntlChar::charName' => ['string', 'char'=>'int|string', 'namechoice='=>'int'], - 'IntlChar::charType' => ['int', 'codepoint'=>'mixed'], - 'IntlChar::chr' => ['string', 'codepoint'=>'mixed'], - 'IntlChar::digit' => ['int|false', 'char'=>'int|string', 'radix='=>'int'], - 'IntlChar::enumCharNames' => ['void', 'start'=>'mixed', 'limit'=>'mixed', 'callback'=>'callable', 'nameChoice='=>'int'], - 'IntlChar::enumCharTypes' => ['void', 'cb='=>'callable'], - 'IntlChar::foldCase' => ['int|string', 'char'=>'int|string', 'options='=>'int'], - 'IntlChar::forDigit' => ['int', 'digit'=>'int', 'radix'=>'int'], - 'IntlChar::getBidiPairedBracket' => ['mixed', 'codepoint'=>'mixed'], - 'IntlChar::getBlockCode' => ['int', 'char'=>'int|string'], - 'IntlChar::getCombiningClass' => ['int', 'codepoint'=>'mixed'], - 'IntlChar::getFC_NFKC_Closure' => ['string', 'char'=>'int|string'], + 'IntlChar::charAge' => ['?array', 'codepoint'=>'int|string'], + 'IntlChar::charDigitValue' => ['?int', 'codepoint'=>'int|string'], + 'IntlChar::charDirection' => ['?int', 'codepoint'=>'int|string'], + 'IntlChar::charFromName' => ['?int', 'name'=>'string', 'type='=>'int'], + 'IntlChar::charMirror' => ['int|string|null', 'codepoint'=>'int|string'], + 'IntlChar::charName' => ['?string', 'codepoint'=>'int|string', 'type='=>'int'], + 'IntlChar::charType' => ['?int', 'codepoint'=>'int|string'], + 'IntlChar::chr' => ['?string', 'codepoint'=>'int|string'], + 'IntlChar::digit' => ['int|false|null', 'codepoint'=>'int|string', 'base='=>'int'], + 'IntlChar::enumCharNames' => ['?bool', 'start'=>'string|int', 'end'=>'string|int', 'callback'=>'callable(int,int,int):void', 'type='=>'int'], + 'IntlChar::enumCharTypes' => ['void', 'callback'=>'callable(int,int,int):void'], + 'IntlChar::foldCase' => ['int|string|null', 'codepoint'=>'int|string', 'options='=>'int'], + 'IntlChar::forDigit' => ['int', 'digit'=>'int', 'base='=>'int'], + 'IntlChar::getBidiPairedBracket' => ['int|string|null', 'codepoint'=>'int|string'], + 'IntlChar::getBlockCode' => ['?int', 'codepoint'=>'int|string'], + 'IntlChar::getCombiningClass' => ['?int', 'codepoint'=>'int|string'], + 'IntlChar::getFC_NFKC_Closure' => ['?string', 'codepoint'=>'int|string'], 'IntlChar::getIntPropertyMaxValue' => ['int', 'property'=>'int'], 'IntlChar::getIntPropertyMinValue' => ['int', 'property'=>'int'], - 'IntlChar::getIntPropertyValue' => ['int', 'char'=>'int|string', 'property'=>'int'], - 'IntlChar::getNumericValue' => ['float', 'char'=>'int|string'], + 'IntlChar::getIntPropertyValue' => ['?int', 'codepoint'=>'int|string', 'property'=>'int'], + 'IntlChar::getNumericValue' => ['?float', 'codepoint'=>'int|string'], 'IntlChar::getPropertyEnum' => ['int', 'alias'=>'string'], - 'IntlChar::getPropertyName' => ['string|false', 'property'=>'int', 'namechoice='=>'int'], + 'IntlChar::getPropertyName' => ['string|false', 'property'=>'int', 'type='=>'int'], 'IntlChar::getPropertyValueEnum' => ['int', 'property'=>'int', 'name'=>'string'], - 'IntlChar::getPropertyValueName' => ['string|false', 'prop'=>'int', 'value'=>'int', 'namechoice='=>'int'], + 'IntlChar::getPropertyValueName' => ['string|false', 'property'=>'int', 'value'=>'int', 'type='=>'int'], 'IntlChar::getUnicodeVersion' => ['array'], - 'IntlChar::hasBinaryProperty' => ['bool', 'char'=>'int|string', 'property'=>'int'], - 'IntlChar::isIDIgnorable' => ['bool', 'codepoint'=>'mixed'], - 'IntlChar::isIDPart' => ['bool', 'codepoint'=>'mixed'], - 'IntlChar::isIDStart' => ['bool', 'codepoint'=>'mixed'], - 'IntlChar::isISOControl' => ['bool', 'codepoint'=>'mixed'], - 'IntlChar::isJavaIDPart' => ['bool', 'codepoint'=>'mixed'], - 'IntlChar::isJavaIDStart' => ['bool', 'codepoint'=>'mixed'], - 'IntlChar::isJavaSpaceChar' => ['bool', 'codepoint'=>'mixed'], - 'IntlChar::isMirrored' => ['bool', 'codepoint'=>'mixed'], - 'IntlChar::isUAlphabetic' => ['bool', 'codepoint'=>'mixed'], - 'IntlChar::isULowercase' => ['bool', 'codepoint'=>'mixed'], - 'IntlChar::isUUppercase' => ['bool', 'codepoint'=>'mixed'], - 'IntlChar::isUWhiteSpace' => ['bool', 'codepoint'=>'mixed'], - 'IntlChar::isWhitespace' => ['bool', 'codepoint'=>'mixed'], - 'IntlChar::isalnum' => ['bool', 'codepoint'=>'mixed'], - 'IntlChar::isalpha' => ['bool', 'codepoint'=>'mixed'], - 'IntlChar::isbase' => ['bool', 'codepoint'=>'mixed'], - 'IntlChar::isblank' => ['bool', 'codepoint'=>'mixed'], - 'IntlChar::iscntrl' => ['bool', 'codepoint'=>'mixed'], - 'IntlChar::isdefined' => ['bool', 'codepoint'=>'mixed'], - 'IntlChar::isdigit' => ['bool', 'codepoint'=>'mixed'], - 'IntlChar::isgraph' => ['bool', 'codepoint'=>'mixed'], - 'IntlChar::islower' => ['bool', 'codepoint'=>'mixed'], - 'IntlChar::isprint' => ['bool', 'codepoint'=>'mixed'], - 'IntlChar::ispunct' => ['bool', 'codepoint'=>'mixed'], - 'IntlChar::isspace' => ['bool', 'codepoint'=>'mixed'], - 'IntlChar::istitle' => ['bool', 'codepoint'=>'mixed'], - 'IntlChar::isupper' => ['bool', 'codepoint'=>'mixed'], - 'IntlChar::isxdigit' => ['bool', 'codepoint'=>'mixed'], - 'IntlChar::ord' => ['int', 'character'=>'mixed'], - 'IntlChar::tolower' => ['mixed', 'codepoint'=>'mixed'], - 'IntlChar::totitle' => ['mixed', 'codepoint'=>'mixed'], - 'IntlChar::toupper' => ['mixed', 'codepoint'=>'mixed'], + 'IntlChar::hasBinaryProperty' => ['?bool', 'codepoint'=>'int|string', 'property'=>'int'], + 'IntlChar::isIDIgnorable' => ['?bool', 'codepoint'=>'int|string'], + 'IntlChar::isIDPart' => ['?bool', 'codepoint'=>'int|string'], + 'IntlChar::isIDStart' => ['?bool', 'codepoint'=>'int|string'], + 'IntlChar::isISOControl' => ['?bool', 'codepoint'=>'int|string'], + 'IntlChar::isJavaIDPart' => ['?bool', 'codepoint'=>'int|string'], + 'IntlChar::isJavaIDStart' => ['?bool', 'codepoint'=>'int|string'], + 'IntlChar::isJavaSpaceChar' => ['?bool', 'codepoint'=>'int|string'], + 'IntlChar::isMirrored' => ['?bool', 'codepoint'=>'int|string'], + 'IntlChar::isUAlphabetic' => ['?bool', 'codepoint'=>'int|string'], + 'IntlChar::isULowercase' => ['?bool', 'codepoint'=>'int|string'], + 'IntlChar::isUUppercase' => ['?bool', 'codepoint'=>'int|string'], + 'IntlChar::isUWhiteSpace' => ['?bool', 'codepoint'=>'int|string'], + 'IntlChar::isWhitespace' => ['?bool', 'codepoint'=>'int|string'], + 'IntlChar::isalnum' => ['?bool', 'codepoint'=>'int|string'], + 'IntlChar::isalpha' => ['?bool', 'codepoint'=>'int|string'], + 'IntlChar::isbase' => ['?bool', 'codepoint'=>'int|string'], + 'IntlChar::isblank' => ['?bool', 'codepoint'=>'int|string'], + 'IntlChar::iscntrl' => ['?bool', 'codepoint'=>'int|string'], + 'IntlChar::isdefined' => ['?bool', 'codepoint'=>'int|string'], + 'IntlChar::isdigit' => ['?bool', 'codepoint'=>'int|string'], + 'IntlChar::isgraph' => ['?bool', 'codepoint'=>'int|string'], + 'IntlChar::islower' => ['?bool', 'codepoint'=>'int|string'], + 'IntlChar::isprint' => ['?bool', 'codepoint'=>'int|string'], + 'IntlChar::ispunct' => ['?bool', 'codepoint'=>'int|string'], + 'IntlChar::isspace' => ['?bool', 'codepoint'=>'int|string'], + 'IntlChar::istitle' => ['?bool', 'codepoint'=>'int|string'], + 'IntlChar::isupper' => ['?bool', 'codepoint'=>'int|string'], + 'IntlChar::isxdigit' => ['?bool', 'codepoint'=>'int|string'], + 'IntlChar::ord' => ['?int', 'character'=>'int|string'], + 'IntlChar::tolower' => ['int|string|null', 'codepoint'=>'int|string'], + 'IntlChar::totitle' => ['int|string|null', 'codepoint'=>'int|string'], + 'IntlChar::toupper' => ['int|string|null', 'codepoint'=>'int|string'], 'IntlCodePointBreakIterator::__construct' => ['void'], 'IntlCodePointBreakIterator::createCharacterInstance' => ['?IntlRuleBasedBreakIterator', 'locale='=>'?string'], 'IntlCodePointBreakIterator::createCodePointInstance' => ['IntlCodePointBreakIterator'], @@ -3098,17 +3098,17 @@ return [ 'IntlCodePointBreakIterator::createWordInstance' => ['?IntlRuleBasedBreakIterator', 'locale='=>'?string'], 'IntlCodePointBreakIterator::current' => ['int'], 'IntlCodePointBreakIterator::first' => ['int'], - 'IntlCodePointBreakIterator::following' => ['int', 'offset'=>'string'], + 'IntlCodePointBreakIterator::following' => ['int', 'offset'=>'int'], 'IntlCodePointBreakIterator::getErrorCode' => ['int'], 'IntlCodePointBreakIterator::getErrorMessage' => ['string'], 'IntlCodePointBreakIterator::getLastCodePoint' => ['int'], - 'IntlCodePointBreakIterator::getLocale' => ['string', 'locale_type'=>'string'], - 'IntlCodePointBreakIterator::getPartsIterator' => ['IntlPartsIterator', 'key_type='=>'string'], + 'IntlCodePointBreakIterator::getLocale' => ['string|false', 'type'=>'int'], + 'IntlCodePointBreakIterator::getPartsIterator' => ['IntlPartsIterator', 'type='=>'string'], 'IntlCodePointBreakIterator::getText' => ['?string'], - 'IntlCodePointBreakIterator::isBoundary' => ['bool', 'offset'=>'string'], + 'IntlCodePointBreakIterator::isBoundary' => ['bool', 'offset'=>'int'], 'IntlCodePointBreakIterator::last' => ['int'], - 'IntlCodePointBreakIterator::next' => ['int', 'offset='=>'string'], - 'IntlCodePointBreakIterator::preceding' => ['int', 'offset'=>'string'], + 'IntlCodePointBreakIterator::next' => ['int', 'offset='=>'?int'], + 'IntlCodePointBreakIterator::preceding' => ['int', 'offset'=>'int'], 'IntlCodePointBreakIterator::previous' => ['int'], 'IntlCodePointBreakIterator::setText' => ['?bool', 'text'=>'string'], 'IntlDateFormatter::__construct' => ['void', 'locale'=>'?string', 'datetype'=>'null|int', 'timetype'=>'null|int', 'timezone='=>'IntlTimeZone|DateTimeZone|string|null', 'calendar='=>'IntlCalendar|int|null', 'pattern='=>'?string'], @@ -3133,7 +3133,7 @@ return [ 'IntlDateFormatter::setPattern' => ['bool', 'pattern'=>'string'], 'IntlDateFormatter::setTimeZone' => ['null|false', 'zone'=>'IntlTimeZone|DateTimeZone|string|null'], 'IntlException::__clone' => ['void'], - 'IntlException::__construct' => ['void'], + 'IntlException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'?Throwable'], 'IntlException::__toString' => ['string'], 'IntlException::__wakeup' => ['void'], 'IntlException::getCode' => ['int'], @@ -3144,14 +3144,14 @@ return [ 'IntlException::getTrace' => ['list\',args?:array}>'], 'IntlException::getTraceAsString' => ['string'], 'IntlGregorianCalendar::__construct' => ['void'], - 'IntlGregorianCalendar::add' => ['bool', 'field'=>'int', 'amount'=>'int'], + 'IntlGregorianCalendar::add' => ['bool', 'field'=>'int', 'value'=>'int'], 'IntlGregorianCalendar::after' => ['bool', 'other'=>'IntlCalendar'], 'IntlGregorianCalendar::before' => ['bool', 'other'=>'IntlCalendar'], 'IntlGregorianCalendar::clear' => ['bool', 'field='=>'?int'], - 'IntlGregorianCalendar::createInstance' => ['IntlGregorianCalendar', 'timeZone='=>'mixed', 'locale='=>'string'], + 'IntlGregorianCalendar::createInstance' => ['?IntlGregorianCalendar', 'timezone='=>'IntlTimeZone|DateTimeZone|string|null', 'locale='=>'?string'], 'IntlGregorianCalendar::equals' => ['bool', 'other'=>'IntlCalendar'], - 'IntlGregorianCalendar::fieldDifference' => ['int', 'when'=>'float', 'field'=>'int'], - 'IntlGregorianCalendar::fromDateTime' => ['IntlCalendar', 'dateTime'=>'DateTime|string'], + 'IntlGregorianCalendar::fieldDifference' => ['int|false', 'timestamp'=>'float', 'field'=>'int'], + 'IntlGregorianCalendar::fromDateTime' => ['?IntlCalendar', 'datetime'=>'DateTime|string', 'locale='=>'?string'], 'IntlGregorianCalendar::get' => ['int', 'field'=>'int'], 'IntlGregorianCalendar::getActualMaximum' => ['int', 'field'=>'int'], 'IntlGregorianCalendar::getActualMinimum' => ['int', 'field'=>'int'], @@ -3162,9 +3162,9 @@ return [ 'IntlGregorianCalendar::getFirstDayOfWeek' => ['int'], 'IntlGregorianCalendar::getGreatestMinimum' => ['int', 'field'=>'int'], 'IntlGregorianCalendar::getGregorianChange' => ['float'], - 'IntlGregorianCalendar::getKeywordValuesForLocale' => ['Iterator', 'key'=>'string', 'locale'=>'string', 'commonlyUsed'=>'bool'], + 'IntlGregorianCalendar::getKeywordValuesForLocale' => ['IntlIterator|false', 'keyword'=>'string', 'locale'=>'string', 'onlyCommon'=>'bool'], 'IntlGregorianCalendar::getLeastMaximum' => ['int', 'field'=>'int'], - 'IntlGregorianCalendar::getLocale' => ['string', 'localeType'=>'int'], + 'IntlGregorianCalendar::getLocale' => ['string|false', 'type'=>'int'], 'IntlGregorianCalendar::getMaximum' => ['int', 'field'=>'int'], 'IntlGregorianCalendar::getMinimalDaysInFirstWeek' => ['int'], 'IntlGregorianCalendar::getMinimum' => ['int', 'field'=>'int'], @@ -3174,24 +3174,24 @@ return [ 'IntlGregorianCalendar::getTime' => ['float'], 'IntlGregorianCalendar::getTimeZone' => ['IntlTimeZone'], 'IntlGregorianCalendar::getType' => ['string'], - 'IntlGregorianCalendar::getWeekendTransition' => ['int', 'dayOfWeek'=>'string'], + 'IntlGregorianCalendar::getWeekendTransition' => ['int|false', 'dayOfWeek'=>'int'], 'IntlGregorianCalendar::inDaylightTime' => ['bool'], 'IntlGregorianCalendar::isEquivalentTo' => ['bool', 'other'=>'IntlCalendar'], 'IntlGregorianCalendar::isLeapYear' => ['bool', 'year'=>'int'], 'IntlGregorianCalendar::isLenient' => ['bool'], 'IntlGregorianCalendar::isSet' => ['bool', 'field'=>'int'], - 'IntlGregorianCalendar::isWeekend' => ['bool', 'date='=>'float'], - 'IntlGregorianCalendar::roll' => ['bool', 'field'=>'int', 'amountOrUpOrDown'=>'mixed'], + 'IntlGregorianCalendar::isWeekend' => ['bool', 'timestamp='=>'?float'], + 'IntlGregorianCalendar::roll' => ['bool', 'field'=>'int', 'value'=>'int|bool'], 'IntlGregorianCalendar::set' => ['bool', 'field'=>'int', 'value'=>'int'], 'IntlGregorianCalendar::set\'1' => ['bool', 'year'=>'int', 'month'=>'int', 'dayOfMonth='=>'int', 'hour='=>'int', 'minute='=>'int', 'second='=>'int'], 'IntlGregorianCalendar::setFirstDayOfWeek' => ['bool', 'dayOfWeek'=>'int'], - 'IntlGregorianCalendar::setGregorianChange' => ['bool', 'date'=>'float'], - 'IntlGregorianCalendar::setLenient' => ['bool', 'isLenient'=>'string'], - 'IntlGregorianCalendar::setMinimalDaysInFirstWeek' => ['bool', 'minimalDays'=>'int'], - 'IntlGregorianCalendar::setRepeatedWallTimeOption' => ['bool', 'wallTimeOption'=>'int'], - 'IntlGregorianCalendar::setSkippedWallTimeOption' => ['bool', 'wallTimeOption'=>'int'], - 'IntlGregorianCalendar::setTime' => ['bool', 'date'=>'float'], - 'IntlGregorianCalendar::setTimeZone' => ['bool', 'timeZone'=>'mixed'], + 'IntlGregorianCalendar::setGregorianChange' => ['bool', 'timestamp'=>'float'], + 'IntlGregorianCalendar::setLenient' => ['true', 'lenient'=>'bool'], + 'IntlGregorianCalendar::setMinimalDaysInFirstWeek' => ['bool', 'days'=>'int'], + 'IntlGregorianCalendar::setRepeatedWallTimeOption' => ['true', 'option'=>'int'], + 'IntlGregorianCalendar::setSkippedWallTimeOption' => ['true', 'option'=>'int'], + 'IntlGregorianCalendar::setTime' => ['bool', 'timestamp'=>'float'], + 'IntlGregorianCalendar::setTimeZone' => ['bool', 'timezone'=>'IntlTimeZone|DateTimeZone|string|null'], 'IntlGregorianCalendar::toDateTime' => ['DateTime'], 'IntlIterator::__construct' => ['void'], 'IntlIterator::current' => ['mixed'], @@ -3200,7 +3200,7 @@ return [ 'IntlIterator::rewind' => ['void'], 'IntlIterator::valid' => ['bool'], 'IntlPartsIterator::getBreakIterator' => ['IntlBreakIterator'], - 'IntlRuleBasedBreakIterator::__construct' => ['void', 'rules'=>'string', 'areCompiled='=>'string'], + 'IntlRuleBasedBreakIterator::__construct' => ['void', 'rules'=>'string', 'compiled='=>'bool'], 'IntlRuleBasedBreakIterator::createCharacterInstance' => ['?IntlRuleBasedBreakIterator', 'locale='=>'?string'], 'IntlRuleBasedBreakIterator::createCodePointInstance' => ['IntlCodePointBreakIterator'], 'IntlRuleBasedBreakIterator::createLineInstance' => ['?IntlRuleBasedBreakIterator', 'locale='=>'?string'], @@ -3213,8 +3213,8 @@ return [ 'IntlRuleBasedBreakIterator::getBinaryRules' => ['string'], 'IntlRuleBasedBreakIterator::getErrorCode' => ['int'], 'IntlRuleBasedBreakIterator::getErrorMessage' => ['string'], - 'IntlRuleBasedBreakIterator::getLocale' => ['string', 'locale_type'=>'string'], - 'IntlRuleBasedBreakIterator::getPartsIterator' => ['IntlPartsIterator', 'key_type='=>'int'], + 'IntlRuleBasedBreakIterator::getLocale' => ['string|false', 'type'=>'int'], + 'IntlRuleBasedBreakIterator::getPartsIterator' => ['IntlPartsIterator', 'type='=>'string'], 'IntlRuleBasedBreakIterator::getRuleStatus' => ['int'], 'IntlRuleBasedBreakIterator::getRuleStatusVec' => ['array'], 'IntlRuleBasedBreakIterator::getRules' => ['string'], @@ -3225,28 +3225,28 @@ return [ 'IntlRuleBasedBreakIterator::preceding' => ['int', 'offset'=>'int'], 'IntlRuleBasedBreakIterator::previous' => ['int'], 'IntlRuleBasedBreakIterator::setText' => ['?bool', 'text'=>'string'], - 'IntlTimeZone::countEquivalentIDs' => ['int|false', 'zoneId'=>'string'], + 'IntlTimeZone::countEquivalentIDs' => ['int|false', 'timezoneId'=>'string'], 'IntlTimeZone::createDefault' => ['IntlTimeZone'], - 'IntlTimeZone::createEnumeration' => ['IntlIterator|false', 'countryOrRawOffset='=>'mixed'], - 'IntlTimeZone::createTimeZone' => ['IntlTimeZone|false', 'zoneId'=>'string'], - 'IntlTimeZone::createTimeZoneIDEnumeration' => ['IntlIterator|false', 'zoneType'=>'int', 'region='=>'string', 'rawOffset='=>'int'], - 'IntlTimeZone::fromDateTimeZone' => ['?IntlTimeZone', 'zoneId'=>'DateTimeZone'], - 'IntlTimeZone::getCanonicalID' => ['string|false', 'zoneId'=>'string', '&w_isSystemID='=>'bool'], + 'IntlTimeZone::createEnumeration' => ['IntlIterator|false', 'countryOrRawOffset='=>'IntlTimeZone|string|int|float|null'], + 'IntlTimeZone::createTimeZone' => ['?IntlTimeZone', 'timezoneId'=>'string'], + 'IntlTimeZone::createTimeZoneIDEnumeration' => ['IntlIterator|false', 'type'=>'int', 'region='=>'?string', 'rawOffset='=>'?int'], + 'IntlTimeZone::fromDateTimeZone' => ['?IntlTimeZone', 'timezone'=>'DateTimeZone'], + 'IntlTimeZone::getCanonicalID' => ['string|false', 'timezoneId'=>'string', '&w_isSystemId='=>'bool'], 'IntlTimeZone::getDSTSavings' => ['int'], - 'IntlTimeZone::getDisplayName' => ['string|false', 'isDaylight='=>'bool', 'style='=>'int', 'locale='=>'string'], - 'IntlTimeZone::getEquivalentID' => ['string|false', 'zoneId'=>'string', 'index'=>'int'], + 'IntlTimeZone::getDisplayName' => ['string|false', 'dst='=>'bool', 'style='=>'int', 'locale='=>'?string'], + 'IntlTimeZone::getEquivalentID' => ['string|false', 'timezoneId'=>'string', 'offset'=>'int'], 'IntlTimeZone::getErrorCode' => ['int'], 'IntlTimeZone::getErrorMessage' => ['string'], 'IntlTimeZone::getGMT' => ['IntlTimeZone'], 'IntlTimeZone::getID' => ['string'], - 'IntlTimeZone::getIDForWindowsID' => ['string', 'timezone'=>'string', 'region='=>'string'], - 'IntlTimeZone::getOffset' => ['int', 'date'=>'float', 'local'=>'bool', '&w_rawOffset'=>'int', '&w_dstOffset'=>'int'], + 'IntlTimeZone::getIDForWindowsID' => ['string|false', 'timezoneId'=>'string', 'region='=>'string'], + 'IntlTimeZone::getOffset' => ['bool', 'timestamp'=>'float', 'local'=>'bool', '&w_rawOffset'=>'int', '&w_dstOffset'=>'int'], 'IntlTimeZone::getRawOffset' => ['int'], - 'IntlTimeZone::getRegion' => ['string|false', 'zoneId'=>'string'], + 'IntlTimeZone::getRegion' => ['string|false', 'timezoneId'=>'string'], 'IntlTimeZone::getTZDataVersion' => ['string'], 'IntlTimeZone::getUnknown' => ['IntlTimeZone'], - 'IntlTimeZone::getWindowsID' => ['string|false', 'timezone'=>'string'], - 'IntlTimeZone::hasSameRules' => ['bool', 'otherTimeZone'=>'IntlTimeZone'], + 'IntlTimeZone::getWindowsID' => ['string|false', 'timezoneId'=>'string'], + 'IntlTimeZone::hasSameRules' => ['bool', 'other'=>'IntlTimeZone'], 'IntlTimeZone::toDateTimeZone' => ['DateTimeZone|false'], 'IntlTimeZone::useDaylightTime' => ['bool'], 'InvalidArgumentException::__clone' => ['void'], @@ -4763,7 +4763,7 @@ return [ 'PDOStatement::fetch' => ['mixed', 'how='=>'int', 'orientation='=>'int', 'offset='=>'int'], 'PDOStatement::fetchAll' => ['array|false', 'how='=>'int', 'fetch_argument='=>'int|string|callable', 'ctor_args='=>'?array'], 'PDOStatement::fetchColumn' => ['string|int|float|bool|null', 'column_number='=>'int'], - 'PDOStatement::fetchObject' => ['object|false', 'class='=>'?string', 'constructorArgs='=>'array'], + 'PDOStatement::fetchObject' => ['object|false', 'class='=>'?class-string', 'constructorArgs='=>'array'], 'PDOStatement::getAttribute' => ['mixed', 'name'=>'int'], 'PDOStatement::getColumnMeta' => ['array|false', 'column'=>'int'], 'PDOStatement::nextRowset' => ['bool'], @@ -4842,29 +4842,27 @@ return [ 'ParseError::getPrevious' => ['?Throwable'], 'ParseError::getTrace' => ['list\',args?:array}>'], 'ParseError::getTraceAsString' => ['string'], - 'Phar::__construct' => ['void', 'fname'=>'string', 'flags='=>'int', 'alias='=>'string'], - 'Phar::addEmptyDir' => ['void', 'dirname'=>'string'], - 'Phar::addFile' => ['void', 'file'=>'string', 'localname='=>'string'], - 'Phar::addFromString' => ['void', 'localname'=>'string', 'contents'=>'string'], + 'Phar::__construct' => ['void', 'filename'=>'string', 'flags='=>'int', 'alias='=>'?string'], + 'Phar::addEmptyDir' => ['void', 'directory'=>'string'], + 'Phar::addFile' => ['void', 'filename'=>'string', 'localName='=>'string'], + 'Phar::addFromString' => ['void', 'localName'=>'string', 'contents'=>'string'], 'Phar::apiVersion' => ['string'], - 'Phar::buildFromDirectory' => ['array', 'base_dir'=>'string', 'regex='=>'string'], - 'Phar::buildFromIterator' => ['array', 'iter'=>'Iterator', 'base_directory='=>'string'], - 'Phar::canCompress' => ['bool', 'method='=>'int'], + 'Phar::buildFromDirectory' => ['array|false', 'directory'=>'string', 'pattern='=>'string'], + 'Phar::buildFromIterator' => ['array|false', 'iterator'=>'Traversable', 'baseDirectory='=>'string'], + 'Phar::canCompress' => ['bool', 'compression='=>'int'], 'Phar::canWrite' => ['bool'], 'Phar::compress' => ['?Phar', 'compression'=>'int', 'extension='=>'string'], - 'Phar::compressAllFilesBZIP2' => ['bool'], - 'Phar::compressAllFilesGZ' => ['bool'], 'Phar::compressFiles' => ['void', 'compression'=>'int'], 'Phar::convertToData' => ['?PharData', 'format='=>'int', 'compression='=>'int', 'extension='=>'string'], 'Phar::convertToExecutable' => ['?Phar', 'format='=>'int', 'compression='=>'int', 'extension='=>'string'], - 'Phar::copy' => ['bool', 'oldfile'=>'string', 'newfile'=>'string'], - 'Phar::count' => ['int'], - 'Phar::createDefaultStub' => ['string', 'indexfile='=>'string', 'webindexfile='=>'string'], + 'Phar::copy' => ['bool', 'from'=>'string', 'to'=>'string'], + 'Phar::count' => ['int', 'mode='=>'int'], + 'Phar::createDefaultStub' => ['string', 'index='=>'string', 'webIndex='=>'string'], 'Phar::decompress' => ['?Phar', 'extension='=>'string'], 'Phar::decompressFiles' => ['bool'], 'Phar::delMetadata' => ['bool'], - 'Phar::delete' => ['bool', 'entry'=>'string'], - 'Phar::extractTo' => ['bool', 'pathto'=>'string', 'files='=>'string|array|null', 'overwrite='=>'bool'], + 'Phar::delete' => ['bool', 'localName'=>'string'], + 'Phar::extractTo' => ['bool', 'directory'=>'string', 'files='=>'string|array|null', 'overwrite='=>'bool'], 'Phar::getAlias' => ['?string'], 'Phar::getMetadata' => ['mixed'], 'Phar::getModified' => ['bool'], @@ -4882,50 +4880,51 @@ return [ 'Phar::isValidPharFilename' => ['bool', 'filename'=>'string', 'executable='=>'bool'], 'Phar::isWritable' => ['bool'], 'Phar::loadPhar' => ['bool', 'filename'=>'string', 'alias='=>'?string'], - 'Phar::mapPhar' => ['bool', 'alias='=>'string', 'dataoffset='=>'int'], - 'Phar::mount' => ['void', 'pharpath'=>'string', 'externalpath'=>'string'], - 'Phar::mungServer' => ['void', 'munglist'=>'array'], - 'Phar::offsetExists' => ['bool', 'offset'=>'string'], - 'Phar::offsetGet' => ['PharFileInfo', 'offset'=>'string'], - 'Phar::offsetSet' => ['void', 'offset'=>'string', 'value'=>'string'], - 'Phar::offsetUnset' => ['bool', 'offset'=>'string'], - 'Phar::running' => ['string', 'retphar='=>'bool'], + 'Phar::mapPhar' => ['bool', 'alias='=>'?string', 'offset='=>'int'], + 'Phar::mount' => ['void', 'pharPath'=>'string', 'externalPath'=>'string'], + 'Phar::mungServer' => ['void', 'variables'=>'list'], + 'Phar::offsetExists' => ['bool', 'localName'=>'string'], + 'Phar::offsetGet' => ['PharFileInfo', 'localName'=>'string'], + 'Phar::offsetSet' => ['void', 'localName'=>'string', 'value'=>'resource|string'], + 'Phar::offsetUnset' => ['void', 'localName'=>'string'], + 'Phar::running' => ['string', 'returnPhar='=>'bool'], 'Phar::setAlias' => ['bool', 'alias'=>'string'], - 'Phar::setDefaultStub' => ['bool', 'index='=>'string', 'webindex='=>'string'], + 'Phar::setDefaultStub' => ['bool', 'index='=>'?string', 'webIndex='=>'string'], 'Phar::setMetadata' => ['void', 'metadata'=>''], - 'Phar::setSignatureAlgorithm' => ['void', 'sigtype'=>'int', 'privatekey='=>'string'], + 'Phar::setSignatureAlgorithm' => ['void', 'algo'=>'int', 'privateKey='=>'string'], 'Phar::setStub' => ['bool', 'stub'=>'string', 'length='=>'int'], 'Phar::startBuffering' => ['void'], 'Phar::stopBuffering' => ['void'], - 'Phar::uncompressAllFiles' => ['bool'], - 'Phar::unlinkArchive' => ['bool', 'archive'=>'string'], - 'Phar::webPhar' => ['', 'alias='=>'string', 'index='=>'string', 'f404='=>'string', 'mimetypes='=>'array', 'rewrites='=>'array'], - 'PharData::__construct' => ['void', 'fname'=>'string', 'flags='=>'?int', 'alias='=>'?string', 'format='=>'int'], - 'PharData::addEmptyDir' => ['bool', 'dirname'=>'string'], - 'PharData::addFile' => ['void', 'file'=>'string', 'localname='=>'string'], - 'PharData::addFromString' => ['bool', 'localname'=>'string', 'contents'=>'string'], - 'PharData::buildFromDirectory' => ['array', 'base_dir'=>'string', 'regex='=>'string'], - 'PharData::buildFromIterator' => ['array', 'iter'=>'Iterator', 'base_directory='=>'string'], + 'Phar::unlinkArchive' => ['bool', 'filename'=>'string'], + 'Phar::webPhar' => ['void', 'alias='=>'?string', 'index='=>'?string', 'fileNotFoundScript='=>'string', 'mimeTypes='=>'array', 'rewrite='=>'callable'], + 'PharData::__construct' => ['void', 'filename'=>'string', 'flags='=>'int', 'alias='=>'?string', 'format='=>'int'], + 'PharData::addEmptyDir' => ['void', 'directory'=>'string'], + 'PharData::addFile' => ['void', 'filename'=>'string', 'localName='=>'string'], + 'PharData::addFromString' => ['void', 'localName'=>'string', 'contents'=>'string'], + 'PharData::buildFromDirectory' => ['array|false', 'directory'=>'string', 'pattern='=>'string'], + 'PharData::buildFromIterator' => ['array|false', 'iterator'=>'Traversable', 'baseDirectory='=>'string'], 'PharData::compress' => ['?PharData', 'compression'=>'int', 'extension='=>'string'], 'PharData::compressFiles' => ['void', 'compression'=>'int'], 'PharData::convertToData' => ['?PharData', 'format='=>'int', 'compression='=>'int', 'extension='=>'string'], 'PharData::convertToExecutable' => ['?Phar', 'format='=>'int', 'compression='=>'int', 'extension='=>'string'], - 'PharData::copy' => ['bool', 'oldfile'=>'string', 'newfile'=>'string'], + 'PharData::copy' => ['bool', 'from'=>'string', 'to'=>'string'], 'PharData::decompress' => ['?PharData', 'extension='=>'string'], 'PharData::decompressFiles' => ['bool'], 'PharData::delMetadata' => ['bool'], - 'PharData::delete' => ['bool', 'entry'=>'string'], - 'PharData::extractTo' => ['bool', 'pathto'=>'string', 'files='=>'string|array|null', 'overwrite='=>'bool'], + 'PharData::delete' => ['bool', 'localName'=>'string'], + 'PharData::extractTo' => ['bool', 'directory'=>'string', 'files='=>'string|array|null', 'overwrite='=>'bool'], 'PharData::isWritable' => ['bool'], - 'PharData::offsetExists' => ['bool', 'offset'=>'string'], - 'PharData::offsetGet' => ['PharFileInfo', 'offset'=>'string'], - 'PharData::offsetSet' => ['void', 'offset'=>'string', 'value'=>'string'], - 'PharData::offsetUnset' => ['bool', 'offset'=>'string'], + 'PharData::offsetExists' => ['bool', 'localName'=>'string'], + 'PharData::offsetGet' => ['PharFileInfo', 'localName'=>'string'], + 'PharData::offsetSet' => ['void', 'localName'=>'string', 'value'=>'string'], + 'PharData::offsetUnset' => ['void', 'localName'=>'string'], 'PharData::setAlias' => ['bool', 'alias'=>'string'], - 'PharData::setDefaultStub' => ['bool', 'index='=>'string', 'webindex='=>'string'], + 'PharData::setDefaultStub' => ['bool', 'index='=>'?string', 'webIndex='=>'string'], + 'PharData::setMetadata' => ['void', 'metadata'=>'mixed'], + 'PharData::setSignatureAlgorithm' => ['void', 'algo'=>'int', 'privateKey='=>'string'], 'PharData::setStub' => ['bool', 'stub'=>'string', 'length='=>'int'], - 'PharFileInfo::__construct' => ['void', 'entry'=>'string'], - 'PharFileInfo::chmod' => ['void', 'permissions'=>'int'], + 'PharFileInfo::__construct' => ['void', 'filename'=>'string'], + 'PharFileInfo::chmod' => ['void', 'perms'=>'int'], 'PharFileInfo::compress' => ['bool', 'compression'=>'int'], 'PharFileInfo::decompress' => ['bool'], 'PharFileInfo::delMetadata' => ['bool'], @@ -4936,13 +4935,8 @@ return [ 'PharFileInfo::getPharFlags' => ['int'], 'PharFileInfo::hasMetadata' => ['bool'], 'PharFileInfo::isCRCChecked' => ['bool'], - 'PharFileInfo::isCompressed' => ['bool', 'compression_type='=>'int'], - 'PharFileInfo::isCompressedBZIP2' => ['bool'], - 'PharFileInfo::isCompressedGZ' => ['bool'], - 'PharFileInfo::setCompressedBZIP2' => ['bool'], - 'PharFileInfo::setCompressedGZ' => ['bool'], + 'PharFileInfo::isCompressed' => ['bool', 'compression='=>'int'], 'PharFileInfo::setMetadata' => ['void', 'metadata'=>'mixed'], - 'PharFileInfo::setUncompressed' => ['bool'], 'Pool::__construct' => ['void', 'size'=>'int', 'class'=>'string', 'ctor='=>'array'], 'Pool::collect' => ['int', 'collector='=>'Callable'], 'Pool::resize' => ['void', 'size'=>'int'], @@ -5137,7 +5131,7 @@ return [ 'RdKafka\TopicPartition::setTopic' => ['void', 'topic_name'=>'string'], 'RecursiveArrayIterator::__construct' => ['void', 'array='=>'array|object', 'flags='=>'int'], 'RecursiveArrayIterator::append' => ['void', 'value'=>'mixed'], - 'RecursiveArrayIterator::asort' => ['void'], + 'RecursiveArrayIterator::asort' => ['true', 'flags='=>'int'], 'RecursiveArrayIterator::count' => ['int'], 'RecursiveArrayIterator::current' => ['mixed'], 'RecursiveArrayIterator::getArrayCopy' => ['array'], @@ -5145,23 +5139,23 @@ return [ 'RecursiveArrayIterator::getFlags' => ['int'], 'RecursiveArrayIterator::hasChildren' => ['bool'], 'RecursiveArrayIterator::key' => ['string|int|null'], - 'RecursiveArrayIterator::ksort' => ['void'], + 'RecursiveArrayIterator::ksort' => ['true', 'flags='=>'int'], 'RecursiveArrayIterator::natcasesort' => ['true'], 'RecursiveArrayIterator::natsort' => ['true'], 'RecursiveArrayIterator::next' => ['void'], - 'RecursiveArrayIterator::offsetExists' => ['void', 'index'=>'string'], - 'RecursiveArrayIterator::offsetGet' => ['mixed', 'index'=>'string'], - 'RecursiveArrayIterator::offsetSet' => ['void', 'index'=>'string', 'newval'=>'string'], - 'RecursiveArrayIterator::offsetUnset' => ['void', 'index'=>'string'], + 'RecursiveArrayIterator::offsetExists' => ['bool', 'key'=>'string|int'], + 'RecursiveArrayIterator::offsetGet' => ['mixed', 'key'=>'string|int'], + 'RecursiveArrayIterator::offsetSet' => ['void', 'key'=>'string|int', 'value'=>'string'], + 'RecursiveArrayIterator::offsetUnset' => ['void', 'key'=>'string|int'], 'RecursiveArrayIterator::rewind' => ['void'], - 'RecursiveArrayIterator::seek' => ['void', 'position'=>'int'], + 'RecursiveArrayIterator::seek' => ['void', 'offset'=>'int'], 'RecursiveArrayIterator::serialize' => ['string'], - 'RecursiveArrayIterator::setFlags' => ['void', 'flags'=>'string'], - 'RecursiveArrayIterator::uasort' => ['void', 'cmp_function'=>'callable(mixed,mixed):int'], - 'RecursiveArrayIterator::uksort' => ['void', 'cmp_function'=>'callable(mixed,mixed):int'], - 'RecursiveArrayIterator::unserialize' => ['string', 'serialized'=>'string'], + 'RecursiveArrayIterator::setFlags' => ['void', 'flags'=>'int'], + 'RecursiveArrayIterator::uasort' => ['true', 'callback'=>'callable(mixed,mixed):int'], + 'RecursiveArrayIterator::uksort' => ['true', 'callback'=>'callable(mixed,mixed):int'], + 'RecursiveArrayIterator::unserialize' => ['void', 'data'=>'string'], 'RecursiveArrayIterator::valid' => ['bool'], - 'RecursiveCachingIterator::__construct' => ['void', 'it'=>'Iterator', 'flags='=>'int'], + 'RecursiveCachingIterator::__construct' => ['void', 'iterator'=>'Iterator', 'flags='=>'int'], 'RecursiveCachingIterator::__toString' => ['string'], 'RecursiveCachingIterator::count' => ['int'], 'RecursiveCachingIterator::current' => ['void'], @@ -5173,14 +5167,14 @@ return [ 'RecursiveCachingIterator::hasNext' => ['bool'], 'RecursiveCachingIterator::key' => ['bool|float|int|string'], 'RecursiveCachingIterator::next' => ['void'], - 'RecursiveCachingIterator::offsetExists' => ['bool', 'index'=>'string'], - 'RecursiveCachingIterator::offsetGet' => ['string', 'index'=>'string'], - 'RecursiveCachingIterator::offsetSet' => ['void', 'index'=>'string', 'newval'=>'string'], - 'RecursiveCachingIterator::offsetUnset' => ['void', 'index'=>'string'], + 'RecursiveCachingIterator::offsetExists' => ['bool', 'key'=>'string'], + 'RecursiveCachingIterator::offsetGet' => ['string', 'key'=>'string'], + 'RecursiveCachingIterator::offsetSet' => ['void', 'key'=>'string', 'value'=>'string'], + 'RecursiveCachingIterator::offsetUnset' => ['void', 'key'=>'string'], 'RecursiveCachingIterator::rewind' => ['void'], 'RecursiveCachingIterator::setFlags' => ['void', 'flags'=>'int'], 'RecursiveCachingIterator::valid' => ['bool'], - 'RecursiveCallbackFilterIterator::__construct' => ['void', 'iterator'=>'RecursiveIterator', 'func'=>'callable'], + 'RecursiveCallbackFilterIterator::__construct' => ['void', 'iterator'=>'RecursiveIterator', 'callback'=>'callable(mixed,mixed=,mixed=):bool'], 'RecursiveCallbackFilterIterator::accept' => ['bool'], 'RecursiveCallbackFilterIterator::current' => ['mixed'], 'RecursiveCallbackFilterIterator::getChildren' => ['RecursiveCallbackFilterIterator'], @@ -5190,7 +5184,7 @@ return [ 'RecursiveCallbackFilterIterator::next' => ['void'], 'RecursiveCallbackFilterIterator::rewind' => ['void'], 'RecursiveCallbackFilterIterator::valid' => ['bool'], - 'RecursiveDirectoryIterator::__construct' => ['void', 'path'=>'string', 'flags='=>'int'], + 'RecursiveDirectoryIterator::__construct' => ['void', 'directory'=>'string', 'flags='=>'int'], 'RecursiveDirectoryIterator::__toString' => ['string'], 'RecursiveDirectoryIterator::current' => ['string|SplFileInfo|FilesystemIterator'], 'RecursiveDirectoryIterator::getATime' => ['int'], @@ -5198,7 +5192,7 @@ return [ 'RecursiveDirectoryIterator::getCTime' => ['int'], 'RecursiveDirectoryIterator::getChildren' => ['RecursiveDirectoryIterator'], 'RecursiveDirectoryIterator::getExtension' => ['string'], - 'RecursiveDirectoryIterator::getFileInfo' => ['SplFileInfo', 'class_name='=>'string'], + 'RecursiveDirectoryIterator::getFileInfo' => ['SplFileInfo', 'class='=>'class-string'], 'RecursiveDirectoryIterator::getFilename' => ['string'], 'RecursiveDirectoryIterator::getFlags' => ['int'], 'RecursiveDirectoryIterator::getGroup' => ['int'], @@ -5207,7 +5201,7 @@ return [ 'RecursiveDirectoryIterator::getMTime' => ['int'], 'RecursiveDirectoryIterator::getOwner' => ['int'], 'RecursiveDirectoryIterator::getPath' => ['string'], - 'RecursiveDirectoryIterator::getPathInfo' => ['SplFileInfo', 'class_name='=>'string'], + 'RecursiveDirectoryIterator::getPathInfo' => ['?SplFileInfo', 'class='=>'class-string'], 'RecursiveDirectoryIterator::getPathname' => ['string'], 'RecursiveDirectoryIterator::getPerms' => ['int'], 'RecursiveDirectoryIterator::getRealPath' => ['string'], @@ -5215,7 +5209,7 @@ return [ 'RecursiveDirectoryIterator::getSubPath' => ['string'], 'RecursiveDirectoryIterator::getSubPathname' => ['string'], 'RecursiveDirectoryIterator::getType' => ['string'], - 'RecursiveDirectoryIterator::hasChildren' => ['bool', 'allow_links='=>'bool'], + 'RecursiveDirectoryIterator::hasChildren' => ['bool', 'allowLinks='=>'bool'], 'RecursiveDirectoryIterator::isDir' => ['bool'], 'RecursiveDirectoryIterator::isDot' => ['bool'], 'RecursiveDirectoryIterator::isExecutable' => ['bool'], @@ -5225,12 +5219,12 @@ return [ 'RecursiveDirectoryIterator::isWritable' => ['bool'], 'RecursiveDirectoryIterator::key' => ['string'], 'RecursiveDirectoryIterator::next' => ['void'], - 'RecursiveDirectoryIterator::openFile' => ['SplFileObject', 'mode='=>'string', 'use_include_path='=>'bool', 'context='=>'resource'], + 'RecursiveDirectoryIterator::openFile' => ['SplFileObject', 'mode='=>'string', 'useIncludePath='=>'bool', 'context='=>'resource'], 'RecursiveDirectoryIterator::rewind' => ['void'], - 'RecursiveDirectoryIterator::seek' => ['void', 'position'=>'int'], - 'RecursiveDirectoryIterator::setFileClass' => ['void', 'class_name='=>'string'], - 'RecursiveDirectoryIterator::setFlags' => ['void', 'flags='=>'int'], - 'RecursiveDirectoryIterator::setInfoClass' => ['void', 'class_name='=>'string'], + 'RecursiveDirectoryIterator::seek' => ['void', 'offset'=>'int'], + 'RecursiveDirectoryIterator::setFileClass' => ['void', 'class='=>'class-string'], + 'RecursiveDirectoryIterator::setFlags' => ['void', 'flags'=>'int'], + 'RecursiveDirectoryIterator::setInfoClass' => ['void', 'class='=>'class-string'], 'RecursiveDirectoryIterator::valid' => ['bool'], 'RecursiveFilterIterator::__construct' => ['void', 'iterator'=>'RecursiveIterator'], 'RecursiveFilterIterator::accept' => ['bool'], @@ -5266,9 +5260,9 @@ return [ 'RecursiveIteratorIterator::next' => ['void'], 'RecursiveIteratorIterator::nextElement' => ['void'], 'RecursiveIteratorIterator::rewind' => ['void'], - 'RecursiveIteratorIterator::setMaxDepth' => ['void', 'max_depth='=>'int'], + 'RecursiveIteratorIterator::setMaxDepth' => ['void', 'maxDepth='=>'int'], 'RecursiveIteratorIterator::valid' => ['bool'], - 'RecursiveRegexIterator::__construct' => ['void', 'iterator'=>'RecursiveIterator', 'regex'=>'string', 'mode='=>'int', 'flags='=>'int', 'preg_flags='=>'int'], + 'RecursiveRegexIterator::__construct' => ['void', 'iterator'=>'RecursiveIterator', 'pattern'=>'string', 'mode='=>'int', 'flags='=>'int', 'pregFlags='=>'int'], 'RecursiveRegexIterator::accept' => ['bool'], 'RecursiveRegexIterator::current' => ['mixed'], 'RecursiveRegexIterator::getChildren' => ['RecursiveRegexIterator'], @@ -5281,11 +5275,11 @@ return [ 'RecursiveRegexIterator::key' => ['mixed'], 'RecursiveRegexIterator::next' => ['void'], 'RecursiveRegexIterator::rewind' => ['void'], - 'RecursiveRegexIterator::setFlags' => ['void', 'new_flags'=>'int'], - 'RecursiveRegexIterator::setMode' => ['void', 'new_mode'=>'int'], - 'RecursiveRegexIterator::setPregFlags' => ['void', 'new_flags'=>'int'], + 'RecursiveRegexIterator::setFlags' => ['void', 'flags'=>'int'], + 'RecursiveRegexIterator::setMode' => ['void', 'mode'=>'int'], + 'RecursiveRegexIterator::setPregFlags' => ['void', 'pregFlags'=>'int'], 'RecursiveRegexIterator::valid' => ['bool'], - 'RecursiveTreeIterator::__construct' => ['void', 'iterator'=>'RecursiveIterator|IteratorAggregate', 'flags='=>'int', 'cit_flags='=>'int', 'mode'=>'int'], + 'RecursiveTreeIterator::__construct' => ['void', 'iterator'=>'RecursiveIterator|IteratorAggregate', 'flags='=>'int', 'cachingIteratorFlags='=>'int', 'mode='=>'int'], 'RecursiveTreeIterator::beginChildren' => ['void'], 'RecursiveTreeIterator::beginIteration' => ['void'], 'RecursiveTreeIterator::callGetChildren' => ['?RecursiveIterator'], @@ -5304,9 +5298,9 @@ return [ 'RecursiveTreeIterator::next' => ['void'], 'RecursiveTreeIterator::nextElement' => ['void'], 'RecursiveTreeIterator::rewind' => ['void'], - 'RecursiveTreeIterator::setMaxDepth' => ['void', 'max_depth='=>'int'], - 'RecursiveTreeIterator::setPostfix' => ['void', 'prefix'=>'string'], - 'RecursiveTreeIterator::setPrefixPart' => ['void', 'part'=>'int', 'prefix'=>'string'], + 'RecursiveTreeIterator::setMaxDepth' => ['void', 'maxDepth='=>'int'], + 'RecursiveTreeIterator::setPostfix' => ['void', 'postfix'=>'string'], + 'RecursiveTreeIterator::setPrefixPart' => ['void', 'part'=>'int', 'value'=>'string'], 'RecursiveTreeIterator::valid' => ['bool'], 'Redis::__construct' => ['void'], 'Redis::__destruct' => ['void'], @@ -6067,7 +6061,7 @@ return [ 'ReflectionZendExtension::getVersion' => ['string'], 'Reflector::__toString' => ['string'], 'Reflector::export' => ['?string'], - 'RegexIterator::__construct' => ['void', 'iterator'=>'Iterator', 'regex'=>'string', 'mode='=>'int', 'flags='=>'int', 'preg_flags='=>'int'], + 'RegexIterator::__construct' => ['void', 'iterator'=>'Iterator', 'pattern'=>'string', 'mode='=>'int', 'flags='=>'int', 'pregFlags='=>'int'], 'RegexIterator::accept' => ['bool'], 'RegexIterator::current' => ['mixed'], 'RegexIterator::getFlags' => ['int'], @@ -6078,9 +6072,9 @@ return [ 'RegexIterator::key' => ['mixed'], 'RegexIterator::next' => ['void'], 'RegexIterator::rewind' => ['void'], - 'RegexIterator::setFlags' => ['void', 'new_flags'=>'int'], - 'RegexIterator::setMode' => ['void', 'new_mode'=>'int'], - 'RegexIterator::setPregFlags' => ['void', 'new_flags'=>'int'], + 'RegexIterator::setFlags' => ['void', 'flags'=>'int'], + 'RegexIterator::setMode' => ['void', 'mode'=>'int'], + 'RegexIterator::setPregFlags' => ['void', 'pregFlags'=>'int'], 'RegexIterator::valid' => ['bool'], 'ResourceBundle::__construct' => ['void', 'locale'=>'string', 'bundlename'=>'string', 'fallback='=>'bool'], 'ResourceBundle::count' => ['int'], @@ -7494,7 +7488,7 @@ return [ 'SphinxClient::status' => ['array'], 'SphinxClient::updateAttributes' => ['int', 'index'=>'string', 'attributes'=>'array', 'values'=>'array', 'mva='=>'bool'], 'SplDoublyLinkedList::__construct' => ['void'], - 'SplDoublyLinkedList::add' => ['void', 'index'=>'mixed', 'newval'=>'mixed'], + 'SplDoublyLinkedList::add' => ['void', 'index'=>'int', 'value'=>'mixed'], 'SplDoublyLinkedList::bottom' => ['mixed'], 'SplDoublyLinkedList::count' => ['int'], 'SplDoublyLinkedList::current' => ['mixed'], @@ -7504,17 +7498,17 @@ return [ 'SplDoublyLinkedList::next' => ['void'], 'SplDoublyLinkedList::offsetExists' => ['bool', 'index'=>'mixed'], 'SplDoublyLinkedList::offsetGet' => ['mixed', 'index'=>'mixed'], - 'SplDoublyLinkedList::offsetSet' => ['void', 'index'=>'mixed', 'newval'=>'mixed'], + 'SplDoublyLinkedList::offsetSet' => ['void', 'index'=>'mixed', 'value'=>'mixed'], 'SplDoublyLinkedList::offsetUnset' => ['void', 'index'=>'mixed'], 'SplDoublyLinkedList::pop' => ['mixed'], 'SplDoublyLinkedList::prev' => ['void'], 'SplDoublyLinkedList::push' => ['void', 'value'=>'mixed'], 'SplDoublyLinkedList::rewind' => ['void'], 'SplDoublyLinkedList::serialize' => ['string'], - 'SplDoublyLinkedList::setIteratorMode' => ['void', 'flags'=>'int'], + 'SplDoublyLinkedList::setIteratorMode' => ['int', 'mode'=>'int'], 'SplDoublyLinkedList::shift' => ['mixed'], 'SplDoublyLinkedList::top' => ['mixed'], - 'SplDoublyLinkedList::unserialize' => ['void', 'serialized'=>'string'], + 'SplDoublyLinkedList::unserialize' => ['void', 'data'=>'string'], 'SplDoublyLinkedList::unshift' => ['void', 'value'=>'mixed'], 'SplDoublyLinkedList::valid' => ['bool'], 'SplEnum::__construct' => ['void', 'initial_value='=>'mixed', 'strict='=>'bool'], @@ -7526,7 +7520,7 @@ return [ 'SplFileInfo::getBasename' => ['string', 'suffix='=>'string'], 'SplFileInfo::getCTime' => ['int|false'], 'SplFileInfo::getExtension' => ['string'], - 'SplFileInfo::getFileInfo' => ['SplFileInfo', 'class='=>'string'], + 'SplFileInfo::getFileInfo' => ['SplFileInfo', 'class='=>'class-string'], 'SplFileInfo::getFilename' => ['string'], 'SplFileInfo::getGroup' => ['int|false'], 'SplFileInfo::getInode' => ['int|false'], @@ -7534,7 +7528,7 @@ return [ 'SplFileInfo::getMTime' => ['int|false'], 'SplFileInfo::getOwner' => ['int|false'], 'SplFileInfo::getPath' => ['string'], - 'SplFileInfo::getPathInfo' => ['SplFileInfo|null', 'class='=>'string'], + 'SplFileInfo::getPathInfo' => ['SplFileInfo|null', 'class='=>'class-string'], 'SplFileInfo::getPathname' => ['string'], 'SplFileInfo::getPerms' => ['int|false'], 'SplFileInfo::getRealPath' => ['string|false'], @@ -7547,8 +7541,8 @@ return [ 'SplFileInfo::isReadable' => ['bool'], 'SplFileInfo::isWritable' => ['bool'], 'SplFileInfo::openFile' => ['SplFileObject', 'mode='=>'string', 'useIncludePath='=>'bool', 'context='=>'resource'], - 'SplFileInfo::setFileClass' => ['void', 'class='=>'string'], - 'SplFileInfo::setInfoClass' => ['void', 'class='=>'string'], + 'SplFileInfo::setFileClass' => ['void', 'class='=>'class-string'], + 'SplFileInfo::setInfoClass' => ['void', 'class='=>'class-string'], 'SplFileObject::__construct' => ['void', 'filename'=>'string', 'mode='=>'string', 'useIncludePath='=>'bool', 'context='=>'?resource'], 'SplFileObject::__toString' => ['string'], 'SplFileObject::current' => ['string|array|false'], @@ -7575,7 +7569,7 @@ return [ 'SplFileObject::getCsvControl' => ['array'], 'SplFileObject::getCurrentLine' => ['string|false'], 'SplFileObject::getExtension' => ['string'], - 'SplFileObject::getFileInfo' => ['SplFileInfo', 'class='=>'string'], + 'SplFileObject::getFileInfo' => ['SplFileInfo', 'class='=>'class-string'], 'SplFileObject::getFilename' => ['string'], 'SplFileObject::getFlags' => ['int'], 'SplFileObject::getGroup' => ['int|false'], @@ -7585,7 +7579,7 @@ return [ 'SplFileObject::getMTime' => ['int|false'], 'SplFileObject::getOwner' => ['int|false'], 'SplFileObject::getPath' => ['string'], - 'SplFileObject::getPathInfo' => ['SplFileInfo|null', 'class='=>'string'], + 'SplFileObject::getPathInfo' => ['SplFileInfo|null', 'class='=>'class-string'], 'SplFileObject::getPathname' => ['string'], 'SplFileObject::getPerms' => ['int|false'], 'SplFileObject::getRealPath' => ['false|string'], @@ -7604,22 +7598,22 @@ return [ 'SplFileObject::rewind' => ['void'], 'SplFileObject::seek' => ['void', 'line'=>'int'], 'SplFileObject::setCsvControl' => ['void', 'separator='=>'string', 'enclosure='=>'string', 'escape='=>'string'], - 'SplFileObject::setFileClass' => ['void', 'class='=>'string'], + 'SplFileObject::setFileClass' => ['void', 'class='=>'class-string'], 'SplFileObject::setFlags' => ['void', 'flags'=>'int'], - 'SplFileObject::setInfoClass' => ['void', 'class='=>'string'], + 'SplFileObject::setInfoClass' => ['void', 'class='=>'class-string'], 'SplFileObject::setMaxLineLen' => ['void', 'maxLength'=>'int'], 'SplFileObject::valid' => ['bool'], 'SplFixedArray::__construct' => ['void', 'size='=>'int'], 'SplFixedArray::__wakeup' => ['void'], 'SplFixedArray::count' => ['int'], 'SplFixedArray::current' => ['mixed'], - 'SplFixedArray::fromArray' => ['SplFixedArray', 'data'=>'array', 'save_indexes='=>'bool'], + 'SplFixedArray::fromArray' => ['SplFixedArray', 'array'=>'array', 'preserveKeys='=>'bool'], 'SplFixedArray::getSize' => ['int'], 'SplFixedArray::key' => ['int'], 'SplFixedArray::next' => ['void'], 'SplFixedArray::offsetExists' => ['bool', 'index'=>'int'], 'SplFixedArray::offsetGet' => ['mixed', 'index'=>'int'], - 'SplFixedArray::offsetSet' => ['void', 'index'=>'int', 'newval'=>'mixed'], + 'SplFixedArray::offsetSet' => ['void', 'index'=>'int', 'value'=>'mixed'], 'SplFixedArray::offsetUnset' => ['void', 'index'=>'int'], 'SplFixedArray::rewind' => ['void'], 'SplFixedArray::setSize' => ['bool', 'size'=>'int'], @@ -7640,8 +7634,8 @@ return [ 'SplHeap::top' => ['mixed'], 'SplHeap::valid' => ['bool'], 'SplMaxHeap::__construct' => ['void'], - 'SplMaxHeap::compare' => ['int', 'a'=>'mixed', 'b'=>'mixed'], - 'SplMinHeap::compare' => ['int', 'a'=>'mixed', 'b'=>'mixed'], + 'SplMaxHeap::compare' => ['int', 'value1'=>'mixed', 'value2'=>'mixed'], + 'SplMinHeap::compare' => ['int', 'value1'=>'mixed', 'value2'=>'mixed'], 'SplMinHeap::count' => ['int'], 'SplMinHeap::current' => ['mixed'], 'SplMinHeap::extract' => ['mixed'], @@ -7655,10 +7649,10 @@ return [ 'SplMinHeap::top' => ['mixed'], 'SplMinHeap::valid' => ['bool'], 'SplObjectStorage::__construct' => ['void'], - 'SplObjectStorage::addAll' => ['void', 'os'=>'splobjectstorage'], - 'SplObjectStorage::attach' => ['void', 'object'=>'object', 'inf='=>'mixed'], + 'SplObjectStorage::addAll' => ['int', 'storage'=>'SplObjectStorage'], + 'SplObjectStorage::attach' => ['void', 'object'=>'object', 'info='=>'mixed'], 'SplObjectStorage::contains' => ['bool', 'object'=>'object'], - 'SplObjectStorage::count' => ['int'], + 'SplObjectStorage::count' => ['int', 'mode='=>'int'], 'SplObjectStorage::current' => ['object'], 'SplObjectStorage::detach' => ['void', 'object'=>'object'], 'SplObjectStorage::getHash' => ['string', 'object'=>'object'], @@ -7667,18 +7661,18 @@ return [ 'SplObjectStorage::next' => ['void'], 'SplObjectStorage::offsetExists' => ['bool', 'object'=>'object'], 'SplObjectStorage::offsetGet' => ['mixed', 'object'=>'object'], - 'SplObjectStorage::offsetSet' => ['object', 'object'=>'object', 'data='=>'mixed'], + 'SplObjectStorage::offsetSet' => ['void', 'object'=>'object', 'info='=>'mixed'], 'SplObjectStorage::offsetUnset' => ['void', 'object'=>'object'], - 'SplObjectStorage::removeAll' => ['void', 'os'=>'splobjectstorage'], - 'SplObjectStorage::removeAllExcept' => ['void', 'os'=>'splobjectstorage'], + 'SplObjectStorage::removeAll' => ['int', 'storage'=>'SplObjectStorage'], + 'SplObjectStorage::removeAllExcept' => ['int', 'storage'=>'SplObjectStorage'], 'SplObjectStorage::rewind' => ['void'], 'SplObjectStorage::serialize' => ['string'], - 'SplObjectStorage::setInfo' => ['void', 'inf'=>'mixed'], - 'SplObjectStorage::unserialize' => ['void', 'serialized'=>'string'], + 'SplObjectStorage::setInfo' => ['void', 'info'=>'mixed'], + 'SplObjectStorage::unserialize' => ['void', 'data'=>'string'], 'SplObjectStorage::valid' => ['bool'], 'SplObserver::update' => ['void', 'subject'=>'SplSubject'], 'SplPriorityQueue::__construct' => ['void'], - 'SplPriorityQueue::compare' => ['int', 'a'=>'mixed', 'b'=>'mixed'], + 'SplPriorityQueue::compare' => ['int', 'priority1'=>'mixed', 'priority2'=>'mixed'], 'SplPriorityQueue::count' => ['int'], 'SplPriorityQueue::current' => ['mixed'], 'SplPriorityQueue::extract' => ['mixed'], @@ -7700,7 +7694,7 @@ return [ 'SplQueue::next' => ['void'], 'SplQueue::offsetExists' => ['bool', 'index'=>'mixed'], 'SplQueue::offsetGet' => ['mixed', 'index'=>'mixed'], - 'SplQueue::offsetSet' => ['void', 'index'=>'mixed', 'newval'=>'mixed'], + 'SplQueue::offsetSet' => ['void', 'index'=>'?int', 'value'=>'mixed'], 'SplQueue::offsetUnset' => ['void', 'index'=>'mixed'], 'SplQueue::pop' => ['mixed'], 'SplQueue::prev' => ['void'], @@ -7710,11 +7704,11 @@ return [ 'SplQueue::setIteratorMode' => ['int', 'mode'=>'int'], 'SplQueue::shift' => ['mixed'], 'SplQueue::top' => ['mixed'], - 'SplQueue::unserialize' => ['void', 'serialized'=>'string'], + 'SplQueue::unserialize' => ['void', 'data'=>'string'], 'SplQueue::unshift' => ['void', 'value'=>'mixed'], 'SplQueue::valid' => ['bool'], 'SplStack::__construct' => ['void'], - 'SplStack::add' => ['void', 'index'=>'mixed', 'newval'=>'mixed'], + 'SplStack::add' => ['void', 'index'=>'int', 'value'=>'mixed'], 'SplStack::bottom' => ['mixed'], 'SplStack::count' => ['int'], 'SplStack::current' => ['mixed'], @@ -7724,7 +7718,7 @@ return [ 'SplStack::next' => ['void'], 'SplStack::offsetExists' => ['bool', 'index'=>'mixed'], 'SplStack::offsetGet' => ['mixed', 'index'=>'mixed'], - 'SplStack::offsetSet' => ['void', 'index'=>'mixed', 'newval'=>'mixed'], + 'SplStack::offsetSet' => ['void', 'index'=>'?int', 'value'=>'mixed'], 'SplStack::offsetUnset' => ['void', 'index'=>'mixed'], 'SplStack::pop' => ['mixed'], 'SplStack::prev' => ['void'], @@ -7734,7 +7728,7 @@ return [ 'SplStack::setIteratorMode' => ['int', 'mode'=>'int'], 'SplStack::shift' => ['mixed'], 'SplStack::top' => ['mixed'], - 'SplStack::unserialize' => ['void', 'serialized'=>'string'], + 'SplStack::unserialize' => ['void', 'data'=>'string'], 'SplStack::unshift' => ['void', 'value'=>'mixed'], 'SplStack::valid' => ['bool'], 'SplSubject::attach' => ['void', 'observer'=>'SplObserver'], @@ -7766,7 +7760,7 @@ return [ 'SplTempFileObject::getCsvControl' => ['array'], 'SplTempFileObject::getCurrentLine' => ['string'], 'SplTempFileObject::getExtension' => ['string'], - 'SplTempFileObject::getFileInfo' => ['SplFileInfo', 'class='=>'string'], + 'SplTempFileObject::getFileInfo' => ['SplFileInfo', 'class='=>'class-string'], 'SplTempFileObject::getFilename' => ['string'], 'SplTempFileObject::getFlags' => ['int'], 'SplTempFileObject::getGroup' => ['int|false'], @@ -7776,7 +7770,7 @@ return [ 'SplTempFileObject::getMTime' => ['int|false'], 'SplTempFileObject::getOwner' => ['int|false'], 'SplTempFileObject::getPath' => ['string'], - 'SplTempFileObject::getPathInfo' => ['SplFileInfo|null', 'class='=>'string'], + 'SplTempFileObject::getPathInfo' => ['SplFileInfo|null', 'class='=>'class-string'], 'SplTempFileObject::getPathname' => ['string'], 'SplTempFileObject::getPerms' => ['int|false'], 'SplTempFileObject::getRealPath' => ['false|string'], @@ -7795,9 +7789,9 @@ return [ 'SplTempFileObject::rewind' => ['void'], 'SplTempFileObject::seek' => ['void', 'line'=>'int'], 'SplTempFileObject::setCsvControl' => ['void', 'separator='=>'string', 'enclosure='=>'string', 'escape='=>'string'], - 'SplTempFileObject::setFileClass' => ['void', 'class='=>'string'], + 'SplTempFileObject::setFileClass' => ['void', 'class='=>'class-string'], 'SplTempFileObject::setFlags' => ['void', 'flags'=>'int'], - 'SplTempFileObject::setInfoClass' => ['void', 'class='=>'string'], + 'SplTempFileObject::setInfoClass' => ['void', 'class='=>'class-string'], 'SplTempFileObject::setMaxLineLen' => ['void', 'maxLength'=>'int'], 'SplTempFileObject::valid' => ['bool'], 'SplType::__construct' => ['void', 'initial_value='=>'mixed', 'strict='=>'bool'], @@ -9351,29 +9345,29 @@ return [ 'apd_set_session' => ['void', 'debug_level'=>'int'], 'apd_set_session_trace' => ['void', 'debug_level'=>'int', 'dump_directory='=>'string'], 'apd_set_session_trace_socket' => ['bool', 'tcp_server'=>'string', 'socket_type'=>'int', 'port'=>'int', 'debug_level'=>'int'], - 'array_change_key_case' => ['associative-array', 'array'=>'array', 'case='=>'int'], + 'array_change_key_case' => ['array', 'array'=>'array', 'case='=>'int'], 'array_chunk' => ['list', 'array'=>'array', 'length'=>'int', 'preserve_keys='=>'bool'], 'array_column' => ['array', 'array'=>'array', 'column_key'=>'mixed', 'index_key='=>'mixed'], - 'array_combine' => ['associative-array|false', 'keys'=>'string[]|int[]', 'values'=>'array'], - 'array_count_values' => ['associative-array', 'array'=>'array'], - 'array_diff' => ['associative-array', 'array'=>'array', '...arrays'=>'array'], - 'array_diff_assoc' => ['associative-array', 'array'=>'array', '...arrays'=>'array'], - 'array_diff_key' => ['associative-array', 'array'=>'array', '...arrays'=>'array'], - 'array_diff_uassoc' => ['associative-array', 'array'=>'array', 'rest'=>'array', 'data_comp_func'=>'callable(mixed,mixed):int'], - 'array_diff_uassoc\'1' => ['associative-array', 'array'=>'array', 'rest'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable(mixed,mixed):int', '...rest='=>'array|callable(mixed,mixed):int'], - 'array_diff_ukey' => ['associative-array', 'array'=>'array', 'rest'=>'array', 'key_comp_func'=>'callable(mixed,mixed):int'], - 'array_diff_ukey\'1' => ['associative-array', 'array'=>'array', 'rest'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable(mixed,mixed):int', '...rest='=>'array|callable(mixed,mixed):int'], + 'array_combine' => ['array|false', 'keys'=>'string[]|int[]', 'values'=>'array'], + 'array_count_values' => ['array', 'array'=>'array'], + 'array_diff' => ['array', 'array'=>'array', '...arrays'=>'array'], + 'array_diff_assoc' => ['array', 'array'=>'array', '...arrays'=>'array'], + 'array_diff_key' => ['array', 'array'=>'array', '...arrays'=>'array'], + 'array_diff_uassoc' => ['array', 'array'=>'array', 'rest'=>'array', 'data_comp_func'=>'callable(mixed,mixed):int'], + 'array_diff_uassoc\'1' => ['array', 'array'=>'array', 'rest'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable(mixed,mixed):int', '...rest='=>'array|callable(mixed,mixed):int'], + 'array_diff_ukey' => ['array', 'array'=>'array', 'rest'=>'array', 'key_comp_func'=>'callable(mixed,mixed):int'], + 'array_diff_ukey\'1' => ['array', 'array'=>'array', 'rest'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable(mixed,mixed):int', '...rest='=>'array|callable(mixed,mixed):int'], 'array_fill' => ['array', 'start_index'=>'int', 'count'=>'int', 'value'=>'mixed'], 'array_fill_keys' => ['array', 'keys'=>'array', 'value'=>'mixed'], - 'array_filter' => ['associative-array', 'array'=>'array', 'callback='=>'callable(mixed,mixed=):scalar', 'mode='=>'int'], - 'array_flip' => ['associative-array|associative-array', 'array'=>'array'], - 'array_intersect' => ['associative-array', 'array'=>'array', '...arrays'=>'array'], - 'array_intersect_assoc' => ['associative-array', 'array'=>'array', '...arrays'=>'array'], - 'array_intersect_key' => ['associative-array', 'array'=>'array', '...arrays'=>'array'], - 'array_intersect_uassoc' => ['associative-array', 'array'=>'array', 'rest'=>'array', 'key_compare_func'=>'callable(mixed,mixed):int'], - 'array_intersect_uassoc\'1' => ['associative-array', 'array'=>'array', 'rest'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable(mixed,mixed):int', '...rest'=>'array|callable(mixed,mixed):int'], - 'array_intersect_ukey' => ['associative-array', 'array'=>'array', 'rest'=>'array', 'key_compare_func'=>'callable(mixed,mixed):int'], - 'array_intersect_ukey\'1' => ['associative-array', 'array'=>'array', 'rest'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable(mixed,mixed):int', '...rest'=>'array|callable(mixed,mixed):int'], + 'array_filter' => ['array', 'array'=>'array', 'callback='=>'callable(mixed,mixed=):scalar', 'mode='=>'int'], + 'array_flip' => ['array', 'array'=>'array'], + 'array_intersect' => ['array', 'array'=>'array', '...arrays'=>'array'], + 'array_intersect_assoc' => ['array', 'array'=>'array', '...arrays'=>'array'], + 'array_intersect_key' => ['array', 'array'=>'array', '...arrays'=>'array'], + 'array_intersect_uassoc' => ['array', 'array'=>'array', 'rest'=>'array', 'key_compare_func'=>'callable(mixed,mixed):int'], + 'array_intersect_uassoc\'1' => ['array', 'array'=>'array', 'rest'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable(mixed,mixed):int', '...rest'=>'array|callable(mixed,mixed):int'], + 'array_intersect_ukey' => ['array', 'array'=>'array', 'rest'=>'array', 'key_compare_func'=>'callable(mixed,mixed):int'], + 'array_intersect_ukey\'1' => ['array', 'array'=>'array', 'rest'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable(mixed,mixed):int', '...rest'=>'array|callable(mixed,mixed):int'], 'array_key_exists' => ['bool', 'key'=>'string|int', 'array'=>'array|object'], 'array_keys' => ['list', 'array'=>'array', 'filter_value='=>'mixed', 'strict='=>'bool'], 'array_map' => ['array', 'callback'=>'?callable', 'array'=>'array', '...arrays='=>'array'], @@ -9395,18 +9389,18 @@ return [ 'array_slice' => ['array', 'array'=>'array', 'offset'=>'int', 'length='=>'?int', 'preserve_keys='=>'bool'], 'array_splice' => ['array', '&rw_array'=>'array', 'offset'=>'int', 'length='=>'int', 'replacement='=>'array|string'], 'array_sum' => ['int|float', 'array'=>'array'], - 'array_udiff' => ['associative-array', 'array'=>'array', 'rest'=>'array', 'data_comp_func'=>'callable(mixed,mixed):int'], - 'array_udiff\'1' => ['associative-array', 'array'=>'array', 'rest'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable(mixed,mixed):int', '...rest='=>'array|callable(mixed,mixed):int'], - 'array_udiff_assoc' => ['associative-array', 'array'=>'array', 'rest'=>'array', 'key_comp_func'=>'callable(mixed,mixed):int'], - 'array_udiff_assoc\'1' => ['associative-array', 'array'=>'array', 'rest'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable(mixed,mixed):int', '...rest='=>'array|callable(mixed,mixed):int'], - 'array_udiff_uassoc' => ['associative-array', 'array'=>'array', 'rest'=>'array', 'data_comp_func'=>'callable(mixed,mixed):int', 'key_comp_func'=>'callable(mixed,mixed):int'], - 'array_udiff_uassoc\'1' => ['associative-array', 'array'=>'array', 'rest'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable(mixed,mixed):int', 'arg5'=>'array|callable(mixed,mixed):int', '...rest='=>'array|callable(mixed,mixed):int'], - 'array_uintersect' => ['associative-array', 'array'=>'array', 'rest'=>'array', 'data_compare_func'=>'callable(mixed,mixed):int'], - 'array_uintersect\'1' => ['associative-array', 'array'=>'array', 'rest'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable(mixed,mixed):int', '...rest='=>'array|callable(mixed,mixed):int'], - 'array_uintersect_assoc' => ['associative-array', 'array'=>'array', 'rest'=>'array', 'data_compare_func'=>'callable(mixed,mixed):int'], - 'array_uintersect_assoc\'1' => ['associative-array', 'array'=>'array', 'rest'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable', '...rest='=>'array|callable(mixed,mixed):int'], - 'array_uintersect_uassoc' => ['associative-array', 'array'=>'array', 'rest'=>'array', 'data_compare_func'=>'callable(mixed,mixed):int', 'key_compare_func'=>'callable(mixed,mixed):int'], - 'array_uintersect_uassoc\'1' => ['associative-array', 'array'=>'array', 'rest'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable(mixed,mixed):int', 'arg5'=>'array|callable(mixed,mixed):int', '...rest='=>'array|callable(mixed,mixed):int'], + 'array_udiff' => ['array', 'array'=>'array', 'rest'=>'array', 'data_comp_func'=>'callable(mixed,mixed):int'], + 'array_udiff\'1' => ['array', 'array'=>'array', 'rest'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable(mixed,mixed):int', '...rest='=>'array|callable(mixed,mixed):int'], + 'array_udiff_assoc' => ['array', 'array'=>'array', 'rest'=>'array', 'key_comp_func'=>'callable(mixed,mixed):int'], + 'array_udiff_assoc\'1' => ['array', 'array'=>'array', 'rest'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable(mixed,mixed):int', '...rest='=>'array|callable(mixed,mixed):int'], + 'array_udiff_uassoc' => ['array', 'array'=>'array', 'rest'=>'array', 'data_comp_func'=>'callable(mixed,mixed):int', 'key_comp_func'=>'callable(mixed,mixed):int'], + 'array_udiff_uassoc\'1' => ['array', 'array'=>'array', 'rest'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable(mixed,mixed):int', 'arg5'=>'array|callable(mixed,mixed):int', '...rest='=>'array|callable(mixed,mixed):int'], + 'array_uintersect' => ['array', 'array'=>'array', 'rest'=>'array', 'data_compare_func'=>'callable(mixed,mixed):int'], + 'array_uintersect\'1' => ['array', 'array'=>'array', 'rest'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable(mixed,mixed):int', '...rest='=>'array|callable(mixed,mixed):int'], + 'array_uintersect_assoc' => ['array', 'array'=>'array', 'rest'=>'array', 'data_compare_func'=>'callable(mixed,mixed):int'], + 'array_uintersect_assoc\'1' => ['array', 'array'=>'array', 'rest'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable', '...rest='=>'array|callable(mixed,mixed):int'], + 'array_uintersect_uassoc' => ['array', 'array'=>'array', 'rest'=>'array', 'data_compare_func'=>'callable(mixed,mixed):int', 'key_compare_func'=>'callable(mixed,mixed):int'], + 'array_uintersect_uassoc\'1' => ['array', 'array'=>'array', 'rest'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable(mixed,mixed):int', 'arg5'=>'array|callable(mixed,mixed):int', '...rest='=>'array|callable(mixed,mixed):int'], 'array_unique' => ['array', 'array'=>'array', 'flags='=>'0'], 'array_unique\'1' => ['array', 'array'=>'array', 'flags='=>'1'], 'array_unique\'2' => ['array', 'array'=>'array', 'flags='=>'2|5'], @@ -9852,62 +9846,62 @@ return [ 'datefmt_set_lenient' => ['void', 'formatter'=>'IntlDateFormatter', 'lenient'=>'bool'], 'datefmt_set_pattern' => ['bool', 'formatter'=>'IntlDateFormatter', 'pattern'=>'string'], 'datefmt_set_timezone' => ['false|null', 'formatter'=>'IntlDateFormatter', 'timezone'=>'IntlTimeZone|DateTimeZone|string|null'], - 'db2_autocommit' => ['mixed', 'connection'=>'resource', 'value='=>'int'], + 'db2_autocommit' => ['0|1|bool', 'connection'=>'resource', 'value='=>'0|1'], 'db2_bind_param' => ['bool', 'stmt'=>'resource', 'parameter_number'=>'int', 'variable_name'=>'string', 'parameter_type='=>'int', 'data_type='=>'int', 'precision='=>'int', 'scale='=>'int'], - 'db2_client_info' => ['object|false', 'connection'=>'resource'], + 'db2_client_info' => ['stdClass|false', 'connection'=>'resource'], 'db2_close' => ['bool', 'connection'=>'resource'], - 'db2_column_privileges' => ['resource|false', 'connection'=>'resource', 'qualifier='=>'string', 'schema='=>'string', 'table_name='=>'string', 'column_name='=>'string'], - 'db2_columns' => ['resource|false', 'connection'=>'resource', 'qualifier='=>'string', 'schema='=>'string', 'table_name='=>'string', 'column_name='=>'string'], + 'db2_column_privileges' => ['resource|false', 'connection'=>'resource', 'qualifier='=>'?string', 'schema='=>'?string', 'table_name='=>'?string', 'column_name='=>'?string'], + 'db2_columns' => ['resource|false', 'connection'=>'resource', 'qualifier='=>'?string', 'schema='=>'?string', 'table_name='=>'?string', 'column_name='=>'?string'], 'db2_commit' => ['bool', 'connection'=>'resource'], 'db2_conn_error' => ['string', 'connection='=>'resource'], 'db2_conn_errormsg' => ['string', 'connection='=>'resource'], - 'db2_connect' => ['resource|false', 'database'=>'string', 'username'=>'string', 'password'=>'string', 'options='=>'array'], + 'db2_connect' => ['resource|false', 'database'=>'string', 'username'=>'?string', 'password'=>'?string', 'options='=>'array'], 'db2_cursor_type' => ['int', 'stmt'=>'resource'], 'db2_escape_string' => ['string', 'string_literal'=>'string'], 'db2_exec' => ['resource|false', 'connection'=>'resource', 'statement'=>'string', 'options='=>'array'], 'db2_execute' => ['bool', 'stmt'=>'resource', 'parameters='=>'array'], - 'db2_fetch_array' => ['array|false', 'stmt'=>'resource', 'row_number='=>'int'], - 'db2_fetch_assoc' => ['array|false', 'stmt'=>'resource', 'row_number='=>'int'], - 'db2_fetch_both' => ['array|false', 'stmt'=>'resource', 'row_number='=>'int'], - 'db2_fetch_object' => ['object|false', 'stmt'=>'resource', 'row_number='=>'int'], - 'db2_fetch_row' => ['bool', 'stmt'=>'resource', 'row_number='=>'int'], - 'db2_field_display_size' => ['int|false', 'stmt'=>'resource', 'column'=>'mixed'], - 'db2_field_name' => ['string|false', 'stmt'=>'resource', 'column'=>'mixed'], - 'db2_field_num' => ['int|false', 'stmt'=>'resource', 'column'=>'mixed'], - 'db2_field_precision' => ['int|false', 'stmt'=>'resource', 'column'=>'mixed'], - 'db2_field_scale' => ['int|false', 'stmt'=>'resource', 'column'=>'mixed'], - 'db2_field_type' => ['string|false', 'stmt'=>'resource', 'column'=>'mixed'], - 'db2_field_width' => ['int|false', 'stmt'=>'resource', 'column'=>'mixed'], - 'db2_foreign_keys' => ['resource|false', 'connection'=>'resource', 'qualifier'=>'string', 'schema'=>'string', 'table_name'=>'string'], + 'db2_fetch_array' => ['array|false', 'stmt'=>'resource', 'row_number='=>'?int'], + 'db2_fetch_assoc' => ['array|false', 'stmt'=>'resource', 'row_number='=>'?int'], + 'db2_fetch_both' => ['array|false', 'stmt'=>'resource', 'row_number='=>'?int'], + 'db2_fetch_object' => ['stdClass|false', 'stmt'=>'resource', 'row_number='=>'?int'], + 'db2_fetch_row' => ['bool', 'stmt'=>'resource', 'row_number='=>'?int'], + 'db2_field_display_size' => ['int|false', 'stmt'=>'resource', 'column'=>'string|int'], + 'db2_field_name' => ['string|false', 'stmt'=>'resource', 'column'=>'string|int'], + 'db2_field_num' => ['int|false', 'stmt'=>'resource', 'column'=>'string|int'], + 'db2_field_precision' => ['int|false', 'stmt'=>'resource', 'column'=>'string|int'], + 'db2_field_scale' => ['int|false', 'stmt'=>'resource', 'column'=>'string|int'], + 'db2_field_type' => ['string|false', 'stmt'=>'resource', 'column'=>'string|int'], + 'db2_field_width' => ['int|false', 'stmt'=>'resource', 'column'=>'string|int'], + 'db2_foreign_keys' => ['resource|false', 'connection'=>'resource', 'qualifier'=>'?string', 'schema'=>'?string', 'table_name'=>'string'], 'db2_free_result' => ['bool', 'stmt'=>'resource'], 'db2_free_stmt' => ['bool', 'stmt'=>'resource'], 'db2_get_option' => ['string|false', 'resource'=>'resource', 'option'=>'string'], - 'db2_last_insert_id' => ['string', 'resource'=>'resource'], + 'db2_last_insert_id' => ['string|null', 'resource'=>'resource'], 'db2_lob_read' => ['string|false', 'stmt'=>'resource', 'colnum'=>'int', 'length'=>'int'], 'db2_next_result' => ['resource|false', 'stmt'=>'resource'], 'db2_num_fields' => ['int|false', 'stmt'=>'resource'], - 'db2_num_rows' => ['int', 'stmt'=>'resource'], + 'db2_num_rows' => ['int|false', 'stmt'=>'resource'], 'db2_pclose' => ['bool', 'resource'=>'resource'], - 'db2_pconnect' => ['resource|false', 'database'=>'string', 'username'=>'string', 'password'=>'string', 'options='=>'array'], + 'db2_pconnect' => ['resource|false', 'database'=>'string', 'username'=>'?string', 'password'=>'?string', 'options='=>'array'], 'db2_prepare' => ['resource|false', 'connection'=>'resource', 'statement'=>'string', 'options='=>'array'], - 'db2_primary_keys' => ['resource|false', 'connection'=>'resource', 'qualifier'=>'string', 'schema'=>'string', 'table_name'=>'string'], + 'db2_primary_keys' => ['resource|false', 'connection'=>'resource', 'qualifier'=>'?string', 'schema'=>'?string', 'table_name'=>'string'], 'db2_primarykeys' => [''], - 'db2_procedure_columns' => ['resource|false', 'connection'=>'resource', 'qualifier'=>'string', 'schema'=>'string', 'procedure'=>'string', 'parameter'=>'string'], + 'db2_procedure_columns' => ['resource|false', 'connection'=>'resource', 'qualifier'=>'?string', 'schema'=>'string', 'procedure'=>'string', 'parameter'=>'?string'], 'db2_procedurecolumns' => [''], - 'db2_procedures' => ['resource|false', 'connection'=>'resource', 'qualifier'=>'string', 'schema'=>'string', 'procedure'=>'string'], - 'db2_result' => ['mixed', 'stmt'=>'resource', 'column'=>'mixed'], + 'db2_procedures' => ['resource|false', 'connection'=>'resource', 'qualifier'=>'?string', 'schema'=>'string', 'procedure'=>'string'], + 'db2_result' => ['mixed', 'stmt'=>'resource', 'column'=>'string|int'], 'db2_rollback' => ['bool', 'connection'=>'resource'], - 'db2_server_info' => ['object|false', 'connection'=>'resource'], + 'db2_server_info' => ['stdClass|false', 'connection'=>'resource'], 'db2_set_option' => ['bool', 'resource'=>'resource', 'options'=>'array', 'type'=>'int'], 'db2_setoption' => [''], - 'db2_special_columns' => ['resource|false', 'connection'=>'resource', 'qualifier'=>'string', 'schema'=>'string', 'table_name'=>'string', 'scope'=>'int'], + 'db2_special_columns' => ['resource|false', 'connection'=>'resource', 'qualifier'=>'?string', 'schema'=>'string', 'table_name'=>'string', 'scope'=>'int'], 'db2_specialcolumns' => [''], - 'db2_statistics' => ['resource|false', 'connection'=>'resource', 'qualifier'=>'string', 'schema'=>'string', 'table_name'=>'string', 'unique'=>'bool'], + 'db2_statistics' => ['resource|false', 'connection'=>'resource', 'qualifier'=>'?string', 'schema'=>'?string', 'table_name'=>'string', 'unique'=>'bool'], 'db2_stmt_error' => ['string', 'stmt='=>'resource'], 'db2_stmt_errormsg' => ['string', 'stmt='=>'resource'], - 'db2_table_privileges' => ['resource|false', 'connection'=>'resource', 'qualifier='=>'string', 'schema='=>'string', 'table_name='=>'string'], + 'db2_table_privileges' => ['resource|false', 'connection'=>'resource', 'qualifier='=>'?string', 'schema='=>'?string', 'table_name='=>'?string'], 'db2_tableprivileges' => [''], - 'db2_tables' => ['resource|false', 'connection'=>'resource', 'qualifier='=>'string', 'schema='=>'string', 'table_name='=>'string', 'table_type='=>'string'], + 'db2_tables' => ['resource|false', 'connection'=>'resource', 'qualifier='=>'?string', 'schema='=>'?string', 'table_name='=>'?string', 'table_type='=>'?string'], 'dba_close' => ['void', 'dba'=>'resource'], 'dba_delete' => ['bool', 'key'=>'string', 'dba'=>'resource'], 'dba_exists' => ['bool', 'key'=>'string', 'dba'=>'resource'], @@ -11917,8 +11911,8 @@ return [ 'intlcal_clear' => ['bool', 'calendar'=>'IntlCalendar', 'field='=>'?int'], 'intlcal_create_instance' => ['?IntlCalendar', 'timezone='=>'mixed', 'locale='=>'?string'], 'intlcal_equals' => ['bool', 'calendar'=>'IntlCalendar', 'other'=>'IntlCalendar'], - 'intlcal_field_difference' => ['int', 'calendar'=>'IntlCalendar', 'timestamp'=>'float', 'field'=>'int'], - 'intlcal_from_date_time' => ['IntlCalendar', 'datetime'=>'DateTime|string'], + 'intlcal_field_difference' => ['int|false', 'calendar'=>'IntlCalendar', 'timestamp'=>'float', 'field'=>'int'], + 'intlcal_from_date_time' => ['?IntlCalendar', 'datetime'=>'DateTime|string', 'locale='=>'?string'], 'intlcal_get' => ['int|false', 'calendar'=>'IntlCalendar', 'field'=>'int'], 'intlcal_get_actual_maximum' => ['int', 'calendar'=>'IntlCalendar', 'field'=>'int'], 'intlcal_get_actual_minimum' => ['int', 'calendar'=>'IntlCalendar', 'field'=>'int'], @@ -11938,7 +11932,7 @@ return [ 'intlcal_get_time' => ['float', 'calendar'=>'IntlCalendar'], 'intlcal_get_time_zone' => ['IntlTimeZone', 'calendar'=>'IntlCalendar'], 'intlcal_get_type' => ['string', 'calendar'=>'IntlCalendar'], - 'intlcal_get_weekend_transition' => ['int', 'calendar'=>'IntlCalendar', 'dayOfWeek'=>'string'], + 'intlcal_get_weekend_transition' => ['int|false', 'calendar'=>'IntlCalendar', 'dayOfWeek'=>'int'], 'intlcal_in_daylight_time' => ['bool', 'calendar'=>'IntlCalendar'], 'intlcal_is_equivalent_to' => ['bool', 'calendar'=>'IntlCalendar', 'other'=>'IntlCalendar'], 'intlcal_is_lenient' => ['bool', 'calendar'=>'IntlCalendar'], @@ -11949,22 +11943,22 @@ return [ 'intlcal_set\'1' => ['bool', 'calendar'=>'IntlCalendar', 'year'=>'int', 'month'=>'int', 'dayOfMonth='=>'int', 'hour='=>'int', 'minute='=>'int', 'second='=>'int'], 'intlcal_set_first_day_of_week' => ['bool', 'calendar'=>'IntlCalendar', 'dayOfWeek'=>'int'], 'intlcal_set_lenient' => ['bool', 'calendar'=>'IntlCalendar', 'lenient'=>'bool'], - 'intlcal_set_repeated_wall_time_option' => ['bool', 'calendar'=>'IntlCalendar', 'option'=>'int'], - 'intlcal_set_skipped_wall_time_option' => ['bool', 'calendar'=>'IntlCalendar', 'option'=>'int'], + 'intlcal_set_repeated_wall_time_option' => ['true', 'calendar'=>'IntlCalendar', 'option'=>'int'], + 'intlcal_set_skipped_wall_time_option' => ['true', 'calendar'=>'IntlCalendar', 'option'=>'int'], 'intlcal_set_time' => ['bool', 'calendar'=>'IntlCalendar', 'timestamp'=>'float'], 'intlcal_set_time_zone' => ['bool', 'calendar'=>'IntlCalendar', 'timezone'=>'mixed'], 'intlcal_to_date_time' => ['DateTime|false', 'calendar'=>'IntlCalendar'], - 'intlgregcal_create_instance' => ['IntlGregorianCalendar', 'timezoneOrYear='=>'mixed', 'localeOrMonth='=>'string'], + 'intlgregcal_create_instance' => ['?IntlGregorianCalendar', 'timezoneOrYear='=>'IntlTimeZone|DateTimeZone|string|null', 'localeOrMonth='=>'string|int|null', 'day='=>'int', 'hour='=>'int', 'minute='=>'int', 'second='=>'int'], 'intlgregcal_get_gregorian_change' => ['float', 'calendar'=>'IntlGregorianCalendar'], - 'intlgregcal_is_leap_year' => ['bool', 'calendar'=>'int'], + 'intlgregcal_is_leap_year' => ['bool', 'calendar'=>'IntlGregorianCalendar', 'year'=>'int'], 'intlgregcal_set_gregorian_change' => ['bool', 'calendar'=>'IntlGregorianCalendar', 'timestamp'=>'float'], 'intltz_count_equivalent_ids' => ['int', 'timezoneId'=>'string'], - 'intltz_create_enumeration' => ['IntlIterator', 'countryOrRawOffset'=>'mixed'], + 'intltz_create_enumeration' => ['IntlIterator|false', 'countryOrRawOffset='=>'IntlTimeZone|string|int|float|null'], 'intltz_create_time_zone' => ['?IntlTimeZone', 'timezoneId'=>'string'], 'intltz_from_date_time_zone' => ['?IntlTimeZone', 'timezone'=>'DateTimeZone'], 'intltz_getGMT' => ['IntlTimeZone'], - 'intltz_get_canonical_id' => ['string', 'timezoneId'=>'string', '&isSystemId'=>'bool'], - 'intltz_get_display_name' => ['string', 'timezone'=>'IntlTimeZone', 'dst'=>'bool', 'style'=>'int', 'locale'=>'string'], + 'intltz_get_canonical_id' => ['string|false', 'timezoneId'=>'string', '&isSystemId='=>'bool'], + 'intltz_get_display_name' => ['string|false', 'timezone'=>'IntlTimeZone', 'dst='=>'bool', 'style='=>'int', 'locale='=>'?string'], 'intltz_get_dst_savings' => ['int', 'timezone'=>'IntlTimeZone'], 'intltz_get_equivalent_id' => ['string', 'timezoneId'=>'string', 'offset'=>'int'], 'intltz_get_error_code' => ['int', 'timezone'=>'IntlTimeZone'], @@ -12807,7 +12801,7 @@ return [ 'mysqli_fetch_field_direct' => ['object|false', 'result'=>'mysqli_result', 'index'=>'int'], 'mysqli_fetch_fields' => ['stdClass[]', 'result'=>'mysqli_result'], 'mysqli_fetch_lengths' => ['array|false', 'result'=>'mysqli_result'], - 'mysqli_fetch_object' => ['object|false|null', 'result'=>'mysqli_result', 'class='=>'class-string', 'constructor_args='=>'array'], + 'mysqli_fetch_object' => ['object|false|null', 'result'=>'mysqli_result', 'class='=>'string', 'constructor_args='=>'array'], 'mysqli_fetch_row' => ['list|false|null', 'result'=>'mysqli_result'], 'mysqli_field_count' => ['int', 'mysql'=>'mysqli'], 'mysqli_field_seek' => ['bool', 'result'=>'mysqli_result', 'index'=>'int'], @@ -12861,7 +12855,7 @@ return [ 'mysqli_result::fetch_field' => ['object|false'], 'mysqli_result::fetch_field_direct' => ['object|false', 'index'=>'int'], 'mysqli_result::fetch_fields' => ['stdClass[]'], - 'mysqli_result::fetch_object' => ['object|false|null', 'class='=>'class-string', 'constructor_args='=>'array'], + 'mysqli_result::fetch_object' => ['object|false|null', 'class='=>'string', 'constructor_args='=>'array'], 'mysqli_result::fetch_row' => ['list|false|null'], 'mysqli_result::field_seek' => ['bool', 'index'=>'int'], 'mysqli_result::free' => ['void'], @@ -13445,8 +13439,6 @@ return [ 'pg_untrace' => ['bool', 'connection='=>'resource'], 'pg_update' => ['string|bool', 'connection'=>'resource', 'table_name'=>'string', 'values'=>'array', 'conditions'=>'array', 'flags='=>'int'], 'pg_version' => ['array', 'connection='=>'resource'], - 'phardata::setMetadata' => ['void', 'metadata'=>'mixed'], - 'phardata::setSignatureAlgorithm' => ['void', 'sigtype'=>'int'], 'phdfs::__construct' => ['void', 'ip'=>'string', 'port'=>'string'], 'phdfs::__destruct' => ['void'], 'phdfs::connect' => ['bool'], @@ -14030,7 +14022,7 @@ return [ 'simplexml_load_string' => ['SimpleXMLElement|false', 'data'=>'string', 'class_name='=>'?string', 'options='=>'int', 'namespace_or_prefix='=>'string', 'is_prefix='=>'bool'], 'sin' => ['float', 'num'=>'float'], 'sinh' => ['float', 'num'=>'float'], - 'sizeof' => ['int', 'value'=>'Countable|array', 'mode='=>'int'], + 'sizeof' => ['int<0, max>', 'value'=>'Countable|array|SimpleXMLElement', 'mode='=>'int'], 'sleep' => ['int|false', 'seconds'=>'0|positive-int'], 'snmp2_get' => ['string|false', 'hostname'=>'string', 'community'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], 'snmp2_getnext' => ['string|false', 'hostname'=>'string', 'community'=>'string', 'object_id'=>'string', 'timeout='=>'int', 'retries='=>'int'], @@ -15292,7 +15284,7 @@ return [ 'uopz_get_hook\'1' => ['?Closure', 'function'=>'string'], 'uopz_get_mock' => ['string|object|null', 'class'=>'string'], 'uopz_get_property' => ['mixed', 'class'=>'object|string', 'property'=>'string'], - 'uopz_get_return' => ['mixed', 'class='=>'string', 'function='=>'string'], + 'uopz_get_return' => ['mixed', 'class='=>'class-string', 'function='=>'string'], 'uopz_get_static' => ['?array', 'class'=>'string', 'function'=>'string'], 'uopz_implement' => ['bool', 'class'=>'string', 'interface'=>'string'], 'uopz_overload' => ['void', 'opcode'=>'int', 'callable'=>'Callable'], @@ -15314,7 +15306,7 @@ return [ 'uopz_unset_hook' => ['bool', 'class'=>'string', 'function'=>'string'], 'uopz_unset_hook\'1' => ['bool', 'function'=>'string'], 'uopz_unset_mock' => ['void', 'class'=>'string'], - 'uopz_unset_return' => ['bool', 'class='=>'string', 'function='=>'string'], + 'uopz_unset_return' => ['bool', 'class='=>'class-string', 'function='=>'string'], 'uopz_unset_return\'1' => ['bool', 'function'=>'string'], 'urldecode' => ['string', 'string'=>'string'], 'urlencode' => ['string', 'string'=>'string'], diff --git a/vendor/vimeo/psalm/dictionaries/InternalTaintSinkMap.php b/vendor/vimeo/psalm/dictionaries/InternalTaintSinkMap.php index cb8c6077..57431299 100644 --- a/vendor/vimeo/psalm/dictionaries/InternalTaintSinkMap.php +++ b/vendor/vimeo/psalm/dictionaries/InternalTaintSinkMap.php @@ -5,7 +5,7 @@ use Psalm\Type\TaintKind; // This maps internal function names to sink types that we don’t want to end up there /** - * @var array>> + * @var non-empty-array>> */ return [ 'exec' => [['shell']], diff --git a/vendor/vimeo/psalm/docs/running_psalm/error_levels.md b/vendor/vimeo/psalm/docs/running_psalm/error_levels.md index 7c7bfa2a..55a18b8f 100644 --- a/vendor/vimeo/psalm/docs/running_psalm/error_levels.md +++ b/vendor/vimeo/psalm/docs/running_psalm/error_levels.md @@ -238,6 +238,7 @@ Level 5 and above allows a more non-verifiable code, and higher levels are even - [MissingPropertyType](issues/MissingPropertyType.md) - [MissingReturnType](issues/MissingReturnType.md) - [NullOperand](issues/NullOperand.md) +- [PrivateFinalMethod](issues/PrivateFinalMethod.md) - [PropertyNotSetInConstructor](issues/PropertyNotSetInConstructor.md) - [RawObjectIteration](issues/RawObjectIteration.md) - [RedundantConditionGivenDocblockType](issues/RedundantConditionGivenDocblockType.md) diff --git a/vendor/vimeo/psalm/docs/running_psalm/issues.md b/vendor/vimeo/psalm/docs/running_psalm/issues.md index 996db7fa..9eb35fce 100644 --- a/vendor/vimeo/psalm/docs/running_psalm/issues.md +++ b/vendor/vimeo/psalm/docs/running_psalm/issues.md @@ -211,6 +211,7 @@ - [PossiblyUnusedParam](issues/PossiblyUnusedParam.md) - [PossiblyUnusedProperty](issues/PossiblyUnusedProperty.md) - [PossiblyUnusedReturnValue](issues/PossiblyUnusedReturnValue.md) + - [PrivateFinalMethod](issues/PrivateFinalMethod.md) - [PropertyNotSetInConstructor](issues/PropertyNotSetInConstructor.md) - [PropertyTypeCoercion](issues/PropertyTypeCoercion.md) - [RawObjectIteration](issues/RawObjectIteration.md) diff --git a/vendor/vimeo/psalm/docs/running_psalm/issues/PrivateFinalMethod.md b/vendor/vimeo/psalm/docs/running_psalm/issues/PrivateFinalMethod.md new file mode 100644 index 00000000..1c55158a --- /dev/null +++ b/vendor/vimeo/psalm/docs/running_psalm/issues/PrivateFinalMethod.md @@ -0,0 +1,14 @@ +# PrivateFinalMethod + +Emitted when a class defines private final method. PHP 8.0+ emits a warning when it sees private final method (except `__construct` where it's allowed), and allows redefinition in child classes (effectively ignoring `final` modifier). Before PHP 8.0, `final` was respected in this case. + +```php + + * @var array */ public $php_extensions = [ - "apcu" => false, - "decimal" => false, - "dom" => false, - "ds" => false, - "ffi" => false, - "geos" => false, - "gmp" => false, - "mongodb" => false, - "mysqli" => false, - "pdo" => false, - "random" => false, - "redis" => false, - "simplexml" => false, - "soap" => false, - "xdebug" => false, + "apcu" => null, + "decimal" => null, + "dom" => null, + "ds" => null, + "ffi" => null, + "geos" => null, + "gmp" => null, + "ibm_db2" => null, + "mongodb" => null, + "mysqli" => null, + "pdo" => null, + "random" => null, + "redis" => null, + "simplexml" => null, + "soap" => null, + "xdebug" => null, ]; /** @@ -645,6 +650,7 @@ class Config 'gettext', 'gmp', 'hash', + 'ibm_db2', 'iconv', 'imap', 'intl', @@ -1113,7 +1119,7 @@ class Config } } foreach ($required_extensions as $required_ext => $_) { - if (isset($config->php_extensions[$required_ext])) { + if (array_key_exists($required_ext, $config->php_extensions)) { $config->php_extensions[$required_ext] = true; } else { $config->php_extensions_not_supported[$required_ext] = true; @@ -2240,7 +2246,8 @@ class Config foreach ($extensions_to_load_stubs_using_deprecated_way as $ext_name) { $ext_stub_path = $ext_stubs_dir . DIRECTORY_SEPARATOR . "$ext_name.phpstub"; $is_stub_already_loaded = in_array($ext_stub_path, $this->internal_stubs, true); - if (! $is_stub_already_loaded && extension_loaded($ext_name)) { + $is_ext_explicitly_disabled = ($this->php_extensions[$ext_name] ?? null) === false; + if (! $is_stub_already_loaded && ! $is_ext_explicitly_disabled && extension_loaded($ext_name)) { $this->internal_stubs[] = $ext_stub_path; $this->config_warnings[] = "Psalm 6 will not automatically load stubs for ext-$ext_name." . " You should explicitly enable or disable this ext in composer.json or Psalm config."; diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassAnalyzer.php index 7108d136..137b4755 100644 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassAnalyzer.php +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassAnalyzer.php @@ -2360,6 +2360,18 @@ class ClassAnalyzer extends ClassLikeAnalyzer ); } + if ($parent_class_storage->readonly && !$storage->readonly) { + IssueBuffer::maybeAdd( + new InvalidExtendClass( + 'Non-readonly class ' . $fq_class_name . ' may not inherit from ' + . 'readonly class ' . $parent_fq_class_name, + $code_location, + $fq_class_name, + ), + $storage->suppressed_issues + $this->getSuppressedIssues(), + ); + } + if ($parent_class_storage->deprecated) { IssueBuffer::maybeAdd( new DeprecatedClass( diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/InterfaceAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/InterfaceAnalyzer.php index 37d53354..dd2a1074 100644 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/InterfaceAnalyzer.php +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/InterfaceAnalyzer.php @@ -127,6 +127,10 @@ class InterfaceAnalyzer extends ClassLikeAnalyzer $class_storage->suppressed_issues + $this->getSuppressedIssues(), ); + foreach ($class_storage->docblock_issues as $docblock_issue) { + IssueBuffer::maybeAdd($docblock_issue); + } + $member_stmts = []; foreach ($this->class->stmts as $stmt) { if ($stmt instanceof PhpParser\Node\Stmt\ClassMethod) { diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/ForeachAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/ForeachAnalyzer.php index 6a643999..7baed128 100644 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/ForeachAnalyzer.php +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/ForeachAnalyzer.php @@ -21,6 +21,7 @@ use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer; use Psalm\Internal\Analyzer\StatementsAnalyzer; use Psalm\Internal\FileManipulation\FileManipulationBuffer; use Psalm\Internal\Scope\LoopScope; +use Psalm\Internal\Type\AssertionReconciler; use Psalm\Internal\Type\Comparator\AtomicTypeComparator; use Psalm\Internal\Type\TypeExpander; use Psalm\Issue\ImpureMethodCall; @@ -36,6 +37,7 @@ use Psalm\Issue\UnnecessaryVarAnnotation; use Psalm\IssueBuffer; use Psalm\Node\Expr\VirtualMethodCall; use Psalm\Node\VirtualIdentifier; +use Psalm\Storage\Assertion; use Psalm\Type; use Psalm\Type\Atomic; use Psalm\Type\Atomic\Scalar; @@ -268,6 +270,19 @@ class ForeachAnalyzer $foreach_context->vars_in_scope[$context_var_id] = $context_type; } + if ($var_id && $foreach_context->hasVariable($var_id)) { + // refine the type of the array variable we iterate over + // if we entered loop body, the array cannot be empty + $foreach_context->vars_in_scope[$var_id] = AssertionReconciler::reconcile( + new Assertion\NonEmpty(), + $foreach_context->vars_in_scope[$var_id], + null, + $statements_analyzer, + true, // inside loop ? + $statements_analyzer->getTemplateTypeMap() ?? [], + ); + } + $foreach_context->inside_loop = true; $foreach_context->break_types[] = 'loop'; diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ArrayAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ArrayAnalyzer.php index db33280a..0c0e30fc 100644 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ArrayAnalyzer.php +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ArrayAnalyzer.php @@ -33,7 +33,6 @@ use Psalm\Type\Atomic\TList; use Psalm\Type\Atomic\TLiteralClassString; use Psalm\Type\Atomic\TLiteralFloat; use Psalm\Type\Atomic\TLiteralInt; -use Psalm\Type\Atomic\TLiteralString; use Psalm\Type\Atomic\TMixed; use Psalm\Type\Atomic\TNonEmptyArray; use Psalm\Type\Atomic\TObjectWithProperties; @@ -536,7 +535,7 @@ class ArrayAnalyzer continue 2; } $new_offset = $key; - $array_creation_info->item_key_atomic_types[] = new TLiteralString($new_offset); + $array_creation_info->item_key_atomic_types[] = Type::getAtomicStringFromLiteral($new_offset); $array_creation_info->all_list = false; } else { $new_offset = $array_creation_info->int_offset++; diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/AssertionFinder.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/AssertionFinder.php index cd3d910a..3396deae 100644 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/AssertionFinder.php +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/AssertionFinder.php @@ -1542,7 +1542,7 @@ class AssertionFinder ) { if ($conditional->left instanceof PhpParser\Node\Expr\FuncCall && $conditional->left->name instanceof PhpParser\Node\Name - && strtolower($conditional->left->name->parts[0]) === 'count' + && in_array(strtolower($conditional->left->name->parts[0]), ['count', 'sizeof']) && $conditional->left->getArgs() && ($conditional instanceof BinaryOp\Greater || $conditional instanceof BinaryOp\GreaterOrEqual) ) { @@ -1551,7 +1551,7 @@ class AssertionFinder $comparison_adjustment = $conditional instanceof BinaryOp\Greater ? 1 : 0; } elseif ($conditional->right instanceof PhpParser\Node\Expr\FuncCall && $conditional->right->name instanceof PhpParser\Node\Name - && strtolower($conditional->right->name->parts[0]) === 'count' + && in_array(strtolower($conditional->right->name->parts[0]), ['count', 'sizeof']) && $conditional->right->getArgs() && ($conditional instanceof BinaryOp\Smaller || $conditional instanceof BinaryOp\SmallerOrEqual) ) { @@ -1584,7 +1584,7 @@ class AssertionFinder ) { $left_count = $conditional->left instanceof PhpParser\Node\Expr\FuncCall && $conditional->left->name instanceof PhpParser\Node\Name - && strtolower($conditional->left->name->parts[0]) === 'count' + && in_array(strtolower($conditional->left->name->parts[0]), ['count', 'sizeof']) && $conditional->left->getArgs(); $operator_less_than_or_equal = @@ -1603,7 +1603,7 @@ class AssertionFinder $right_count = $conditional->right instanceof PhpParser\Node\Expr\FuncCall && $conditional->right->name instanceof PhpParser\Node\Name - && strtolower($conditional->right->name->parts[0]) === 'count' + && in_array(strtolower($conditional->right->name->parts[0]), ['count', 'sizeof']) && $conditional->right->getArgs(); $operator_greater_than_or_equal = @@ -1633,7 +1633,7 @@ class AssertionFinder ) { $left_count = $conditional->left instanceof PhpParser\Node\Expr\FuncCall && $conditional->left->name instanceof PhpParser\Node\Name - && strtolower($conditional->left->name->parts[0]) === 'count' + && in_array(strtolower($conditional->left->name->parts[0]), ['count', 'sizeof']) && $conditional->left->getArgs(); if ($left_count && $conditional->right instanceof PhpParser\Node\Scalar\LNumber) { @@ -1644,7 +1644,7 @@ class AssertionFinder $right_count = $conditional->right instanceof PhpParser\Node\Expr\FuncCall && $conditional->right->name instanceof PhpParser\Node\Name - && strtolower($conditional->right->name->parts[0]) === 'count' + && in_array(strtolower($conditional->right->name->parts[0]), ['count', 'sizeof']) && $conditional->right->getArgs(); if ($right_count && $conditional->left instanceof PhpParser\Node\Scalar\LNumber) { @@ -1785,7 +1785,7 @@ class AssertionFinder ) { $left_count = $conditional->left instanceof PhpParser\Node\Expr\FuncCall && $conditional->left->name instanceof PhpParser\Node\Name - && strtolower($conditional->left->name->parts[0]) === 'count'; + && in_array(strtolower($conditional->left->name->parts[0]), ['count', 'sizeof']); $right_number = $conditional->right instanceof PhpParser\Node\Scalar\LNumber && $conditional->right->value === ( @@ -1871,9 +1871,9 @@ class AssertionFinder return new IsType(new Atomic\TString()); case 'is_int': case 'is_integer': + case 'is_long': return new IsType(new Atomic\TInt()); case 'is_float': - case 'is_long': case 'is_double': case 'is_real': return new IsType(new Atomic\TFloat()); @@ -2044,7 +2044,8 @@ class AssertionFinder protected static function hasNonEmptyCountCheck(PhpParser\Node\Expr\FuncCall $stmt): bool { - return $stmt->name instanceof PhpParser\Node\Name && strtolower($stmt->name->parts[0]) === 'count'; + return $stmt->name instanceof PhpParser\Node\Name && + in_array(strtolower($stmt->name->parts[0]), ['count', 'sizeof']); } protected static function hasArrayKeyExistsCheck(PhpParser\Node\Expr\FuncCall $stmt): bool diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/ArrayAssignmentAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/ArrayAssignmentAnalyzer.php index 4f11f44c..c071a741 100644 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/ArrayAssignmentAnalyzer.php +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/ArrayAssignmentAnalyzer.php @@ -170,7 +170,10 @@ class ArrayAssignmentAnalyzer $key_values = []; if ($current_dim instanceof PhpParser\Node\Scalar\String_) { - $key_values[] = new TLiteralString($current_dim->value); + $value_type = Type::getAtomicStringFromLiteral($current_dim->value); + if ($value_type instanceof TLiteralString) { + $key_values[] = $value_type; + } } elseif ($current_dim instanceof PhpParser\Node\Scalar\LNumber && !$root_is_string) { $key_values[] = new TLiteralInt($current_dim->value); } elseif ($current_dim @@ -330,7 +333,7 @@ class ArrayAssignmentAnalyzer $v = $type->value; $v[0] = $new_char; $changed = true; - $type = new TLiteralString($v); + $type = Type::getAtomicStringFromLiteral($v); break; } } @@ -511,11 +514,8 @@ class ArrayAssignmentAnalyzer $array_atomic_key_type = Type::getArrayKey(); } - if ($offset_already_existed - && $parent_var_id - && ($parent_type = $context->vars_in_scope[$parent_var_id] ?? null) - ) { - if ($parent_type->hasList() && strpos($parent_var_id, '[') === false) { + if ($parent_var_id && ($parent_type = $context->vars_in_scope[$parent_var_id] ?? null)) { + if ($offset_already_existed && $parent_type->hasList() && strpos($parent_var_id, '[') === false) { $array_atomic_type_list = $value_type; } elseif ($parent_type->hasClassStringMap() && $key_type @@ -1036,7 +1036,10 @@ class ArrayAssignmentAnalyzer $key_values = []; if ($dim instanceof PhpParser\Node\Scalar\String_) { - $key_values[] = new TLiteralString($dim->value); + $value_type = Type::getAtomicStringFromLiteral($dim->value); + if ($value_type instanceof TLiteralString) { + $key_values[] = $value_type; + } } elseif ($dim instanceof PhpParser\Node\Scalar\LNumber) { $key_values[] = new TLiteralInt($dim->value); } else { @@ -1077,7 +1080,10 @@ class ArrayAssignmentAnalyzer && $child_stmt_dim_type->isSingleStringLiteral()) ) { if ($child_stmt->dim instanceof PhpParser\Node\Scalar\String_) { - $offset_type = new TLiteralString($child_stmt->dim->value); + $offset_type = Type::getAtomicStringFromLiteral($child_stmt->dim->value); + if (!$offset_type instanceof TLiteralString) { + return [null, '[string]', false]; + } } else { $offset_type = $child_stmt_dim_type->getSingleStringLiteral(); } diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/ConcatAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/ConcatAnalyzer.php index f4d35664..b90ffbc3 100644 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/ConcatAnalyzer.php +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/ConcatAnalyzer.php @@ -34,6 +34,7 @@ use Psalm\Type\Atomic\TLowercaseString; use Psalm\Type\Atomic\TNamedObject; use Psalm\Type\Atomic\TNonEmptyNonspecificLiteralString; use Psalm\Type\Atomic\TNonEmptyString; +use Psalm\Type\Atomic\TNonFalsyString; use Psalm\Type\Atomic\TNonspecificLiteralString; use Psalm\Type\Atomic\TNull; use Psalm\Type\Atomic\TNumericString; @@ -173,7 +174,7 @@ class ConcatAnalyzer break 2; } - $result_type_parts[] = new TLiteralString($literal); + $result_type_parts[] = Type::getAtomicStringFromLiteral($literal); } } @@ -278,6 +279,31 @@ class ConcatAnalyzer } } } + } elseif ($left_type || $right_type) { + /** + * @var Union $known_operand + */ + $known_operand = $right_type ?? $left_type; + + if ($known_operand->isSingle()) { + $known_operands_atomic = $known_operand->getSingleAtomic(); + + if ($known_operands_atomic instanceof TNonEmptyString) { + $result_type = Type::getNonEmptyString(); + } + + if ($known_operands_atomic instanceof TNonFalsyString) { + $result_type = Type::getNonFalsyString(); + } + + if ($known_operands_atomic instanceof TLiteralString) { + if ($known_operands_atomic->value) { + $result_type = Type::getNonFalsyString(); + } elseif ($known_operands_atomic->value !== '') { + $result_type = Type::getNonEmptyString(); + } + } + } } } diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BitwiseNotAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BitwiseNotAnalyzer.php index 00542cbb..3efa5c6c 100644 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BitwiseNotAnalyzer.php +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BitwiseNotAnalyzer.php @@ -50,7 +50,7 @@ class BitwiseNotAnalyzer if ($type_part instanceof TLiteralInt) { $type_part = new TLiteralInt(~$type_part->value); } elseif ($type_part instanceof TLiteralString) { - $type_part = new TLiteralString(~$type_part->value); + $type_part = Type::getAtomicStringFromLiteral(~$type_part->value); } $acceptable_types[] = $type_part; diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallReturnTypeFetcher.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallReturnTypeFetcher.php index 6c40bf78..123437eb 100644 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallReturnTypeFetcher.php +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallReturnTypeFetcher.php @@ -35,7 +35,6 @@ use Psalm\Type\Atomic\TIntRange; use Psalm\Type\Atomic\TKeyedArray; use Psalm\Type\Atomic\TList; use Psalm\Type\Atomic\TLiteralInt; -use Psalm\Type\Atomic\TLiteralString; use Psalm\Type\Atomic\TNamedObject; use Psalm\Type\Atomic\TNonEmptyArray; use Psalm\Type\Atomic\TNull; @@ -80,7 +79,7 @@ class FunctionCallReturnTypeFetcher if ($stmt->isFirstClassCallable()) { $candidate_callable = CallableTypeComparator::getCallableFromAtomic( $codebase, - new TLiteralString($function_id), + Type::getAtomicStringFromLiteral($function_id), null, $statements_analyzer, true, @@ -354,6 +353,7 @@ class FunctionCallReturnTypeFetcher } else { switch ($call_map_key) { case 'count': + case 'sizeof': if (($first_arg_type = $statements_analyzer->node_data->getType($call_args[0]->value))) { $atomic_types = $first_arg_type->getAtomicTypes(); diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/NamedFunctionCallHandler.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/NamedFunctionCallHandler.php index 39cf5dd9..874f0618 100644 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/NamedFunctionCallHandler.php +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/NamedFunctionCallHandler.php @@ -35,7 +35,6 @@ use Psalm\Type\Atomic\TDependentGetDebugType; use Psalm\Type\Atomic\TDependentGetType; use Psalm\Type\Atomic\TFloat; use Psalm\Type\Atomic\TInt; -use Psalm\Type\Atomic\TLiteralString; use Psalm\Type\Atomic\TLowercaseString; use Psalm\Type\Atomic\TMixed; use Psalm\Type\Atomic\TNamedObject; @@ -625,17 +624,17 @@ class NamedFunctionCallHandler $class_string_types[] = new TClassString(); } else { if ($class_type instanceof TInt) { - $class_string_types[] = new TLiteralString('int'); + $class_string_types[] = Type::getAtomicStringFromLiteral('int'); } elseif ($class_type instanceof TString) { - $class_string_types[] = new TLiteralString('string'); + $class_string_types[] = Type::getAtomicStringFromLiteral('string'); } elseif ($class_type instanceof TFloat) { - $class_string_types[] = new TLiteralString('float'); + $class_string_types[] = Type::getAtomicStringFromLiteral('float'); } elseif ($class_type instanceof TBool) { - $class_string_types[] = new TLiteralString('bool'); + $class_string_types[] = Type::getAtomicStringFromLiteral('bool'); } elseif ($class_type instanceof TClosedResource) { - $class_string_types[] = new TLiteralString('resource (closed)'); + $class_string_types[] = Type::getAtomicStringFromLiteral('resource (closed)'); } elseif ($class_type instanceof TNull) { - $class_string_types[] = new TLiteralString('null'); + $class_string_types[] = Type::getAtomicStringFromLiteral('null'); } else { $class_string_types[] = new TString(); } diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/CastAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/CastAnalyzer.php index 21d67fdb..83825307 100644 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/CastAnalyzer.php +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/CastAnalyzer.php @@ -721,7 +721,7 @@ class CastAnalyzer || $atomic_type instanceof TNumeric ) { if ($atomic_type instanceof TLiteralInt || $atomic_type instanceof TLiteralFloat) { - $castable_types[] = new TLiteralString((string) $atomic_type->value); + $castable_types[] = Type::getAtomicStringFromLiteral((string) $atomic_type->value); } elseif ($atomic_type instanceof TNonspecificLiteralInt) { $castable_types[] = new TNonspecificLiteralString(); } else { @@ -740,20 +740,20 @@ class CastAnalyzer if ($atomic_type instanceof TNull || $atomic_type instanceof TFalse ) { - $valid_strings[] = new TLiteralString(''); + $valid_strings[] = Type::getAtomicStringFromLiteral(''); continue; } if ($atomic_type instanceof TTrue ) { - $valid_strings[] = new TLiteralString('1'); + $valid_strings[] = Type::getAtomicStringFromLiteral('1'); continue; } if ($atomic_type instanceof TBool ) { - $valid_strings[] = new TLiteralString('1'); - $valid_strings[] = new TLiteralString(''); + $valid_strings[] = Type::getAtomicStringFromLiteral('1'); + $valid_strings[] = Type::getAtomicStringFromLiteral(''); continue; } diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/EncapsulatedStringAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/EncapsulatedStringAnalyzer.php index 0bf09dcd..9792a91c 100644 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/EncapsulatedStringAnalyzer.php +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/EncapsulatedStringAnalyzer.php @@ -10,6 +10,7 @@ use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer; use Psalm\Internal\Analyzer\StatementsAnalyzer; use Psalm\Internal\DataFlow\DataFlowNode; use Psalm\Plugin\EventHandler\Event\AddRemoveTaintsEvent; +use Psalm\Type; use Psalm\Type\Atomic\TLiteralFloat; use Psalm\Type\Atomic\TLiteralInt; use Psalm\Type\Atomic\TLiteralString; @@ -123,7 +124,7 @@ class EncapsulatedStringAnalyzer if ($non_empty) { if ($literal_string !== null) { $stmt_type = new Union( - [new TLiteralString($literal_string)], + [Type::getAtomicStringFromLiteral($literal_string)], ['parent_nodes' => $parent_nodes], ); } elseif ($all_literals) { diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ArrayFetchAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ArrayFetchAnalyzer.php index b252981f..2567ca86 100644 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ArrayFetchAnalyzer.php +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ArrayFetchAnalyzer.php @@ -481,7 +481,10 @@ class ArrayFetchAnalyzer $key_values = []; if ($stmt->dim instanceof PhpParser\Node\Scalar\String_) { - $key_values[] = new TLiteralString($stmt->dim->value); + $value_type = Type::getAtomicStringFromLiteral($stmt->dim->value); + if ($value_type instanceof TLiteralString) { + $key_values[] = $value_type; + } } elseif ($stmt->dim instanceof PhpParser\Node\Scalar\LNumber) { $key_values[] = new TLiteralInt($stmt->dim->value); } elseif ($stmt->dim && ($stmt_dim_type = $statements_analyzer->node_data->getType($stmt->dim))) { @@ -514,7 +517,7 @@ class ArrayFetchAnalyzer if ($in_assignment) { $offset_type->removeType('null'); - $offset_type->addType(new TLiteralString('')); + $offset_type->addType(Type::getAtomicStringFromLiteral('')); } } @@ -534,7 +537,7 @@ class ArrayFetchAnalyzer $offset_type->removeType('null'); if (!$offset_type->ignore_nullable_issues) { - $offset_type->addType(new TLiteralString('')); + $offset_type->addType(Type::getAtomicStringFromLiteral('')); } } } diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/AtomicPropertyFetchAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/AtomicPropertyFetchAnalyzer.php index 9b3352c6..585d7ca1 100644 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/AtomicPropertyFetchAnalyzer.php +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/AtomicPropertyFetchAnalyzer.php @@ -52,7 +52,6 @@ use Psalm\Type\Atomic\TFalse; use Psalm\Type\Atomic\TGenericObject; use Psalm\Type\Atomic\TInt; use Psalm\Type\Atomic\TLiteralInt; -use Psalm\Type\Atomic\TLiteralString; use Psalm\Type\Atomic\TMixed; use Psalm\Type\Atomic\TNamedObject; use Psalm\Type\Atomic\TNull; @@ -935,7 +934,7 @@ class AtomicPropertyFetchAnalyzer if ($lhs_type_part instanceof TEnumCase) { $statements_analyzer->node_data->setType( $stmt, - new Union([new TLiteralString($lhs_type_part->case_name)]), + new Union([Type::getAtomicStringFromLiteral($lhs_type_part->case_name)]), ); } else { $statements_analyzer->node_data->setType($stmt, Type::getNonEmptyString()); @@ -971,7 +970,7 @@ class AtomicPropertyFetchAnalyzer foreach ($enum_cases as $enum_case) { if (is_string($enum_case->value)) { - $case_values[] = new TLiteralString($enum_case->value); + $case_values[] = Type::getAtomicStringFromLiteral($enum_case->value); } elseif (is_int($enum_case->value)) { $case_values[] = new TLiteralInt($enum_case->value); } else { diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/VariableFetchAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/VariableFetchAnalyzer.php index fef2f892..98e911a0 100644 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/VariableFetchAnalyzer.php +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/VariableFetchAnalyzer.php @@ -321,11 +321,9 @@ class VariableFetchAnalyzer (bool) $statements_analyzer->getBranchPoint($var_name), ); } else { - if ($codebase->alter_code) { - if (!isset($project_analyzer->getIssuesToFix()['PossiblyUndefinedVariable'])) { - return true; - } - + if ($codebase->alter_code + && isset($project_analyzer->getIssuesToFix()['PossiblyUndefinedVariable']) + ) { $branch_point = $statements_analyzer->getBranchPoint($var_name); if ($branch_point) { diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/MatchAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/MatchAnalyzer.php index 677d36a5..c1694804 100644 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/MatchAnalyzer.php +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/MatchAnalyzer.php @@ -81,7 +81,8 @@ class MatchAnalyzer && ($stmt->cond->name->parts === ['get_class'] || $stmt->cond->name->parts === ['gettype'] || $stmt->cond->name->parts === ['get_debug_type'] - || $stmt->cond->name->parts === ['count']) + || $stmt->cond->name->parts === ['count'] + || $stmt->cond->name->parts === ['sizeof']) && $stmt->cond->getArgs() ) { $first_arg = $stmt->cond->getArgs()[0]; diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/SimpleTypeInferer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/SimpleTypeInferer.php index e5b03998..aa229281 100644 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/SimpleTypeInferer.php +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/SimpleTypeInferer.php @@ -758,7 +758,7 @@ class SimpleTypeInferer foreach ($unpacked_atomic_type->properties as $key => $property_value) { if (is_string($key)) { $new_offset = $key; - $array_creation_info->item_key_atomic_types[] = new TLiteralString($new_offset); + $array_creation_info->item_key_atomic_types[] = Type::getAtomicStringFromLiteral($new_offset); } else { $new_offset = $array_creation_info->int_offset++; $array_creation_info->item_key_atomic_types[] = new TLiteralInt($new_offset); diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/UnaryPlusMinusAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/UnaryPlusMinusAnalyzer.php index 07f12204..eb4f256f 100644 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/UnaryPlusMinusAnalyzer.php +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/UnaryPlusMinusAnalyzer.php @@ -20,6 +20,8 @@ use Psalm\Type\Atomic\TString; use Psalm\Type\Union; use RuntimeException; +use function is_int; + /** * @internal */ @@ -51,7 +53,9 @@ class UnaryPlusMinusAnalyzer continue; } if ($type_part instanceof TLiteralInt) { - $type_part = new TLiteralInt(-$type_part->value); + /** @var int|float $value */ + $value = -$type_part->value; + $type_part = is_int($value) ? new TLiteralInt($value) : new TLiteralFloat($value); } elseif ($type_part instanceof TLiteralFloat) { $type_part = new TLiteralFloat(-$type_part->value); } elseif ($type_part instanceof TIntRange) { diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php index c13850f0..896f5ac3 100644 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php @@ -76,7 +76,6 @@ use function fwrite; use function get_class; use function in_array; use function is_string; -use function ltrim; use function preg_split; use function reset; use function round; @@ -794,21 +793,21 @@ class StatementsAnalyzer extends SourceAnalyzer if (isset($comments->tags['psalm-scope-this'])) { $trimmed = trim(reset($comments->tags['psalm-scope-this'])); - $trimmed = ltrim($trimmed, '\\'); + $scope_fqcn = Type::getFQCLNFromString($trimmed, $this->getAliases()); - if (!$codebase->classExists($trimmed)) { + if (!$codebase->classExists($scope_fqcn)) { IssueBuffer::maybeAdd( new UndefinedDocblockClass( - 'Scope class ' . $trimmed . ' does not exist', + 'Scope class ' . $scope_fqcn . ' does not exist', new CodeLocation($this->getSource(), $stmt, null, true), - $trimmed, + $scope_fqcn, ), ); } else { - $this_type = Type::parseString($trimmed); - $context->self = $trimmed; + $this_type = Type::parseString($scope_fqcn); + $context->self = $scope_fqcn; $context->vars_in_scope['$this'] = $this_type; - $this->setFQCLN($trimmed); + $this->setFQCLN($scope_fqcn); } } } diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/TraitAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/TraitAnalyzer.php index 8bea62d0..c6192a66 100644 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/TraitAnalyzer.php +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/TraitAnalyzer.php @@ -5,6 +5,7 @@ namespace Psalm\Internal\Analyzer; use PhpParser\Node\Stmt\Trait_; use Psalm\Aliases; use Psalm\Context; +use Psalm\IssueBuffer; use function assert; @@ -80,5 +81,9 @@ class TraitAnalyzer extends ClassLikeAnalyzer AttributesAnalyzer::TARGET_CLASS, $storage->suppressed_issues + $statements_analyzer->getSuppressedIssues(), ); + + foreach ($storage->docblock_issues as $docblock_issue) { + IssueBuffer::maybeAdd($docblock_issue); + } } } diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Psalm.php b/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Psalm.php index f7f60c78..58ce6d78 100644 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Psalm.php +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Psalm.php @@ -44,6 +44,7 @@ use function array_sum; use function array_values; use function chdir; use function count; +use function extension_loaded; use function file_exists; use function file_put_contents; use function function_exists; @@ -899,8 +900,17 @@ final class Psalm } } - if ($threads > 1) { + if ($threads > 1 + && extension_loaded('grpc') + && (ini_get('grpc.enable_fork_support') === '1' && ini_get('grpc.poll_strategy') === 'epoll1') === false + ) { $ini_handler->disableExtension('grpc'); + + $progress->warning(PHP_EOL + . 'grpc extension has been disabled. ' + . 'Set grpc.enable_fork_support = 1 and grpc.poll_strategy = epoll1 in php.ini to enable it. ' + . 'See https://github.com/grpc/grpc/issues/20250#issuecomment-531321945 for more information.' + . PHP_EOL . PHP_EOL); } $ini_handler->disableExtensions([ diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ClassLikes.php b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ClassLikes.php index 08e43ac4..618ba707 100644 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ClassLikes.php +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ClassLikes.php @@ -1703,6 +1703,10 @@ class ClassLikes continue; } + if ($method_storage->public_api) { + continue; + } + if ($method_storage->location && !$project_analyzer->canReportIssues($method_storage->location->file_path) && !$codebase->analyzer->canReportIssues($method_storage->location->file_path) diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ConstantTypeResolver.php b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ConstantTypeResolver.php index a67ed0ff..d341bbc9 100644 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ConstantTypeResolver.php +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ConstantTypeResolver.php @@ -94,7 +94,7 @@ class ConstantTypeResolver || $right instanceof TLiteralFloat || $right instanceof TLiteralInt) ) { - return new TLiteralString($left->value . $right->value); + return Type::getAtomicStringFromLiteral($left->value . $right->value); } return new TString(); @@ -355,7 +355,7 @@ class ConstantTypeResolver } if (is_string($value)) { - return new TLiteralString($value); + return Type::getAtomicStringFromLiteral($value); } if (is_int($value)) { diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Functions.php b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Functions.php index 9ba277fe..50e3f60f 100644 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Functions.php +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Functions.php @@ -555,7 +555,7 @@ class Functions return true; } - if ($function_id === 'count' && isset($args[0]) && $type_provider) { + if (in_array($function_id, ['count', 'sizeof']) && isset($args[0]) && $type_provider) { $count_type = $type_provider->getType($args[0]->value); if ($count_type) { diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/InternalCallMapHandler.php b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/InternalCallMapHandler.php index f25840dc..71ce092e 100644 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/InternalCallMapHandler.php +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/InternalCallMapHandler.php @@ -36,26 +36,26 @@ use function version_compare; class InternalCallMapHandler { private const PHP_MAJOR_VERSION = 8; - private const PHP_MINOR_VERSION = 2; + private const PHP_MINOR_VERSION = 3; private const LOWEST_AVAILABLE_DELTA = 71; private static ?int $loaded_php_major_version = null; private static ?int $loaded_php_minor_version = null; /** - * @var array>|null + * @var non-empty-array>|null */ private static ?array $call_map = null; /** - * @var array>|null + * @var array>|null */ private static ?array $call_map_callables = []; /** - * @var array>> + * @var non-empty-array>>|null */ - private static array $taint_sink_map = []; + private static ?array $taint_sink_map = null; /** * @param list $args @@ -84,7 +84,7 @@ class InternalCallMapHandler } /** - * @param array $callables + * @param non-empty-list $callables * @param list $args */ public static function getMatchingCallableFromCallMapOptions( @@ -216,7 +216,7 @@ class InternalCallMapHandler } /** - * @return list|null + * @return non-empty-list|null */ public static function getCallablesFromCallMap(string $function_id): ?array { @@ -332,7 +332,9 @@ class InternalCallMapHandler /** * Gets the method/function call map * - * @return array> + * @return non-empty-array> + * @psalm-assert !null self::$taint_sink_map + * @psalm-assert !null self::$call_map */ public static function getCallMap(): array { @@ -353,26 +355,31 @@ class InternalCallMapHandler return self::$call_map; } - /** @var array> */ - $call_map = require(dirname(__DIR__, 4) . '/dictionaries/CallMap.php'); + /** @var non-empty-array> */ + $call_map_data = require(dirname(__DIR__, 4) . '/dictionaries/CallMap.php'); - self::$call_map = []; + $call_map = []; - foreach ($call_map as $key => $value) { + foreach ($call_map_data as $key => $value) { $cased_key = strtolower($key); - self::$call_map[$cased_key] = $value; + $call_map[$cased_key] = $value; } + self::$call_map = $call_map; + /** - * @var array>> + * @var non-empty-array>> */ - $taint_map = require(dirname(__DIR__, 4) . '/dictionaries/InternalTaintSinkMap.php'); + $taint_map_data = require(dirname(__DIR__, 4) . '/dictionaries/InternalTaintSinkMap.php'); - foreach ($taint_map as $key => $value) { + $taint_map = []; + foreach ($taint_map_data as $key => $value) { $cased_key = strtolower($key); - self::$taint_sink_map[$cased_key] = $value; + $taint_map[$cased_key] = $value; } + self::$taint_sink_map = $taint_map; + if (version_compare($analyzer_version, $current_version, '<')) { // the following assumes both minor and major versions a single digits for ($i = $current_version_int; $i > $analyzer_version_int && $i >= self::LOWEST_AVAILABLE_DELTA; --$i) { @@ -408,6 +415,7 @@ class InternalCallMapHandler } } } + assert(!empty(self::$call_map)); self::$loaded_php_major_version = $analyzer_major_version; self::$loaded_php_minor_version = $analyzer_minor_version; diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/FunctionDocblockManipulator.php b/vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/FunctionDocblockManipulator.php index 9608c2d4..9b1762db 100644 --- a/vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/FunctionDocblockManipulator.php +++ b/vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/FunctionDocblockManipulator.php @@ -17,7 +17,9 @@ use Psalm\Internal\Scanner\ParsedDocblock; use function array_key_exists; use function array_merge; use function array_reduce; +use function array_slice; use function count; +use function implode; use function is_string; use function ltrim; use function preg_match; @@ -332,7 +334,29 @@ class FunctionDocblockManipulator foreach ($parsed_docblock->tags['param'] as &$param_block) { $doc_parts = CommentAnalyzer::splitDocLine($param_block); + // If there's no type + if (($doc_parts[0] ?? null) === '$' . $param_name) { + // If the parameter has a description add that back + if (count($doc_parts) > 1) { + $new_param_block .= " ". implode(" ", array_slice($doc_parts, 1)); + } + + if ($param_block !== $new_param_block) { + $modified_docblock = true; + } + + $param_block = $new_param_block; + $found_in_params = true; + break; + } + + // If there is a type if (($doc_parts[1] ?? null) === '$' . $param_name) { + // If the parameter has a description add that back + if (count($doc_parts) > 2) { + $new_param_block .= " ". implode(" ", array_slice($doc_parts, 2)); + } + if ($param_block !== $new_param_block) { $modified_docblock = true; } diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ClassLikeDocblockParser.php b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ClassLikeDocblockParser.php index 59805870..38f524b6 100644 --- a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ClassLikeDocblockParser.php +++ b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ClassLikeDocblockParser.php @@ -356,7 +356,12 @@ class ClassLikeDocblockParser $method_tree = $parse_tree_creator->create(); } catch (TypeParseTreeException $e) { - throw new DocblockParseException($method_entry . ' is not a valid method'); + throw new DocblockParseException( + $method_entry . ' is not a valid method: ' + . $e->getMessage(), + 0, + $e, + ); } if (!$method_tree instanceof MethodWithReturnTypeTree diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ClassLikeNodeScanner.php b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ClassLikeNodeScanner.php index 3da672a6..6331b7ec 100644 --- a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ClassLikeNodeScanner.php +++ b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ClassLikeNodeScanner.php @@ -42,11 +42,13 @@ use Psalm\Issue\ConstantDeclarationInTrait; use Psalm\Issue\DuplicateClass; use Psalm\Issue\DuplicateConstant; use Psalm\Issue\DuplicateEnumCase; +use Psalm\Issue\InvalidAttribute; use Psalm\Issue\InvalidDocblock; use Psalm\Issue\InvalidEnumBackingType; use Psalm\Issue\InvalidEnumCaseValue; use Psalm\Issue\InvalidTypeImport; use Psalm\Issue\MissingDocblockType; +use Psalm\Issue\MissingPropertyType; use Psalm\Issue\ParseError; use Psalm\IssueBuffer; use Psalm\Storage\AttributeStorage; @@ -256,6 +258,7 @@ class ClassLikeNodeScanner if ($node instanceof PhpParser\Node\Stmt\Class_) { $storage->abstract = $node->isAbstract(); $storage->final = $node->isFinal(); + $storage->readonly = $node->isReadonly(); $this->codebase->classlikes->addFullyQualifiedClassName($fq_classlike_name, $this->file_path); @@ -704,10 +707,10 @@ class ClassLikeNodeScanner $name_types = []; $values_types = []; foreach ($storage->enum_cases as $name => $enumCaseStorage) { - $name_types[] = new Type\Atomic\TLiteralString($name); + $name_types[] = Type::getAtomicStringFromLiteral($name); if ($storage->enum_type !== null) { if (is_string($enumCaseStorage->value)) { - $values_types[] = new Type\Atomic\TLiteralString($enumCaseStorage->value); + $values_types[] = Type::getAtomicStringFromLiteral($enumCaseStorage->value); } elseif (is_int($enumCaseStorage->value)) { $values_types[] = new Type\Atomic\TLiteralInt($enumCaseStorage->value); } @@ -765,6 +768,14 @@ class ClassLikeNodeScanner $storage->external_mutation_free = true; } + if ($attribute->fq_class_name === 'AllowDynamicProperties' && $storage->readonly) { + IssueBuffer::maybeAdd(new InvalidAttribute( + 'Readonly classes cannot have dynamic properties', + new CodeLocation($this->file_scanner, $attr, null, true), + )); + continue; + } + $storage->attributes[] = $attribute; } } @@ -1586,10 +1597,22 @@ class ClassLikeNodeScanner if (count($property_storage->internal) === 0 && $var_comment && $var_comment->internal) { $property_storage->internal = [NamespaceAnalyzer::getNameSpaceRoot($fq_classlike_name)]; } - $property_storage->readonly = $stmt->isReadonly() || ($var_comment && $var_comment->readonly); + $property_storage->readonly = $storage->readonly + || $stmt->isReadonly() + || ($var_comment && $var_comment->readonly); $property_storage->allow_private_mutation = $var_comment ? $var_comment->allow_private_mutation : false; $property_storage->description = $var_comment ? $var_comment->description : null; + if (!$signature_type && $storage->readonly) { + IssueBuffer::maybeAdd( + new MissingPropertyType( + 'Properties of readonly classes must have a type', + new CodeLocation($this->file_scanner, $stmt, null, true), + $fq_classlike_name . '::$' . $property->name->name, + ), + ); + } + if (!$signature_type && !$doc_var_group_type) { if ($property->default) { $property_storage->suggested_type = SimpleTypeInferer::infer( @@ -1883,8 +1906,8 @@ class ClassLikeNodeScanner $type_string = str_replace("\n", '', implode('', $var_line_parts)); - $type_string = preg_replace('/>[^>^\}]*$/', '>', $type_string, 1); - $type_string = preg_replace('/\}[^>^\}]*$/', '}', $type_string, 1); + // Strip any remaining characters after the last grouping character >, } or ) + $type_string = preg_replace('/(?<=[>})])[^>})]*$/', '', $type_string, 1); try { $type_tokens = TypeTokenizer::getFullyQualifiedTokens( diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeDocblockParser.php b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeDocblockParser.php index 639692a8..7ade521f 100644 --- a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeDocblockParser.php +++ b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeDocblockParser.php @@ -555,6 +555,8 @@ class FunctionLikeDocblockParser $info->description = $parsed_docblock->description; } + $info->public_api = isset($parsed_docblock->tags['psalm-api']) || isset($parsed_docblock->tags['api']); + return $info; } diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeDocblockScanner.php b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeDocblockScanner.php index c61377cd..f0cc1dc5 100644 --- a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeDocblockScanner.php +++ b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeDocblockScanner.php @@ -417,6 +417,8 @@ class FunctionLikeDocblockScanner if ($docblock_info->description) { $storage->description = $docblock_info->description; } + + $storage->public_api = $docblock_info->public_api; } /** @@ -489,7 +491,8 @@ class FunctionLikeDocblockScanner // spaces are allowed before $foo in get(string $foo) magic method // definitions, but we want to remove them in this instance - if (isset($fixed_type_tokens[$i - 1]) + if ($i > 0 + && isset($fixed_type_tokens[$i - 1]) && $fixed_type_tokens[$i - 1][0][0] === ' ' ) { unset($fixed_type_tokens[$i - 1]); diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeNodeScanner.php b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeNodeScanner.php index ce008167..ed3463b9 100644 --- a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeNodeScanner.php +++ b/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeNodeScanner.php @@ -34,6 +34,7 @@ use Psalm\Issue\DuplicateParam; use Psalm\Issue\InvalidDocblock; use Psalm\Issue\MissingDocblockType; use Psalm\Issue\ParseError; +use Psalm\Issue\PrivateFinalMethod; use Psalm\IssueBuffer; use Psalm\Storage\ClassLikeStorage; use Psalm\Storage\FileStorage; @@ -1101,7 +1102,24 @@ class FunctionLikeNodeScanner $storage->is_static = $stmt->isStatic(); $storage->abstract = $stmt->isAbstract(); - $storage->final = $classlike_storage->final || $stmt->isFinal(); + if ($stmt->isPrivate() && $stmt->isFinal() && $method_name_lc !== '__construct') { + IssueBuffer::maybeAdd( + new PrivateFinalMethod( + 'Private methods cannot be final', + new CodeLocation($this->file_scanner, $stmt, null, true), + (string) $method_id, + ), + ); + if ($this->codebase->analysis_php_version_id >= 8_00_00) { + // ignore `final` on the method as that's what PHP does + $storage->final = $classlike_storage->final; + } else { + $storage->final = true; + } + } else { + $storage->final = $classlike_storage->final || $stmt->isFinal(); + } + $storage->final_from_docblock = $classlike_storage->final_from_docblock; if ($stmt->isPrivate()) { diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/AddRemoveTaints/HtmlFunctionTainter.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/AddRemoveTaints/HtmlFunctionTainter.php index 19606c9a..c96a50f1 100644 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/AddRemoveTaints/HtmlFunctionTainter.php +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/AddRemoveTaints/HtmlFunctionTainter.php @@ -46,6 +46,9 @@ class HtmlFunctionTainter implements AddTaintsInterface, RemoveTaintsInterface $second_arg = $item->getArgs()[1]->value ?? null; if ($second_arg === null) { + if ($statements_analyzer->getCodebase()->analysis_php_version_id >= 8_01_00) { + return ['html', 'has_quotes']; + } return ['html']; } @@ -95,6 +98,9 @@ class HtmlFunctionTainter implements AddTaintsInterface, RemoveTaintsInterface $second_arg = $item->getArgs()[1]->value ?? null; if ($second_arg === null) { + if ($statements_analyzer->getCodebase()->analysis_php_version_id >= 8_01_00) { + return ['html', 'has_quotes']; + } return ['html']; } diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/GetObjectVarsReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/GetObjectVarsReturnTypeProvider.php index ee7938f7..04b8b59c 100644 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/GetObjectVarsReturnTypeProvider.php +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/GetObjectVarsReturnTypeProvider.php @@ -56,7 +56,7 @@ class GetObjectVarsReturnTypeProvider implements FunctionReturnTypeProviderInter $object_type = reset($atomics); if ($object_type instanceof Atomic\TEnumCase) { - $properties = ['name' => new Union([new Atomic\TLiteralString($object_type->case_name)])]; + $properties = ['name' => new Union([Type::getAtomicStringFromLiteral($object_type->case_name)])]; $codebase = $statements_source->getCodebase(); $enum_classlike_storage = $codebase->classlike_storage_provider->get($object_type->value); if ($enum_classlike_storage->enum_type === null) { @@ -66,7 +66,7 @@ class GetObjectVarsReturnTypeProvider implements FunctionReturnTypeProviderInter if (is_int($enum_case_storage->value)) { $properties['value'] = new Union([new Atomic\TLiteralInt($enum_case_storage->value)]); } elseif (is_string($enum_case_storage->value)) { - $properties['value'] = new Union([new Atomic\TLiteralString($enum_case_storage->value)]); + $properties['value'] = new Union([Type::getAtomicStringFromLiteral($enum_case_storage->value)]); } return new TKeyedArray($properties); } diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/VersionCompareReturnTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/VersionCompareReturnTypeProvider.php index 739d254c..6340fedd 100644 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/VersionCompareReturnTypeProvider.php +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/VersionCompareReturnTypeProvider.php @@ -9,7 +9,6 @@ use Psalm\Plugin\EventHandler\FunctionReturnTypeProviderInterface; use Psalm\Type; use Psalm\Type\Atomic\TBool; use Psalm\Type\Atomic\TLiteralInt; -use Psalm\Type\Atomic\TLiteralString; use Psalm\Type\Atomic\TNull; use Psalm\Type\Union; @@ -42,20 +41,20 @@ class VersionCompareReturnTypeProvider implements FunctionReturnTypeProviderInte if ($operator_type) { if (!$operator_type->hasMixed()) { $acceptable_operator_type = new Union([ - new TLiteralString('<'), - new TLiteralString('lt'), - new TLiteralString('<='), - new TLiteralString('le'), - new TLiteralString('>'), - new TLiteralString('gt'), - new TLiteralString('>='), - new TLiteralString('ge'), - new TLiteralString('=='), - new TLiteralString('='), - new TLiteralString('eq'), - new TLiteralString('!='), - new TLiteralString('<>'), - new TLiteralString('ne'), + Type::getAtomicStringFromLiteral('<'), + Type::getAtomicStringFromLiteral('lt'), + Type::getAtomicStringFromLiteral('<='), + Type::getAtomicStringFromLiteral('le'), + Type::getAtomicStringFromLiteral('>'), + Type::getAtomicStringFromLiteral('gt'), + Type::getAtomicStringFromLiteral('>='), + Type::getAtomicStringFromLiteral('ge'), + Type::getAtomicStringFromLiteral('=='), + Type::getAtomicStringFromLiteral('='), + Type::getAtomicStringFromLiteral('eq'), + Type::getAtomicStringFromLiteral('!='), + Type::getAtomicStringFromLiteral('<>'), + Type::getAtomicStringFromLiteral('ne'), ]); $codebase = $statements_source->getCodebase(); diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/FunctionDocblockComment.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/FunctionDocblockComment.php index 74b31560..400dbcc6 100644 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/FunctionDocblockComment.php +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/FunctionDocblockComment.php @@ -174,4 +174,6 @@ class FunctionDocblockComment /** @var array, suggested_replacement?:string}> */ public array $unexpected_tags = []; + + public bool $public_api = false; } diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/AssertionReconciler.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/AssertionReconciler.php index b33d7b3a..ac8419f3 100644 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/AssertionReconciler.php +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Type/AssertionReconciler.php @@ -945,6 +945,15 @@ class AssertionReconciler extends Reconciler $redundant = false; $existing_var_type->removeType($atomic_key); $existing_var_type->addType(new TEnumCase($fq_enum_name, $case_name)); + } elseif (AtomicTypeComparator::canBeIdentical( + $statements_analyzer->getCodebase(), + $atomic_type, + $assertion_type, + )) { + $can_be_equal = true; + $redundant = $atomic_key === $assertion_type->getKey(); + $existing_var_type->removeType($atomic_key); + $existing_var_type->addType(new TEnumCase($fq_enum_name, $case_name)); } elseif ($atomic_key !== $assertion_type->getKey()) { $existing_var_type->removeType($atomic_key); $redundant = false; diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTreeCreator.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTreeCreator.php index 9449448a..34502e11 100644 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTreeCreator.php +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTreeCreator.php @@ -780,8 +780,7 @@ class ParseTreeCreator $type_token[0], $new_parent, ); - } elseif ($type_token[0] !== 'array' - && $type_token[0][0] !== '\\' + } elseif ($type_token[0][0] !== '\\' && $this->current_leaf instanceof Root ) { $new_leaf = new MethodTree( diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/SimpleNegatedAssertionReconciler.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/SimpleNegatedAssertionReconciler.php index 5f7d8e12..160bdc74 100644 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/SimpleNegatedAssertionReconciler.php +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Type/SimpleNegatedAssertionReconciler.php @@ -987,17 +987,17 @@ class SimpleNegatedAssertionReconciler extends Reconciler if (get_class($string_atomic_type) === TString::class) { $existing_var_type->removeType('string'); - $existing_var_type->addType(new TLiteralString('')); - $existing_var_type->addType(new TLiteralString('0')); + $existing_var_type->addType(Type::getAtomicStringFromLiteral('')); + $existing_var_type->addType(Type::getAtomicStringFromLiteral('0')); } elseif (get_class($string_atomic_type) === TNonEmptyString::class) { $existing_var_type->removeType('string'); - $existing_var_type->addType(new TLiteralString('0')); + $existing_var_type->addType(Type::getAtomicStringFromLiteral('0')); } elseif (get_class($string_atomic_type) === TNonEmptyLowercaseString::class) { $existing_var_type->removeType('string'); - $existing_var_type->addType(new TLiteralString('0')); + $existing_var_type->addType(Type::getAtomicStringFromLiteral('0')); } elseif (get_class($string_atomic_type) === TNonEmptyNonspecificLiteralString::class) { $existing_var_type->removeType('string'); - $existing_var_type->addType(new TLiteralString('0')); + $existing_var_type->addType(Type::getAtomicStringFromLiteral('0')); } } diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeCombiner.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeCombiner.php index f22dd918..85aad52b 100644 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeCombiner.php +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeCombiner.php @@ -1473,7 +1473,7 @@ class TypeCombiner } elseif ($type instanceof TKeyedArray && isset($type->class_strings[$property_name])) { $objectlike_keys[$property_name] = new TLiteralClassString($property_name, $from_docblock); } else { - $objectlike_keys[$property_name] = new TLiteralString($property_name, $from_docblock); + $objectlike_keys[$property_name] = Type::getAtomicStringFromLiteral($property_name, $from_docblock); } } diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeParser.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeParser.php index cf95fbec..fc0016f7 100644 --- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeParser.php +++ b/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeParser.php @@ -47,7 +47,6 @@ use Psalm\Type\Atomic\TKeyedArray; use Psalm\Type\Atomic\TLiteralClassString; use Psalm\Type\Atomic\TLiteralFloat; use Psalm\Type\Atomic\TLiteralInt; -use Psalm\Type\Atomic\TLiteralString; use Psalm\Type\Atomic\TMixed; use Psalm\Type\Atomic\TNamedObject; use Psalm\Type\Atomic\TNonEmptyArray; @@ -393,7 +392,7 @@ class TypeParser } if ($parse_tree->value[0] === '"' || $parse_tree->value[0] === '\'') { - return new TLiteralString(substr($parse_tree->value, 1, -1), $from_docblock); + return Type::getAtomicStringFromLiteral(substr($parse_tree->value, 1, -1), $from_docblock); } if (strpos($parse_tree->value, '::')) { diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/TypeChecker.php b/vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/TypeChecker.php index d135de1b..4c2e52c9 100644 --- a/vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/TypeChecker.php +++ b/vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/TypeChecker.php @@ -348,6 +348,7 @@ class TypeChecker extends TypeVisitor { if ($this->prevent_template_covariance && strpos($atomic->defining_class, 'fn-') !== 0 + && $atomic->defining_class !== 'class-string-map' ) { $codebase = $this->source->getCodebase(); diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/VersionUtils.php b/vendor/vimeo/psalm/src/Psalm/Internal/VersionUtils.php index 7dbda1b6..ac0d6575 100644 --- a/vendor/vimeo/psalm/src/Psalm/Internal/VersionUtils.php +++ b/vendor/vimeo/psalm/src/Psalm/Internal/VersionUtils.php @@ -2,8 +2,8 @@ namespace Psalm\Internal; +use Composer\InstalledVersions; use OutOfBoundsException; -use PackageVersions\Versions; use Phar; use function class_exists; @@ -89,11 +89,17 @@ final class VersionUtils { try { return [ - self::PSALM_PACKAGE => Versions::getVersion(self::PSALM_PACKAGE), - self::PHP_PARSER_PACKAGE => Versions::getVersion(self::PHP_PARSER_PACKAGE), + self::PSALM_PACKAGE => self::getVersion(self::PSALM_PACKAGE), + self::PHP_PARSER_PACKAGE => self::getVersion(self::PHP_PARSER_PACKAGE), ]; } catch (OutOfBoundsException $ex) { } return null; } + + private static function getVersion(string $packageName): string + { + return InstalledVersions::getPrettyVersion($packageName) + . '@' . InstalledVersions::getReference($packageName); + } } diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/PrivateFinalMethod.php b/vendor/vimeo/psalm/src/Psalm/Issue/PrivateFinalMethod.php new file mode 100644 index 00000000..bdf63371 --- /dev/null +++ b/vendor/vimeo/psalm/src/Psalm/Issue/PrivateFinalMethod.php @@ -0,0 +1,9 @@ +getCodebase(); - $issues = $event->getIssues(); - $build_info = $event->getBuildInfo(); - $source_control_info = $event->getSourceControlInfo(); - if (!function_exists('curl_init')) { - fwrite(STDERR, 'No curl found, cannot send data to ' . $codebase->config->shepherd_host . PHP_EOL); + fwrite(STDERR, "No curl found, cannot send data to shepherd server.\n"); return; } + $rawPayload = self::collectPayloadToSend($event); + + if ($rawPayload === null) { + return; + } + + $config = $event->getCodebase()->config; + + /** + * Deprecated logic, in Psalm 6 just use $config->shepherd_endpoint + * '#' here is just a hack/marker to use a custom endpoint instead just a custom domain + * case 1: empty option (use https://shepherd.dev/hooks/psalm/) + * case 2: custom domain (/hooks/psalm should be appended) (use https://custom.domain/hooks/psalm) + * case 3: custom endpoint (/hooks/psalm should be appended) (use custom endpoint) + */ + if (substr_compare($config->shepherd_endpoint, '#', -1) === 0) { + $shepherd_endpoint = $config->shepherd_endpoint; + } else { + /** @psalm-suppress DeprecatedProperty, DeprecatedMethod */ + $shepherd_endpoint = self::buildShepherdUrlFromHost($config->shepherd_host); + } + + self::sendPayload($shepherd_endpoint, $rawPayload); + } + + /** + * @psalm-pure + * @deprecated Will be removed in Psalm 6 + */ + private static function buildShepherdUrlFromHost(string $host): string + { + if (parse_url($host, PHP_URL_SCHEME) === null) { + $host = 'https://' . $host; + } + + return $host . '/hooks/psalm'; + } + + /** + * @return array{build: array, git: array, issues: array, coverage: list, level: int<1,8>}|null + */ + private static function collectPayloadToSend(AfterAnalysisEvent $event): ?array + { + /** @see \Psalm\Internal\ExecutionEnvironment\BuildInfoCollector::collect */ + $build_info = $event->getBuildInfo(); + + $is_ci_env = array_key_exists('CI_NAME', $build_info); // 'git' key always presents + if (! $is_ci_env) { + return null; + } + + $source_control_info = $event->getSourceControlInfo(); $source_control_data = $source_control_info ? $source_control_info->toArray() : []; - if (!$source_control_data && isset($build_info['git']) && is_array($build_info['git'])) { + if ($source_control_data === [] && isset($build_info['git']) && is_array($build_info['git'])) { $source_control_data = $build_info['git']; } unset($build_info['git']); - if ($build_info) { - $normalized_data = $issues === [] ? [] : array_filter( - array_merge(...array_values($issues)), - static fn(IssueData $i): bool => $i->severity === 'error', - ); - - $data = [ - 'build' => $build_info, - 'git' => $source_control_data, - 'issues' => $normalized_data, - 'coverage' => $codebase->analyzer->getTotalTypeCoverage($codebase), - 'level' => Config::getInstance()->level, - ]; - - $payload = json_encode($data, JSON_THROW_ON_ERROR); - - /** @psalm-suppress DeprecatedProperty */ - $base_address = $codebase->config->shepherd_host; - - if (parse_url($base_address, PHP_URL_SCHEME) === null) { - $base_address = 'https://' . $base_address; - } - - // Prepare new cURL resource - $ch = curl_init($base_address . '/hooks/psalm'); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); - curl_setopt($ch, CURLINFO_HEADER_OUT, true); - curl_setopt($ch, CURLOPT_POST, true); - curl_setopt($ch, CURLOPT_POSTFIELDS, $payload); - - // Set HTTP Header for POST request - curl_setopt( - $ch, - CURLOPT_HTTPHEADER, - [ - 'Content-Type: application/json', - 'Content-Length: ' . strlen($payload), - ], - ); - - // Submit the POST request - $curl_result = curl_exec($ch); - - /** @var array{http_code: int, ssl_verify_result: int} $curl_info */ - $curl_info = curl_getinfo($ch); - - // Close cURL session handle - curl_close($ch); - - $response_status_code = $curl_info['http_code']; - if ($response_status_code >= 200 && $response_status_code < 300) { - $shepherd_host = parse_url($codebase->config->shepherd_endpoint, PHP_URL_HOST); - - fwrite(STDERR, "🐑 results sent to $shepherd_host 🐑" . PHP_EOL); - return; - } - - $is_ssl_error = $curl_info['ssl_verify_result'] > 1; - if ($is_ssl_error) { - fwrite(STDERR, self::getCurlSslErrorMessage($curl_info['ssl_verify_result']) . PHP_EOL); - return; - } - - fwrite(STDERR, "Shepherd error: server responded with $response_status_code HTTP status code.\n"); - $response_content = is_string($curl_result) ? strip_tags($curl_result) : 'n/a'; - fwrite(STDERR, "Shepherd response: $response_content\n"); + if ($build_info === []) { + return null; } + + $issues = $event->getIssues(); + $normalized_data = $issues === [] ? [] : array_filter( + array_merge(...array_values($issues)), + static fn(IssueData $i): bool => $i->severity === 'error', + ); + + $codebase = $event->getCodebase(); + + return [ + 'build' => $build_info, + 'git' => $source_control_data, + 'issues' => $normalized_data, + 'coverage' => $codebase->analyzer->getTotalTypeCoverage($codebase), + 'level' => Config::getInstance()->level, + ]; + } + + private static function sendPayload(string $endpoint, array $rawPayload): void + { + $payload = json_encode($rawPayload, JSON_THROW_ON_ERROR); + + // Prepare new cURL resource + $ch = curl_init($endpoint); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); + curl_setopt($ch, CURLINFO_HEADER_OUT, true); + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_POSTFIELDS, $payload); + + // Set HTTP Header for POST request + curl_setopt( + $ch, + CURLOPT_HTTPHEADER, + [ + 'Content-Type: application/json', + 'Content-Length: ' . strlen($payload), + ], + ); + + // Submit the POST request + $curl_result = curl_exec($ch); + + /** @var array{http_code: int, ssl_verify_result: int} $curl_info */ + $curl_info = curl_getinfo($ch); + + // Close cURL session handle + curl_close($ch); + + $response_status_code = $curl_info['http_code']; + if ($response_status_code >= 200 && $response_status_code < 300) { + $shepherd_host = parse_url($endpoint, PHP_URL_HOST); + + fwrite(STDERR, "🐑 results sent to $shepherd_host 🐑" . PHP_EOL); + return; + } + + $is_ssl_error = $curl_info['ssl_verify_result'] > 1; + if ($is_ssl_error) { + fwrite(STDERR, self::getCurlSslErrorMessage($curl_info['ssl_verify_result']) . PHP_EOL); + return; + } + + $output = "Shepherd error: $endpoint endpoint responded with $response_status_code HTTP status code.\n"; + $response_content = is_string($curl_result) ? strip_tags($curl_result) : 'n/a'; + $output .= "Shepherd response: $response_content\n"; + if ($response_status_code === 0) { + $output .= "Please check shepherd endpoint — it should be a valid URL.\n"; + } + + $output .= sprintf("cURL Debug info:\n%s\n", var_export($curl_info, true)); + fwrite(STDERR, $output); } /** diff --git a/vendor/vimeo/psalm/src/Psalm/Storage/ClassLikeStorage.php b/vendor/vimeo/psalm/src/Psalm/Storage/ClassLikeStorage.php index d095cefb..45fa635d 100644 --- a/vendor/vimeo/psalm/src/Psalm/Storage/ClassLikeStorage.php +++ b/vendor/vimeo/psalm/src/Psalm/Storage/ClassLikeStorage.php @@ -470,6 +470,8 @@ final class ClassLikeStorage implements HasAttributesInterface public bool $public_api = false; + public bool $readonly = false; + public function __construct(string $name) { $this->name = $name; diff --git a/vendor/vimeo/psalm/src/Psalm/Storage/FunctionLikeStorage.php b/vendor/vimeo/psalm/src/Psalm/Storage/FunctionLikeStorage.php index e581e35e..63f3c895 100644 --- a/vendor/vimeo/psalm/src/Psalm/Storage/FunctionLikeStorage.php +++ b/vendor/vimeo/psalm/src/Psalm/Storage/FunctionLikeStorage.php @@ -243,6 +243,8 @@ abstract class FunctionLikeStorage implements HasAttributesInterface */ public $description; + public bool $public_api = false; + public function __toString(): string { return $this->getSignature(false); diff --git a/vendor/vimeo/psalm/src/Psalm/Type.php b/vendor/vimeo/psalm/src/Psalm/Type.php index 5ae85202..4a066707 100644 --- a/vendor/vimeo/psalm/src/Psalm/Type.php +++ b/vendor/vimeo/psalm/src/Psalm/Type.php @@ -251,29 +251,27 @@ abstract class Type public static function getString(?string $value = null): Union { - $type = null; + return new Union([$value === null ? new TString() : self::getAtomicStringFromLiteral($value)]); + } - if ($value !== null) { - $config = Config::getInstance(); + /** @return TLiteralString|TNonEmptyString */ + public static function getAtomicStringFromLiteral(string $value, bool $from_docblock = false): TString + { + $config = Config::getInstance(); - $event = new StringInterpreterEvent($value, ProjectAnalyzer::getInstance()->getCodebase()); + $event = new StringInterpreterEvent($value, ProjectAnalyzer::getInstance()->getCodebase()); - $type = $config->eventDispatcher->dispatchStringInterpreter($event); + $type = $config->eventDispatcher->dispatchStringInterpreter($event); - if (!$type) { - if (strlen($value) < $config->max_string_length) { - $type = new TLiteralString($value); - } else { - $type = new TNonEmptyString(); - } + if (!$type) { + if (strlen($value) < $config->max_string_length) { + $type = new TLiteralString($value, $from_docblock); + } else { + $type = new TNonEmptyString($from_docblock); } } - if (!$type) { - $type = new TString(); - } - - return new Union([$type]); + return $type; } /** diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TKeyedArray.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TKeyedArray.php index b78fa865..45dfb6b2 100644 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TKeyedArray.php +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TKeyedArray.php @@ -13,7 +13,6 @@ use Psalm\Type\Atomic; use Psalm\Type\Atomic\TArray; use Psalm\Type\Atomic\TLiteralClassString; use Psalm\Type\Atomic\TLiteralInt; -use Psalm\Type\Atomic\TLiteralString; use Psalm\Type\Atomic\TNonEmptyArray; use Psalm\Type\Union; use UnexpectedValueException; @@ -309,7 +308,8 @@ class TKeyedArray extends Atomic } elseif (isset($this->class_strings[$key])) { $key_types[] = new TLiteralClassString($key); } else { - $key_types[] = new TLiteralString($key); + /** @psalm-suppress ImpureMethodCall let's assume string interpreters are pure */ + $key_types[] = Type::getAtomicStringFromLiteral($key); } } @@ -362,7 +362,8 @@ class TKeyedArray extends Atomic } elseif (isset($this->class_strings[$key])) { $key_types[] = new TLiteralClassString($key); } else { - $key_types[] = new TLiteralString($key); + /** @psalm-suppress ImpureMethodCall let's assume string interpreters are pure */ + $key_types[] = Type::getAtomicStringFromLiteral($key); } $value_type = Type::combineUnionTypes($property, $value_type); diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralString.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralString.php index 901fb866..7346e5a0 100644 --- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralString.php +++ b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralString.php @@ -2,9 +2,13 @@ namespace Psalm\Type\Atomic; +use InvalidArgumentException; +use Psalm\Config; + use function addcslashes; use function mb_strlen; use function mb_substr; +use function strlen; /** * Denotes a string whose value is known. @@ -16,12 +20,43 @@ class TLiteralString extends TString /** @var string */ public $value; + /** + * Creates a literal string with a known value. + * + * Internal. + * String interpreters should use {@see TLiteralString::make} instead. + * All other clients should use {@see Type::getAtomicStringFromLiteral}. + * + * @psalm-internal Psalm\Type::getAtomicStringFromLiteral + * @psalm-internal Psalm\Type\Atomic\TLiteralClassString::__construct + * @psalm-internal Psalm\Type\Atomic\TLiteralString::make + */ public function __construct(string $value, bool $from_docblock = false) { + $config = Config::getInstance(); + if (strlen($value) >= $config->max_string_length) { + throw new InvalidArgumentException( + 'Literal string length should be below the configured limit (' + . $config->max_string_length + . ')', + ); + } $this->value = $value; $this->from_docblock = $from_docblock; } + /** + * Should only be used by string interpreters to avoid recursive calls. + * + * For all other purposes use {@see Type::getAtomicStringFromLiteral} + * + * @psalm-api + */ + public static function make(string $value, bool $from_docblock = false): self + { + return new self($value, $from_docblock); + } + /** * @psalm-suppress PossiblyUnusedMethod * @return static diff --git a/vendor/vimeo/psalm/stubs/CoreGenericClasses.phpstub b/vendor/vimeo/psalm/stubs/CoreGenericClasses.phpstub index 74a2353c..528f59ab 100644 --- a/vendor/vimeo/psalm/stubs/CoreGenericClasses.phpstub +++ b/vendor/vimeo/psalm/stubs/CoreGenericClasses.phpstub @@ -531,14 +531,3 @@ final class ReturnTypeWillChange public function __construct() {} } -#[Attribute(Attribute::TARGET_PARAMETER)] -final class SensitiveParameter -{ - public function __construct() {} -} - -#[Attribute(Attribute::TARGET_CLASS)] -final class AllowDynamicProperties -{ - public function __construct() {} -} diff --git a/vendor/vimeo/psalm/stubs/Php80.phpstub b/vendor/vimeo/psalm/stubs/Php80.phpstub index 42e0ad79..2f2d5bf0 100644 --- a/vendor/vimeo/psalm/stubs/Php80.phpstub +++ b/vendor/vimeo/psalm/stubs/Php80.phpstub @@ -240,6 +240,13 @@ class DatePeriod implements IteratorAggregate */ function get_headers(string $url, bool $associative = false, $context = null) : array|false {} +/** + * @psalm-pure + * + * @psalm-flow ($values) -> return + */ +function pack(string $format, mixed ...$values): string {} + final class CurlHandle { private function __construct() diff --git a/vendor/vimeo/psalm/stubs/Php82.phpstub b/vendor/vimeo/psalm/stubs/Php82.phpstub index f6da0a6c..40d60e3e 100644 --- a/vendor/vimeo/psalm/stubs/Php82.phpstub +++ b/vendor/vimeo/psalm/stubs/Php82.phpstub @@ -33,4 +33,16 @@ namespace { /** @psalm-return (Start is string ? Iterator : Iterator) */ public function getIterator(): Iterator {} } + + #[Attribute(Attribute::TARGET_PARAMETER)] + final class SensitiveParameter + { + public function __construct() {} + } + + #[Attribute(Attribute::TARGET_CLASS)] + final class AllowDynamicProperties + { + public function __construct() {} + } } diff --git a/vendor/vimeo/psalm/stubs/extensions/ffi.phpstub b/vendor/vimeo/psalm/stubs/extensions/ffi.phpstub index bd6152fa..6e14a77c 100644 --- a/vendor/vimeo/psalm/stubs/extensions/ffi.phpstub +++ b/vendor/vimeo/psalm/stubs/extensions/ffi.phpstub @@ -19,9 +19,10 @@ namespace { } /** + * Note: Official docs say this could return `null`, but it throws exceptions instead. * @param \FFI\CType|string $type */ - public static function new($type, bool $owned = true, bool $persistent = false): ?\FFI\CData + public static function new($type, bool $owned = true, bool $persistent = false): \FFI\CData { } @@ -106,6 +107,25 @@ namespace { public static function isNull(\FFI\CData $ptr): bool { } + + public function __call(...$values) + { + } + + /** + * @param mixed $value + * @return mixed $value + */ + public function __set(string $key, $value) + { + } + + /** + * @return string|int|float|\FFI\CData|null + */ + public function __get(string $key) + { + } } } @@ -115,9 +135,36 @@ namespace FFI { /** * @since 7.4.0 */ - final class CData + final class CData implements \Countable, \ArrayAccess, \Countable, \Traversable { + /** + * @return bool + */ + public function offsetExists($offset) + { + } + /** + * @return mixed|null + */ + public function offsetGet($offset) + { + } + + /** + * @param mixed|null $value + * @return void + */ + public function offsetSet($offset, $value) + { + } + + /** + * @return void + */ + public function offsetUnset($offset) + { + } } /** diff --git a/vendor/vimeo/psalm/stubs/extensions/ibm_db2.phpstub b/vendor/vimeo/psalm/stubs/extensions/ibm_db2.phpstub new file mode 100644 index 00000000..de8a47a0 --- /dev/null +++ b/vendor/vimeo/psalm/stubs/extensions/ibm_db2.phpstub @@ -0,0 +1,9 @@ + 1 ? bool : (0|1)) + */ +function db2_autocommit($connection, int $value = null): int|bool {}